|
|
|
@ -58,7 +58,7 @@ void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s |
|
|
|
case SelectMode::CHI: |
|
|
|
return ExtractHalf(v, src_c, Half::H1, false); |
|
|
|
case SelectMode::CBCC: |
|
|
|
return v.ir.IAdd(v.ir.ShiftLeftLogical(src_b, v.ir.Imm32(16)), src_b); |
|
|
|
return v.ir.IAdd(v.ir.ShiftLeftLogical(src_b, v.ir.Imm32(16)), src_c); |
|
|
|
case SelectMode::CSFU: |
|
|
|
throw NotImplementedException("XMAD CSFU"); |
|
|
|
} |
|
|
|
@ -78,16 +78,44 @@ void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s |
|
|
|
} |
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
void TranslatorVisitor::XMAD_reg(u64) { |
|
|
|
throw NotImplementedException("XMAD (reg)"); |
|
|
|
void TranslatorVisitor::XMAD_reg(u64 insn) { |
|
|
|
union { |
|
|
|
u64 raw; |
|
|
|
BitField<35, 1, Half> half_b; |
|
|
|
BitField<36, 1, u64> psl; |
|
|
|
BitField<37, 1, u64> mrg; |
|
|
|
BitField<38, 1, u64> x; |
|
|
|
BitField<50, 3, SelectMode> select_mode; |
|
|
|
} const xmad{insn}; |
|
|
|
|
|
|
|
XMAD(*this, insn, GetReg20(insn), GetReg39(insn), xmad.select_mode, xmad.half_b, xmad.psl != 0, |
|
|
|
xmad.mrg != 0, xmad.x != 0); |
|
|
|
} |
|
|
|
|
|
|
|
void TranslatorVisitor::XMAD_rc(u64) { |
|
|
|
throw NotImplementedException("XMAD (rc)"); |
|
|
|
void TranslatorVisitor::XMAD_rc(u64 insn) { |
|
|
|
union { |
|
|
|
u64 raw; |
|
|
|
BitField<50, 2, SelectMode> select_mode; |
|
|
|
BitField<52, 1, Half> half_b; |
|
|
|
BitField<54, 1, u64> x; |
|
|
|
} const xmad{insn}; |
|
|
|
|
|
|
|
XMAD(*this, insn, GetReg39(insn), GetCbuf(insn), xmad.select_mode, xmad.half_b, false, false, |
|
|
|
xmad.x != 0); |
|
|
|
} |
|
|
|
|
|
|
|
void TranslatorVisitor::XMAD_cr(u64) { |
|
|
|
throw NotImplementedException("XMAD (cr)"); |
|
|
|
void TranslatorVisitor::XMAD_cr(u64 insn) { |
|
|
|
union { |
|
|
|
u64 raw; |
|
|
|
BitField<50, 2, SelectMode> select_mode; |
|
|
|
BitField<52, 1, Half> half_b; |
|
|
|
BitField<54, 1, u64> x; |
|
|
|
BitField<55, 1, u64> psl; |
|
|
|
BitField<56, 1, u64> mrg; |
|
|
|
} const xmad{insn}; |
|
|
|
|
|
|
|
XMAD(*this, insn, GetCbuf(insn), GetReg39(insn), xmad.select_mode, xmad.half_b, xmad.psl != 0, |
|
|
|
xmad.mrg != 0, xmad.x != 0); |
|
|
|
} |
|
|
|
|
|
|
|
void TranslatorVisitor::XMAD_imm(u64 insn) { |
|
|
|
@ -97,14 +125,11 @@ void TranslatorVisitor::XMAD_imm(u64 insn) { |
|
|
|
BitField<36, 1, u64> psl; |
|
|
|
BitField<37, 1, u64> mrg; |
|
|
|
BitField<38, 1, u64> x; |
|
|
|
BitField<39, 8, IR::Reg> src_c; |
|
|
|
BitField<50, 3, SelectMode> select_mode; |
|
|
|
} const xmad{insn}; |
|
|
|
|
|
|
|
const IR::U32 src_b{ir.Imm32(static_cast<u32>(xmad.src_b))}; |
|
|
|
const IR::U32 src_c{X(xmad.src_c)}; |
|
|
|
XMAD(*this, insn, src_b, src_c, xmad.select_mode, Half::H0, xmad.psl != 0, xmad.mrg != 0, |
|
|
|
xmad.x != 0); |
|
|
|
XMAD(*this, insn, ir.Imm32(static_cast<u32>(xmad.src_b)), GetReg39(insn), xmad.select_mode, |
|
|
|
Half::H0, xmad.psl != 0, xmad.mrg != 0, xmad.x != 0); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Shader::Maxwell
|