ARM64: Better recognition of constants encodable as immediates.

When the right-hand side input is a constant, VIXL will automatically
switch between add and sub (or between similar pairs of instructions).

Change-Id: Icf05237b8653c409618f44e45049df87baf0f4c6
diff --git a/compiler/optimizing/common_arm64.h b/compiler/optimizing/common_arm64.h
index f545475..4abe5e9 100644
--- a/compiler/optimizing/common_arm64.h
+++ b/compiler/optimizing/common_arm64.h
@@ -206,7 +206,9 @@
   if (instr->IsAdd() || instr->IsSub() || instr->IsCondition() ||
       instr->IsCompare() || instr->IsBoundsCheck()) {
     // Uses aliases of ADD/SUB instructions.
-    return vixl::Assembler::IsImmAddSub(value);
+    // If `value` does not fit but `-value` does, VIXL will automatically use
+    // the 'opposite' instruction.
+    return vixl::Assembler::IsImmAddSub(value) || vixl::Assembler::IsImmAddSub(-value);
   } else if (instr->IsAnd() || instr->IsOr() || instr->IsXor()) {
     // Uses logical operations.
     return vixl::Assembler::IsImmLogical(value, vixl::kXRegSize);