Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[ARM] Support both hardfp and softfp with lfs and lfd. Fixes these tw…
…o instructions on Android since it uses softfp calling conventions. This adds a emitter for moving from two ARM Registers to a double VFP reg.
  • Loading branch information
Sonicadvance1 committed Aug 30, 2013
1 parent 2ab7fc1 commit 2c1337e
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
5 changes: 4 additions & 1 deletion Source/Core/Common/Src/ArmEmitter.cpp
Expand Up @@ -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;
}
}
Expand Down
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 2c1337e

Please sign in to comment.