From dc6fd70130c92f9a2e9c5c19fc57dd278f0e3d4b Mon Sep 17 00:00:00 2001 From: martin Date: Wed, 4 Sep 2024 13:07:30 -0500 Subject: [PATCH] add S_XOR_B32 --- .../frontend/translate/scalar_alu.cpp | 14 +++++++++++--- .../frontend/translate/translate.h | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index af258cd19..1f63781ae 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -35,6 +35,8 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { return S_OR_B64(NegateMode::Result, true, inst); case Opcode::S_ORN2_B64: return S_OR_B64(NegateMode::Src1, false, inst); + case Opcode::S_XOR_B32: + return S_OR_B32(inst, true); case Opcode::S_AND_B64: return S_AND_B64(NegateMode::None, inst); case Opcode::S_NAND_B64: @@ -50,7 +52,7 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { case Opcode::S_ASHR_I32: return S_ASHR_I32(inst); case Opcode::S_OR_B32: - return S_OR_B32(inst); + return S_OR_B32(inst, false); case Opcode::S_LSHL_B32: return S_LSHL_B32(inst); case Opcode::S_LSHR_B32: @@ -393,10 +395,16 @@ void Translator::S_ASHR_I32(const GcnInst& inst) { ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } -void Translator::S_OR_B32(const GcnInst& inst) { +void Translator::S_OR_B32(const GcnInst& inst, bool is_xor) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.BitwiseOr(src0, src1)}; + IR::U32 result; + if (is_xor) { + result = ir.BitwiseXor(src0, src1); + } else { + result = ir.BitwiseOr(src0, src1); + } + SetDst(inst.dst[0], result); ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 0c1f3a587..6efdc8974 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -86,7 +86,7 @@ public: void S_ADD_I32(const GcnInst& inst); void S_AND_B32(const GcnInst& inst); void S_ASHR_I32(const GcnInst& inst); - void S_OR_B32(const GcnInst& inst); + void S_OR_B32(const GcnInst& inst, bool is_xor); void S_LSHR_B32(const GcnInst& inst); void S_CSELECT_B32(const GcnInst& inst); void S_CSELECT_B64(const GcnInst& inst);