Index: runtime/vm/intermediate_language_arm.cc |
=================================================================== |
--- runtime/vm/intermediate_language_arm.cc (revision 38266) |
+++ runtime/vm/intermediate_language_arm.cc (working copy) |
@@ -6130,9 +6130,26 @@ |
} |
break; |
} |
- default: |
- UNREACHABLE(); |
- break; |
+ case Token::kMUL: { |
+ // We only support the multiplication of two positive 32-bit integers |
+ // resulting in a positive 64-bit integer fitting in a mint. |
+ // We deopt in all other cases. |
+ // This guarantees that the multiplication of 16-bit unsigned integers, |
+ // as used in bignum arithmetic, will always succeed. |
+ if (TargetCPUFeatures::arm_version() == ARMv7) { |
+ __ orrs(out_hi, left_hi, Operand(right_hi)); |
+ __ b(deopt, NE); |
+ __ smull(out_lo, out_hi, left_lo, right_lo); |
Vyacheslav Egorov (Google)
2014/07/16 23:51:35
should not this be umul given that we look at hi?
regis
2014/07/18 02:44:56
You are right. This should have been an unsigned m
Vyacheslav Egorov (Google)
2014/07/18 11:15:34
Well this particular case would not call a deopt r
|
+ if (can_overflow()) { |
+ __ TestImmediate(out_hi, 0xC0000000); |
+ __ b(deopt, NE); |
+ } |
+ } else { |
+ __ b(deopt); |
+ } |
+ break; |
+ } |
+ default: UNREACHABLE(); |
} |
if (FLAG_throw_on_javascript_int_overflow) { |
EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi); |
@@ -6316,22 +6333,34 @@ |
Register right = locs()->in(1).reg(); |
Register out = locs()->out(0).reg(); |
ASSERT(out != left); |
+ Label* deopt = CanDeoptimize() ? |
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryUint32Op) : NULL; |
switch (op_kind()) { |
case Token::kBIT_AND: |
__ and_(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kBIT_OR: |
__ orr(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kBIT_XOR: |
__ eor(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kADD: |
__ add(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kSUB: |
__ sub(out, left, Operand(right)); |
- break; |
+ break; |
+ case Token::kMUL: { |
+ if (TargetCPUFeatures::arm_version() == ARMv7) { |
+ __ smull(out, IP, left, right); |
Cutch
2014/07/16 18:09:48
Have you tested this code path?
regis
2014/07/16 23:12:42
Yes, I have ran all the tests, including the RSA b
|
+ __ TestImmediate(IP, 0xC0000000); |
+ __ b(deopt, NE); |
+ } else { |
+ __ b(deopt); |
+ } |
+ break; |
+ } |
default: |
UNREACHABLE(); |
} |