| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 51ae7f5a44c29fc4b69f66651b95fcfef7a6f2fa..b74a5984beacf2964dd0d5ef31f330b773089aec 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -8282,6 +8282,24 @@ bool CanBeZero(HValue *right) {
|
| }
|
|
|
|
|
| +bool HGraphBuilder::MatchMultiplyAdd(HValue* left, HValue* right, HValue** a,
|
| + HValue** b, HValue** c) {
|
| + if (right->IsMul()) {
|
| + HValue *tmp = left;
|
| + left = right;
|
| + right = tmp;
|
| + }
|
| + if (!left->IsMul())
|
| + return false;
|
| +
|
| + HMul* mul = HMul::cast(left);
|
| + *a = mul->left();
|
| + *b = mul->right();
|
| + *c = right;
|
| + return true;
|
| +}
|
| +
|
| +
|
| HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr,
|
| HValue* left,
|
| HValue* right) {
|
| @@ -8294,17 +8312,21 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr,
|
| }
|
| HInstruction* instr = NULL;
|
| switch (expr->op()) {
|
| - case Token::ADD:
|
| + case Token::ADD: {
|
| + HValue* a, *b, *c;
|
| if (info.IsString()) {
|
| AddInstruction(new(zone()) HCheckNonSmi(left));
|
| AddInstruction(HCheckInstanceType::NewIsString(left, zone()));
|
| AddInstruction(new(zone()) HCheckNonSmi(right));
|
| AddInstruction(HCheckInstanceType::NewIsString(right, zone()));
|
| instr = new(zone()) HStringAdd(context, left, right);
|
| + } else if (info.IsDouble() && MatchMultiplyAdd(left, right, &a, &b, &c)) {
|
| + instr = new(zone()) HMultiplyAddD(context, a, b, c);
|
| } else {
|
| instr = HAdd::NewHAdd(zone(), context, left, right);
|
| }
|
| break;
|
| + }
|
| case Token::SUB:
|
| instr = HSub::NewHSub(zone(), context, left, right);
|
| break;
|
|
|