Index: runtime/vm/intermediate_language_x64.cc |
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
index cf5e72d61ef9feba38f5a91636b2d8a14f0a5e2b..0522ff0964595f175585d2ad57b3ad64f4184837 100644 |
--- a/runtime/vm/intermediate_language_x64.cc |
+++ b/runtime/vm/intermediate_language_x64.cc |
@@ -3139,7 +3139,7 @@ void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
} |
-LocationSummary* Float32x4ShuffleInstr::MakeLocationSummary() const { |
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
LocationSummary* summary = |
@@ -3150,7 +3150,7 @@ LocationSummary* Float32x4ShuffleInstr::MakeLocationSummary() const { |
} |
-void Float32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
XmmRegister value = locs()->in(0).fpu_reg(); |
ASSERT(locs()->out().fpu_reg() == value); |
@@ -3173,6 +3173,7 @@ void Float32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ cvtss2sd(value, value); |
break; |
case MethodRecognizer::kFloat32x4Shuffle: |
+ case MethodRecognizer::kUint32x4Shuffle: |
__ shufps(value, value, Immediate(mask_)); |
break; |
default: UNREACHABLE(); |
@@ -3180,6 +3181,33 @@ void Float32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
} |
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary() const { |
+ const intptr_t kNumInputs = 2; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* summary = |
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_in(1, Location::RequiresFpuRegister()); |
+ summary->set_out(Location::SameAsFirstInput()); |
+ return summary; |
+} |
+ |
+ |
+void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister left = locs()->in(0).fpu_reg(); |
+ XmmRegister right = locs()->in(1).fpu_reg(); |
+ |
+ ASSERT(locs()->out().fpu_reg() == left); |
+ switch (op_kind()) { |
+ case MethodRecognizer::kFloat32x4ShuffleMix: |
+ case MethodRecognizer::kUint32x4ShuffleMix: |
+ __ shufps(left, right, Immediate(mask_)); |
+ break; |
+ default: UNREACHABLE(); |
+ } |
+} |
+ |
+ |
LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
@@ -3541,45 +3569,6 @@ void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
} |
-LocationSummary* Float32x4TwoArgShuffleInstr::MakeLocationSummary() const { |
- const intptr_t kNumInputs = 2; |
- const intptr_t kNumTemps = 0; |
- LocationSummary* summary = |
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
- summary->set_in(0, Location::RequiresFpuRegister()); |
- summary->set_in(1, Location::RequiresFpuRegister()); |
- summary->set_out(Location::SameAsFirstInput()); |
- return summary; |
-} |
- |
- |
-void Float32x4TwoArgShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- XmmRegister left = locs()->in(0).fpu_reg(); |
- XmmRegister right = locs()->in(1).fpu_reg(); |
- |
- ASSERT(locs()->out().fpu_reg() == left); |
- |
- switch (op_kind()) { |
- case MethodRecognizer::kFloat32x4WithZWInXY: |
- __ movhlps(left, right); |
- break; |
- case MethodRecognizer::kFloat32x4InterleaveXY: |
- __ unpcklps(left, right); |
- break; |
- case MethodRecognizer::kFloat32x4InterleaveZW: |
- __ unpckhps(left, right); |
- break; |
- case MethodRecognizer::kFloat32x4InterleaveXYPairs: |
- __ unpcklpd(left, right); |
- break; |
- case MethodRecognizer::kFloat32x4InterleaveZWPairs: |
- __ unpckhpd(left, right); |
- break; |
- default: UNREACHABLE(); |
- } |
-} |
- |
- |
LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 4; |
const intptr_t kNumTemps = 1; |