Chromium Code Reviews| 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)) { |