Index: runtime/vm/intermediate_language_ia32.cc |
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc |
index 6daebaff042789c0c2a742d0c3b99571de451d4c..9f0fb5362384eaa3952199ce05f3e75e8fe22334 100644 |
--- a/runtime/vm/intermediate_language_ia32.cc |
+++ b/runtime/vm/intermediate_language_ia32.cc |
@@ -2777,12 +2777,13 @@ void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* BoxDoubleInstr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
- const intptr_t kNumTemps = 0; |
+ const intptr_t kNumTemps = 1; |
LocationSummary* summary = |
new LocationSummary(kNumInputs, |
kNumTemps, |
LocationSummary::kCallOnSlowPath); |
summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_temp(0, Location::RequiresRegister()); |
srdjan
2013/10/30 20:50:12
Ia32 does not have many registers available, and t
|
summary->set_out(Location::RequiresRegister()); |
return summary; |
} |
@@ -2830,7 +2831,8 @@ void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ TryAllocate(compiler->double_class(), |
slow_path->entry_label(), |
Assembler::kFarJump, |
- out_reg); |
+ out_reg, |
+ locs()->temp(0).reg()); |
__ Bind(slow_path->exit_label()); |
__ movsd(FieldAddress(out_reg, Double::value_offset()), value); |
} |
@@ -2884,12 +2886,13 @@ void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
- const intptr_t kNumTemps = 0; |
+ const intptr_t kNumTemps = 1; |
LocationSummary* summary = |
new LocationSummary(kNumInputs, |
kNumTemps, |
LocationSummary::kCallOnSlowPath); |
summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_temp(0, Location::RequiresRegister()); |
summary->set_out(Location::RequiresRegister()); |
return summary; |
} |
@@ -2937,7 +2940,8 @@ void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ TryAllocate(compiler->float32x4_class(), |
slow_path->entry_label(), |
Assembler::kFarJump, |
- out_reg); |
+ out_reg, |
+ locs()->temp(0).reg()); |
__ Bind(slow_path->exit_label()); |
__ movups(FieldAddress(out_reg, Float32x4::value_offset()), value); |
} |
@@ -2978,12 +2982,13 @@ void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
LocationSummary* BoxUint32x4Instr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
- const intptr_t kNumTemps = 0; |
+ const intptr_t kNumTemps = 1; |
LocationSummary* summary = |
new LocationSummary(kNumInputs, |
kNumTemps, |
LocationSummary::kCallOnSlowPath); |
summary->set_in(0, Location::RequiresFpuRegister()); |
+ summary->set_temp(0, Location::RequiresRegister()); |
summary->set_out(Location::RequiresRegister()); |
return summary; |
} |
@@ -3031,7 +3036,8 @@ void BoxUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ TryAllocate(compiler->uint32x4_class(), |
slow_path->entry_label(), |
Assembler::kFarJump, |
- out_reg); |
+ out_reg, |
+ locs()->temp(0).reg()); |
__ Bind(slow_path->exit_label()); |
__ movups(FieldAddress(out_reg, Uint32x4::value_offset()), value); |
} |
@@ -4494,7 +4500,8 @@ void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
Class::ZoneHandle(Isolate::Current()->object_store()->mint_class()), |
slow_path->entry_label(), |
Assembler::kFarJump, |
- out_reg); |
+ out_reg, |
+ EDX); |
__ Bind(slow_path->exit_label()); |
__ movsd(FieldAddress(out_reg, Mint::value_offset()), value); |
__ Bind(&done); |