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

Side by Side Diff: src/compiler/js-intrinsic-builder.cc

Issue 612043003: Add inlining for intrinsics. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Move decls. Created 6 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/compiler/js-intrinsic-builder.h ('k') | src/compiler/linkage.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "src/compiler/access-builder.h"
6 #include "src/compiler/common-operator.h"
7 #include "src/compiler/generic-node-inl.h"
8 #include "src/compiler/js-intrinsic-builder.h"
9 #include "src/compiler/js-operator.h"
10 #include "src/compiler/simplified-operator.h"
11
12
13 namespace v8 {
14 namespace internal {
15 namespace compiler {
16
17 ResultAndEffect JSIntrinsicBuilder::BuildGraphFor(Runtime::FunctionId id,
18 const NodeVector& arguments) {
19 switch (id) {
20 case Runtime::kInlineIsSmi:
21 return BuildGraphFor_IsSmi(arguments);
22 case Runtime::kInlineIsNonNegativeSmi:
23 return BuildGraphFor_IsNonNegativeSmi(arguments);
24 case Runtime::kInlineIsArray:
25 return BuildMapCheck(arguments[0], arguments[2], JS_ARRAY_TYPE);
26 case Runtime::kInlineIsRegExp:
27 return BuildMapCheck(arguments[0], arguments[2], JS_REGEXP_TYPE);
28 case Runtime::kInlineIsFunction:
29 return BuildMapCheck(arguments[0], arguments[2], JS_FUNCTION_TYPE);
30 case Runtime::kInlineValueOf:
31 return BuildGraphFor_ValueOf(arguments);
32 default:
33 break;
34 }
35 return ResultAndEffect();
36 }
37
38 ResultAndEffect JSIntrinsicBuilder::BuildGraphFor_IsSmi(
39 const NodeVector& arguments) {
40 Node* object = arguments[0];
41 SimplifiedOperatorBuilder simplified(jsgraph_->zone());
42 Node* condition = graph()->NewNode(simplified.ObjectIsSmi(), object);
43
44 return ResultAndEffect(condition, arguments[2]);
45 }
46
47
48 ResultAndEffect JSIntrinsicBuilder::BuildGraphFor_IsNonNegativeSmi(
49 const NodeVector& arguments) {
50 Node* object = arguments[0];
51 SimplifiedOperatorBuilder simplified(jsgraph_->zone());
52 Node* condition =
53 graph()->NewNode(simplified.ObjectIsNonNegativeSmi(), object);
54
55 return ResultAndEffect(condition, arguments[2]);
56 }
57
58
59 /*
60 * if (_isSmi(object)) {
61 * return false
62 * } else {
63 * return %_GetMapInstanceType(object) == map_type
64 * }
65 */
66 ResultAndEffect JSIntrinsicBuilder::BuildMapCheck(Node* object, Node* effect,
67 InstanceType map_type) {
68 SimplifiedOperatorBuilder simplified(jsgraph_->zone());
69
70 Node* is_smi = graph()->NewNode(simplified.ObjectIsSmi(), object);
71 Node* branch = graph()->NewNode(common()->Branch(), is_smi, graph()->start());
72 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
73 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
74
75 Node* map = graph()->NewNode(simplified.LoadField(AccessBuilder::ForMap()),
76 object, effect, if_false);
77
78 Node* instance_type = graph()->NewNode(
79 simplified.LoadField(AccessBuilder::ForMapInstanceType()), map, map,
80 if_false);
81
82 Node* has_map_type =
83 graph()->NewNode(jsgraph_->machine()->Word32Equal(), instance_type,
84 jsgraph_->Int32Constant(map_type));
85
86 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
87
88 Node* phi =
89 graph()->NewNode(common()->Phi((MachineType)(kTypeBool | kRepTagged), 2),
90 jsgraph_->FalseConstant(), has_map_type, merge);
91
92 Node* ephi =
93 graph()->NewNode(common()->EffectPhi(2), effect, instance_type, merge);
94
95 return ResultAndEffect(phi, ephi);
96 }
97
98
99 /*
100 * if (%_isSmi(object)) {
101 * return object;
102 * } else if (%_GetMapInstanceType(object) == JS_VALUE_TYPE) {
103 * return %_LoadValueField(object);
104 * } else {
105 * return object;
106 * }
107 */
108 ResultAndEffect JSIntrinsicBuilder::BuildGraphFor_ValueOf(
109 const NodeVector& arguments) {
110 Node* object = arguments[0];
111 Node* effect = arguments[2];
112 SimplifiedOperatorBuilder simplified(jsgraph_->zone());
113
114 Node* is_smi = graph()->NewNode(simplified.ObjectIsSmi(), object);
115 Node* branch = graph()->NewNode(common()->Branch(), is_smi, graph()->start());
116 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
117 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
118
119 Node* map = graph()->NewNode(simplified.LoadField(AccessBuilder::ForMap()),
120 object, effect, if_false);
121
122 Node* instance_type = graph()->NewNode(
123 simplified.LoadField(AccessBuilder::ForMapInstanceType()), map, map,
124 if_false);
125
126 Node* is_value =
127 graph()->NewNode(jsgraph_->machine()->Word32Equal(), instance_type,
128 jsgraph_->Constant(JS_VALUE_TYPE));
129
130 Node* branch_is_value =
131 graph()->NewNode(common()->Branch(), is_value, if_false);
132 Node* is_value_true = graph()->NewNode(common()->IfTrue(), branch_is_value);
133 Node* is_value_false = graph()->NewNode(common()->IfFalse(), branch_is_value);
134
135 Node* value =
136 graph()->NewNode(simplified.LoadField(AccessBuilder::ForValue()), object,
137 instance_type, is_value_true);
138
139 Node* merge_is_value =
140 graph()->NewNode(common()->Merge(2), is_value_true, is_value_false);
141
142 Node* phi_is_value = graph()->NewNode(common()->Phi((MachineType)kTypeAny, 2),
143 value, object, merge_is_value);
144
145
146 Node* merge = graph()->NewNode(common()->Merge(2), if_true, merge_is_value);
147
148 Node* phi = graph()->NewNode(common()->Phi((MachineType)kTypeAny, 2), object,
149 phi_is_value, merge);
150
151 Node* ephi =
152 graph()->NewNode(common()->EffectPhi(2), effect, instance_type, merge);
153
154 return ResultAndEffect(phi, ephi);
155 }
156 }
157 }
158 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « src/compiler/js-intrinsic-builder.h ('k') | src/compiler/linkage.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698