| 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 21 matching lines...) Expand all Loading... |
| 32 case IrOpcode::kChangeInt32ToTagged: | 32 case IrOpcode::kChangeInt32ToTagged: |
| 33 return ChangeInt32ToTagged(node->InputAt(0), control); | 33 return ChangeInt32ToTagged(node->InputAt(0), control); |
| 34 case IrOpcode::kChangeTaggedToFloat64: | 34 case IrOpcode::kChangeTaggedToFloat64: |
| 35 return ChangeTaggedToFloat64(node->InputAt(0), control); | 35 return ChangeTaggedToFloat64(node->InputAt(0), control); |
| 36 case IrOpcode::kChangeTaggedToInt32: | 36 case IrOpcode::kChangeTaggedToInt32: |
| 37 return ChangeTaggedToUI32(node->InputAt(0), control, kSigned); | 37 return ChangeTaggedToUI32(node->InputAt(0), control, kSigned); |
| 38 case IrOpcode::kChangeTaggedToUint32: | 38 case IrOpcode::kChangeTaggedToUint32: |
| 39 return ChangeTaggedToUI32(node->InputAt(0), control, kUnsigned); | 39 return ChangeTaggedToUI32(node->InputAt(0), control, kUnsigned); |
| 40 case IrOpcode::kChangeUint32ToTagged: | 40 case IrOpcode::kChangeUint32ToTagged: |
| 41 return ChangeUint32ToTagged(node->InputAt(0), control); | 41 return ChangeUint32ToTagged(node->InputAt(0), control); |
| 42 #define SIMD128_CASES(TYPE, Type, type, lane_count, lane_type) \ |
| 43 case IrOpcode::kChange##Type##ToTagged: \ |
| 44 return Change##Type##ToTagged(node->InputAt(0), control); \ |
| 45 case IrOpcode::kChangeTaggedTo##Type: \ |
| 46 return ChangeTaggedTo##Type(node->InputAt(0), control); |
| 47 SIMD128_TYPES(SIMD128_CASES) |
| 48 #undef SIMD128_CASES |
| 42 case IrOpcode::kLoadField: | 49 case IrOpcode::kLoadField: |
| 43 return LoadField(node); | 50 return LoadField(node); |
| 44 case IrOpcode::kStoreField: | 51 case IrOpcode::kStoreField: |
| 45 return StoreField(node); | 52 return StoreField(node); |
| 46 case IrOpcode::kLoadElement: | 53 case IrOpcode::kLoadElement: |
| 47 return LoadElement(node); | 54 return LoadElement(node); |
| 48 case IrOpcode::kStoreElement: | 55 case IrOpcode::kStoreElement: |
| 49 return StoreElement(node); | 56 return StoreElement(node); |
| 50 case IrOpcode::kAllocate: | 57 case IrOpcode::kAllocate: |
| 51 return Allocate(node); | 58 return Allocate(node); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 62 } | 69 } |
| 63 UNREACHABLE(); | 70 UNREACHABLE(); |
| 64 return NoChange(); | 71 return NoChange(); |
| 65 } | 72 } |
| 66 | 73 |
| 67 | 74 |
| 68 Node* ChangeLowering::HeapNumberValueIndexConstant() { | 75 Node* ChangeLowering::HeapNumberValueIndexConstant() { |
| 69 return jsgraph()->IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag); | 76 return jsgraph()->IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag); |
| 70 } | 77 } |
| 71 | 78 |
| 79 Node* ChangeLowering::Simd128ValueIndexConstant() { |
| 80 return jsgraph()->IntPtrConstant(Simd128Value::kValueOffset - kHeapObjectTag); |
| 81 } |
| 72 | 82 |
| 73 Node* ChangeLowering::SmiMaxValueConstant() { | 83 Node* ChangeLowering::SmiMaxValueConstant() { |
| 74 return jsgraph()->Int32Constant(Smi::kMaxValue); | 84 return jsgraph()->Int32Constant(Smi::kMaxValue); |
| 75 } | 85 } |
| 76 | 86 |
| 77 | 87 |
| 78 Node* ChangeLowering::SmiShiftBitsConstant() { | 88 Node* ChangeLowering::SmiShiftBitsConstant() { |
| 79 return jsgraph()->IntPtrConstant(kSmiShiftSize + kSmiTagSize); | 89 return jsgraph()->IntPtrConstant(kSmiShiftSize + kSmiTagSize); |
| 80 } | 90 } |
| 81 | 91 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 95 } | 105 } |
| 96 Node* heap_number = graph()->NewNode(allocate_heap_number_operator_.get(), | 106 Node* heap_number = graph()->NewNode(allocate_heap_number_operator_.get(), |
| 97 target, context, effect, control); | 107 target, context, effect, control); |
| 98 Node* store = graph()->NewNode( | 108 Node* store = graph()->NewNode( |
| 99 machine()->Store(StoreRepresentation(MachineRepresentation::kFloat64, | 109 machine()->Store(StoreRepresentation(MachineRepresentation::kFloat64, |
| 100 kNoWriteBarrier)), | 110 kNoWriteBarrier)), |
| 101 heap_number, HeapNumberValueIndexConstant(), value, heap_number, control); | 111 heap_number, HeapNumberValueIndexConstant(), value, heap_number, control); |
| 102 return graph()->NewNode(common()->FinishRegion(), heap_number, store); | 112 return graph()->NewNode(common()->FinishRegion(), heap_number, store); |
| 103 } | 113 } |
| 104 | 114 |
| 115 #define SIMD128_ALLOCATE(TYPE, Type, type, lane_count, lane_type) \ |
| 116 Node* ChangeLowering::Allocate##Type##WithValue(Node* value) { \ |
| 117 Callable callable = CodeFactory::Allocate##Type(isolate()); \ |
| 118 Node* target = jsgraph()->HeapConstant(callable.code()); \ |
| 119 Node* context = jsgraph()->NoContextConstant(); \ |
| 120 Node* effect = \ |
| 121 graph()->NewNode(common()->BeginRegion(), graph()->start()); \ |
| 122 if (!allocate_##type##_value_operator_.is_set()) { \ |
| 123 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( \ |
| 124 isolate(), jsgraph()->zone(), callable.descriptor(), 0, \ |
| 125 CallDescriptor::kNoFlags, Operator::kNoThrow); \ |
| 126 allocate_##type##_value_operator_.set(common()->Call(descriptor)); \ |
| 127 } \ |
| 128 Node* simd_value = graph()->NewNode( \ |
| 129 allocate_##type##_value_operator_.get(), target, context, effect); \ |
| 130 Node* store = graph()->NewNode( \ |
| 131 machine()->Store(StoreRepresentation(MachineRepresentation::kSimd128, \ |
| 132 kNoWriteBarrier)), \ |
| 133 simd_value, Simd128ValueIndexConstant(), value, simd_value); \ |
| 134 return graph()->NewNode(common()->FinishRegion(), simd_value, store); \ |
| 135 } |
| 136 SIMD128_TYPES(SIMD128_ALLOCATE) |
| 137 #undef SIMD128_ALLOCATE |
| 105 | 138 |
| 106 Node* ChangeLowering::ChangeInt32ToFloat64(Node* value) { | 139 Node* ChangeLowering::ChangeInt32ToFloat64(Node* value) { |
| 107 return graph()->NewNode(machine()->ChangeInt32ToFloat64(), value); | 140 return graph()->NewNode(machine()->ChangeInt32ToFloat64(), value); |
| 108 } | 141 } |
| 109 | 142 |
| 110 | 143 |
| 111 Node* ChangeLowering::ChangeInt32ToSmi(Node* value) { | 144 Node* ChangeLowering::ChangeInt32ToSmi(Node* value) { |
| 112 if (machine()->Is64()) { | 145 if (machine()->Is64()) { |
| 113 value = graph()->NewNode(machine()->ChangeInt32ToInt64(), value); | 146 value = graph()->NewNode(machine()->ChangeInt32ToInt64(), value); |
| 114 } | 147 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 142 return graph()->NewNode(machine()->WordShl(), value, SmiShiftBitsConstant()); | 175 return graph()->NewNode(machine()->WordShl(), value, SmiShiftBitsConstant()); |
| 143 } | 176 } |
| 144 | 177 |
| 145 | 178 |
| 146 Node* ChangeLowering::LoadHeapNumberValue(Node* value, Node* control) { | 179 Node* ChangeLowering::LoadHeapNumberValue(Node* value, Node* control) { |
| 147 return graph()->NewNode(machine()->Load(MachineType::Float64()), value, | 180 return graph()->NewNode(machine()->Load(MachineType::Float64()), value, |
| 148 HeapNumberValueIndexConstant(), graph()->start(), | 181 HeapNumberValueIndexConstant(), graph()->start(), |
| 149 control); | 182 control); |
| 150 } | 183 } |
| 151 | 184 |
| 185 #define SIMD128_LOAD(TYPE, Type, type, lane_count, lane_type) \ |
| 186 Node* ChangeLowering::Load##Type##Value(Node* value) { \ |
| 187 return graph()->NewNode(machine()->Load(MachineType::Simd128()), value, \ |
| 188 Simd128ValueIndexConstant(), graph()->start()); \ |
| 189 } |
| 190 SIMD128_TYPES(SIMD128_LOAD) |
| 191 #undef SIMD128_LOAD |
| 152 | 192 |
| 153 Node* ChangeLowering::TestNotSmi(Node* value) { | 193 Node* ChangeLowering::TestNotSmi(Node* value) { |
| 154 STATIC_ASSERT(kSmiTag == 0); | 194 STATIC_ASSERT(kSmiTag == 0); |
| 155 STATIC_ASSERT(kSmiTagMask == 1); | 195 STATIC_ASSERT(kSmiTagMask == 1); |
| 156 return graph()->NewNode(machine()->WordAnd(), value, | 196 return graph()->NewNode(machine()->WordAnd(), value, |
| 157 jsgraph()->IntPtrConstant(kSmiTagMask)); | 197 jsgraph()->IntPtrConstant(kSmiTagMask)); |
| 158 } | 198 } |
| 159 | 199 |
| 160 | 200 |
| 161 Reduction ChangeLowering::ChangeBitToBool(Node* value, Node* control) { | 201 Reduction ChangeLowering::ChangeBitToBool(Node* value, Node* control) { |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 Node* vfalse = | 460 Node* vfalse = |
| 421 AllocateHeapNumberWithValue(ChangeUint32ToFloat64(value), if_false); | 461 AllocateHeapNumberWithValue(ChangeUint32ToFloat64(value), if_false); |
| 422 | 462 |
| 423 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | 463 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
| 424 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), | 464 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2), |
| 425 vtrue, vfalse, merge); | 465 vtrue, vfalse, merge); |
| 426 | 466 |
| 427 return Replace(phi); | 467 return Replace(phi); |
| 428 } | 468 } |
| 429 | 469 |
| 470 #define SIMD128_CHANGE(TYPE, SType, type, lane_count, lane_type) \ |
| 471 Reduction ChangeLowering::ChangeTaggedTo##SType(Node* value, \ |
| 472 Node* control) { \ |
| 473 DCHECK(NodeProperties::GetType(value)->Is(Type::TaggedPointer())); \ |
| 474 return Replace(Load##SType##Value(value)); \ |
| 475 } \ |
| 476 \ |
| 477 Reduction ChangeLowering::Change##SType##ToTagged(Node* value, \ |
| 478 Node* control) { \ |
| 479 DCHECK(NodeProperties::GetType(value)->Is(Type::Simd())); \ |
| 480 return Replace(Allocate##SType##WithValue(value)); \ |
| 481 } |
| 482 SIMD128_TYPES(SIMD128_CHANGE) |
| 483 #undef SIMD128_CHANGE |
| 430 | 484 |
| 431 namespace { | 485 namespace { |
| 432 | 486 |
| 433 WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, | 487 WriteBarrierKind ComputeWriteBarrierKind(BaseTaggedness base_is_tagged, |
| 434 MachineRepresentation representation, | 488 MachineRepresentation representation, |
| 435 Type* field_type, Type* input_type) { | 489 Type* field_type, Type* input_type) { |
| 436 if (field_type->Is(Type::TaggedSigned()) || | 490 if (field_type->Is(Type::TaggedSigned()) || |
| 437 input_type->Is(Type::TaggedSigned())) { | 491 input_type->Is(Type::TaggedSigned())) { |
| 438 // Write barriers are only for writes of heap objects. | 492 // Write barriers are only for writes of heap objects. |
| 439 return kNoWriteBarrier; | 493 return kNoWriteBarrier; |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 } | 758 } |
| 705 | 759 |
| 706 | 760 |
| 707 MachineOperatorBuilder* ChangeLowering::machine() const { | 761 MachineOperatorBuilder* ChangeLowering::machine() const { |
| 708 return jsgraph()->machine(); | 762 return jsgraph()->machine(); |
| 709 } | 763 } |
| 710 | 764 |
| 711 } // namespace compiler | 765 } // namespace compiler |
| 712 } // namespace internal | 766 } // namespace internal |
| 713 } // namespace v8 | 767 } // namespace v8 |
| OLD | NEW |