| Index: src/compiler/arm/code-generator-arm.cc
 | 
| diff --git a/src/compiler/arm/code-generator-arm.cc b/src/compiler/arm/code-generator-arm.cc
 | 
| index a5a6979a7fbda9a8f8aff96e0b5177f201379979..1b7e312593d5ca530bc6dd8110d2abf623a80853 100644
 | 
| --- a/src/compiler/arm/code-generator-arm.cc
 | 
| +++ b/src/compiler/arm/code-generator-arm.cc
 | 
| @@ -1108,6 +1108,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
 | 
|        DCHECK_EQ(LeaveCC, i.OutputSBit());
 | 
|        break;
 | 
|      }
 | 
| +    case kArmVmovU32F32:
 | 
| +      __ vmov(i.OutputRegister(), i.InputFloat32Register(0));
 | 
| +      DCHECK_EQ(LeaveCC, i.OutputSBit());
 | 
| +      break;
 | 
|      case kArmVmovLowU32F64:
 | 
|        __ VmovLow(i.OutputRegister(), i.InputFloat64Register(0));
 | 
|        DCHECK_EQ(LeaveCC, i.OutputSBit());
 | 
| @@ -1591,23 +1595,50 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
 | 
|        }
 | 
|      }
 | 
|    } else if (source->IsFPRegister()) {
 | 
| -    DwVfpRegister src = g.ToDoubleRegister(source);
 | 
| -    if (destination->IsFPRegister()) {
 | 
| -      DwVfpRegister dst = g.ToDoubleRegister(destination);
 | 
| -      __ Move(dst, src);
 | 
| +    MachineRepresentation rep = LocationOperand::cast(source)->representation();
 | 
| +    if (rep == MachineRepresentation::kFloat64) {
 | 
| +      DwVfpRegister src = g.ToDoubleRegister(source);
 | 
| +      if (destination->IsFPRegister()) {
 | 
| +        DwVfpRegister dst = g.ToDoubleRegister(destination);
 | 
| +        __ Move(dst, src);
 | 
| +      } else {
 | 
| +        DCHECK(destination->IsFPStackSlot());
 | 
| +        __ vstr(src, g.ToMemOperand(destination));
 | 
| +      }
 | 
|      } else {
 | 
| -      DCHECK(destination->IsFPStackSlot());
 | 
| -      __ vstr(src, g.ToMemOperand(destination));
 | 
| +      DCHECK_EQ(MachineRepresentation::kFloat32, rep);
 | 
| +      SwVfpRegister src = g.ToFloat32Register(source);
 | 
| +      if (destination->IsFPRegister()) {
 | 
| +        SwVfpRegister dst = g.ToFloat32Register(destination);
 | 
| +        __ Move(dst, src);
 | 
| +      } else {
 | 
| +        DCHECK(destination->IsFPStackSlot());
 | 
| +        __ vstr(src, g.ToMemOperand(destination));
 | 
| +      }
 | 
|      }
 | 
|    } else if (source->IsFPStackSlot()) {
 | 
| -    DCHECK(destination->IsFPRegister() || destination->IsFPStackSlot());
 | 
|      MemOperand src = g.ToMemOperand(source);
 | 
| +    MachineRepresentation rep =
 | 
| +        LocationOperand::cast(destination)->representation();
 | 
|      if (destination->IsFPRegister()) {
 | 
| -      __ vldr(g.ToDoubleRegister(destination), src);
 | 
| +      if (rep == MachineRepresentation::kFloat64) {
 | 
| +        __ vldr(g.ToDoubleRegister(destination), src);
 | 
| +      } else {
 | 
| +        DCHECK_EQ(MachineRepresentation::kFloat32, rep);
 | 
| +        __ vldr(g.ToFloat32Register(destination), src);
 | 
| +      }
 | 
|      } else {
 | 
| -      DwVfpRegister temp = kScratchDoubleReg;
 | 
| -      __ vldr(temp, src);
 | 
| -      __ vstr(temp, g.ToMemOperand(destination));
 | 
| +      DCHECK(destination->IsFPStackSlot());
 | 
| +      if (rep == MachineRepresentation::kFloat64) {
 | 
| +        DwVfpRegister temp = kScratchDoubleReg;
 | 
| +        __ vldr(temp, src);
 | 
| +        __ vstr(temp, g.ToMemOperand(destination));
 | 
| +      } else {
 | 
| +        DCHECK_EQ(MachineRepresentation::kFloat32, rep);
 | 
| +        SwVfpRegister temp = kScratchDoubleReg.low();
 | 
| +        __ vldr(temp, src);
 | 
| +        __ vstr(temp, g.ToMemOperand(destination));
 | 
| +      }
 | 
|      }
 | 
|    } else {
 | 
|      UNREACHABLE();
 | 
| @@ -1647,34 +1678,61 @@ void CodeGenerator::AssembleSwap(InstructionOperand* source,
 | 
|      __ str(temp_0, dst);
 | 
|      __ vstr(temp_1, src);
 | 
|    } else if (source->IsFPRegister()) {
 | 
| -    DwVfpRegister temp = kScratchDoubleReg;
 | 
| -    DwVfpRegister src = g.ToDoubleRegister(source);
 | 
| -    if (destination->IsFPRegister()) {
 | 
| -      DwVfpRegister dst = g.ToDoubleRegister(destination);
 | 
| -      __ Move(temp, src);
 | 
| -      __ Move(src, dst);
 | 
| -      __ Move(dst, temp);
 | 
| +    MachineRepresentation rep = LocationOperand::cast(source)->representation();
 | 
| +    LowDwVfpRegister temp = kScratchDoubleReg;
 | 
| +    if (rep == MachineRepresentation::kFloat64) {
 | 
| +      DwVfpRegister src = g.ToDoubleRegister(source);
 | 
| +      if (destination->IsFPRegister()) {
 | 
| +        DwVfpRegister dst = g.ToDoubleRegister(destination);
 | 
| +        __ Move(temp, src);
 | 
| +        __ Move(src, dst);
 | 
| +        __ Move(dst, temp);
 | 
| +      } else {
 | 
| +        DCHECK(destination->IsFPStackSlot());
 | 
| +        MemOperand dst = g.ToMemOperand(destination);
 | 
| +        __ Move(temp, src);
 | 
| +        __ vldr(src, dst);
 | 
| +        __ vstr(temp, dst);
 | 
| +      }
 | 
|      } else {
 | 
| -      DCHECK(destination->IsFPStackSlot());
 | 
| -      MemOperand dst = g.ToMemOperand(destination);
 | 
| -      __ Move(temp, src);
 | 
| -      __ vldr(src, dst);
 | 
| -      __ vstr(temp, dst);
 | 
| +      DCHECK_EQ(MachineRepresentation::kFloat32, rep);
 | 
| +      SwVfpRegister src = g.ToFloat32Register(source);
 | 
| +      if (destination->IsFPRegister()) {
 | 
| +        SwVfpRegister dst = g.ToFloat32Register(destination);
 | 
| +        __ Move(temp.low(), src);
 | 
| +        __ Move(src, dst);
 | 
| +        __ Move(dst, temp.low());
 | 
| +      } else {
 | 
| +        DCHECK(destination->IsFPStackSlot());
 | 
| +        MemOperand dst = g.ToMemOperand(destination);
 | 
| +        __ Move(temp.low(), src);
 | 
| +        __ vldr(src, dst);
 | 
| +        __ vstr(temp.low(), dst);
 | 
| +      }
 | 
|      }
 | 
|    } else if (source->IsFPStackSlot()) {
 | 
|      DCHECK(destination->IsFPStackSlot());
 | 
|      Register temp_0 = kScratchReg;
 | 
| -    DwVfpRegister temp_1 = kScratchDoubleReg;
 | 
| +    LowDwVfpRegister temp_1 = kScratchDoubleReg;
 | 
|      MemOperand src0 = g.ToMemOperand(source);
 | 
| -    MemOperand src1(src0.rn(), src0.offset() + kPointerSize);
 | 
|      MemOperand dst0 = g.ToMemOperand(destination);
 | 
| -    MemOperand dst1(dst0.rn(), dst0.offset() + kPointerSize);
 | 
| -    __ vldr(temp_1, dst0);  // Save destination in temp_1.
 | 
| -    __ ldr(temp_0, src0);   // Then use temp_0 to copy source to destination.
 | 
| -    __ str(temp_0, dst0);
 | 
| -    __ ldr(temp_0, src1);
 | 
| -    __ str(temp_0, dst1);
 | 
| -    __ vstr(temp_1, src0);
 | 
| +    MachineRepresentation rep = LocationOperand::cast(source)->representation();
 | 
| +    if (rep == MachineRepresentation::kFloat64) {
 | 
| +      MemOperand src1(src0.rn(), src0.offset() + kPointerSize);
 | 
| +      MemOperand dst1(dst0.rn(), dst0.offset() + kPointerSize);
 | 
| +      __ vldr(temp_1, dst0);  // Save destination in temp_1.
 | 
| +      __ ldr(temp_0, src0);   // Then use temp_0 to copy source to destination.
 | 
| +      __ str(temp_0, dst0);
 | 
| +      __ ldr(temp_0, src1);
 | 
| +      __ str(temp_0, dst1);
 | 
| +      __ vstr(temp_1, src0);
 | 
| +    } else {
 | 
| +      DCHECK_EQ(MachineRepresentation::kFloat32, rep);
 | 
| +      __ vldr(temp_1.low(), dst0);  // Save destination in temp_1.
 | 
| +      __ ldr(temp_0, src0);  // Then use temp_0 to copy source to destination.
 | 
| +      __ str(temp_0, dst0);
 | 
| +      __ vstr(temp_1.low(), src0);
 | 
| +    }
 | 
|    } else {
 | 
|      // No other combinations are possible.
 | 
|      UNREACHABLE();
 | 
| 
 |