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