Index: src/compiler/change-lowering.cc |
diff --git a/src/compiler/change-lowering.cc b/src/compiler/change-lowering.cc |
index 907b36a93b7dd860c2a32e27a6b685444c9baf33..6bee8aba74626b3e372f979af7c2f6d242b091e9 100644 |
--- a/src/compiler/change-lowering.cc |
+++ b/src/compiler/change-lowering.cc |
@@ -39,6 +39,13 @@ Reduction ChangeLowering::Reduce(Node* node) { |
return ChangeTaggedToUI32(node->InputAt(0), control, kUnsigned); |
case IrOpcode::kChangeUint32ToTagged: |
return ChangeUint32ToTagged(node->InputAt(0), control); |
+#define SIMD128_CASES(TYPE, Type, type, lane_count, lane_type) \ |
+ case IrOpcode::kChange##Type##ToTagged: \ |
+ return Change##Type##ToTagged(node->InputAt(0), control); \ |
+ case IrOpcode::kChangeTaggedTo##Type: \ |
+ return ChangeTaggedTo##Type(node->InputAt(0), control); |
+ SIMD128_TYPES(SIMD128_CASES) |
+#undef SIMD128_CASES |
case IrOpcode::kLoadField: |
return LoadField(node); |
case IrOpcode::kStoreField: |
@@ -69,6 +76,9 @@ Node* ChangeLowering::HeapNumberValueIndexConstant() { |
return jsgraph()->IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag); |
} |
+Node* ChangeLowering::Simd128ValueIndexConstant() { |
+ return jsgraph()->IntPtrConstant(Simd128Value::kValueOffset - kHeapObjectTag); |
+} |
Node* ChangeLowering::SmiMaxValueConstant() { |
return jsgraph()->Int32Constant(Smi::kMaxValue); |
@@ -102,6 +112,29 @@ Node* ChangeLowering::AllocateHeapNumberWithValue(Node* value, Node* control) { |
return graph()->NewNode(common()->FinishRegion(), heap_number, store); |
} |
+#define SIMD128_ALLOCATE(TYPE, Type, type, lane_count, lane_type) \ |
+ Node* ChangeLowering::Allocate##Type##WithValue(Node* value) { \ |
+ Callable callable = CodeFactory::Allocate##Type(isolate()); \ |
+ Node* target = jsgraph()->HeapConstant(callable.code()); \ |
+ Node* context = jsgraph()->NoContextConstant(); \ |
+ Node* effect = \ |
+ graph()->NewNode(common()->BeginRegion(), graph()->start()); \ |
+ if (!allocate_##type##_value_operator_.is_set()) { \ |
+ CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( \ |
+ isolate(), jsgraph()->zone(), callable.descriptor(), 0, \ |
+ CallDescriptor::kNoFlags, Operator::kNoThrow); \ |
+ allocate_##type##_value_operator_.set(common()->Call(descriptor)); \ |
+ } \ |
+ Node* simd_value = graph()->NewNode( \ |
+ allocate_##type##_value_operator_.get(), target, context, effect); \ |
+ Node* store = graph()->NewNode( \ |
+ machine()->Store(StoreRepresentation(MachineRepresentation::kSimd128, \ |
+ kNoWriteBarrier)), \ |
+ simd_value, Simd128ValueIndexConstant(), value, simd_value); \ |
+ return graph()->NewNode(common()->FinishRegion(), simd_value, store); \ |
+ } |
+SIMD128_TYPES(SIMD128_ALLOCATE) |
+#undef SIMD128_ALLOCATE |
Node* ChangeLowering::ChangeInt32ToFloat64(Node* value) { |
return graph()->NewNode(machine()->ChangeInt32ToFloat64(), value); |
@@ -149,6 +182,13 @@ Node* ChangeLowering::LoadHeapNumberValue(Node* value, Node* control) { |
control); |
} |
+#define SIMD128_LOAD(TYPE, Type, type, lane_count, lane_type) \ |
+ Node* ChangeLowering::Load##Type##Value(Node* value) { \ |
+ return graph()->NewNode(machine()->Load(MachineType::Simd128()), value, \ |
+ Simd128ValueIndexConstant(), graph()->start()); \ |
+ } |
+SIMD128_TYPES(SIMD128_LOAD) |
+#undef SIMD128_LOAD |
Node* ChangeLowering::TestNotSmi(Node* value) { |
STATIC_ASSERT(kSmiTag == 0); |
@@ -427,6 +467,20 @@ Reduction ChangeLowering::ChangeUint32ToTagged(Node* value, Node* control) { |
return Replace(phi); |
} |
+#define SIMD128_CHANGE(TYPE, SType, type, lane_count, lane_type) \ |
+ Reduction ChangeLowering::ChangeTaggedTo##SType(Node* value, \ |
+ Node* control) { \ |
+ DCHECK(NodeProperties::GetType(value)->Is(Type::TaggedPointer())); \ |
+ return Replace(Load##SType##Value(value)); \ |
+ } \ |
+ \ |
+ Reduction ChangeLowering::Change##SType##ToTagged(Node* value, \ |
+ Node* control) { \ |
+ DCHECK(NodeProperties::GetType(value)->Is(Type::Simd())); \ |
+ return Replace(Allocate##SType##WithValue(value)); \ |
+ } |
+SIMD128_TYPES(SIMD128_CHANGE) |
+#undef SIMD128_CHANGE |
namespace { |