Chromium Code Reviews| Index: runtime/vm/intermediate_language_ia32.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_ia32.cc (revision 13385) |
| +++ runtime/vm/intermediate_language_ia32.cc (working copy) |
| @@ -1985,7 +1985,7 @@ |
| const Class& double_class = compiler->double_class(); |
| const Code& stub = |
| - Code::Handle(StubCode::GetAllocationStubForClass(double_class)); |
| + Code::Handle(StubCode::GetAllocationStubForClass(double_class)); |
| const ExternalLabel label(double_class.ToCString(), stub.EntryPoint()); |
| // TODO(vegorov): allocate box in the driver loop to avoid spilling. |
| @@ -2007,6 +2007,44 @@ |
| } |
| +LocationSummary* DoubleToIntegerInstr::MakeLocationSummary() const { |
| + return MakeCallSummary(); // Slow case calls the method. |
| +} |
| + |
| + |
| +void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| + Register result = locs()->out().reg(); |
| + ASSERT(result == EAX); |
| + Register value_obj = EBX; |
| + XmmRegister value_double = XMM0; |
| + __ movl(value_obj, Address(ESP, 0)); |
|
Florian Schneider
2012/10/09 11:13:58
Alternatively, you could make the instruction take
srdjan
2012/10/09 21:23:04
Done.
|
| + __ movsd(value_double, FieldAddress(value_obj, Double::value_offset())); |
| + __ cvttsd2si(result, value_double); |
|
Florian Schneider
2012/10/09 11:13:58
Please add this instruction to the disassembler. I
srdjan
2012/10/09 21:23:04
Done.
|
| + // Overflow is signalled with minint. |
| + Label do_call, done; |
| + // Check for overflow and that it fits into Smi. |
| + __ cmpl(result, Immediate(0xC0000000)); |
| + __ j(NEGATIVE, &do_call, Assembler::kNearJump); |
| + __ SmiTag(result); |
| + __ Drop(1); |
| + __ jmp(&done); |
| + __ Bind(&do_call); |
| + ASSERT(instance_call()->HasICData()); |
| + const ICData& ic_data = *instance_call()->ic_data(); |
| + ASSERT((ic_data.NumberOfChecks() == 1)); |
| + const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0)); |
| + |
| + const intptr_t kNumberOfArguments = 1; |
| + compiler->GenerateStaticCall(instance_call()->deopt_id(), |
| + instance_call()->token_pos(), |
| + target, |
| + kNumberOfArguments, |
| + Array::Handle(), // No argument names., |
| + locs()); |
| + __ Bind(&done); |
| +} |
| + |
| + |
| LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary() const { |
| return MakeCallSummary(); |
| } |