Chromium Code Reviews| Index: runtime/vm/assembler_arm64.cc |
| =================================================================== |
| --- runtime/vm/assembler_arm64.cc (revision 36182) |
| +++ runtime/vm/assembler_arm64.cc (working copy) |
| @@ -684,6 +684,12 @@ |
| void Assembler::AddImmediate( |
| Register dest, Register rn, int64_t imm, Register pp) { |
| Operand op; |
| + if (imm == 0) { |
| + if (dest != rn) { |
| + mov(dest, rn); |
| + } |
| + return; |
| + } |
| if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) { |
| add(dest, rn, op); |
| } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) == |
| @@ -705,6 +711,7 @@ |
| adds(dest, rn, op); |
| } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) == |
| Operand::Immediate) { |
| + ASSERT(imm != kMinInt64); // Would cause erroneous overflow detection. |
| subs(dest, rn, op); |
| } else { |
|
zra
2014/05/14 19:40:55
ASSERT(imm != kMinInt64);
regis
2014/05/14 19:54:53
It would not be a problem here, since we emit an a
|
| // TODO(zra): Try adding top 12 bits, then bottom 12 bits. |
| @@ -715,6 +722,24 @@ |
| } |
| +void Assembler::SubImmediateSetFlags( |
| + Register dest, Register rn, int64_t imm, Register pp) { |
| + Operand op; |
| + if (Operand::CanHold(imm, kXRegSizeInBits, &op) == Operand::Immediate) { |
|
zra
2014/05/14 19:40:55
ditto
regis
2014/05/14 19:54:53
Done.
|
| + subs(dest, rn, op); |
| + } else if (Operand::CanHold(-imm, kXRegSizeInBits, &op) == |
| + Operand::Immediate) { |
| + ASSERT(imm != kMinInt64); // Would cause erroneous overflow detection. |
| + adds(dest, rn, op); |
| + } else { |
|
zra
2014/05/14 19:40:55
ASSERT(imm != kMinInt64);
regis
2014/05/14 19:54:53
It would not be a problem here, since we emit a su
|
| + // TODO(zra): Try subtracting top 12 bits, then bottom 12 bits. |
| + ASSERT(rn != TMP2); |
| + LoadImmediate(TMP2, imm, pp); |
| + subs(dest, rn, Operand(TMP2)); |
| + } |
| +} |
| + |
| + |
| void Assembler::AndImmediate( |
| Register rd, Register rn, int64_t imm, Register pp) { |
| Operand imm_op; |