shader_recompiler: Implement V_LSHL_B64 for immediate arguments. (#1674)

This commit is contained in:
squidbus 2024-12-07 13:28:17 -08:00 committed by GitHub
parent 57e762468f
commit c076ba69e8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1155,15 +1155,23 @@ void Translator::V_LSHL_B64(const GcnInst& inst) {
const IR::U64 src0{GetSrc64(inst.src[0])}; const IR::U64 src0{GetSrc64(inst.src[0])};
const IR::U64 src1{GetSrc64(inst.src[1])}; const IR::U64 src1{GetSrc64(inst.src[1])};
const IR::VectorReg dst_reg{inst.dst[0].code}; const IR::VectorReg dst_reg{inst.dst[0].code};
if (src0.IsImmediate() && src0.U64() == -1) { if (src0.IsImmediate()) {
ir.SetVectorReg(dst_reg, ir.Imm32(0xFFFFFFFF)); if (src0.U64() == -1) {
ir.SetVectorReg(dst_reg + 1, ir.Imm32(0xFFFFFFFF)); // If src0 is a fixed -1, the result will always be -1.
return; ir.SetVectorReg(dst_reg, ir.Imm32(0xFFFFFFFF));
ir.SetVectorReg(dst_reg + 1, ir.Imm32(0xFFFFFFFF));
return;
}
if (src1.IsImmediate()) {
// If both src0 and src1 are immediates, we can calculate the result now.
// Note that according to the manual, only bits 4:0 are used from src1.
const u64 result = src0.U64() << (src1.U64() & 0x1F);
ir.SetVectorReg(dst_reg, ir.Imm32(static_cast<u32>(result)));
ir.SetVectorReg(dst_reg + 1, ir.Imm32(static_cast<u32>(result >> 32)));
return;
}
} }
ASSERT_MSG(src0.IsImmediate() && src0.U64() == 0 && src1.IsImmediate() && src1.U64() == 0, UNREACHABLE_MSG("Unimplemented V_LSHL_B64 arguments");
"V_LSHL_B64 with non-zero src0 or src1 is not supported");
ir.SetVectorReg(dst_reg, ir.Imm32(0));
ir.SetVectorReg(dst_reg + 1, ir.Imm32(0));
} }
void Translator::V_MUL_F64(const GcnInst& inst) { void Translator::V_MUL_F64(const GcnInst& inst) {