Implement S_ABSDIFF_I32

This commit is contained in:
Luke Warner 2024-09-13 11:22:31 -04:00
parent ab201398b2
commit fb47a12b63
2 changed files with 10 additions and 0 deletions

View File

@ -84,6 +84,8 @@ void Translator::EmitScalarAlu(const GcnInst& inst) {
return S_MAX_U32(false, inst); return S_MAX_U32(false, inst);
case Opcode::S_MAX_I32: case Opcode::S_MAX_I32:
return S_MAX_U32(true, inst); return S_MAX_U32(true, inst);
case Opcode::S_ABSDIFF_I32:
return S_ABSDIFF_I32(inst);
case Opcode::S_WQM_B64: case Opcode::S_WQM_B64:
break; break;
default: default:
@ -563,4 +565,11 @@ void Translator::S_MIN_U32(bool is_signed, const GcnInst& inst) {
ir.SetScc(ir.IEqual(result, src0)); ir.SetScc(ir.IEqual(result, src0));
} }
void Translator::S_ABSDIFF_I32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 src1{GetSrc(inst.src[1])};
const IR::U32 result{ir.IAbs(ir.ISub(src0, src1))};
SetDst(inst.dst[0], result);
}
} // namespace Shader::Gcn } // namespace Shader::Gcn

View File

@ -104,6 +104,7 @@ public:
void S_MAX_U32(bool is_signed, const GcnInst& inst); void S_MAX_U32(bool is_signed, const GcnInst& inst);
void S_MIN_U32(bool is_signed, const GcnInst& inst); void S_MIN_U32(bool is_signed, const GcnInst& inst);
void S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst); void S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst);
void S_ABSDIFF_I32(const GcnInst& inst);
// Scalar Memory // Scalar Memory
void S_LOAD_DWORD(int num_dwords, const GcnInst& inst); void S_LOAD_DWORD(int num_dwords, const GcnInst& inst);