summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2015-01-20 16:35:08 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2015-01-20 16:35:08 -0600
commit67f2ff2e18b38efeaabecba48423cde06c0e8df0 (patch)
tree54ef24ece9a927b3ea5feced8ba574060e6042cc /Source/Core
parent217c2c9d6acfe5b13e7afc08b42272788d44507b (diff)
[AArch64] Move the 64bit floating point instructions to scalar.
Instead of doing vector operations and throwing away the top 64bits of each operation, let's instead use scalar operations. On Cortex-A57 this saves us three cycles per vector operation changed to scalar, so this saves 3-9cycles per instruction emulated. Also puts one less micro-op in to the vector pipeline there. On the Nvidia Denver I couldn't see any noticeable performance difference, but it's a quirky architecture so it may be noticing we are throwing away the top bits anyway and optimizing it. The world may never know what's truly happening there.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp68
1 files changed, 34 insertions, 34 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp
index a670edccc8..305f30d217 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp
@@ -27,7 +27,7 @@ void JitArm64::fabsx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(inst.FD);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FABS(64, V0, VB);
+ m_float_emit.FABS(EncodeRegToDouble(V0), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
@@ -44,7 +44,7 @@ void JitArm64::faddsx(UGeckoInstruction inst)
ARM64Reg VB = fpr.R(inst.FB);
ARM64Reg VD = fpr.R(inst.FD);
- m_float_emit.FADD(64, VD, VA, VB);
+ m_float_emit.FADD(EncodeRegToDouble(VD), EncodeRegToDouble(VA), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 1, VD, 0);
}
@@ -60,7 +60,7 @@ void JitArm64::faddx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(inst.FD);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FADD(64, V0, VA, VB);
+ m_float_emit.FADD(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
@@ -81,9 +81,9 @@ void JitArm64::fmaddsx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FADD(64, V0, V0, VB);
- m_float_emit.DUP(64, VD, V0, 0);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FADD(EncodeRegToDouble(VD), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.INS(64, VD, 1, VD, 0);
fpr.Unlock(V0);
}
@@ -102,8 +102,8 @@ void JitArm64::fmaddx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FADD(64, V0, V0, VB);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FADD(EncodeRegToDouble(V0), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
}
@@ -136,9 +136,9 @@ void JitArm64::fmsubsx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FSUB(64, V0, V0, VB);
- m_float_emit.DUP(64, VD, V0, 0);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FSUB(EncodeRegToDouble(VD), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.INS(64, VD, 1, VD, 0);
fpr.Unlock(V0);
}
@@ -157,8 +157,8 @@ void JitArm64::fmsubx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FSUB(64, V0, V0, VB);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FSUB(EncodeRegToDouble(V0), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
}
@@ -174,7 +174,7 @@ void JitArm64::fmulsx(UGeckoInstruction inst)
ARM64Reg VC = fpr.R(inst.FC);
ARM64Reg VD = fpr.R(inst.FD);
- m_float_emit.FMUL(64, VD, VA, VC);
+ m_float_emit.FMUL(EncodeRegToDouble(VD), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
m_float_emit.INS(64, VD, 1, VD, 0);
}
@@ -190,7 +190,7 @@ void JitArm64::fmulx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(inst.FD);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
@@ -207,8 +207,8 @@ void JitArm64::fnabsx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(inst.FD);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FABS(64, V0, VB);
- m_float_emit.FNEG(64, V0, V0);
+ m_float_emit.FABS(EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.FNEG(EncodeRegToDouble(V0), EncodeRegToDouble(V0));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
@@ -225,7 +225,7 @@ void JitArm64::fnegx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(inst.FD);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FNEG(64, V0, VB);
+ m_float_emit.FNEG(EncodeRegToDouble(V0), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
@@ -246,10 +246,10 @@ void JitArm64::fnmaddsx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FADD(64, V0, V0, VB);
- m_float_emit.FNEG(64, V0, V0);
- m_float_emit.DUP(64, VD, V0, 0);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FADD(EncodeRegToDouble(VD), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.FNEG(EncodeRegToDouble(VD), EncodeRegToDouble(VD));
+ m_float_emit.INS(64, VD, 1, VD, 0);
fpr.Unlock(V0);
}
@@ -268,9 +268,9 @@ void JitArm64::fnmaddx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FADD(64, V0, V0, VB);
- m_float_emit.FNEG(64, V0, V0);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FADD(EncodeRegToDouble(V0), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.FNEG(EncodeRegToDouble(V0), EncodeRegToDouble(V0));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
}
@@ -290,10 +290,10 @@ void JitArm64::fnmsubsx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FSUB(64, V0, V0, VB);
- m_float_emit.FNEG(64, V0, V0);
- m_float_emit.DUP(64, VD, V0, 0);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FSUB(EncodeRegToDouble(VD), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.FNEG(EncodeRegToDouble(VD), EncodeRegToDouble(VD));
+ m_float_emit.INS(64, VD, 1, VD, 0);
fpr.Unlock(V0);
}
@@ -312,9 +312,9 @@ void JitArm64::fnmsubx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(d);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FMUL(64, V0, VA, VC);
- m_float_emit.FSUB(64, V0, V0, VB);
- m_float_emit.FNEG(64, V0, V0);
+ m_float_emit.FMUL(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VC));
+ m_float_emit.FSUB(EncodeRegToDouble(V0), EncodeRegToDouble(V0), EncodeRegToDouble(VB));
+ m_float_emit.FNEG(EncodeRegToDouble(V0), EncodeRegToDouble(V0));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);
}
@@ -353,7 +353,7 @@ void JitArm64::fsubsx(UGeckoInstruction inst)
ARM64Reg VB = fpr.R(inst.FB);
ARM64Reg VD = fpr.R(inst.FD);
- m_float_emit.FSUB(64, VD, VA, VB);
+ m_float_emit.FSUB(EncodeRegToDouble(VD), EncodeRegToDouble(VA), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 1, VD, 0);
}
@@ -369,7 +369,7 @@ void JitArm64::fsubx(UGeckoInstruction inst)
ARM64Reg VD = fpr.R(inst.FD);
ARM64Reg V0 = fpr.GetReg();
- m_float_emit.FSUB(64, V0, VA, VB);
+ m_float_emit.FSUB(EncodeRegToDouble(V0), EncodeRegToDouble(VA), EncodeRegToDouble(VB));
m_float_emit.INS(64, VD, 0, V0, 0);
fpr.Unlock(V0);