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/address-map.h" | 7 #include "src/address-map.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 Node* control = graph()->start(); | 24 Node* control = graph()->start(); |
25 switch (node->opcode()) { | 25 switch (node->opcode()) { |
26 case IrOpcode::kChangeBitToBool: | 26 case IrOpcode::kChangeBitToBool: |
27 return ChangeBitToBool(node->InputAt(0), control); | 27 return ChangeBitToBool(node->InputAt(0), control); |
28 case IrOpcode::kChangeBoolToBit: | 28 case IrOpcode::kChangeBoolToBit: |
29 return ChangeBoolToBit(node->InputAt(0)); | 29 return ChangeBoolToBit(node->InputAt(0)); |
30 case IrOpcode::kChangeInt31ToTagged: | 30 case IrOpcode::kChangeInt31ToTagged: |
31 return ChangeInt31ToTagged(node->InputAt(0), control); | 31 return ChangeInt31ToTagged(node->InputAt(0), control); |
32 case IrOpcode::kChangeTaggedSignedToInt32: | 32 case IrOpcode::kChangeTaggedSignedToInt32: |
33 return ChangeTaggedSignedToInt32(node->InputAt(0)); | 33 return ChangeTaggedSignedToInt32(node->InputAt(0)); |
34 case IrOpcode::kChangeTaggedToFloat64: | |
35 return ChangeTaggedToFloat64(node->InputAt(0), control); | |
36 case IrOpcode::kChangeTaggedToInt32: | |
37 return ChangeTaggedToUI32(node->InputAt(0), control, kSigned); | |
38 case IrOpcode::kChangeTaggedToUint32: | |
39 return ChangeTaggedToUI32(node->InputAt(0), control, kUnsigned); | |
40 case IrOpcode::kTruncateTaggedToWord32: | |
41 return TruncateTaggedToWord32(node->InputAt(0), control); | |
42 case IrOpcode::kLoadField: | 34 case IrOpcode::kLoadField: |
43 return LoadField(node); | 35 return LoadField(node); |
44 case IrOpcode::kStoreField: | 36 case IrOpcode::kStoreField: |
45 return StoreField(node); | 37 return StoreField(node); |
46 case IrOpcode::kLoadElement: | 38 case IrOpcode::kLoadElement: |
47 return LoadElement(node); | 39 return LoadElement(node); |
48 case IrOpcode::kStoreElement: | 40 case IrOpcode::kStoreElement: |
49 return StoreElement(node); | 41 return StoreElement(node); |
50 case IrOpcode::kAllocate: | 42 case IrOpcode::kAllocate: |
51 return Allocate(node); | 43 return Allocate(node); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 } | 130 } |
139 | 131 |
140 Reduction ChangeLowering::ChangeInt31ToTagged(Node* value, Node* control) { | 132 Reduction ChangeLowering::ChangeInt31ToTagged(Node* value, Node* control) { |
141 return Replace(ChangeInt32ToSmi(value)); | 133 return Replace(ChangeInt32ToSmi(value)); |
142 } | 134 } |
143 | 135 |
144 Reduction ChangeLowering::ChangeTaggedSignedToInt32(Node* value) { | 136 Reduction ChangeLowering::ChangeTaggedSignedToInt32(Node* value) { |
145 return Replace(ChangeSmiToWord32(value)); | 137 return Replace(ChangeSmiToWord32(value)); |
146 } | 138 } |
147 | 139 |
148 Reduction ChangeLowering::ChangeTaggedToUI32(Node* value, Node* control, | |
149 Signedness signedness) { | |
150 const Operator* op = (signedness == kSigned) | |
151 ? machine()->ChangeFloat64ToInt32() | |
152 : machine()->ChangeFloat64ToUint32(); | |
153 | |
154 if (NodeProperties::GetType(value)->Is(Type::TaggedPointer()) && | |
155 NodeProperties::GetType(value)->Is(Type::Number())) { | |
156 return Replace(graph()->NewNode(op, LoadHeapNumberValue(value, control))); | |
157 } | |
158 | |
159 Node* check = TestNotSmi(value); | |
160 Node* branch = | |
161 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | |
162 | |
163 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch); | |
164 | |
165 STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset); | |
166 Node* vnot_smi = graph()->NewNode(op, LoadHeapNumberValue(value, if_not_smi)); | |
167 | |
168 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch); | |
169 Node* vfrom_smi = ChangeSmiToWord32(value); | |
170 | |
171 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi); | |
172 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), | |
173 vnot_smi, vfrom_smi, merge); | |
174 | |
175 return Replace(phi); | |
176 } | |
177 | |
178 | |
179 Reduction ChangeLowering::ChangeTaggedToFloat64(Node* value, Node* control) { | |
180 Node* check = TestNotSmi(value); | |
181 Node* branch = | |
182 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | |
183 | |
184 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch); | |
185 | |
186 STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset); | |
187 Node* vnot_smi = LoadHeapNumberValue(value, if_not_smi); | |
188 | |
189 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch); | |
190 Node* vfrom_smi = ChangeSmiToFloat64(value); | |
191 | |
192 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi); | |
193 Node* phi = | |
194 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), | |
195 vnot_smi, vfrom_smi, merge); | |
196 | |
197 return Replace(phi); | |
198 } | |
199 | |
200 Reduction ChangeLowering::TruncateTaggedToWord32(Node* value, Node* control) { | |
201 Node* check = TestNotSmi(value); | |
202 Node* branch = | |
203 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | |
204 | |
205 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch); | |
206 | |
207 STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset); | |
208 Node* vnot_smi = graph()->NewNode(machine()->TruncateFloat64ToWord32(), | |
209 LoadHeapNumberValue(value, if_not_smi)); | |
210 | |
211 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch); | |
212 Node* vfrom_smi = ChangeSmiToWord32(value); | |
213 | |
214 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi); | |
215 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), | |
216 vnot_smi, vfrom_smi, merge); | |
217 | |
218 return Replace(phi); | |
219 } | |
220 | |
221 namespace { | 140 namespace { |
222 | 141 |
223 WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, | 142 WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, |
224 MachineRepresentation representation, | 143 MachineRepresentation representation, |
225 Type* field_type, Type* input_type) { | 144 Type* field_type, Type* input_type) { |
226 if (field_type->Is(Type::TaggedSigned()) || | 145 if (field_type->Is(Type::TaggedSigned()) || |
227 input_type->Is(Type::TaggedSigned())) { | 146 input_type->Is(Type::TaggedSigned())) { |
228 // Write barriers are only for writes of heap objects. | 147 // Write barriers are only for writes of heap objects. |
229 return kNoWriteBarrier; | 148 return kNoWriteBarrier; |
230 } | 149 } |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 } | 331 } |
413 | 332 |
414 | 333 |
415 MachineOperatorBuilder* ChangeLowering::machine() const { | 334 MachineOperatorBuilder* ChangeLowering::machine() const { |
416 return jsgraph()->machine(); | 335 return jsgraph()->machine(); |
417 } | 336 } |
418 | 337 |
419 } // namespace compiler | 338 } // namespace compiler |
420 } // namespace internal | 339 } // namespace internal |
421 } // namespace v8 | 340 } // namespace v8 |
OLD | NEW |