Index: runtime/vm/assembler_arm.cc |
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc |
index e768806218f9d0692675e28bcf3fffddfdc1c0e4..f1b49f03ce34d49ee7c1a29f4a1db87a64795dcd 100644 |
--- a/runtime/vm/assembler_arm.cc |
+++ b/runtime/vm/assembler_arm.cc |
@@ -3017,6 +3017,32 @@ void Assembler::SubImmediateSetFlags(Register rd, Register rn, int32_t value, |
} |
+void Assembler::SubImmediate(Register rd, Register rn, int32_t value, |
+ Condition cond) { |
regis
2016/10/08 09:10:37
Why do you need this new flavor? Since you are not
Vyacheslav Egorov (Google)
2016/10/24 20:23:02
Done.
|
+ Operand o; |
+ if (Operand::CanHold(value, &o)) { |
+ // Handles value == kMinInt32. |
+ sub(rd, rn, o, cond); |
+ } else if (Operand::CanHold(-value, &o)) { |
+ ASSERT(value != kMinInt32); // Would cause erroneous overflow detection. |
+ add(rd, rn, o, cond); |
+ } else { |
+ ASSERT(rn != IP); |
+ if (Operand::CanHold(~value, &o)) { |
+ mvn(IP, o, cond); |
+ sub(rd, rn, Operand(IP), cond); |
+ } else if (Operand::CanHold(~(-value), &o)) { |
+ ASSERT(value != kMinInt32); // Would cause erroneous overflow detection. |
+ mvn(IP, o, cond); |
+ add(rd, rn, Operand(IP), cond); |
+ } else { |
+ LoadDecodableImmediate(IP, value, cond); |
+ sub(rd, rn, Operand(IP), cond); |
+ } |
+ } |
+} |
+ |
+ |
void Assembler::AndImmediate(Register rd, Register rs, int32_t imm, |
Condition cond) { |
Operand o; |