Index: runtime/vm/intermediate_language_ia32.cc |
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc |
index aca4b09355a8edfd544a4484b10c8d253f10d2da..22d97ae25c055ae8fdfc339aa65a8fd85120c1db 100644 |
--- a/runtime/vm/intermediate_language_ia32.cc |
+++ b/runtime/vm/intermediate_language_ia32.cc |
@@ -3404,6 +3404,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; |
@@ -3835,6 +3863,129 @@ 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()); |
+ __ subl(ESP, Immediate(16)); |
+ __ movsd(Address(ESP, 0), v0); |
+ __ movsd(Address(ESP, 8), v1); |
+ __ movups(v0, Address(ESP, 0)); |
+ __ addl(ESP, Immediate(16)); |
+} |
+ |
+ |
+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; |