| Index: src/a64/assembler-a64.h | 
| diff --git a/src/a64/assembler-a64.h b/src/a64/assembler-a64.h | 
| index 09a8a72014d9c7885266576e35094c6b60926e23..bf115b446648368d1e5398cdb0914719837db381 100644 | 
| --- a/src/a64/assembler-a64.h | 
| +++ b/src/a64/assembler-a64.h | 
| @@ -264,36 +264,60 @@ struct FPRegister : public CPURegister { | 
| static const int kMaxNumRegisters = kNumberOfFPRegisters; | 
|  | 
| // Crankshaft can use all the FP registers except: | 
| -  //   - d29 which is used in crankshaft as a double scratch register | 
| -  //   - d30 which is used to keep the 0 double value | 
| +  //   - d15 which is used to keep the 0 double value | 
| +  //   - d30 which is used in crankshaft as a double scratch register | 
| //   - d31 which is used in the MacroAssembler as a double scratch register | 
| -  static const int kNumReservedRegisters = 3; | 
| +  static const unsigned kAllocatableLowRangeBegin = 0; | 
| +  static const unsigned kAllocatableLowRangeEnd = 14; | 
| +  static const unsigned kAllocatableHighRangeBegin = 16; | 
| +  static const unsigned kAllocatableHighRangeEnd = 29; | 
| + | 
| +  static const RegList kAllocatableFPRegisters = 0x3fff7fff; | 
| + | 
| +  // Gap between low and high ranges. | 
| +  static const int kAllocatableRangeGapSize = | 
| +      (kAllocatableHighRangeBegin - kAllocatableLowRangeEnd) - 1; | 
| + | 
| static const int kMaxNumAllocatableRegisters = | 
| -      kNumberOfFPRegisters - kNumReservedRegisters; | 
| +      (kAllocatableLowRangeEnd - kAllocatableLowRangeBegin + 1) + | 
| +      (kAllocatableHighRangeEnd - kAllocatableHighRangeBegin + 1); | 
| static int NumAllocatableRegisters() { return kMaxNumAllocatableRegisters; } | 
| -  static const RegList kAllocatableFPRegisters = | 
| -      (1 << kMaxNumAllocatableRegisters) - 1; | 
|  | 
| -  static FPRegister FromAllocationIndex(int index) { | 
| -    ASSERT((index >= 0) && (index < NumAllocatableRegisters())); | 
| -    return from_code(index); | 
| +  // Return true if the register is one that crankshaft can allocate. | 
| +  bool IsAllocatable() const { | 
| +    return (Bit() & kAllocatableFPRegisters) != 0; | 
| +  } | 
| + | 
| +  static FPRegister FromAllocationIndex(unsigned int index) { | 
| +    ASSERT(index < static_cast<unsigned>(NumAllocatableRegisters())); | 
| + | 
| +    return (index <= kAllocatableLowRangeEnd) | 
| +        ? from_code(index) | 
| +        : from_code(index + kAllocatableRangeGapSize); | 
| } | 
|  | 
| static const char* AllocationIndexToString(int index) { | 
| ASSERT((index >= 0) && (index < NumAllocatableRegisters())); | 
| +    ASSERT((kAllocatableLowRangeBegin == 0) && | 
| +           (kAllocatableLowRangeEnd == 14) && | 
| +           (kAllocatableHighRangeBegin == 16) && | 
| +           (kAllocatableHighRangeEnd == 29)); | 
| const char* const names[] = { | 
| "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", | 
| -      "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", | 
| +      "d8", "d9", "d10", "d11", "d12", "d13", "d14", | 
| "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", | 
| -      "d24", "d25", "d26", "d27", "d28", | 
| +      "d24", "d25", "d26", "d27", "d28", "d29" | 
| }; | 
| return names[index]; | 
| } | 
|  | 
| static int ToAllocationIndex(FPRegister reg) { | 
| -    int code = reg.code(); | 
| -    ASSERT(code < NumAllocatableRegisters()); | 
| -    return code; | 
| +    ASSERT(reg.IsAllocatable()); | 
| +    unsigned code = reg.code(); | 
| + | 
| +    return (code <= kAllocatableLowRangeEnd) | 
| +        ? code | 
| +        : code - kAllocatableRangeGapSize; | 
| } | 
|  | 
| static FPRegister from_code(int code) { | 
| @@ -375,10 +399,10 @@ ALIAS_REGISTER(Register, lr, x30); | 
| ALIAS_REGISTER(Register, xzr, x31); | 
| ALIAS_REGISTER(Register, wzr, w31); | 
|  | 
| -// Crankshaft double scratch register. | 
| -ALIAS_REGISTER(FPRegister, crankshaft_fp_scratch, d29); | 
| // Keeps the 0 double value. | 
| -ALIAS_REGISTER(FPRegister, fp_zero, d30); | 
| +ALIAS_REGISTER(FPRegister, fp_zero, d15); | 
| +// Crankshaft double scratch register. | 
| +ALIAS_REGISTER(FPRegister, crankshaft_fp_scratch, d30); | 
| // MacroAssembler double scratch register. | 
| ALIAS_REGISTER(FPRegister, fp_scratch, d31); | 
|  | 
|  |