|
|
@@ -12,7 +12,6 @@ namespace ARMeilleure.CodeGen.Optimizations
|
|
|
switch (operation.Instruction)
|
|
|
{
|
|
|
case Instruction.Add:
|
|
|
- case Instruction.BitwiseExclusiveOr:
|
|
|
TryEliminateBinaryOpComutative(operation, 0);
|
|
|
break;
|
|
|
|
|
|
@@ -24,6 +23,10 @@ namespace ARMeilleure.CodeGen.Optimizations
|
|
|
TryEliminateBitwiseOr(operation);
|
|
|
break;
|
|
|
|
|
|
+ case Instruction.BitwiseExclusiveOr:
|
|
|
+ TryEliminateBitwiseExclusiveOr(operation);
|
|
|
+ break;
|
|
|
+
|
|
|
case Instruction.ConditionalSelect:
|
|
|
TryEliminateConditionalSelect(operation);
|
|
|
break;
|
|
|
@@ -89,6 +92,24 @@ namespace ARMeilleure.CodeGen.Optimizations
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private static void TryEliminateBitwiseExclusiveOr(Operation operation)
|
|
|
+ {
|
|
|
+ // Try to recognize and optimize those 2 patterns (in order):
|
|
|
+ // x ^ y == 0x00000000 when x == y
|
|
|
+ // 0x00000000 ^ y == y, x ^ 0x00000000 == x
|
|
|
+ Operand x = operation.GetSource(0);
|
|
|
+ Operand y = operation.GetSource(1);
|
|
|
+
|
|
|
+ if (x == y && x.Type.IsInteger())
|
|
|
+ {
|
|
|
+ operation.TurnIntoCopy(Const(x.Type, 0));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TryEliminateBinaryOpComutative(operation, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private static void TryEliminateBinaryOpY(Operation operation, ulong comparand)
|
|
|
{
|
|
|
Operand x = operation.GetSource(0);
|