Jit64: divwx - Micro-optimize division by 2
Prefer using eax to isolate the sign bit. This saves a byte when the destination ends up as r8-15, because those require a REX prefix. Before: 41 8B C5 mov eax,r13d 41 C1 ED 1F shr r13d,1Fh 44 03 E8 add r13d,eax 41 D1 FD sar r13d,1 After: 41 8B C5 mov eax,r13d C1 E8 1F shr eax,1Fh 44 03 E8 add r13d,eax 41 D1 FD sar r13d,1
This commit is contained in:
parent
f18f6cd0a2
commit
dfb32040bf
|
@ -1494,6 +1494,8 @@ void Jit64::divwx(UGeckoInstruction inst)
|
||||||
else if (divisor == 2 || divisor == -2)
|
else if (divisor == 2 || divisor == -2)
|
||||||
{
|
{
|
||||||
X64Reg tmp = RSCRATCH;
|
X64Reg tmp = RSCRATCH;
|
||||||
|
X64Reg sign = tmp;
|
||||||
|
|
||||||
if (!Ra.IsSimpleReg())
|
if (!Ra.IsSimpleReg())
|
||||||
{
|
{
|
||||||
// Load dividend from memory
|
// Load dividend from memory
|
||||||
|
@ -1510,9 +1512,10 @@ void Jit64::divwx(UGeckoInstruction inst)
|
||||||
// Copy dividend directly into destination
|
// Copy dividend directly into destination
|
||||||
MOV(32, Rd, Ra);
|
MOV(32, Rd, Ra);
|
||||||
tmp = Ra.GetSimpleReg();
|
tmp = Ra.GetSimpleReg();
|
||||||
|
sign = Rd;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHR(32, Rd, Imm8(31));
|
SHR(32, R(sign), Imm8(31));
|
||||||
ADD(32, Rd, R(tmp));
|
ADD(32, Rd, R(tmp));
|
||||||
SAR(32, Rd, Imm8(1));
|
SAR(32, Rd, Imm8(1));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue