OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/js-intrinsic-lowering.h" | 5 #include "src/compiler/js-intrinsic-lowering.h" |
6 | 6 |
7 #include <stack> | 7 #include <stack> |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 case Runtime::kInlineIsArray: | 43 case Runtime::kInlineIsArray: |
44 return ReduceIsInstanceType(node, JS_ARRAY_TYPE); | 44 return ReduceIsInstanceType(node, JS_ARRAY_TYPE); |
45 case Runtime::kInlineIsTypedArray: | 45 case Runtime::kInlineIsTypedArray: |
46 return ReduceIsInstanceType(node, JS_TYPED_ARRAY_TYPE); | 46 return ReduceIsInstanceType(node, JS_TYPED_ARRAY_TYPE); |
47 case Runtime::kInlineIsRegExp: | 47 case Runtime::kInlineIsRegExp: |
48 return ReduceIsInstanceType(node, JS_REGEXP_TYPE); | 48 return ReduceIsInstanceType(node, JS_REGEXP_TYPE); |
49 case Runtime::kInlineIsJSReceiver: | 49 case Runtime::kInlineIsJSReceiver: |
50 return ReduceIsJSReceiver(node); | 50 return ReduceIsJSReceiver(node); |
51 case Runtime::kInlineIsSmi: | 51 case Runtime::kInlineIsSmi: |
52 return ReduceIsSmi(node); | 52 return ReduceIsSmi(node); |
53 case Runtime::kInlineValueOf: | |
54 return ReduceValueOf(node); | |
55 case Runtime::kInlineFixedArrayGet: | 53 case Runtime::kInlineFixedArrayGet: |
56 return ReduceFixedArrayGet(node); | 54 return ReduceFixedArrayGet(node); |
57 case Runtime::kInlineFixedArraySet: | 55 case Runtime::kInlineFixedArraySet: |
58 return ReduceFixedArraySet(node); | 56 return ReduceFixedArraySet(node); |
59 case Runtime::kInlineRegExpConstructResult: | 57 case Runtime::kInlineRegExpConstructResult: |
60 return ReduceRegExpConstructResult(node); | 58 return ReduceRegExpConstructResult(node); |
61 case Runtime::kInlineRegExpExec: | 59 case Runtime::kInlineRegExpExec: |
62 return ReduceRegExpExec(node); | 60 return ReduceRegExpExec(node); |
63 case Runtime::kInlineRegExpFlags: | 61 case Runtime::kInlineRegExpFlags: |
64 return ReduceRegExpFlags(node); | 62 return ReduceRegExpFlags(node); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 Reduction JSIntrinsicLowering::ReduceIsJSReceiver(Node* node) { | 195 Reduction JSIntrinsicLowering::ReduceIsJSReceiver(Node* node) { |
198 return Change(node, simplified()->ObjectIsReceiver()); | 196 return Change(node, simplified()->ObjectIsReceiver()); |
199 } | 197 } |
200 | 198 |
201 | 199 |
202 Reduction JSIntrinsicLowering::ReduceIsSmi(Node* node) { | 200 Reduction JSIntrinsicLowering::ReduceIsSmi(Node* node) { |
203 return Change(node, simplified()->ObjectIsSmi()); | 201 return Change(node, simplified()->ObjectIsSmi()); |
204 } | 202 } |
205 | 203 |
206 | 204 |
207 Reduction JSIntrinsicLowering::ReduceValueOf(Node* node) { | |
208 // if (%_IsSmi(value)) { | |
209 // return value; | |
210 // } else if (%_GetInstanceType(%_GetMap(value)) == JS_VALUE_TYPE) { | |
211 // return %_GetValue(value); | |
212 // } else { | |
213 // return value; | |
214 // } | |
215 const Operator* const merge_op = common()->Merge(2); | |
216 const Operator* const ephi_op = common()->EffectPhi(2); | |
217 const Operator* const phi_op = | |
218 common()->Phi(MachineRepresentation::kTagged, 2); | |
219 | |
220 Node* value = NodeProperties::GetValueInput(node, 0); | |
221 Node* effect = NodeProperties::GetEffectInput(node); | |
222 Node* control = NodeProperties::GetControlInput(node); | |
223 | |
224 Node* check0 = graph()->NewNode(simplified()->ObjectIsSmi(), value); | |
225 Node* branch0 = graph()->NewNode(common()->Branch(), check0, control); | |
226 | |
227 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); | |
228 Node* etrue0 = effect; | |
229 Node* vtrue0 = value; | |
230 | |
231 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); | |
232 Node* efalse0; | |
233 Node* vfalse0; | |
234 { | |
235 Node* check1 = graph()->NewNode( | |
236 machine()->Word32Equal(), | |
237 graph()->NewNode( | |
238 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), | |
239 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), | |
240 value, effect, if_false0), | |
241 effect, if_false0), | |
242 jsgraph()->Int32Constant(JS_VALUE_TYPE)); | |
243 Node* branch1 = graph()->NewNode(common()->Branch(), check1, if_false0); | |
244 | |
245 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); | |
246 Node* etrue1 = | |
247 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForValue()), | |
248 value, effect, if_true1); | |
249 Node* vtrue1 = etrue1; | |
250 | |
251 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); | |
252 Node* efalse1 = effect; | |
253 Node* vfalse1 = value; | |
254 | |
255 Node* merge1 = graph()->NewNode(merge_op, if_true1, if_false1); | |
256 efalse0 = graph()->NewNode(ephi_op, etrue1, efalse1, merge1); | |
257 vfalse0 = graph()->NewNode(phi_op, vtrue1, vfalse1, merge1); | |
258 } | |
259 | |
260 Node* merge0 = graph()->NewNode(merge_op, if_true0, if_false0); | |
261 | |
262 // Replace all effect uses of {node} with the {ephi0}. | |
263 Node* ephi0 = graph()->NewNode(ephi_op, etrue0, efalse0, merge0); | |
264 ReplaceWithValue(node, node, ephi0); | |
265 | |
266 // Turn the {node} into a Phi. | |
267 return Change(node, phi_op, vtrue0, vfalse0, merge0); | |
268 } | |
269 | |
270 | |
271 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op) { | 205 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op) { |
272 // Replace all effect uses of {node} with the effect dependency. | 206 // Replace all effect uses of {node} with the effect dependency. |
273 RelaxEffectsAndControls(node); | 207 RelaxEffectsAndControls(node); |
274 // Remove the inputs corresponding to context, effect and control. | 208 // Remove the inputs corresponding to context, effect and control. |
275 NodeProperties::RemoveNonValueInputs(node); | 209 NodeProperties::RemoveNonValueInputs(node); |
276 // Finally update the operator to the new one. | 210 // Finally update the operator to the new one. |
277 NodeProperties::ChangeOp(node, op); | 211 NodeProperties::ChangeOp(node, op); |
278 return Changed(node); | 212 return Changed(node); |
279 } | 213 } |
280 | 214 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 } | 413 } |
480 | 414 |
481 | 415 |
482 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 416 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { |
483 return jsgraph()->simplified(); | 417 return jsgraph()->simplified(); |
484 } | 418 } |
485 | 419 |
486 } // namespace compiler | 420 } // namespace compiler |
487 } // namespace internal | 421 } // namespace internal |
488 } // namespace v8 | 422 } // namespace v8 |
OLD | NEW |