Revision: 6339
Author: [email protected]
Date: Sun Jan 16 23:26:36 2011
Log: Landing for Martyn Capewell.

ARM: Implement DoInteger32ToDouble in lithium codegen. Clean up
temporary register use.

Code review URL: http://codereview.chromium.org/6257003/
http://code.google.com/p/v8/source/detail?r=6339

Modified:
 /branches/bleeding_edge/src/arm/assembler-arm.h
 /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc
 /branches/bleeding_edge/src/arm/lithium-codegen-arm.h

=======================================
--- /branches/bleeding_edge/src/arm/assembler-arm.h     Thu Jan 13 04:21:47 2011
+++ /branches/bleeding_edge/src/arm/assembler-arm.h     Sun Jan 16 23:26:36 2011
@@ -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",
=======================================
--- /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Fri Jan 14 07:08:44 2011 +++ /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Sun Jan 16 23:26:36 2011
@@ -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);
 }


=======================================
--- /branches/bleeding_edge/src/arm/lithium-codegen-arm.h Fri Jan 14 04:50:03 2011 +++ /branches/bleeding_edge/src/arm/lithium-codegen-arm.h Sun Jan 16 23:26:36 2011
@@ -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