diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index aaaae0213c..17298e5ec8 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -158,6 +158,13 @@ bool TryMakeFloatIMM8(u32 val, Operand2 &op2) return false; } +void ARMXEmitter::MOVI2FR(ARMReg dest, float val, bool negate) +{ + union {float f; u32 u;} conv; + conv.f = negate ? -val : val; + MOVI2R(dest, conv.u); +} + void ARMXEmitter::MOVI2F(ARMReg dest, float val, ARMReg tempReg, bool negate) { union {float f; u32 u;} conv; @@ -2146,7 +2153,7 @@ void ARMXEmitter::VDUP(u32 Size, ARMReg Vd, ARMReg Rt) sizeEncoded = 0; Write32((0xEE << 24) | (0x8 << 20) | ((sizeEncoded & 2) << 21) | (register_quad << 21) \ - | ((Vd & 0xF) << 16) | (Rt << 12) | (0xD1 << 4) | ((Vd & 0x10) << 3) | (1 << 4)); + | ((Vd & 0xF) << 16) | (Rt << 12) | (0xD1 << 4) | ((Vd & 0x10) << 3) | ((sizeEncoded & 1) << 5)); } void ARMXEmitter::VEOR(ARMReg Vd, ARMReg Vn, ARMReg Vm) { diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 0f2475a7e3..4b8f73169e 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -807,6 +807,7 @@ public: // Wrapper around MOVT/MOVW with fallbacks. void MOVI2R(ARMReg reg, u32 val, bool optimize = true); + void MOVI2FR(ARMReg dest, float val, bool negate = false); void MOVI2F(ARMReg dest, float val, ARMReg tempReg, bool negate = false); void MOVI2F_neon(ARMReg dest, float val, ARMReg tempReg, bool negate = false);