Index: runtime/vm/assembler_x64.cc |
=================================================================== |
--- runtime/vm/assembler_x64.cc (revision 36182) |
+++ runtime/vm/assembler_x64.cc (working copy) |
@@ -2363,11 +2363,14 @@ |
void Assembler::AddImmediate(Register reg, const Immediate& imm, Register pp) { |
- int64_t value = imm.value(); |
- if (value > 0) { |
+ const int64_t value = imm.value(); |
+ if (value == 0) { |
+ return; |
+ } |
+ if ((value > 0) || (value == kMinInt64)) { |
if (value == 1) { |
incq(reg); |
- } else if (value != 0) { |
+ } else { |
if (CanLoadImmediateFromPool(imm, pp)) { |
ASSERT(reg != TMP); |
LoadImmediate(TMP, imm, pp); |
@@ -2376,31 +2379,22 @@ |
addq(reg, imm); |
} |
} |
- } else if (value < 0) { |
- value = -value; |
- if (value == 1) { |
- decq(reg); |
- } else if (value != 0) { |
- const Immediate& s = Immediate(value); |
- if (CanLoadImmediateFromPool(s, pp)) { |
- ASSERT(reg != TMP); |
- LoadImmediate(TMP, s, pp); |
- subq(reg, TMP); |
- } else { |
- subq(reg, Immediate(value)); |
- } |
- } |
+ } else { |
+ SubImmediate(reg, Immediate(-value), pp); |
} |
} |
void Assembler::AddImmediate(const Address& address, const Immediate& imm, |
Register pp) { |
- int64_t value = imm.value(); |
- if (value > 0) { |
+ const int64_t value = imm.value(); |
+ if (value == 0) { |
+ return; |
+ } |
+ if ((value > 0) || (value == kMinInt64)) { |
if (value == 1) { |
incq(address); |
- } else if (value != 0) { |
+ } else { |
if (CanLoadImmediateFromPool(imm, pp)) { |
LoadImmediate(TMP, imm, pp); |
addq(address, TMP); |
@@ -2408,19 +2402,54 @@ |
addq(address, imm); |
} |
} |
- } else if (value < 0) { |
- value = -value; |
+ } else { |
+ SubImmediate(address, Immediate(-value), pp); |
+ } |
+} |
+ |
+ |
+void Assembler::SubImmediate(Register reg, const Immediate& imm, Register pp) { |
+ const int64_t value = imm.value(); |
+ if (value == 0) { |
+ return; |
+ } |
+ if ((value > 0) || (value == kMinInt64)) { |
if (value == 1) { |
+ decq(reg); |
+ } else { |
+ if (CanLoadImmediateFromPool(imm, pp)) { |
+ ASSERT(reg != TMP); |
+ LoadImmediate(TMP, imm, pp); |
+ subq(reg, TMP); |
+ } else { |
+ subq(reg, imm); |
+ } |
+ } |
+ } else { |
+ AddImmediate(reg, Immediate(-value), pp); |
+ } |
+} |
+ |
+ |
+void Assembler::SubImmediate(const Address& address, const Immediate& imm, |
+ Register pp) { |
+ const int64_t value = imm.value(); |
+ if (value == 0) { |
+ return; |
+ } |
+ if ((value > 0) || (value == kMinInt64)) { |
+ if (value == 1) { |
decq(address); |
- } else if (value != 0) { |
- const Immediate& s = Immediate(value); |
- if (CanLoadImmediateFromPool(s, pp)) { |
- LoadImmediate(TMP, s, pp); |
+ } else { |
+ if (CanLoadImmediateFromPool(imm, pp)) { |
+ LoadImmediate(TMP, imm, pp); |
subq(address, TMP); |
} else { |
- subq(address, s); |
+ subq(address, imm); |
} |
} |
+ } else { |
+ AddImmediate(address, Immediate(-value), pp); |
} |
} |