| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 8264 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8275     HConstant* right_const = HConstant::cast(right); | 8275     HConstant* right_const = HConstant::cast(right); | 
| 8276     if (right_const->HasInteger32Value() && | 8276     if (right_const->HasInteger32Value() && | 
| 8277        (right_const->Integer32Value() & 0x1f) != 0) { | 8277        (right_const->Integer32Value() & 0x1f) != 0) { | 
| 8278       return false; | 8278       return false; | 
| 8279     } | 8279     } | 
| 8280   } | 8280   } | 
| 8281   return true; | 8281   return true; | 
| 8282 } | 8282 } | 
| 8283 | 8283 | 
| 8284 | 8284 | 
|  | 8285 bool HGraphBuilder::MatchMultiplyAdd(HValue* left, HValue* right, HValue** a, | 
|  | 8286                                      HValue** b, HValue** c) { | 
|  | 8287   if (right->IsMul()) { | 
|  | 8288     HValue *tmp = left; | 
|  | 8289     left = right; | 
|  | 8290     right = tmp; | 
|  | 8291   } | 
|  | 8292   if (!left->IsMul()) | 
|  | 8293     return false; | 
|  | 8294 | 
|  | 8295   HMul* mul = HMul::cast(left); | 
|  | 8296   *a = mul->left(); | 
|  | 8297   *b = mul->right(); | 
|  | 8298   *c = right; | 
|  | 8299   return true; | 
|  | 8300 } | 
|  | 8301 | 
|  | 8302 | 
| 8285 HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, | 8303 HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, | 
| 8286                                                   HValue* left, | 8304                                                   HValue* left, | 
| 8287                                                   HValue* right) { | 8305                                                   HValue* right) { | 
| 8288   HValue* context = environment()->LookupContext(); | 8306   HValue* context = environment()->LookupContext(); | 
| 8289   TypeInfo info = oracle()->BinaryType(expr); | 8307   TypeInfo info = oracle()->BinaryType(expr); | 
| 8290   if (info.IsUninitialized()) { | 8308   if (info.IsUninitialized()) { | 
| 8291     AddInstruction(new(zone()) HSoftDeoptimize); | 8309     AddInstruction(new(zone()) HSoftDeoptimize); | 
| 8292     current_block()->MarkAsDeoptimizing(); | 8310     current_block()->MarkAsDeoptimizing(); | 
| 8293     info = TypeInfo::Unknown(); | 8311     info = TypeInfo::Unknown(); | 
| 8294   } | 8312   } | 
| 8295   HInstruction* instr = NULL; | 8313   HInstruction* instr = NULL; | 
| 8296   switch (expr->op()) { | 8314   switch (expr->op()) { | 
| 8297     case Token::ADD: | 8315     case Token::ADD: { | 
|  | 8316       HValue* a, *b, *c; | 
| 8298       if (info.IsString()) { | 8317       if (info.IsString()) { | 
| 8299         AddInstruction(new(zone()) HCheckNonSmi(left)); | 8318         AddInstruction(new(zone()) HCheckNonSmi(left)); | 
| 8300         AddInstruction(HCheckInstanceType::NewIsString(left, zone())); | 8319         AddInstruction(HCheckInstanceType::NewIsString(left, zone())); | 
| 8301         AddInstruction(new(zone()) HCheckNonSmi(right)); | 8320         AddInstruction(new(zone()) HCheckNonSmi(right)); | 
| 8302         AddInstruction(HCheckInstanceType::NewIsString(right, zone())); | 8321         AddInstruction(HCheckInstanceType::NewIsString(right, zone())); | 
| 8303         instr = new(zone()) HStringAdd(context, left, right); | 8322         instr = new(zone()) HStringAdd(context, left, right); | 
|  | 8323       } else if (info.IsDouble() && MatchMultiplyAdd(left, right, &a, &b, &c)) { | 
|  | 8324         instr = new(zone()) HMultiplyAddD(context, a, b, c); | 
| 8304       } else { | 8325       } else { | 
| 8305         instr = HAdd::NewHAdd(zone(), context, left, right); | 8326         instr = HAdd::NewHAdd(zone(), context, left, right); | 
| 8306       } | 8327       } | 
| 8307       break; | 8328       break; | 
|  | 8329     } | 
| 8308     case Token::SUB: | 8330     case Token::SUB: | 
| 8309       instr = HSub::NewHSub(zone(), context, left, right); | 8331       instr = HSub::NewHSub(zone(), context, left, right); | 
| 8310       break; | 8332       break; | 
| 8311     case Token::MUL: | 8333     case Token::MUL: | 
| 8312       instr = HMul::NewHMul(zone(), context, left, right); | 8334       instr = HMul::NewHMul(zone(), context, left, right); | 
| 8313       break; | 8335       break; | 
| 8314     case Token::MOD: | 8336     case Token::MOD: | 
| 8315       instr = HMod::NewHMod(zone(), context, left, right); | 8337       instr = HMod::NewHMod(zone(), context, left, right); | 
| 8316       break; | 8338       break; | 
| 8317     case Token::DIV: | 8339     case Token::DIV: | 
| (...skipping 1693 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 10011     } | 10033     } | 
| 10012   } | 10034   } | 
| 10013 | 10035 | 
| 10014 #ifdef DEBUG | 10036 #ifdef DEBUG | 
| 10015   if (graph_ != NULL) graph_->Verify(false);  // No full verify. | 10037   if (graph_ != NULL) graph_->Verify(false);  // No full verify. | 
| 10016   if (allocator_ != NULL) allocator_->Verify(); | 10038   if (allocator_ != NULL) allocator_->Verify(); | 
| 10017 #endif | 10039 #endif | 
| 10018 } | 10040 } | 
| 10019 | 10041 | 
| 10020 } }  // namespace v8::internal | 10042 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|