Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 0a28d343bac887ccdeb673f9b8ea4180e05da031..204a15586c6fb71d886d8326c3a9a2b2661397c5 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -1619,6 +1619,27 @@ void LCodeGen::DoSubI(LSubI* instr) { |
} |
+void LCodeGen::DoRSubI(LRSubI* instr) { |
+ LOperand* left = instr->left(); |
+ LOperand* right = instr->right(); |
+ LOperand* result = instr->result(); |
+ bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); |
+ SBit set_cond = can_overflow ? SetCC : LeaveCC; |
+ |
+ if (right->IsStackSlot() || right->IsArgument()) { |
+ Register right_reg = EmitLoadRegister(right, ip); |
+ __ rsb(ToRegister(result), ToRegister(left), Operand(right_reg), set_cond); |
+ } else { |
+ ASSERT(right->IsRegister() || right->IsConstantOperand()); |
+ __ rsb(ToRegister(result), ToRegister(left), ToOperand(right), set_cond); |
+ } |
+ |
+ if (can_overflow) { |
+ DeoptimizeIf(vs, instr->environment()); |
+ } |
+} |
+ |
+ |
void LCodeGen::DoConstantI(LConstantI* instr) { |
ASSERT(instr->result()->IsRegister()); |
__ mov(ToRegister(instr->result()), Operand(instr->value())); |