mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-03 03:05:18 +02:00
x86 jit: For clarity, use TEMPREG where it doesn't matter that it's EAX.
Might have missed a few places.
This commit is contained in:
+38
-37
@@ -123,8 +123,8 @@ namespace MIPSComp
|
||||
bool needsTemp = !HasLowSubregister(gpr.R(rt)) || rt == rs;
|
||||
if (needsTemp) {
|
||||
CMP(32, gpr.R(rs), Imm32(suimm));
|
||||
SETcc(CC_L, R(EAX));
|
||||
MOVZX(32, 8, gpr.RX(rt), R(EAX));
|
||||
SETcc(CC_L, R(TEMPREG));
|
||||
MOVZX(32, 8, gpr.RX(rt), R(TEMPREG));
|
||||
} else {
|
||||
XOR(32, gpr.R(rt), gpr.R(rt));
|
||||
CMP(32, gpr.R(rs), Imm32(suimm));
|
||||
@@ -145,8 +145,8 @@ namespace MIPSComp
|
||||
bool needsTemp = !HasLowSubregister(gpr.R(rt)) || rt == rs;
|
||||
if (needsTemp) {
|
||||
CMP(32, gpr.R(rs), Imm32(suimm));
|
||||
SETcc(CC_B, R(EAX));
|
||||
MOVZX(32, 8, gpr.RX(rt), R(EAX));
|
||||
SETcc(CC_B, R(TEMPREG));
|
||||
MOVZX(32, 8, gpr.RX(rt), R(TEMPREG));
|
||||
} else {
|
||||
XOR(32, gpr.R(rt), gpr.R(rt));
|
||||
CMP(32, gpr.R(rs), Imm32(suimm));
|
||||
@@ -218,11 +218,11 @@ namespace MIPSComp
|
||||
{
|
||||
gpr.Lock(rd, rs);
|
||||
gpr.MapReg(rd, rd == rs, true);
|
||||
BSR(32, EAX, gpr.R(rs));
|
||||
BSR(32, TEMPREG, gpr.R(rs));
|
||||
FixupBranch notFound = J_CC(CC_Z);
|
||||
|
||||
MOV(32, gpr.R(rd), Imm32(31));
|
||||
SUB(32, gpr.R(rd), R(EAX));
|
||||
SUB(32, gpr.R(rd), R(TEMPREG));
|
||||
FixupBranch skip = J();
|
||||
|
||||
SetJumpTarget(notFound);
|
||||
@@ -249,13 +249,13 @@ namespace MIPSComp
|
||||
{
|
||||
gpr.Lock(rd, rs);
|
||||
gpr.MapReg(rd, rd == rs, true);
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
NOT(32, R(EAX));
|
||||
BSR(32, EAX, R(EAX));
|
||||
MOV(32, R(TEMPREG), gpr.R(rs));
|
||||
NOT(32, R(TEMPREG));
|
||||
BSR(32, TEMPREG, R(TEMPREG));
|
||||
FixupBranch notFound = J_CC(CC_Z);
|
||||
|
||||
MOV(32, gpr.R(rd), Imm32(31));
|
||||
SUB(32, gpr.R(rd), R(EAX));
|
||||
SUB(32, gpr.R(rd), R(TEMPREG));
|
||||
FixupBranch skip = J();
|
||||
|
||||
SetJumpTarget(notFound);
|
||||
@@ -356,13 +356,13 @@ namespace MIPSComp
|
||||
NOT(32, gpr.R(rd));
|
||||
}
|
||||
} else {
|
||||
// Use EAX as a temporary if we'd overwrite it.
|
||||
// Use TEMPREG as a temporary if we'd overwrite it.
|
||||
if (rd == rt)
|
||||
MOV(32, R(EAX), gpr.R(rt));
|
||||
MOV(32, R(TEMPREG), gpr.R(rt));
|
||||
gpr.MapReg(rd, rs == rd, true);
|
||||
if (rs != rd)
|
||||
MOV(32, gpr.R(rd), gpr.R(rs));
|
||||
(this->*arith)(32, gpr.R(rd), rd == rt ? R(EAX) : gpr.R(rt));
|
||||
(this->*arith)(32, gpr.R(rd), rd == rt ? R(TEMPREG) : gpr.R(rt));
|
||||
if (invertResult) {
|
||||
NOT(32, gpr.R(rd));
|
||||
}
|
||||
@@ -485,8 +485,8 @@ namespace MIPSComp
|
||||
bool needsTemp = !HasLowSubregister(gpr.R(rd)) || rd == rt || rd == rs;
|
||||
if (needsTemp) {
|
||||
CMP(32, gpr.R(lhs), gpr.R(rhs));
|
||||
SETcc(cc, R(EAX));
|
||||
MOVZX(32, 8, gpr.RX(rd), R(EAX));
|
||||
SETcc(cc, R(TEMPREG));
|
||||
MOVZX(32, 8, gpr.RX(rd), R(TEMPREG));
|
||||
} else {
|
||||
XOR(32, gpr.R(rd), gpr.R(rd));
|
||||
CMP(32, gpr.R(lhs), gpr.R(rhs));
|
||||
@@ -525,8 +525,8 @@ namespace MIPSComp
|
||||
bool needsTemp = !HasLowSubregister(gpr.R(rd)) || rd == rt || rd == rs;
|
||||
if (needsTemp) {
|
||||
CMP(32, gpr.R(lhs), gpr.R(rhs));
|
||||
SETcc(cc, R(EAX));
|
||||
MOVZX(32, 8, gpr.RX(rd), R(EAX));
|
||||
SETcc(cc, R(TEMPREG));
|
||||
MOVZX(32, 8, gpr.RX(rd), R(TEMPREG));
|
||||
} else {
|
||||
XOR(32, gpr.R(rd), gpr.R(rd));
|
||||
CMP(32, gpr.R(lhs), gpr.R(rhs));
|
||||
@@ -756,13 +756,13 @@ namespace MIPSComp
|
||||
{
|
||||
gpr.Lock(rs, rt);
|
||||
gpr.MapReg(rt, true, true);
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
AND(32, R(EAX), Imm32(sourcemask));
|
||||
MOV(32, R(TEMPREG), gpr.R(rs));
|
||||
AND(32, R(TEMPREG), Imm32(sourcemask));
|
||||
if (pos != 0) {
|
||||
SHL(32, R(EAX), Imm8(pos));
|
||||
SHL(32, R(TEMPREG), Imm8(pos));
|
||||
}
|
||||
AND(32, gpr.R(rt), Imm32(destmask));
|
||||
OR(32, gpr.R(rt), R(EAX));
|
||||
OR(32, gpr.R(rt), R(TEMPREG));
|
||||
gpr.UnlockAll();
|
||||
}
|
||||
}
|
||||
@@ -794,8 +794,8 @@ namespace MIPSComp
|
||||
// Work around the byte-register addressing problem.
|
||||
if (gpr.R(rt).IsSimpleReg() && !HasLowSubregister(gpr.R(rt)))
|
||||
{
|
||||
MOV(32, R(EAX), gpr.R(rt));
|
||||
MOVSX(32, 8, gpr.RX(rd), R(EAX));
|
||||
MOV(32, R(TEMPREG), gpr.R(rt));
|
||||
MOVSX(32, 8, gpr.RX(rd), R(TEMPREG));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -829,31 +829,31 @@ namespace MIPSComp
|
||||
if (rd != rt)
|
||||
MOV(32, gpr.R(rd), gpr.R(rt));
|
||||
|
||||
LEA(32, EAX, MScaled(gpr.RX(rd), 2, 0));
|
||||
LEA(32, TEMPREG, MScaled(gpr.RX(rd), 2, 0));
|
||||
SHR(32, gpr.R(rd), Imm8(1));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
AND(32, gpr.R(rd), Imm32(0x55555555));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
|
||||
LEA(32, EAX, MScaled(gpr.RX(rd), 4, 0));
|
||||
LEA(32, TEMPREG, MScaled(gpr.RX(rd), 4, 0));
|
||||
SHR(32, gpr.R(rd), Imm8(2));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
AND(32, gpr.R(rd), Imm32(0x33333333));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
|
||||
MOV(32, R(EAX), gpr.R(rd));
|
||||
SHL(32, R(EAX), Imm8(4));
|
||||
MOV(32, R(TEMPREG), gpr.R(rd));
|
||||
SHL(32, R(TEMPREG), Imm8(4));
|
||||
SHR(32, gpr.R(rd), Imm8(4));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
AND(32, gpr.R(rd), Imm32(0x0F0F0F0F));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
|
||||
MOV(32, R(EAX), gpr.R(rd));
|
||||
SHL(32, R(EAX), Imm8(8));
|
||||
MOV(32, R(TEMPREG), gpr.R(rd));
|
||||
SHL(32, R(TEMPREG), Imm8(8));
|
||||
SHR(32, gpr.R(rd), Imm8(8));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
AND(32, gpr.R(rd), Imm32(0x00FF00FF));
|
||||
XOR(32, gpr.R(rd), R(EAX));
|
||||
XOR(32, gpr.R(rd), R(TEMPREG));
|
||||
|
||||
ROL(32, gpr.R(rd), Imm8(16));
|
||||
|
||||
@@ -959,6 +959,7 @@ namespace MIPSComp
|
||||
gpr.KillImmediate(MIPS_REG_HI, false, true);
|
||||
gpr.KillImmediate(MIPS_REG_LO, false, true);
|
||||
gpr.KillImmediate(rt, true, false);
|
||||
// Mul, this must be EAX!
|
||||
MOV(32, R(EAX), gpr.R(rs));
|
||||
IMUL(32, gpr.R(rt));
|
||||
MOV(32, gpr.R(MIPS_REG_HI), R(EDX));
|
||||
|
||||
+13
-13
@@ -231,17 +231,17 @@ void Jit::Comp_FPU2op(MIPSOpcode op) {
|
||||
}
|
||||
if (setMXCSR != -1) {
|
||||
STMXCSR(M(&mxcsrTemp));
|
||||
MOV(32, R(EAX), M(&mxcsrTemp));
|
||||
AND(32, R(EAX), Imm32(~(3 << 13)));
|
||||
OR(32, R(EAX), Imm32(setMXCSR << 13));
|
||||
MOV(32, M(&mips_->temp), R(EAX));
|
||||
MOV(32, R(TEMPREG), M(&mxcsrTemp));
|
||||
AND(32, R(TEMPREG), Imm32(~(3 << 13)));
|
||||
OR(32, R(TEMPREG), Imm32(setMXCSR << 13));
|
||||
MOV(32, M(&mips_->temp), R(TEMPREG));
|
||||
LDMXCSR(M(&mips_->temp));
|
||||
}
|
||||
|
||||
(this->*conv)(EAX, fpr.R(fs));
|
||||
(this->*conv)(TEMPREG, fpr.R(fs));
|
||||
|
||||
// Did we get an indefinite integer value?
|
||||
CMP(32, R(EAX), Imm32(0x80000000));
|
||||
CMP(32, R(TEMPREG), Imm32(0x80000000));
|
||||
FixupBranch skip = J_CC(CC_NE);
|
||||
MOVSS(XMM0, fpr.R(fs));
|
||||
XORPS(XMM1, R(XMM1));
|
||||
@@ -249,12 +249,12 @@ void Jit::Comp_FPU2op(MIPSOpcode op) {
|
||||
|
||||
// At this point, -inf = 0xffffffff, inf/nan = 0x00000000.
|
||||
// We want -inf to be 0x80000000 inf/nan to be 0x7fffffff, so we flip those bits.
|
||||
MOVD_xmm(R(EAX), XMM0);
|
||||
XOR(32, R(EAX), Imm32(0x7fffffff));
|
||||
MOVD_xmm(R(TEMPREG), XMM0);
|
||||
XOR(32, R(TEMPREG), Imm32(0x7fffffff));
|
||||
|
||||
SetJumpTarget(skip);
|
||||
fpr.DiscardR(fd);
|
||||
MOV(32, fpr.R(fd), R(EAX));
|
||||
MOV(32, fpr.R(fd), R(TEMPREG));
|
||||
|
||||
if (setMXCSR != -1) {
|
||||
LDMXCSR(M(&mxcsrTemp));
|
||||
@@ -371,10 +371,10 @@ void Jit::Comp_mxc1(MIPSOpcode op) {
|
||||
}
|
||||
} else {
|
||||
AND(32, gpr.R(rt), Imm32(~(1 << 23)));
|
||||
MOV(32, R(EAX), gpr.R(MIPS_REG_FPCOND));
|
||||
AND(32, R(EAX), Imm32(1));
|
||||
SHL(32, R(EAX), Imm8(23));
|
||||
OR(32, gpr.R(rt), R(EAX));
|
||||
MOV(32, R(TEMPREG), gpr.R(MIPS_REG_FPCOND));
|
||||
AND(32, R(TEMPREG), Imm32(1));
|
||||
SHL(32, R(TEMPREG), Imm8(23));
|
||||
OR(32, gpr.R(rt), R(TEMPREG));
|
||||
}
|
||||
gpr.UnlockAll();
|
||||
} else if (fs == 0) {
|
||||
|
||||
+21
-21
@@ -1094,17 +1094,17 @@ void Jit::Comp_Vcmp(MIPSOpcode op) {
|
||||
ANDPS(XMM0, M(vcmpMask[n - 1]));
|
||||
MOVAPS(M(vcmpResult), XMM0);
|
||||
|
||||
MOV(32, R(EAX), M(&vcmpResult[0]));
|
||||
MOV(32, R(TEMPREG), M(&vcmpResult[0]));
|
||||
for (int i = 1; i < n; ++i) {
|
||||
OR(32, R(EAX), M(&vcmpResult[i]));
|
||||
OR(32, R(TEMPREG), M(&vcmpResult[i]));
|
||||
}
|
||||
|
||||
// Aggregate the bits. Urgh, expensive. Can optimize for the case of one comparison,
|
||||
// which is the most common after all.
|
||||
CMP(32, R(EAX), Imm8(affected_bits & 0x1F));
|
||||
CMP(32, R(TEMPREG), Imm8(affected_bits & 0x1F));
|
||||
SETcc(CC_E, R(ECX));
|
||||
SHL(32, R(ECX), Imm8(5));
|
||||
OR(32, R(EAX), R(ECX));
|
||||
OR(32, R(TEMPREG), R(ECX));
|
||||
} else {
|
||||
// Finalize the comparison for ES/NS.
|
||||
if (cond == VC_ES || cond == VC_NS) {
|
||||
@@ -1113,17 +1113,17 @@ void Jit::Comp_Vcmp(MIPSOpcode op) {
|
||||
// It's inversed below for NS.
|
||||
}
|
||||
|
||||
MOVD_xmm(R(EAX), XMM0);
|
||||
MOVD_xmm(R(TEMPREG), XMM0);
|
||||
if (inverse) {
|
||||
XOR(32, R(EAX), Imm32(0xFFFFFFFF));
|
||||
XOR(32, R(TEMPREG), Imm32(0xFFFFFFFF));
|
||||
}
|
||||
AND(32, R(EAX), Imm32(0x31));
|
||||
AND(32, R(TEMPREG), Imm32(0x31));
|
||||
}
|
||||
|
||||
gpr.UnlockAllX();
|
||||
gpr.MapReg(MIPS_REG_VFPUCC, true, true);
|
||||
AND(32, gpr.R(MIPS_REG_VFPUCC), Imm32(~affected_bits));
|
||||
OR(32, gpr.R(MIPS_REG_VFPUCC), R(EAX));
|
||||
OR(32, gpr.R(MIPS_REG_VFPUCC), R(TEMPREG));
|
||||
|
||||
fpr.ReleaseSpillLocks();
|
||||
}
|
||||
@@ -1452,12 +1452,12 @@ void Jit::Comp_Vf2i(MIPSOpcode op) {
|
||||
// Except for truncate, we need to update MXCSR to our preferred rounding mode.
|
||||
if (setMXCSR != -1) {
|
||||
STMXCSR(M(&mxcsrTemp));
|
||||
MOV(32, R(EAX), M(&mxcsrTemp));
|
||||
AND(32, R(EAX), Imm32(~(3 << 13)));
|
||||
MOV(32, R(TEMPREG), M(&mxcsrTemp));
|
||||
AND(32, R(TEMPREG), Imm32(~(3 << 13)));
|
||||
if (setMXCSR != 0) {
|
||||
OR(32, R(EAX), Imm32(setMXCSR << 13));
|
||||
OR(32, R(TEMPREG), Imm32(setMXCSR << 13));
|
||||
}
|
||||
MOV(32, M(&mips_->temp), R(EAX));
|
||||
MOV(32, M(&mips_->temp), R(TEMPREG));
|
||||
LDMXCSR(M(&mips_->temp));
|
||||
}
|
||||
|
||||
@@ -1490,12 +1490,12 @@ void Jit::Comp_Vf2i(MIPSOpcode op) {
|
||||
MAXSD(XMM0, M(&minIntAsDouble));
|
||||
// We've set the rounding mode above, so this part's easy.
|
||||
switch ((op >> 21) & 0x1f) {
|
||||
case 16: CVTSD2SI(EAX, R(XMM0)); break; //n
|
||||
case 17: CVTTSD2SI(EAX, R(XMM0)); break; //z - truncate
|
||||
case 18: CVTSD2SI(EAX, R(XMM0)); break; //u
|
||||
case 19: CVTSD2SI(EAX, R(XMM0)); break; //d
|
||||
case 16: CVTSD2SI(TEMPREG, R(XMM0)); break; //n
|
||||
case 17: CVTTSD2SI(TEMPREG, R(XMM0)); break; //z - truncate
|
||||
case 18: CVTSD2SI(TEMPREG, R(XMM0)); break; //u
|
||||
case 19: CVTSD2SI(TEMPREG, R(XMM0)); break; //d
|
||||
}
|
||||
MOVD_xmm(fpr.VX(tempregs[i]), R(EAX));
|
||||
MOVD_xmm(fpr.VX(tempregs[i]), R(TEMPREG));
|
||||
}
|
||||
|
||||
for (int i = 0; i < n; ++i) {
|
||||
@@ -2471,9 +2471,9 @@ void Jit::Comp_Viim(MIPSOpcode op) {
|
||||
s32 imm = (s32)(s16)(u16)(op & 0xFFFF);
|
||||
FP32 fp;
|
||||
fp.f = (float)imm;
|
||||
MOV(32, R(EAX), Imm32(fp.u));
|
||||
MOV(32, R(TEMPREG), Imm32(fp.u));
|
||||
fpr.MapRegV(dreg, MAP_DIRTY | MAP_NOINIT);
|
||||
MOVD_xmm(fpr.VX(dreg), R(EAX));
|
||||
MOVD_xmm(fpr.VX(dreg), R(TEMPREG));
|
||||
|
||||
ApplyPrefixD(&dreg, V_Single);
|
||||
fpr.ReleaseSpillLocks();
|
||||
@@ -2491,9 +2491,9 @@ void Jit::Comp_Vfim(MIPSOpcode op) {
|
||||
FP16 half;
|
||||
half.u = op & 0xFFFF;
|
||||
FP32 fval = half_to_float_fast5(half);
|
||||
MOV(32, R(EAX), Imm32(fval.u));
|
||||
MOV(32, R(TEMPREG), Imm32(fval.u));
|
||||
fpr.MapRegV(dreg, MAP_DIRTY | MAP_NOINIT);
|
||||
MOVD_xmm(fpr.VX(dreg), R(EAX));
|
||||
MOVD_xmm(fpr.VX(dreg), R(TEMPREG));
|
||||
|
||||
ApplyPrefixD(&dreg, V_Single);
|
||||
fpr.ReleaseSpillLocks();
|
||||
|
||||
@@ -37,6 +37,9 @@ using namespace Gen;
|
||||
#define CTXREG EBP
|
||||
#endif
|
||||
|
||||
// This must be one of EAX, EBX, ECX, EDX as they have 8-bit subregisters.
|
||||
#define TEMPREG EAX
|
||||
|
||||
struct MIPSCachedReg {
|
||||
OpArg location;
|
||||
bool away; // value not in source register
|
||||
|
||||
Reference in New Issue
Block a user