summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@Gmail.com>2013-08-30 09:37:57 +0000
committerRyan Houdek <Sonicadvance1@Gmail.com>2013-08-30 09:38:11 +0000
commit2c1337eb5f89be68ed649ec66e8805055ecfca1c (patch)
tree8c8601c1bb5e12938452292b444a5f4d336b1425 /Source/Core
parent2ab7fc10daa8b7af2dde19c1c584a09cee79f624 (diff)
[ARM] Support both hardfp and softfp with lfs and lfd. Fixes these two instructions on Android since it uses softfp calling conventions. This adds a emitter for moving from two ARM Registers to a double VFP reg.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/Src/ArmEmitter.cpp5
-rw-r--r--Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp9
2 files changed, 12 insertions, 2 deletions
diff --git a/Source/Core/Common/Src/ArmEmitter.cpp b/Source/Core/Common/Src/ArmEmitter.cpp
index 2788760c6d..e9102f20cf 100644
--- a/Source/Core/Common/Src/ArmEmitter.cpp
+++ b/Source/Core/Common/Src/ArmEmitter.cpp
@@ -1154,7 +1154,10 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src)
else
{
// Move 64bit from Arm reg
- _dbg_assert_msg_(DYNA_REC, false, "This VMOV doesn't support moving 64bit ARM to NEON");
+ ARMReg Src2 = (ARMReg)(Src + 1);
+ Dest = (ARMReg)(Dest - S0);
+ Write32(condition | (0xC4 << 20) | (Src2 << 16) | (Src << 12) \
+ | (0xB << 8) | ((Dest & 0x10) << 1) | (1 << 4) | ((Dest & 0xF) >> 1));
return;
}
}
diff --git a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
index 14a9786cc2..178007f5b3 100644
--- a/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
+++ b/Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
@@ -61,6 +61,9 @@ void JitArm::lfs(UGeckoInstruction inst)
ARMReg v0 = fpr.R0(inst.FD);
ARMReg v1 = fpr.R1(inst.FD);
+#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0
+ VMOV(S0, R0);
+#endif
VCVT(v0, S0, 0);
VCVT(v1, S0, 0);
@@ -98,8 +101,12 @@ void JitArm::lfd(UGeckoInstruction inst)
BL(rA);
ARMReg v0 = fpr.R0(inst.FD);
-
+#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0 and R1
+ VMOV(v0, R0);
+#else
VMOV(v0, D0);
+#endif
+
POP(4, R0, R1, R2, R3);
gpr.Unlock(rA, rB);