Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: src/hydrogen.cc

Issue 1333843002: [runtime] Move binary operator fallbacks into the runtime. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: No need for frame states in bytecode handlers. Add test case. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/hydrogen.h" 5 #include "src/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-numbering.h" 10 #include "src/ast-numbering.h"
(...skipping 11048 matching lines...) Expand 10 before | Expand all | Expand 10 after
11059 Representation result_rep = RepresentationFor(result_type); 11059 Representation result_rep = RepresentationFor(result_type);
11060 11060
11061 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) || 11061 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) ||
11062 (right_rep.IsTagged() && !right_rep.IsSmi()); 11062 (right_rep.IsTagged() && !right_rep.IsSmi());
11063 11063
11064 HInstruction* instr = NULL; 11064 HInstruction* instr = NULL;
11065 // Only the stub is allowed to call into the runtime, since otherwise we would 11065 // Only the stub is allowed to call into the runtime, since otherwise we would
11066 // inline several instructions (including the two pushes) for every tagged 11066 // inline several instructions (including the two pushes) for every tagged
11067 // operation in optimized code, which is more expensive, than a stub call. 11067 // operation in optimized code, which is more expensive, than a stub call.
11068 if (graph()->info()->IsStub() && is_non_primitive) { 11068 if (graph()->info()->IsStub() && is_non_primitive) {
11069 HValue* function = 11069 Runtime::FunctionId function_id;
11070 AddLoadJSBuiltin(BinaryOpIC::TokenToContextIndex(op, strength)); 11070 switch (op) {
11071 default:
11072 UNREACHABLE();
Michael Starzinger 2015/09/10 11:43:24 Sneaky fall-through to convince compiler that func
11073 case Token::ADD:
11074 function_id =
11075 is_strong(strength) ? Runtime::kAdd_Strong : Runtime::kAdd;
11076 break;
11077 case Token::SUB:
11078 function_id = is_strong(strength) ? Runtime::kSubtract_Strong
11079 : Runtime::kSubtract;
11080 break;
11081 case Token::MUL:
11082 function_id = is_strong(strength) ? Runtime::kMultiply_Strong
11083 : Runtime::kMultiply;
11084 break;
11085 case Token::DIV:
11086 function_id =
11087 is_strong(strength) ? Runtime::kDivide_Strong : Runtime::kDivide;
11088 break;
11089 case Token::MOD:
11090 function_id =
11091 is_strong(strength) ? Runtime::kModulus_Strong : Runtime::kModulus;
11092 break;
11093 case Token::BIT_OR:
11094 function_id = is_strong(strength) ? Runtime::kBitwiseOr_Strong
11095 : Runtime::kBitwiseOr;
11096 break;
11097 case Token::BIT_AND:
11098 function_id = is_strong(strength) ? Runtime::kBitwiseAnd_Strong
11099 : Runtime::kBitwiseAnd;
11100 break;
11101 case Token::BIT_XOR:
11102 function_id = is_strong(strength) ? Runtime::kBitwiseXor_Strong
11103 : Runtime::kBitwiseXor;
11104 break;
11105 case Token::SAR:
11106 function_id = is_strong(strength) ? Runtime::kShiftRight_Strong
11107 : Runtime::kShiftRight;
11108 break;
11109 case Token::SHR:
11110 function_id = is_strong(strength) ? Runtime::kShiftRightLogical_Strong
11111 : Runtime::kShiftRightLogical;
11112 break;
11113 case Token::SHL:
11114 function_id = is_strong(strength) ? Runtime::kShiftLeft_Strong
11115 : Runtime::kShiftLeft;
11116 break;
11117 }
11071 Add<HPushArguments>(left, right); 11118 Add<HPushArguments>(left, right);
11072 instr = AddUncasted<HInvokeFunction>(function, 2); 11119 instr = AddUncasted<HCallRuntime>(Runtime::FunctionForId(function_id), 2);
11073 } else { 11120 } else {
11074 if (is_strong(strength) && Token::IsBitOp(op)) { 11121 if (is_strong(strength) && Token::IsBitOp(op)) {
11075 // TODO(conradw): This is not efficient, but is necessary to prevent 11122 // TODO(conradw): This is not efficient, but is necessary to prevent
11076 // conversion of oddball values to numbers in strong mode. It would be 11123 // conversion of oddball values to numbers in strong mode. It would be
11077 // better to prevent the conversion rather than adding a runtime check. 11124 // better to prevent the conversion rather than adding a runtime check.
11078 IfBuilder if_builder(this); 11125 IfBuilder if_builder(this);
11079 if_builder.If<HHasInstanceTypeAndBranch>(left, ODDBALL_TYPE); 11126 if_builder.If<HHasInstanceTypeAndBranch>(left, ODDBALL_TYPE);
11080 if_builder.OrIf<HHasInstanceTypeAndBranch>(right, ODDBALL_TYPE); 11127 if_builder.OrIf<HHasInstanceTypeAndBranch>(right, ODDBALL_TYPE);
11081 if_builder.Then(); 11128 if_builder.Then();
11082 Add<HCallRuntime>( 11129 Add<HCallRuntime>(
(...skipping 29 matching lines...) Expand all
11112 break; 11159 break;
11113 } 11160 }
11114 case Token::DIV: 11161 case Token::DIV:
11115 instr = AddUncasted<HDiv>(left, right, strength); 11162 instr = AddUncasted<HDiv>(left, right, strength);
11116 break; 11163 break;
11117 case Token::BIT_XOR: 11164 case Token::BIT_XOR:
11118 case Token::BIT_AND: 11165 case Token::BIT_AND:
11119 instr = AddUncasted<HBitwise>(op, left, right, strength); 11166 instr = AddUncasted<HBitwise>(op, left, right, strength);
11120 break; 11167 break;
11121 case Token::BIT_OR: { 11168 case Token::BIT_OR: {
11122 HValue* operand, *shift_amount; 11169 HValue *operand, *shift_amount;
11123 if (left_type->Is(Type::Signed32()) && 11170 if (left_type->Is(Type::Signed32()) &&
11124 right_type->Is(Type::Signed32()) && 11171 right_type->Is(Type::Signed32()) &&
11125 MatchRotateRight(left, right, &operand, &shift_amount)) { 11172 MatchRotateRight(left, right, &operand, &shift_amount)) {
11126 instr = AddUncasted<HRor>(operand, shift_amount, strength); 11173 instr = AddUncasted<HRor>(operand, shift_amount, strength);
11127 } else { 11174 } else {
11128 instr = AddUncasted<HBitwise>(op, left, right, strength); 11175 instr = AddUncasted<HBitwise>(op, left, right, strength);
11129 } 11176 }
11130 break; 11177 break;
11131 } 11178 }
11132 case Token::SAR: 11179 case Token::SAR:
(...skipping 2363 matching lines...) Expand 10 before | Expand all | Expand 10 after
13496 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13543 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13497 } 13544 }
13498 13545
13499 #ifdef DEBUG 13546 #ifdef DEBUG
13500 graph_->Verify(false); // No full verify. 13547 graph_->Verify(false); // No full verify.
13501 #endif 13548 #endif
13502 } 13549 }
13503 13550
13504 } // namespace internal 13551 } // namespace internal
13505 } // namespace v8 13552 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698