mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-09 15:49:25 +01:00
JitArm64: Use BIC/EON/ORN in crXXX
This lets us save an instruction in certain scenarios.
This commit is contained in:
parent
9246bcad55
commit
71e9766519
@ -636,10 +636,8 @@ void JitArm64::crXXX(UGeckoInstruction inst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// crandc or crorc
|
// crnor or crnand
|
||||||
const bool negate_b = inst.SUBOP10 == 129 || inst.SUBOP10 == 417;
|
const bool negate_result = inst.SUBOP10 == 33 || inst.SUBOP10 == 225;
|
||||||
// crnor or crnand or creqv
|
|
||||||
const bool negate_result = inst.SUBOP10 == 33 || inst.SUBOP10 == 225 || inst.SUBOP10 == 289;
|
|
||||||
|
|
||||||
auto WA = gpr.GetScopedReg();
|
auto WA = gpr.GetScopedReg();
|
||||||
ARM64Reg XA = EncodeRegTo64(WA);
|
ARM64Reg XA = EncodeRegTo64(WA);
|
||||||
@ -648,27 +646,36 @@ void JitArm64::crXXX(UGeckoInstruction inst)
|
|||||||
ARM64Reg XB = EncodeRegTo64(WB);
|
ARM64Reg XB = EncodeRegTo64(WB);
|
||||||
|
|
||||||
GetCRFieldBit(inst.CRBA >> 2, 3 - (inst.CRBA & 3), XA, false);
|
GetCRFieldBit(inst.CRBA >> 2, 3 - (inst.CRBA & 3), XA, false);
|
||||||
GetCRFieldBit(inst.CRBB >> 2, 3 - (inst.CRBB & 3), XB, negate_b);
|
GetCRFieldBit(inst.CRBB >> 2, 3 - (inst.CRBB & 3), XB, false);
|
||||||
|
|
||||||
// Compute combined bit
|
// Compute combined bit
|
||||||
switch (inst.SUBOP10)
|
switch (inst.SUBOP10)
|
||||||
{
|
{
|
||||||
case 129: // crandc: A && ~B
|
|
||||||
case 225: // crnand: ~(A && B)
|
case 225: // crnand: ~(A && B)
|
||||||
case 257: // crand: A && B
|
case 257: // crand: A && B
|
||||||
AND(XA, XA, XB);
|
AND(XA, XA, XB);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 129: // crandc: A && ~B
|
||||||
|
BIC(XA, XA, XB);
|
||||||
|
break;
|
||||||
|
|
||||||
case 193: // crxor: A ^ B
|
case 193: // crxor: A ^ B
|
||||||
case 289: // creqv: ~(A ^ B)
|
|
||||||
EOR(XA, XA, XB);
|
EOR(XA, XA, XB);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 289: // creqv: ~(A ^ B) = A ^ ~B
|
||||||
|
EON(XA, XA, XB);
|
||||||
|
break;
|
||||||
|
|
||||||
case 33: // crnor: ~(A || B)
|
case 33: // crnor: ~(A || B)
|
||||||
case 417: // crorc: A || ~B
|
|
||||||
case 449: // cror: A || B
|
case 449: // cror: A || B
|
||||||
ORR(XA, XA, XB);
|
ORR(XA, XA, XB);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 417: // crorc: A || ~B
|
||||||
|
ORN(XA, XA, XB);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user