Chromium Code Reviews| 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 a4ab884f8f203697026127fbec31449abb66106c..b053082d62935f30773e44d2a406dc4b2e9b4607 100644 | 
| --- a/src/compiler/arm/code-generator-arm.cc | 
| +++ b/src/compiler/arm/code-generator-arm.cc | 
| @@ -940,16 +940,28 @@ void CodeGenerator::AssemblePrologue() { | 
| __ mov(fp, sp); | 
| saved_pp = false; | 
| } | 
| + int register_save_area_size = saved_pp ? kPointerSize : 0; | 
| const RegList saves = descriptor->CalleeSavedRegisters(); | 
| if (saves != 0 || saved_pp) { | 
| // Save callee-saved registers. | 
| - int register_save_area_size = saved_pp ? kPointerSize : 0; | 
| - for (int i = Register::kNumRegisters - 1; i >= 0; i--) { | 
| - if (!((1 << i) & saves)) continue; | 
| - register_save_area_size += kPointerSize; | 
| - } | 
| - frame()->SetRegisterSaveAreaSize(register_save_area_size); | 
| __ stm(db_w, sp, saves); | 
| + register_save_area_size += | 
| + kPointerSize * base::bits::CountPopulation32(saves); | 
| + } | 
| + const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); | 
| + if (saves_fp != 0) { | 
| + // Save callee-saved FP registers. | 
| + DCHECK(DwVfpRegister::kMaxNumRegisters == 32); | 
| 
 
Benedikt Meurer
2015/06/24 07:04:21
Nit: How about a static assert here?
 
akos.palfi.imgtec
2015/06/24 15:36:05
Done.
 
 | 
| + uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; | 
| + uint32_t first = base::bits::CountTrailingZeros32(saves_fp); | 
| + DCHECK((last - first + 1) == base::bits::CountPopulation32(saves_fp)); | 
| 
 
Benedikt Meurer
2015/06/24 07:04:21
Nit: How about DCHECK_EQ?
 
akos.palfi.imgtec
2015/06/24 15:36:05
Done.
 
 | 
| + | 
| + __ vstm(db_w, sp, DwVfpRegister::from_code(first), | 
| + DwVfpRegister::from_code(last)); | 
| + register_save_area_size += 2 * kPointerSize * (last - first + 1); | 
| + } | 
| + if (register_save_area_size > 0) { | 
| + frame()->SetRegisterSaveAreaSize(register_save_area_size); | 
| } | 
| } else if (descriptor->IsJSFunctionCall()) { | 
| CompilationInfo* info = this->info(); | 
| @@ -993,6 +1005,15 @@ void CodeGenerator::AssembleReturn() { | 
| if (stack_slots > 0) { | 
| __ add(sp, sp, Operand(stack_slots * kPointerSize)); | 
| } | 
| + // Restore FP registers. | 
| + const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); | 
| + if (saves_fp != 0) { | 
| + DCHECK(DwVfpRegister::kMaxNumRegisters == 32); | 
| 
 
Benedikt Meurer
2015/06/24 07:04:21
Nit: STATIC_ASSERT?
 
akos.palfi.imgtec
2015/06/24 15:36:05
Done.
 
 | 
| + uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; | 
| + uint32_t first = base::bits::CountTrailingZeros32(saves_fp); | 
| + __ vldm(ia_w, sp, DwVfpRegister::from_code(first), | 
| + DwVfpRegister::from_code(last)); | 
| + } | 
| // Restore registers. | 
| const RegList saves = descriptor->CalleeSavedRegisters(); | 
| if (saves != 0) { |