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

Reply via email to