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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 Node* context = jsgraph()->NoContextConstant(); | 80 Node* context = jsgraph()->NoContextConstant(); |
81 Node* effect = graph()->NewNode(common()->BeginRegion(), graph()->start()); | 81 Node* effect = graph()->NewNode(common()->BeginRegion(), graph()->start()); |
82 if (!allocate_heap_number_operator_.is_set()) { | 82 if (!allocate_heap_number_operator_.is_set()) { |
83 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( | 83 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( |
84 isolate(), jsgraph()->zone(), callable.descriptor(), 0, | 84 isolate(), jsgraph()->zone(), callable.descriptor(), 0, |
85 CallDescriptor::kNoFlags, Operator::kNoThrow); | 85 CallDescriptor::kNoFlags, Operator::kNoThrow); |
86 allocate_heap_number_operator_.set(common()->Call(descriptor)); | 86 allocate_heap_number_operator_.set(common()->Call(descriptor)); |
87 } | 87 } |
88 Node* heap_number = graph()->NewNode(allocate_heap_number_operator_.get(), | 88 Node* heap_number = graph()->NewNode(allocate_heap_number_operator_.get(), |
89 target, context, effect, control); | 89 target, context, effect, control); |
90 Node* store = graph()->NewNode( | 90 Node* store = graph()->NewNode(machine()->Store(StoreRepresentation( |
91 machine()->Store(StoreRepresentation(kMachFloat64, kNoWriteBarrier)), | 91 MachineType::Float64(), kNoWriteBarrier)), |
92 heap_number, HeapNumberValueIndexConstant(), value, heap_number, control); | 92 heap_number, HeapNumberValueIndexConstant(), |
| 93 value, heap_number, control); |
93 return graph()->NewNode(common()->FinishRegion(), heap_number, store); | 94 return graph()->NewNode(common()->FinishRegion(), heap_number, store); |
94 } | 95 } |
95 | 96 |
96 | 97 |
97 Node* ChangeLowering::ChangeInt32ToFloat64(Node* value) { | 98 Node* ChangeLowering::ChangeInt32ToFloat64(Node* value) { |
98 return graph()->NewNode(machine()->ChangeInt32ToFloat64(), value); | 99 return graph()->NewNode(machine()->ChangeInt32ToFloat64(), value); |
99 } | 100 } |
100 | 101 |
101 | 102 |
102 Node* ChangeLowering::ChangeInt32ToSmi(Node* value) { | 103 Node* ChangeLowering::ChangeInt32ToSmi(Node* value) { |
(...skipping 25 matching lines...) Expand all Loading... |
128 | 129 |
129 Node* ChangeLowering::ChangeUint32ToSmi(Node* value) { | 130 Node* ChangeLowering::ChangeUint32ToSmi(Node* value) { |
130 if (machine()->Is64()) { | 131 if (machine()->Is64()) { |
131 value = graph()->NewNode(machine()->ChangeUint32ToUint64(), value); | 132 value = graph()->NewNode(machine()->ChangeUint32ToUint64(), value); |
132 } | 133 } |
133 return graph()->NewNode(machine()->WordShl(), value, SmiShiftBitsConstant()); | 134 return graph()->NewNode(machine()->WordShl(), value, SmiShiftBitsConstant()); |
134 } | 135 } |
135 | 136 |
136 | 137 |
137 Node* ChangeLowering::LoadHeapNumberValue(Node* value, Node* control) { | 138 Node* ChangeLowering::LoadHeapNumberValue(Node* value, Node* control) { |
138 return graph()->NewNode(machine()->Load(kMachFloat64), value, | 139 return graph()->NewNode(machine()->Load(MachineType::Float64()), value, |
139 HeapNumberValueIndexConstant(), graph()->start(), | 140 HeapNumberValueIndexConstant(), graph()->start(), |
140 control); | 141 control); |
141 } | 142 } |
142 | 143 |
143 | 144 |
144 Node* ChangeLowering::TestNotSmi(Node* value) { | 145 Node* ChangeLowering::TestNotSmi(Node* value) { |
145 STATIC_ASSERT(kSmiTag == 0); | 146 STATIC_ASSERT(kSmiTag == 0); |
146 STATIC_ASSERT(kSmiTagMask == 1); | 147 STATIC_ASSERT(kSmiTagMask == 1); |
147 return graph()->NewNode(machine()->WordAnd(), value, | 148 return graph()->NewNode(machine()->WordAnd(), value, |
148 jsgraph()->IntPtrConstant(kSmiTagMask)); | 149 jsgraph()->IntPtrConstant(kSmiTagMask)); |
149 } | 150 } |
150 | 151 |
151 | 152 |
152 Reduction ChangeLowering::ChangeBitToBool(Node* value, Node* control) { | 153 Reduction ChangeLowering::ChangeBitToBool(Node* value, Node* control) { |
153 return Replace(graph()->NewNode(common()->Select(kMachAnyTagged), value, | 154 return Replace( |
154 jsgraph()->TrueConstant(), | 155 graph()->NewNode(common()->Select(MachineRepresentation::kTagged), value, |
155 jsgraph()->FalseConstant())); | 156 jsgraph()->TrueConstant(), jsgraph()->FalseConstant())); |
156 } | 157 } |
157 | 158 |
158 | 159 |
159 Reduction ChangeLowering::ChangeBoolToBit(Node* value) { | 160 Reduction ChangeLowering::ChangeBoolToBit(Node* value) { |
160 return Replace(graph()->NewNode(machine()->WordEqual(), value, | 161 return Replace(graph()->NewNode(machine()->WordEqual(), value, |
161 jsgraph()->TrueConstant())); | 162 jsgraph()->TrueConstant())); |
162 } | 163 } |
163 | 164 |
164 | 165 |
165 Reduction ChangeLowering::ChangeFloat64ToTagged(Node* value, Node* control) { | 166 Reduction ChangeLowering::ChangeFloat64ToTagged(Node* value, Node* control) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 if_box = graph()->NewNode(common()->Merge(2), if_ovf, if_box); | 226 if_box = graph()->NewNode(common()->Merge(2), if_ovf, if_box); |
226 | 227 |
227 if_smi = graph()->NewNode(common()->IfFalse(), branch_ovf); | 228 if_smi = graph()->NewNode(common()->IfFalse(), branch_ovf); |
228 vsmi = graph()->NewNode(common()->Projection(0), smi_tag); | 229 vsmi = graph()->NewNode(common()->Projection(0), smi_tag); |
229 } | 230 } |
230 | 231 |
231 // Allocate the box for the {value}. | 232 // Allocate the box for the {value}. |
232 vbox = AllocateHeapNumberWithValue(value, if_box); | 233 vbox = AllocateHeapNumberWithValue(value, if_box); |
233 | 234 |
234 control = graph()->NewNode(common()->Merge(2), if_smi, if_box); | 235 control = graph()->NewNode(common()->Merge(2), if_smi, if_box); |
235 value = | 236 value = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
236 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), vsmi, vbox, control); | 237 vsmi, vbox, control); |
237 return Replace(value); | 238 return Replace(value); |
238 } | 239 } |
239 | 240 |
240 | 241 |
241 Reduction ChangeLowering::ChangeInt32ToTagged(Node* value, Node* control) { | 242 Reduction ChangeLowering::ChangeInt32ToTagged(Node* value, Node* control) { |
242 if (machine()->Is64() || | 243 if (machine()->Is64() || |
243 NodeProperties::GetType(value)->Is(Type::SignedSmall())) { | 244 NodeProperties::GetType(value)->Is(Type::SignedSmall())) { |
244 return Replace(ChangeInt32ToSmi(value)); | 245 return Replace(ChangeInt32ToSmi(value)); |
245 } | 246 } |
246 | 247 |
247 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value); | 248 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value); |
248 | 249 |
249 Node* ovf = graph()->NewNode(common()->Projection(1), add); | 250 Node* ovf = graph()->NewNode(common()->Projection(1), add); |
250 Node* branch = | 251 Node* branch = |
251 graph()->NewNode(common()->Branch(BranchHint::kFalse), ovf, control); | 252 graph()->NewNode(common()->Branch(BranchHint::kFalse), ovf, control); |
252 | 253 |
253 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 254 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
254 Node* vtrue = | 255 Node* vtrue = |
255 AllocateHeapNumberWithValue(ChangeInt32ToFloat64(value), if_true); | 256 AllocateHeapNumberWithValue(ChangeInt32ToFloat64(value), if_true); |
256 | 257 |
257 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 258 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
258 Node* vfalse = graph()->NewNode(common()->Projection(0), add); | 259 Node* vfalse = graph()->NewNode(common()->Projection(0), add); |
259 | 260 |
260 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 261 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
261 Node* phi = | 262 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
262 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), vtrue, vfalse, merge); | 263 vtrue, vfalse, merge); |
263 | 264 |
264 return Replace(phi); | 265 return Replace(phi); |
265 } | 266 } |
266 | 267 |
267 | 268 |
268 Reduction ChangeLowering::ChangeTaggedToUI32(Node* value, Node* control, | 269 Reduction ChangeLowering::ChangeTaggedToUI32(Node* value, Node* control, |
269 Signedness signedness) { | 270 Signedness signedness) { |
270 if (NodeProperties::GetType(value)->Is(Type::TaggedSigned())) { | 271 if (NodeProperties::GetType(value)->Is(Type::TaggedSigned())) { |
271 return Replace(ChangeSmiToInt32(value)); | 272 return Replace(ChangeSmiToInt32(value)); |
272 } | 273 } |
273 | 274 |
274 const MachineType type = (signedness == kSigned) ? kMachInt32 : kMachUint32; | |
275 const Operator* op = (signedness == kSigned) | 275 const Operator* op = (signedness == kSigned) |
276 ? machine()->ChangeFloat64ToInt32() | 276 ? machine()->ChangeFloat64ToInt32() |
277 : machine()->ChangeFloat64ToUint32(); | 277 : machine()->ChangeFloat64ToUint32(); |
278 | 278 |
279 if (NodeProperties::GetType(value)->Is(Type::TaggedPointer())) { | 279 if (NodeProperties::GetType(value)->Is(Type::TaggedPointer())) { |
280 return Replace(graph()->NewNode(op, LoadHeapNumberValue(value, control))); | 280 return Replace(graph()->NewNode(op, LoadHeapNumberValue(value, control))); |
281 } | 281 } |
282 | 282 |
283 Node* check = TestNotSmi(value); | 283 Node* check = TestNotSmi(value); |
284 Node* branch = | 284 Node* branch = |
285 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | 285 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); |
286 | 286 |
287 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 287 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
288 Node* vtrue = graph()->NewNode(op, LoadHeapNumberValue(value, if_true)); | 288 Node* vtrue = graph()->NewNode(op, LoadHeapNumberValue(value, if_true)); |
289 | 289 |
290 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 290 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
291 Node* vfalse = ChangeSmiToInt32(value); | 291 Node* vfalse = ChangeSmiToInt32(value); |
292 | 292 |
293 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 293 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
294 Node* phi = graph()->NewNode(common()->Phi(type, 2), vtrue, vfalse, merge); | 294 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), |
| 295 vtrue, vfalse, merge); |
295 | 296 |
296 return Replace(phi); | 297 return Replace(phi); |
297 } | 298 } |
298 | 299 |
299 | 300 |
300 namespace { | 301 namespace { |
301 | 302 |
302 bool CanCover(Node* value, IrOpcode::Value opcode) { | 303 bool CanCover(Node* value, IrOpcode::Value opcode) { |
303 if (value->opcode() != opcode) return false; | 304 if (value->opcode() != opcode) return false; |
304 bool first = true; | 305 bool first = true; |
(...skipping 18 matching lines...) Expand all Loading... |
323 // if IsSmi(y) then ChangeSmiToFloat64(y) | 324 // if IsSmi(y) then ChangeSmiToFloat64(y) |
324 // else LoadHeapNumberValue(y) | 325 // else LoadHeapNumberValue(y) |
325 Node* const object = NodeProperties::GetValueInput(value, 0); | 326 Node* const object = NodeProperties::GetValueInput(value, 0); |
326 Node* const context = NodeProperties::GetContextInput(value); | 327 Node* const context = NodeProperties::GetContextInput(value); |
327 Node* const frame_state = NodeProperties::GetFrameStateInput(value, 0); | 328 Node* const frame_state = NodeProperties::GetFrameStateInput(value, 0); |
328 Node* const effect = NodeProperties::GetEffectInput(value); | 329 Node* const effect = NodeProperties::GetEffectInput(value); |
329 Node* const control = NodeProperties::GetControlInput(value); | 330 Node* const control = NodeProperties::GetControlInput(value); |
330 | 331 |
331 const Operator* merge_op = common()->Merge(2); | 332 const Operator* merge_op = common()->Merge(2); |
332 const Operator* ephi_op = common()->EffectPhi(2); | 333 const Operator* ephi_op = common()->EffectPhi(2); |
333 const Operator* phi_op = common()->Phi(kMachFloat64, 2); | 334 const Operator* phi_op = common()->Phi(MachineRepresentation::kFloat64, 2); |
334 | 335 |
335 Node* check1 = TestNotSmi(object); | 336 Node* check1 = TestNotSmi(object); |
336 Node* branch1 = | 337 Node* branch1 = |
337 graph()->NewNode(common()->Branch(BranchHint::kFalse), check1, control); | 338 graph()->NewNode(common()->Branch(BranchHint::kFalse), check1, control); |
338 | 339 |
339 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); | 340 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); |
340 Node* vtrue1 = graph()->NewNode(value->op(), object, context, frame_state, | 341 Node* vtrue1 = graph()->NewNode(value->op(), object, context, frame_state, |
341 effect, if_true1); | 342 effect, if_true1); |
342 Node* etrue1 = vtrue1; | 343 Node* etrue1 = vtrue1; |
343 | 344 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 Node* branch = | 381 Node* branch = |
381 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | 382 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); |
382 | 383 |
383 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 384 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
384 Node* vtrue = LoadHeapNumberValue(value, if_true); | 385 Node* vtrue = LoadHeapNumberValue(value, if_true); |
385 | 386 |
386 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 387 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
387 Node* vfalse = ChangeSmiToFloat64(value); | 388 Node* vfalse = ChangeSmiToFloat64(value); |
388 | 389 |
389 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 390 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
390 Node* phi = | 391 Node* phi = graph()->NewNode( |
391 graph()->NewNode(common()->Phi(kMachFloat64, 2), vtrue, vfalse, merge); | 392 common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, vfalse, merge); |
392 | 393 |
393 return Replace(phi); | 394 return Replace(phi); |
394 } | 395 } |
395 | 396 |
396 | 397 |
397 Reduction ChangeLowering::ChangeUint32ToTagged(Node* value, Node* control) { | 398 Reduction ChangeLowering::ChangeUint32ToTagged(Node* value, Node* control) { |
398 if (NodeProperties::GetType(value)->Is(Type::UnsignedSmall())) { | 399 if (NodeProperties::GetType(value)->Is(Type::UnsignedSmall())) { |
399 return Replace(ChangeUint32ToSmi(value)); | 400 return Replace(ChangeUint32ToSmi(value)); |
400 } | 401 } |
401 | 402 |
402 Node* check = graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, | 403 Node* check = graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, |
403 SmiMaxValueConstant()); | 404 SmiMaxValueConstant()); |
404 Node* branch = | 405 Node* branch = |
405 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 406 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
406 | 407 |
407 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 408 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
408 Node* vtrue = ChangeUint32ToSmi(value); | 409 Node* vtrue = ChangeUint32ToSmi(value); |
409 | 410 |
410 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 411 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
411 Node* vfalse = | 412 Node* vfalse = |
412 AllocateHeapNumberWithValue(ChangeUint32ToFloat64(value), if_false); | 413 AllocateHeapNumberWithValue(ChangeUint32ToFloat64(value), if_false); |
413 | 414 |
414 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 415 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
415 Node* phi = | 416 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
416 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), vtrue, vfalse, merge); | 417 vtrue, vfalse, merge); |
417 | 418 |
418 return Replace(phi); | 419 return Replace(phi); |
419 } | 420 } |
420 | 421 |
421 | 422 |
422 namespace { | 423 namespace { |
423 | 424 |
424 WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, | 425 WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, |
425 MachineType representation, | 426 MachineRepresentation representation, |
426 Type* field_type, Type* input_type) { | 427 Type* field_type, Type* input_type) { |
427 if (field_type->Is(Type::TaggedSigned()) || | 428 if (field_type->Is(Type::TaggedSigned()) || |
428 input_type->Is(Type::TaggedSigned())) { | 429 input_type->Is(Type::TaggedSigned())) { |
429 // Write barriers are only for writes of heap objects. | 430 // Write barriers are only for writes of heap objects. |
430 return kNoWriteBarrier; | 431 return kNoWriteBarrier; |
431 } | 432 } |
432 if (input_type->Is(Type::BooleanOrNullOrUndefined())) { | 433 if (input_type->Is(Type::BooleanOrNullOrUndefined())) { |
433 // Write barriers are not necessary when storing true, false, null or | 434 // Write barriers are not necessary when storing true, false, null or |
434 // undefined, because these special oddballs are always in the root set. | 435 // undefined, because these special oddballs are always in the root set. |
435 return kNoWriteBarrier; | 436 return kNoWriteBarrier; |
436 } | 437 } |
437 if (base_is_tagged == kTaggedBase && | 438 if (base_is_tagged == kTaggedBase && |
438 RepresentationOf(representation) == kRepTagged) { | 439 representation == MachineRepresentation::kTagged) { |
439 if (input_type->IsConstant() && | 440 if (input_type->IsConstant() && |
440 input_type->AsConstant()->Value()->IsHeapObject()) { | 441 input_type->AsConstant()->Value()->IsHeapObject()) { |
441 Handle<HeapObject> input = | 442 Handle<HeapObject> input = |
442 Handle<HeapObject>::cast(input_type->AsConstant()->Value()); | 443 Handle<HeapObject>::cast(input_type->AsConstant()->Value()); |
443 if (input->IsMap()) { | 444 if (input->IsMap()) { |
444 // Write barriers for storing maps are cheaper. | 445 // Write barriers for storing maps are cheaper. |
445 return kMapWriteBarrier; | 446 return kMapWriteBarrier; |
446 } | 447 } |
447 Isolate* const isolate = input->GetIsolate(); | 448 Isolate* const isolate = input->GetIsolate(); |
448 RootIndexMap root_index_map(isolate); | 449 RootIndexMap root_index_map(isolate); |
(...skipping 24 matching lines...) Expand all Loading... |
473 node->InsertInput(graph()->zone(), 1, offset); | 474 node->InsertInput(graph()->zone(), 1, offset); |
474 NodeProperties::ChangeOp(node, machine()->Load(access.machine_type)); | 475 NodeProperties::ChangeOp(node, machine()->Load(access.machine_type)); |
475 return Changed(node); | 476 return Changed(node); |
476 } | 477 } |
477 | 478 |
478 | 479 |
479 Reduction ChangeLowering::StoreField(Node* node) { | 480 Reduction ChangeLowering::StoreField(Node* node) { |
480 const FieldAccess& access = FieldAccessOf(node->op()); | 481 const FieldAccess& access = FieldAccessOf(node->op()); |
481 Type* type = NodeProperties::GetType(node->InputAt(1)); | 482 Type* type = NodeProperties::GetType(node->InputAt(1)); |
482 WriteBarrierKind kind = ComputeWriteBarrierKind( | 483 WriteBarrierKind kind = ComputeWriteBarrierKind( |
483 access.base_is_tagged, access.machine_type, access.type, type); | 484 access.base_is_tagged, access.machine_type.representation(), access.type, |
| 485 type); |
484 Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag()); | 486 Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag()); |
485 node->InsertInput(graph()->zone(), 1, offset); | 487 node->InsertInput(graph()->zone(), 1, offset); |
486 NodeProperties::ChangeOp( | 488 NodeProperties::ChangeOp( |
487 node, machine()->Store(StoreRepresentation(access.machine_type, kind))); | 489 node, machine()->Store(StoreRepresentation(access.machine_type, kind))); |
488 return Changed(node); | 490 return Changed(node); |
489 } | 491 } |
490 | 492 |
491 | 493 |
492 Node* ChangeLowering::ComputeIndex(const ElementAccess& access, | 494 Node* ChangeLowering::ComputeIndex(const ElementAccess& access, |
493 Node* const key) { | 495 Node* const key) { |
494 Node* index = key; | 496 Node* index = key; |
495 const int element_size_shift = ElementSizeLog2Of(access.machine_type); | 497 const int element_size_shift = |
| 498 ElementSizeLog2Of(access.machine_type.representation()); |
496 if (element_size_shift) { | 499 if (element_size_shift) { |
497 index = graph()->NewNode(machine()->Word32Shl(), index, | 500 index = graph()->NewNode(machine()->Word32Shl(), index, |
498 jsgraph()->Int32Constant(element_size_shift)); | 501 jsgraph()->Int32Constant(element_size_shift)); |
499 } | 502 } |
500 const int fixed_offset = access.header_size - access.tag(); | 503 const int fixed_offset = access.header_size - access.tag(); |
501 if (fixed_offset) { | 504 if (fixed_offset) { |
502 index = graph()->NewNode(machine()->Int32Add(), index, | 505 index = graph()->NewNode(machine()->Int32Add(), index, |
503 jsgraph()->Int32Constant(fixed_offset)); | 506 jsgraph()->Int32Constant(fixed_offset)); |
504 } | 507 } |
505 if (machine()->Is64()) { | 508 if (machine()->Is64()) { |
(...skipping 12 matching lines...) Expand all Loading... |
518 NodeProperties::ChangeOp(node, machine()->Load(access.machine_type)); | 521 NodeProperties::ChangeOp(node, machine()->Load(access.machine_type)); |
519 return Changed(node); | 522 return Changed(node); |
520 } | 523 } |
521 | 524 |
522 | 525 |
523 Reduction ChangeLowering::StoreElement(Node* node) { | 526 Reduction ChangeLowering::StoreElement(Node* node) { |
524 const ElementAccess& access = ElementAccessOf(node->op()); | 527 const ElementAccess& access = ElementAccessOf(node->op()); |
525 Type* type = NodeProperties::GetType(node->InputAt(2)); | 528 Type* type = NodeProperties::GetType(node->InputAt(2)); |
526 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); | 529 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); |
527 NodeProperties::ChangeOp( | 530 NodeProperties::ChangeOp( |
528 node, | 531 node, machine()->Store(StoreRepresentation( |
529 machine()->Store(StoreRepresentation( | 532 access.machine_type, |
530 access.machine_type, | 533 ComputeWriteBarrierKind(access.base_is_tagged, |
531 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type, | 534 access.machine_type.representation(), |
532 access.type, type)))); | 535 access.type, type)))); |
533 return Changed(node); | 536 return Changed(node); |
534 } | 537 } |
535 | 538 |
536 | 539 |
537 Reduction ChangeLowering::Allocate(Node* node) { | 540 Reduction ChangeLowering::Allocate(Node* node) { |
538 PretenureFlag pretenure = OpParameter<PretenureFlag>(node->op()); | 541 PretenureFlag pretenure = OpParameter<PretenureFlag>(node->op()); |
539 if (pretenure == NOT_TENURED) { | 542 if (pretenure == NOT_TENURED) { |
540 Callable callable = CodeFactory::AllocateInNewSpace(isolate()); | 543 Callable callable = CodeFactory::AllocateInNewSpace(isolate()); |
541 Node* target = jsgraph()->HeapConstant(callable.code()); | 544 Node* target = jsgraph()->HeapConstant(callable.code()); |
542 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( | 545 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 } | 580 } |
578 | 581 |
579 | 582 |
580 MachineOperatorBuilder* ChangeLowering::machine() const { | 583 MachineOperatorBuilder* ChangeLowering::machine() const { |
581 return jsgraph()->machine(); | 584 return jsgraph()->machine(); |
582 } | 585 } |
583 | 586 |
584 } // namespace compiler | 587 } // namespace compiler |
585 } // namespace internal | 588 } // namespace internal |
586 } // namespace v8 | 589 } // namespace v8 |
OLD | NEW |