| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
| 10 #include "src/ast/ast-numbering.h" | 10 #include "src/ast/ast-numbering.h" |
| (...skipping 11272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11283 Representation result_rep = RepresentationFor(result_type); | 11283 Representation result_rep = RepresentationFor(result_type); |
| 11284 | 11284 |
| 11285 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) || | 11285 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) || |
| 11286 (right_rep.IsTagged() && !right_rep.IsSmi()); | 11286 (right_rep.IsTagged() && !right_rep.IsSmi()); |
| 11287 | 11287 |
| 11288 HInstruction* instr = NULL; | 11288 HInstruction* instr = NULL; |
| 11289 // Only the stub is allowed to call into the runtime, since otherwise we would | 11289 // Only the stub is allowed to call into the runtime, since otherwise we would |
| 11290 // inline several instructions (including the two pushes) for every tagged | 11290 // inline several instructions (including the two pushes) for every tagged |
| 11291 // operation in optimized code, which is more expensive, than a stub call. | 11291 // operation in optimized code, which is more expensive, than a stub call. |
| 11292 if (graph()->info()->IsStub() && is_non_primitive) { | 11292 if (graph()->info()->IsStub() && is_non_primitive) { |
| 11293 Runtime::FunctionId function_id; | 11293 HValue* values[] = {context(), left, right}; |
| 11294 #define GET_STUB(Name) \ |
| 11295 do { \ |
| 11296 Callable callable = CodeFactory::Name(isolate()); \ |
| 11297 HValue* stub = Add<HConstant>(callable.code()); \ |
| 11298 instr = AddUncasted<HCallWithDescriptor>( \ |
| 11299 stub, 0, callable.descriptor(), \ |
| 11300 Vector<HValue*>(values, arraysize(values))); \ |
| 11301 } while (false) |
| 11302 |
| 11294 switch (op) { | 11303 switch (op) { |
| 11295 default: | 11304 default: |
| 11296 UNREACHABLE(); | 11305 UNREACHABLE(); |
| 11297 case Token::ADD: | 11306 case Token::ADD: |
| 11298 function_id = Runtime::kAdd; | 11307 GET_STUB(Add); |
| 11299 break; | 11308 break; |
| 11300 case Token::SUB: | 11309 case Token::SUB: |
| 11301 function_id = Runtime::kSubtract; | 11310 GET_STUB(Subtract); |
| 11302 break; | 11311 break; |
| 11303 case Token::MUL: | 11312 case Token::MUL: |
| 11304 function_id = Runtime::kMultiply; | 11313 GET_STUB(Multiply); |
| 11305 break; | 11314 break; |
| 11306 case Token::DIV: | 11315 case Token::DIV: |
| 11307 function_id = Runtime::kDivide; | 11316 GET_STUB(Divide); |
| 11308 break; | 11317 break; |
| 11309 case Token::MOD: | 11318 case Token::MOD: |
| 11310 function_id = Runtime::kModulus; | 11319 GET_STUB(Modulus); |
| 11311 break; | 11320 break; |
| 11312 case Token::BIT_OR: | 11321 case Token::BIT_OR: |
| 11313 function_id = Runtime::kBitwiseOr; | 11322 GET_STUB(BitwiseOr); |
| 11314 break; | 11323 break; |
| 11315 case Token::BIT_AND: | 11324 case Token::BIT_AND: |
| 11316 function_id = Runtime::kBitwiseAnd; | 11325 GET_STUB(BitwiseAnd); |
| 11317 break; | 11326 break; |
| 11318 case Token::BIT_XOR: | 11327 case Token::BIT_XOR: |
| 11319 function_id = Runtime::kBitwiseXor; | 11328 GET_STUB(BitwiseXor); |
| 11320 break; | 11329 break; |
| 11321 case Token::SAR: | 11330 case Token::SAR: |
| 11322 function_id = Runtime::kShiftRight; | 11331 GET_STUB(ShiftRight); |
| 11323 break; | 11332 break; |
| 11324 case Token::SHR: | 11333 case Token::SHR: |
| 11325 function_id = Runtime::kShiftRightLogical; | 11334 GET_STUB(ShiftRightLogical); |
| 11326 break; | 11335 break; |
| 11327 case Token::SHL: | 11336 case Token::SHL: |
| 11328 function_id = Runtime::kShiftLeft; | 11337 GET_STUB(ShiftLeft); |
| 11329 break; | 11338 break; |
| 11330 } | 11339 } |
| 11331 Add<HPushArguments>(left, right); | 11340 #undef GET_STUB |
| 11332 instr = AddUncasted<HCallRuntime>(Runtime::FunctionForId(function_id), 2); | |
| 11333 } else { | 11341 } else { |
| 11334 switch (op) { | 11342 switch (op) { |
| 11335 case Token::ADD: | 11343 case Token::ADD: |
| 11336 instr = AddUncasted<HAdd>(left, right); | 11344 instr = AddUncasted<HAdd>(left, right); |
| 11337 break; | 11345 break; |
| 11338 case Token::SUB: | 11346 case Token::SUB: |
| 11339 instr = AddUncasted<HSub>(left, right); | 11347 instr = AddUncasted<HSub>(left, right); |
| 11340 break; | 11348 break; |
| 11341 case Token::MUL: | 11349 case Token::MUL: |
| 11342 instr = AddUncasted<HMul>(left, right); | 11350 instr = AddUncasted<HMul>(left, right); |
| (...skipping 2363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13706 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13714 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13707 } | 13715 } |
| 13708 | 13716 |
| 13709 #ifdef DEBUG | 13717 #ifdef DEBUG |
| 13710 graph_->Verify(false); // No full verify. | 13718 graph_->Verify(false); // No full verify. |
| 13711 #endif | 13719 #endif |
| 13712 } | 13720 } |
| 13713 | 13721 |
| 13714 } // namespace internal | 13722 } // namespace internal |
| 13715 } // namespace v8 | 13723 } // namespace v8 |
| OLD | NEW |