Reviewers: Mads Ager, Description: ARM: Implement DoInteger32ToDouble stub.
BUG=none TEST=none Please review this at http://codereview.chromium.org/6257003/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/arm/assembler-arm.h M src/arm/lithium-codegen-arm.h M src/arm/lithium-codegen-arm.cc Index: src/arm/assembler-arm.h =================================================================== --- src/arm/assembler-arm.h (revision 6336) +++ src/arm/assembler-arm.h (working copy) @@ -171,7 +171,7 @@ // d1 has also been excluded from allocation to be used as a scratch // register as well. static const int kNumRegisters = 16; - static const int kNumAllocatableRegisters = 14; + static const int kNumAllocatableRegisters = 15; static int ToAllocationIndex(DwVfpRegister reg) { ASSERT(reg.code() != 0); @@ -180,12 +180,13 @@ static DwVfpRegister FromAllocationIndex(int index) { ASSERT(index >= 0 && index < kNumAllocatableRegisters); - return from_code(index + 2); + return from_code(index + 1); } static const char* AllocationIndexToString(int index) { ASSERT(index >= 0 && index < kNumAllocatableRegisters); const char* const names[] = { + "d1", "d2", "d3", "d4", Index: src/arm/lithium-codegen-arm.cc =================================================================== --- src/arm/lithium-codegen-arm.cc (revision 6336) +++ src/arm/lithium-codegen-arm.cc (working copy) @@ -2300,7 +2300,7 @@ DoubleRegister input = ToDoubleRegister(instr->input()); Register result = ToRegister(instr->result()); Register prev_fpscr = ToRegister(instr->temp()); - SwVfpRegister single_scratch = single_scratch0(); + SwVfpRegister single_scratch = double_scratch0().low(); Register scratch = scratch0(); // Set custom FPCSR: @@ -2508,7 +2508,19 @@ void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) { - Abort("DoInteger32ToDouble unimplemented."); + LOperand* input = instr->input(); + ASSERT(input->IsRegister() || input->IsStackSlot()); + LOperand* output = instr->result(); + ASSERT(output->IsDoubleRegister()); + SwVfpRegister single_scratch = double_scratch0().low(); + if (input->IsStackSlot()) { + Register scratch = scratch0(); + __ ldr(scratch, ToMemOperand(input)); + __ vmov(single_scratch, scratch); + } else { + __ vmov(single_scratch, ToRegister(input)); + } + __ vcvt_f64_s32(ToDoubleRegister(output), single_scratch); } Index: src/arm/lithium-codegen-arm.h =================================================================== --- src/arm/lithium-codegen-arm.h (revision 6336) +++ src/arm/lithium-codegen-arm.h (working copy) @@ -130,9 +130,7 @@ MacroAssembler* masm() const { return masm_; } Register scratch0() { return r9; } - SwVfpRegister single_scratch0() { return s0; } - SwVfpRegister single_scratch1() { return s1; } - DwVfpRegister double_scratch0() { return d1; } + DwVfpRegister double_scratch0() { return d0; } int GetNextEmittedBlock(int block); LInstruction* GetNextInstruction(); -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
