Index: runtime/vm/intermediate_language_x64.cc |
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
index 2fb6dedcdde628234f931e17ccc4f160d62e65bc..9f79d0715a6eacb9e18289c5d60f39f030dd5a1a 100644 |
--- a/runtime/vm/intermediate_language_x64.cc |
+++ b/runtime/vm/intermediate_language_x64.cc |
@@ -3270,6 +3270,34 @@ void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
} |
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) 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 BinaryFloat64x2OpInstr::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 Token::kADD: __ addpd(left, right); break; |
+ case Token::kSUB: __ subpd(left, right); break; |
+ case Token::kMUL: __ mulpd(left, right); break; |
+ case Token::kDIV: __ divpd(left, right); break; |
+ default: UNREACHABLE(); |
+ } |
+} |
+ |
+ |
LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
@@ -3701,6 +3729,127 @@ void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
} |
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* summary = |
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_out(Location::SameAsFirstInput()); |
+ return summary; |
+} |
+ |
+ |
+void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister value = locs()->in(0).fpu_reg(); |
+ |
+ ASSERT(locs()->out().fpu_reg() == value); |
+ switch (op_kind()) { |
+ case MethodRecognizer::kFloat64x2GetX: |
+ __ shufpd(value, value, Immediate(0x00)); |
+ break; |
+ case MethodRecognizer::kFloat64x2GetY: |
+ __ shufpd(value, value, Immediate(0x33)); |
+ break; |
+ default: UNREACHABLE(); |
+ } |
+} |
+ |
+ |
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const { |
+ const intptr_t kNumInputs = 0; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* summary = |
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ summary->set_out(Location::RequiresFpuRegister()); |
+ return summary; |
+} |
+ |
+ |
+void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister value = locs()->out().fpu_reg(); |
+ __ xorpd(value, value); |
+} |
+ |
+ |
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* summary = |
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_out(Location::SameAsFirstInput()); |
+ return summary; |
+} |
+ |
+ |
+void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister value = locs()->out().fpu_reg(); |
+ __ shufpd(value, value, Immediate(0x0)); |
+} |
+ |
+ |
+LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( |
+ bool opt) 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 Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister v0 = locs()->in(0).fpu_reg(); |
+ XmmRegister v1 = locs()->in(1).fpu_reg(); |
+ ASSERT(v0 == locs()->out().fpu_reg()); |
+ __ AddImmediate(RSP, Immediate(-16), PP); |
+ __ movsd(Address(RSP, 0), v0); |
+ __ movsd(Address(RSP, 8), v1); |
+ __ movups(v0, Address(RSP, 0)); |
+ __ AddImmediate(RSP, Immediate(16), PP); |
+} |
+ |
+ |
+LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( |
+ bool opt) const { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* summary = |
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_out(Location::SameAsFirstInput()); |
+ return summary; |
+} |
+ |
+ |
+void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister value = locs()->out().fpu_reg(); |
+ __ cvtpd2ps(value, value); |
+} |
+ |
+ |
+LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( |
+ bool opt) const { |
+ const intptr_t kNumInputs = 1; |
+ const intptr_t kNumTemps = 0; |
+ LocationSummary* summary = |
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
+ summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_out(Location::SameAsFirstInput()); |
+ return summary; |
+} |
+ |
+ |
+void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
+ XmmRegister value = locs()->out().fpu_reg(); |
+ __ cvtps2pd(value, value); |
+} |
+ |
+ |
LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( |
bool opt) const { |
const intptr_t kNumInputs = 4; |