Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 902e507258c6c722c829c244df0c1e17be632620..0ea706063fd0aa7392b1859ea2ede58d0f7611da 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -11066,10 +11066,57 @@ HValue* HGraphBuilder::BuildBinaryOperation( |
// inline several instructions (including the two pushes) for every tagged |
// operation in optimized code, which is more expensive, than a stub call. |
if (graph()->info()->IsStub() && is_non_primitive) { |
- HValue* function = |
- AddLoadJSBuiltin(BinaryOpIC::TokenToContextIndex(op, strength)); |
+ Runtime::FunctionId function_id; |
+ switch (op) { |
+ default: |
+ UNREACHABLE(); |
Michael Starzinger
2015/09/10 11:43:24
Sneaky fall-through to convince compiler that func
|
+ case Token::ADD: |
+ function_id = |
+ is_strong(strength) ? Runtime::kAdd_Strong : Runtime::kAdd; |
+ break; |
+ case Token::SUB: |
+ function_id = is_strong(strength) ? Runtime::kSubtract_Strong |
+ : Runtime::kSubtract; |
+ break; |
+ case Token::MUL: |
+ function_id = is_strong(strength) ? Runtime::kMultiply_Strong |
+ : Runtime::kMultiply; |
+ break; |
+ case Token::DIV: |
+ function_id = |
+ is_strong(strength) ? Runtime::kDivide_Strong : Runtime::kDivide; |
+ break; |
+ case Token::MOD: |
+ function_id = |
+ is_strong(strength) ? Runtime::kModulus_Strong : Runtime::kModulus; |
+ break; |
+ case Token::BIT_OR: |
+ function_id = is_strong(strength) ? Runtime::kBitwiseOr_Strong |
+ : Runtime::kBitwiseOr; |
+ break; |
+ case Token::BIT_AND: |
+ function_id = is_strong(strength) ? Runtime::kBitwiseAnd_Strong |
+ : Runtime::kBitwiseAnd; |
+ break; |
+ case Token::BIT_XOR: |
+ function_id = is_strong(strength) ? Runtime::kBitwiseXor_Strong |
+ : Runtime::kBitwiseXor; |
+ break; |
+ case Token::SAR: |
+ function_id = is_strong(strength) ? Runtime::kShiftRight_Strong |
+ : Runtime::kShiftRight; |
+ break; |
+ case Token::SHR: |
+ function_id = is_strong(strength) ? Runtime::kShiftRightLogical_Strong |
+ : Runtime::kShiftRightLogical; |
+ break; |
+ case Token::SHL: |
+ function_id = is_strong(strength) ? Runtime::kShiftLeft_Strong |
+ : Runtime::kShiftLeft; |
+ break; |
+ } |
Add<HPushArguments>(left, right); |
- instr = AddUncasted<HInvokeFunction>(function, 2); |
+ instr = AddUncasted<HCallRuntime>(Runtime::FunctionForId(function_id), 2); |
} else { |
if (is_strong(strength) && Token::IsBitOp(op)) { |
// TODO(conradw): This is not efficient, but is necessary to prevent |
@@ -11119,7 +11166,7 @@ HValue* HGraphBuilder::BuildBinaryOperation( |
instr = AddUncasted<HBitwise>(op, left, right, strength); |
break; |
case Token::BIT_OR: { |
- HValue* operand, *shift_amount; |
+ HValue *operand, *shift_amount; |
if (left_type->Is(Type::Signed32()) && |
right_type->Is(Type::Signed32()) && |
MatchRotateRight(left, right, &operand, &shift_amount)) { |