// 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);
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",
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:
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);
}
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();