Index: runtime/vm/intermediate_language_x64.cc |
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
index 574c51a8e80915179d970d8d5952ec3300e42149..fcf2db74fb754ddfb500dd31bb65df8431b94a2e 100644 |
--- a/runtime/vm/intermediate_language_x64.cc |
+++ b/runtime/vm/intermediate_language_x64.cc |
@@ -3151,7 +3151,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 = |
@@ -3162,7 +3162,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); |
@@ -3185,6 +3185,7 @@ void Float32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ cvtss2sd(value, value); |
break; |
case MethodRecognizer::kFloat32x4Shuffle: |
+ case MethodRecognizer::kUint32x4Shuffle: |
__ shufps(value, value, Immediate(mask_)); |
break; |
default: UNREACHABLE(); |
@@ -3192,6 +3193,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; |
@@ -3553,45 +3581,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; |