Index: runtime/vm/assembler_arm64.cc |
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc |
index 72278e967a219aeda1961063fdf09d5000085159..dde11c270453b2743cd3aa3507cbf1be94570781 100644 |
--- a/runtime/vm/assembler_arm64.cc |
+++ b/runtime/vm/assembler_arm64.cc |
@@ -682,6 +682,24 @@ void Assembler::SubImmediateSetFlags(Register dest, Register rn, int64_t imm) { |
} |
+void Assembler::SubImmediate(Register dest, Register rn, int64_t imm) { |
regis
2016/10/08 09:10:37
Same comment as for arm.
Vyacheslav Egorov (Google)
2016/10/24 20:23:03
Done.
|
+ Operand op; |
+ if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) { |
+ // Handles imm == kMinInt64. |
+ sub(dest, rn, op); |
+ } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) == |
+ Operand::Immediate) { |
+ ASSERT(imm != kMinInt64); // Would cause erroneous overflow detection. |
+ add(dest, rn, op); |
+ } else { |
+ // TODO(zra): Try subtracting top 12 bits, then bottom 12 bits. |
+ ASSERT(rn != TMP2); |
+ LoadImmediate(TMP2, imm); |
+ sub(dest, rn, Operand(TMP2)); |
+ } |
+} |
+ |
+ |
void Assembler::AndImmediate(Register rd, Register rn, int64_t imm) { |
Operand imm_op; |
if (Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op)) { |