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, HV alue** b, HValue** c) { | |
8286 if (right->IsMul()) { | |
8287 HValue *tmp = left; | |
8288 left = right; | |
8289 right = tmp; | |
8290 } | |
8291 if (!left->IsMul()) | |
8292 return false; | |
8293 | |
8294 HMul* mul = HMul::cast(left); | |
8295 *a = mul->left(); | |
8296 *b = mul->right(); | |
8297 *c = right; | |
8298 //printf("matched multiply-add\n"); | |
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 #ifdef V8_TARGET_ARCH_ARM | |
8317 HValue* a, *b, *c; | |
8318 #endif | |
8298 if (info.IsString()) { | 8319 if (info.IsString()) { |
8299 AddInstruction(new(zone()) HCheckNonSmi(left)); | 8320 AddInstruction(new(zone()) HCheckNonSmi(left)); |
8300 AddInstruction(HCheckInstanceType::NewIsString(left, zone())); | 8321 AddInstruction(HCheckInstanceType::NewIsString(left, zone())); |
8301 AddInstruction(new(zone()) HCheckNonSmi(right)); | 8322 AddInstruction(new(zone()) HCheckNonSmi(right)); |
8302 AddInstruction(HCheckInstanceType::NewIsString(right, zone())); | 8323 AddInstruction(HCheckInstanceType::NewIsString(right, zone())); |
8303 instr = new(zone()) HStringAdd(context, left, right); | 8324 instr = new(zone()) HStringAdd(context, left, right); |
8325 #ifdef V8_TARGET_ARCH_ARM | |
8326 } else if (info.IsDouble() && MatchMultiplyAdd(left, right, &a, &b, &c)) { | |
8327 // FIXME: Probably need to check types here? | |
ulan_google
2012/11/07 09:54:03
Setting input representation should be sufficient.
| |
8328 // FIXME: I'm not sure I'm hooking this up correctly :/ | |
8329 instr = new(zone()) HMultiplyAdd(context, a, b, c); | |
8330 #endif | |
8304 } else { | 8331 } else { |
8305 instr = HAdd::NewHAdd(zone(), context, left, right); | 8332 instr = HAdd::NewHAdd(zone(), context, left, right); |
8306 } | 8333 } |
8307 break; | 8334 break; |
8335 } | |
8308 case Token::SUB: | 8336 case Token::SUB: |
8309 instr = HSub::NewHSub(zone(), context, left, right); | 8337 instr = HSub::NewHSub(zone(), context, left, right); |
8310 break; | 8338 break; |
8311 case Token::MUL: | 8339 case Token::MUL: |
8312 instr = HMul::NewHMul(zone(), context, left, right); | 8340 instr = HMul::NewHMul(zone(), context, left, right); |
8313 break; | 8341 break; |
8314 case Token::MOD: | 8342 case Token::MOD: |
8315 instr = HMod::NewHMod(zone(), context, left, right); | 8343 instr = HMod::NewHMod(zone(), context, left, right); |
8316 break; | 8344 break; |
8317 case Token::DIV: | 8345 case Token::DIV: |
(...skipping 1693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10011 } | 10039 } |
10012 } | 10040 } |
10013 | 10041 |
10014 #ifdef DEBUG | 10042 #ifdef DEBUG |
10015 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 10043 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
10016 if (allocator_ != NULL) allocator_->Verify(); | 10044 if (allocator_ != NULL) allocator_->Verify(); |
10017 #endif | 10045 #endif |
10018 } | 10046 } |
10019 | 10047 |
10020 } } // namespace v8::internal | 10048 } } // namespace v8::internal |
OLD | NEW |