mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-03-10 07:36:27 +00:00
VFPv4: Implement VFMA, VFMS
This commit is contained in:
@@ -304,6 +304,46 @@ bool ArmTranslatorVisitor::vfp_VFNMA(Cond cond, bool D, size_t Vn, size_t Vd, bo
|
||||
});
|
||||
}
|
||||
|
||||
// VFMA<c>.F64 <Dd>, <Dn>, <Dm>
|
||||
// VFMA<c>.F32 <Sd>, <Sn>, <Sm>
|
||||
bool ArmTranslatorVisitor::vfp_VFMA(Cond cond, bool D, size_t Vn, size_t Vd, bool sz, bool N, bool M, size_t Vm) {
|
||||
if (!ConditionPassed(cond)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const auto d = ToExtReg(sz, Vd, D);
|
||||
const auto n = ToExtReg(sz, Vn, N);
|
||||
const auto m = ToExtReg(sz, Vm, M);
|
||||
|
||||
return EmitVfpVectorOperation(sz, d, n, m, [this](ExtReg d, ExtReg n, ExtReg m) {
|
||||
const auto reg_n = ir.GetExtendedRegister(n);
|
||||
const auto reg_m = ir.GetExtendedRegister(m);
|
||||
const auto reg_d = ir.GetExtendedRegister(d);
|
||||
const auto result = ir.FPMulAdd(reg_d, reg_n, reg_m, true);
|
||||
ir.SetExtendedRegister(d, result);
|
||||
});
|
||||
}
|
||||
|
||||
// VFMS<c>.F64 <Dd>, <Dn>, <Dm>
|
||||
// VFMS<c>.F32 <Sd>, <Sn>, <Sm>
|
||||
bool ArmTranslatorVisitor::vfp_VFMS(Cond cond, bool D, size_t Vn, size_t Vd, bool sz, bool N, bool M, size_t Vm) {
|
||||
if (!ConditionPassed(cond)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const auto d = ToExtReg(sz, Vd, D);
|
||||
const auto n = ToExtReg(sz, Vn, N);
|
||||
const auto m = ToExtReg(sz, Vm, M);
|
||||
|
||||
return EmitVfpVectorOperation(sz, d, n, m, [this](ExtReg d, ExtReg n, ExtReg m) {
|
||||
const auto reg_n = ir.GetExtendedRegister(n);
|
||||
const auto reg_m = ir.GetExtendedRegister(m);
|
||||
const auto reg_d = ir.GetExtendedRegister(d);
|
||||
const auto result = ir.FPMulAdd(reg_d, ir.FPNeg(reg_n), reg_m, true);
|
||||
ir.SetExtendedRegister(d, result);
|
||||
});
|
||||
}
|
||||
|
||||
// VMOV<c>.32 <Dd[0]>, <Rt>
|
||||
bool ArmTranslatorVisitor::vfp_VMOV_u32_f64(Cond cond, size_t Vd, Reg t, bool D) {
|
||||
if (t == Reg::PC) {
|
||||
|
||||
Reference in New Issue
Block a user