From 8211225ad4ab9e95ad3a4cc325d4bf82f55d6936 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 18 Oct 2019 03:22:20 +0200 Subject: [PATCH] [dxbc] Swap OpSelect arguments for Ne/Dne, don't use OpLogicalNot Saves one instruction. --- src/dxbc/dxbc_compiler.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index b94e1fae..9103f40a 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -1871,7 +1871,14 @@ namespace dxvk { if (componentCount > 1) conditionType = m_module.defVectorType(conditionType, componentCount); + bool invert = false; + switch (ins.op) { + case DxbcOpcode::Ne: + case DxbcOpcode::DNe: + invert = true; + /* fall through */ + case DxbcOpcode::Eq: case DxbcOpcode::DEq: condition = m_module.opFOrdEqual( @@ -1890,13 +1897,6 @@ namespace dxvk { conditionType, src.at(0).id, src.at(1).id); break; - case DxbcOpcode::Ne: - case DxbcOpcode::DNe: - // Avoid poorly supported FUnordNotEqual - condition = m_module.opLogicalNot(conditionType, - m_module.opFOrdEqual(conditionType, src.at(0).id, src.at(1).id)); - break; - case DxbcOpcode::IEq: condition = m_module.opIEqual( conditionType, src.at(0).id, src.at(1).id); @@ -1952,6 +1952,9 @@ namespace dxvk { sTrue = m_module.constComposite(typeId, componentCount, vTrue .data()); } + if (invert) + std::swap(sFalse, sTrue); + // Perform component-wise mask selection // based on the condition evaluated above. result.id = m_module.opSelect(