OLD | NEW |
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/compiler/change-lowering.h" | 5 #include "src/compiler/change-lowering.h" |
6 | 6 |
7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
11 namespace compiler { | 11 namespace compiler { |
12 | 12 |
13 ChangeLowering::~ChangeLowering() {} | 13 ChangeLowering::~ChangeLowering() {} |
14 | 14 |
15 | 15 |
16 Reduction ChangeLowering::Reduce(Node* node) { | 16 Reduction ChangeLowering::Reduce(Node* node) { |
17 Node* control = graph()->start(); | 17 Node* control = graph()->start(); |
18 switch (node->opcode()) { | 18 switch (node->opcode()) { |
19 case IrOpcode::kChangeBitToBool: | 19 case IrOpcode::kChangeBitToBool: |
20 return ChangeBitToBool(node->InputAt(0), control); | 20 return ChangeBitToBool(node->InputAt(0), control); |
21 case IrOpcode::kChangeBoolToBit: | 21 case IrOpcode::kChangeBoolToBit: |
22 return ChangeBoolToBit(node->InputAt(0)); | 22 return ChangeBoolToBit(node->InputAt(0)); |
23 case IrOpcode::kChangeFloat64ToTagged: | 23 case IrOpcode::kChangeFloat64ToTagged: |
24 return ChangeFloat64ToTagged(node->InputAt(0), control); | 24 return ChangeFloat64ToTagged(node->InputAt(0), control); |
25 case IrOpcode::kChangeInt32ToTagged: | 25 case IrOpcode::kChangeInt32ToTagged: |
26 return ChangeInt32ToTagged(node->InputAt(0), control); | 26 return ChangeInt32ToTagged(node->InputAt(0), control); |
27 case IrOpcode::kChangeTaggedToFloat64: | 27 case IrOpcode::kChangeTaggedToFloat64: |
28 return ChangeTaggedToFloat64(node->InputAt(0), control); | 28 return ChangeTaggedToFloat64(node->InputAt(0), control); |
29 case IrOpcode::kChangeTaggedToInt32: | 29 case IrOpcode::kChangeTaggedToInt32: |
| 30 return ChangeTaggedToI32(node->InputAt(0), control, true); |
30 case IrOpcode::kChangeTaggedToUint32: | 31 case IrOpcode::kChangeTaggedToUint32: |
31 // ToInt32 and ToUint32 perform exactly the same operation, just the | 32 return ChangeTaggedToI32(node->InputAt(0), control, false); |
32 // interpretation of the resulting 32 bit value is different, so we can | |
33 // use the same subgraph for both operations. | |
34 // See ECMA-262 9.5: ToInt32 and ECMA-262 9.6: ToUint32. | |
35 return ChangeTaggedToInt32(node->InputAt(0), control); | |
36 case IrOpcode::kChangeUint32ToTagged: | 33 case IrOpcode::kChangeUint32ToTagged: |
37 return ChangeUint32ToTagged(node->InputAt(0), control); | 34 return ChangeUint32ToTagged(node->InputAt(0), control); |
38 default: | 35 default: |
39 return NoChange(); | 36 return NoChange(); |
40 } | 37 } |
41 UNREACHABLE(); | 38 UNREACHABLE(); |
42 return NoChange(); | 39 return NoChange(); |
43 } | 40 } |
44 | 41 |
45 | 42 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 160 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
164 Node* smi = graph()->NewNode(common()->Projection(0), add); | 161 Node* smi = graph()->NewNode(common()->Projection(0), add); |
165 | 162 |
166 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 163 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
167 Node* phi = graph()->NewNode(common()->Phi(2), heap_number, smi, merge); | 164 Node* phi = graph()->NewNode(common()->Phi(2), heap_number, smi, merge); |
168 | 165 |
169 return Replace(phi); | 166 return Replace(phi); |
170 } | 167 } |
171 | 168 |
172 | 169 |
173 Reduction ChangeLowering::ChangeTaggedToInt32(Node* val, Node* control) { | 170 Reduction ChangeLowering::ChangeTaggedToI32(Node* val, Node* control, |
| 171 bool is_signed) { |
174 STATIC_ASSERT(kSmiTag == 0); | 172 STATIC_ASSERT(kSmiTag == 0); |
175 STATIC_ASSERT(kSmiTagMask == 1); | 173 STATIC_ASSERT(kSmiTagMask == 1); |
176 | 174 |
177 Node* tag = graph()->NewNode(machine()->WordAnd(), val, | 175 Node* tag = graph()->NewNode(machine()->WordAnd(), val, |
178 jsgraph()->Int32Constant(kSmiTagMask)); | 176 jsgraph()->Int32Constant(kSmiTagMask)); |
179 Node* branch = graph()->NewNode(common()->Branch(), tag, control); | 177 Node* branch = graph()->NewNode(common()->Branch(), tag, control); |
180 | 178 |
181 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 179 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
182 Node* change = graph()->NewNode(machine()->TruncateFloat64ToInt32(), | 180 Operator* op = is_signed ? machine()->ChangeFloat64ToInt32() |
183 LoadHeapNumberValue(val, if_true)); | 181 : machine()->ChangeFloat64ToUint32(); |
| 182 Node* change = graph()->NewNode(op, LoadHeapNumberValue(val, if_true)); |
184 | 183 |
185 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 184 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
186 Node* number = ChangeSmiToInt32(val); | 185 Node* number = ChangeSmiToInt32(val); |
187 | 186 |
188 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 187 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
189 Node* phi = graph()->NewNode(common()->Phi(2), change, number, merge); | 188 Node* phi = graph()->NewNode(common()->Phi(2), change, number, merge); |
190 | 189 |
191 return Replace(phi); | 190 return Replace(phi); |
192 } | 191 } |
193 | 192 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 Graph* ChangeLowering::graph() const { return jsgraph()->graph(); } | 246 Graph* ChangeLowering::graph() const { return jsgraph()->graph(); } |
248 | 247 |
249 | 248 |
250 CommonOperatorBuilder* ChangeLowering::common() const { | 249 CommonOperatorBuilder* ChangeLowering::common() const { |
251 return jsgraph()->common(); | 250 return jsgraph()->common(); |
252 } | 251 } |
253 | 252 |
254 } // namespace compiler | 253 } // namespace compiler |
255 } // namespace internal | 254 } // namespace internal |
256 } // namespace v8 | 255 } // namespace v8 |
OLD | NEW |