From 8fed281c1325c54a2fc6154d9381d7b5b734f8d3 Mon Sep 17 00:00:00 2001 From: Andrew Middendorp Date: Sat, 7 Sep 2024 04:54:08 -0700 Subject: [PATCH] Added S_ANDN2_B32 and S_NAND_B32 opcodes --- .../frontend/translate/scalar_alu.cpp | 18 ++++++++++++++---- .../frontend/translate/translate.h | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index adc127f12..56de5afda 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -46,7 +46,11 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { case Opcode::S_ADD_I32: return S_ADD_I32(inst); case Opcode::S_AND_B32: - return S_AND_B32(inst); + return S_AND_B32(NegateMode::None, inst); + case Opcode::S_NAND_B32: + return S_AND_B32(NegateMode::Result, inst); + case Opcode::S_ANDN2_B32: + return S_AND_B32(NegateMode::Src1, inst); case Opcode::S_ASHR_I32: return S_ASHR_I32(inst); case Opcode::S_OR_B32: @@ -381,10 +385,16 @@ void Translator::S_ADD_I32(const GcnInst& inst) { // TODO: Overflow flag } -void Translator::S_AND_B32(const GcnInst& inst) { +void Translator::S_AND_B32(NegateMode negate, const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.BitwiseAnd(src0, src1)}; + IR::U32 src1{GetSrc(inst.src[1])}; + if (negate == NegateMode::Src1) { + IR::U32 src1{ir.BitwiseNot(GetSrc(inst.src[1]))}; + } + IR::U32 result{ir.BitwiseAnd(src0, src1)}; + if (negate == NegateMode::Result) { + IR::U32 result{ir.BitwiseNot(ir.BitwiseAnd(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 e4be298ea..888d3451b 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -84,7 +84,7 @@ public: void S_OR_B64(NegateMode negate, bool is_xor, const GcnInst& inst); void S_AND_B64(NegateMode negate, const GcnInst& inst); void S_ADD_I32(const GcnInst& inst); - void S_AND_B32(const GcnInst& inst); + void S_AND_B32(NegateMode negate, const GcnInst& inst); void S_ASHR_I32(const GcnInst& inst); void S_OR_B32(const GcnInst& inst); void S_LSHR_B32(const GcnInst& inst);