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

Side by Side Diff: src/compiler/js-generic-lowering.cc

Issue 1693833002: Remove strong mode support from binary operations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 4 years, 10 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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/code-stubs.h" 6 #include "src/code-stubs.h"
7 #include "src/compiler/common-operator.h" 7 #include "src/compiler/common-operator.h"
8 #include "src/compiler/js-generic-lowering.h" 8 #include "src/compiler/js-generic-lowering.h"
9 #include "src/compiler/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/machine-operator.h" 10 #include "src/compiler/machine-operator.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 node->ReplaceInput(0, test); 55 node->ReplaceInput(0, test);
56 } 56 }
57 // Fall-through. 57 // Fall-through.
58 default: 58 default:
59 // Nothing to see. 59 // Nothing to see.
60 return NoChange(); 60 return NoChange();
61 } 61 }
62 return Changed(node); 62 return Changed(node);
63 } 63 }
64 64
65 65 #define REPLACE_BINARY_OP_IC_CALL(Op, token) \
66 #define REPLACE_BINARY_OP_IC_CALL(Op, token) \ 66 void JSGenericLowering::Lower##Op(Node* node) { \
67 void JSGenericLowering::Lower##Op(Node* node) { \ 67 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node); \
68 BinaryOperationParameters const& p = \ 68 ReplaceWithStubCall(node, CodeFactory::BinaryOpIC(isolate(), token), \
69 BinaryOperationParametersOf(node->op()); \ 69 CallDescriptor::kPatchableCallSiteWithNop | flags); \
70 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node); \
71 ReplaceWithStubCall(node, \
72 CodeFactory::BinaryOpIC(isolate(), token, \
73 strength(p.language_mode())), \
74 CallDescriptor::kPatchableCallSiteWithNop | flags); \
75 } 70 }
76 REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR) 71 REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR)
77 REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR) 72 REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR)
78 REPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND) 73 REPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND)
79 REPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL) 74 REPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL)
80 REPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR) 75 REPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR)
81 REPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR) 76 REPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR)
82 REPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD) 77 REPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD)
83 REPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB) 78 REPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB)
84 REPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL) 79 REPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL)
85 REPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV) 80 REPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV)
86 REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD) 81 REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD)
87 #undef REPLACE_BINARY_OP_IC_CALL 82 #undef REPLACE_BINARY_OP_IC_CALL
88 83
89 84
90 // These ops are not language mode dependent; we arbitrarily pass Strength::WEAK 85 // These ops are not language mode dependent; we arbitrarily pass Strength::WEAK
91 // here. 86 // here.
92 #define REPLACE_COMPARE_IC_CALL(op, token) \ 87 #define REPLACE_COMPARE_IC_CALL(op, token) \
93 void JSGenericLowering::Lower##op(Node* node) { \ 88 void JSGenericLowering::Lower##op(Node* node) { \
94 ReplaceWithCompareIC(node, token, Strength::WEAK); \ 89 ReplaceWithCompareIC(node, token); \
95 } 90 }
96 REPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ) 91 REPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ)
97 REPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE) 92 REPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE)
98 REPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT) 93 REPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT)
99 REPLACE_COMPARE_IC_CALL(JSStrictNotEqual, Token::NE_STRICT) 94 REPLACE_COMPARE_IC_CALL(JSStrictNotEqual, Token::NE_STRICT)
95 REPLACE_COMPARE_IC_CALL(JSLessThan, Token::LT)
96 REPLACE_COMPARE_IC_CALL(JSGreaterThan, Token::GT)
97 REPLACE_COMPARE_IC_CALL(JSLessThanOrEqual, Token::LTE)
98 REPLACE_COMPARE_IC_CALL(JSGreaterThanOrEqual, Token::GTE)
100 #undef REPLACE_COMPARE_IC_CALL 99 #undef REPLACE_COMPARE_IC_CALL
101 100
102 101
103 #define REPLACE_COMPARE_IC_CALL_WITH_LANGUAGE_MODE(op, token) \
104 void JSGenericLowering::Lower##op(Node* node) { \
105 ReplaceWithCompareIC(node, token, \
106 strength(OpParameter<LanguageMode>(node))); \
107 }
108 REPLACE_COMPARE_IC_CALL_WITH_LANGUAGE_MODE(JSLessThan, Token::LT)
109 REPLACE_COMPARE_IC_CALL_WITH_LANGUAGE_MODE(JSGreaterThan, Token::GT)
110 REPLACE_COMPARE_IC_CALL_WITH_LANGUAGE_MODE(JSLessThanOrEqual, Token::LTE)
111 REPLACE_COMPARE_IC_CALL_WITH_LANGUAGE_MODE(JSGreaterThanOrEqual, Token::GTE)
112 #undef REPLACE_COMPARE_IC_CALL_WITH_LANGUAGE_MODE
113
114
115 #define REPLACE_RUNTIME_CALL(op, fun) \ 102 #define REPLACE_RUNTIME_CALL(op, fun) \
116 void JSGenericLowering::Lower##op(Node* node) { \ 103 void JSGenericLowering::Lower##op(Node* node) { \
117 ReplaceWithRuntimeCall(node, fun); \ 104 ReplaceWithRuntimeCall(node, fun); \
118 } 105 }
119 REPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext) 106 REPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext)
120 REPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext) 107 REPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext)
121 REPLACE_RUNTIME_CALL(JSConvertReceiver, Runtime::kConvertReceiver) 108 REPLACE_RUNTIME_CALL(JSConvertReceiver, Runtime::kConvertReceiver)
122 #undef REPLACE_RUNTIME 109 #undef REPLACE_RUNTIME
123 110
124 111
125 static CallDescriptor::Flags FlagsForNode(Node* node) { 112 static CallDescriptor::Flags FlagsForNode(Node* node) {
126 CallDescriptor::Flags result = CallDescriptor::kNoFlags; 113 CallDescriptor::Flags result = CallDescriptor::kNoFlags;
127 if (OperatorProperties::GetFrameStateInputCount(node->op()) > 0) { 114 if (OperatorProperties::GetFrameStateInputCount(node->op()) > 0) {
128 result |= CallDescriptor::kNeedsFrameState; 115 result |= CallDescriptor::kNeedsFrameState;
129 } 116 }
130 return result; 117 return result;
131 } 118 }
132 119
133 120 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token) {
134 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, 121 Callable callable = CodeFactory::CompareIC(isolate(), token);
135 Strength str) {
136 Callable callable = CodeFactory::CompareIC(isolate(), token, str);
137 122
138 // Create a new call node asking a CompareIC for help. 123 // Create a new call node asking a CompareIC for help.
139 NodeVector inputs(zone()); 124 NodeVector inputs(zone());
140 inputs.reserve(node->InputCount() + 1); 125 inputs.reserve(node->InputCount() + 1);
141 inputs.push_back(jsgraph()->HeapConstant(callable.code())); 126 inputs.push_back(jsgraph()->HeapConstant(callable.code()));
142 inputs.push_back(NodeProperties::GetValueInput(node, 0)); 127 inputs.push_back(NodeProperties::GetValueInput(node, 0));
143 inputs.push_back(NodeProperties::GetValueInput(node, 1)); 128 inputs.push_back(NodeProperties::GetValueInput(node, 1));
144 inputs.push_back(NodeProperties::GetContextInput(node)); 129 inputs.push_back(NodeProperties::GetContextInput(node));
145 // Some comparisons (StrictEqual) don't have an effect, control or frame 130 // Some comparisons (StrictEqual) don't have an effect, control or frame
146 // state inputs, so handle those cases here. 131 // state inputs, so handle those cases here.
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 } 859 }
875 860
876 861
877 MachineOperatorBuilder* JSGenericLowering::machine() const { 862 MachineOperatorBuilder* JSGenericLowering::machine() const {
878 return jsgraph()->machine(); 863 return jsgraph()->machine();
879 } 864 }
880 865
881 } // namespace compiler 866 } // namespace compiler
882 } // namespace internal 867 } // namespace internal
883 } // namespace v8 868 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698