Fix: V_MUL_I32_I24 | V_MUL_U32_U24 (#3632)

This commit is contained in:
DanielSvoboda
2025-09-19 23:05:22 -03:00
committed by GitHub
parent fa489c023e
commit eb18382396
2 changed files with 8 additions and 6 deletions

View File

@@ -153,7 +153,7 @@ public:
void V_SUB_F32(const GcnInst& inst);
void V_SUBREV_F32(const GcnInst& inst);
void V_MUL_F32(const GcnInst& inst);
void V_MUL_I32_I24(const GcnInst& inst);
void V_MUL_I32_I24(const GcnInst& inst, bool is_signed);
void V_MIN_F32(const GcnInst& inst, bool is_legacy = false);
void V_MAX_F32(const GcnInst& inst, bool is_legacy = false);
void V_MIN_I32(const GcnInst& inst);

View File

@@ -29,9 +29,9 @@ void Translator::EmitVectorAlu(const GcnInst& inst) {
case Opcode::V_MUL_F32:
return V_MUL_F32(inst);
case Opcode::V_MUL_I32_I24:
return V_MUL_I32_I24(inst);
return V_MUL_I32_I24(inst, true);
case Opcode::V_MUL_U32_U24:
return V_MUL_I32_I24(inst);
return V_MUL_I32_I24(inst, false);
case Opcode::V_MIN_LEGACY_F32:
return V_MIN_F32(inst, true);
case Opcode::V_MAX_LEGACY_F32:
@@ -459,9 +459,11 @@ void Translator::V_MUL_F32(const GcnInst& inst) {
SetDst(inst.dst[0], ir.FPMul(GetSrc<IR::F32>(inst.src[0]), GetSrc<IR::F32>(inst.src[1])));
}
void Translator::V_MUL_I32_I24(const GcnInst& inst) {
const IR::U32 src0{ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(24), true)};
const IR::U32 src1{ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(24), true)};
void Translator::V_MUL_I32_I24(const GcnInst& inst, bool is_signed) {
const IR::U32 src0{
ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0), ir.Imm32(24), is_signed)};
const IR::U32 src1{
ir.BitFieldExtract(GetSrc(inst.src[1]), ir.Imm32(0), ir.Imm32(24), is_signed)};
SetDst(inst.dst[0], ir.IMul(src0, src1));
}