| Index: src/compiler/register-allocator.cc | 
| diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc | 
| index 14ceae11c33a8481703dad7a410ff96627c801d1..01c9bde874c0282f5a5104ac23ecec41707b2d54 100644 | 
| --- a/src/compiler/register-allocator.cc | 
| +++ b/src/compiler/register-allocator.cc | 
| @@ -1344,6 +1344,8 @@ RegisterAllocationData::RegisterAllocationData( | 
| allocation_zone()), | 
| fixed_double_live_ranges_(this->config()->num_double_registers(), nullptr, | 
| allocation_zone()), | 
| +      fixed_simd128_live_ranges_(this->config()->num_simd128_registers(), | 
| +                                 nullptr, allocation_zone()), | 
| spill_ranges_(code->VirtualRegisterCount(), nullptr, allocation_zone()), | 
| delayed_references_(allocation_zone()), | 
| assigned_registers_(nullptr), | 
| @@ -1521,12 +1523,14 @@ void RegisterAllocationData::MarkAllocated(MachineRepresentation rep, | 
| int index) { | 
| switch (rep) { | 
| case MachineRepresentation::kFloat32: | 
| +    case MachineRepresentation::kSimd128: | 
| if (kSimpleFPAliasing) { | 
| assigned_double_registers_->Add(index); | 
| } else { | 
| int alias_base_index = -1; | 
| int aliases = config()->GetAliases( | 
| rep, index, MachineRepresentation::kFloat64, &alias_base_index); | 
| +        DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 
| while (aliases--) { | 
| int aliased_reg = alias_base_index + aliases; | 
| assigned_double_registers_->Add(aliased_reg); | 
| @@ -1857,17 +1861,22 @@ void LiveRangeBuilder::AddInitialIntervals(const InstructionBlock* block, | 
| } | 
|  | 
| int LiveRangeBuilder::FixedFPLiveRangeID(int index, MachineRepresentation rep) { | 
| +  int result = -index - 1; | 
| switch (rep) { | 
| +    case MachineRepresentation::kSimd128: | 
| +      result -= config()->num_float_registers(); | 
| +    // Fall through. | 
| case MachineRepresentation::kFloat32: | 
| -      return -index - 1 - config()->num_general_registers(); | 
| +      result -= config()->num_double_registers(); | 
| +    // Fall through. | 
| case MachineRepresentation::kFloat64: | 
| -      return -index - 1 - config()->num_general_registers() - | 
| -             config()->num_float_registers(); | 
| +      result -= config()->num_general_registers(); | 
| +      break; | 
| default: | 
| +      UNREACHABLE(); | 
| break; | 
| } | 
| -  UNREACHABLE(); | 
| -  return 0; | 
| +  return result; | 
| } | 
|  | 
| TopLevelLiveRange* LiveRangeBuilder::FixedLiveRangeFor(int index) { | 
| @@ -1887,27 +1896,44 @@ TopLevelLiveRange* LiveRangeBuilder::FixedLiveRangeFor(int index) { | 
| TopLevelLiveRange* LiveRangeBuilder::FixedFPLiveRangeFor( | 
| int index, MachineRepresentation rep) { | 
| TopLevelLiveRange* result = nullptr; | 
| -  if (rep == MachineRepresentation::kFloat64) { | 
| -    DCHECK(index < config()->num_double_registers()); | 
| -    result = data()->fixed_double_live_ranges()[index]; | 
| -    if (result == nullptr) { | 
| -      result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 
| -      DCHECK(result->IsFixed()); | 
| -      result->set_assigned_register(index); | 
| -      data()->MarkAllocated(rep, index); | 
| -      data()->fixed_double_live_ranges()[index] = result; | 
| -    } | 
| -  } else { | 
| -    DCHECK(rep == MachineRepresentation::kFloat32); | 
| -    DCHECK(index < config()->num_float_registers()); | 
| -    result = data()->fixed_float_live_ranges()[index]; | 
| -    if (result == nullptr) { | 
| -      result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 
| -      DCHECK(result->IsFixed()); | 
| -      result->set_assigned_register(index); | 
| -      data()->MarkAllocated(rep, index); | 
| -      data()->fixed_float_live_ranges()[index] = result; | 
| -    } | 
| +  switch (rep) { | 
| +    case MachineRepresentation::kFloat32: | 
| +      DCHECK(rep == MachineRepresentation::kFloat32); | 
| +      DCHECK(index < config()->num_float_registers()); | 
| +      result = data()->fixed_float_live_ranges()[index]; | 
| +      if (result == nullptr) { | 
| +        result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 
| +        DCHECK(result->IsFixed()); | 
| +        result->set_assigned_register(index); | 
| +        data()->MarkAllocated(rep, index); | 
| +        data()->fixed_float_live_ranges()[index] = result; | 
| +      } | 
| +      break; | 
| +    case MachineRepresentation::kFloat64: | 
| +      DCHECK(index < config()->num_double_registers()); | 
| +      result = data()->fixed_double_live_ranges()[index]; | 
| +      if (result == nullptr) { | 
| +        result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 
| +        DCHECK(result->IsFixed()); | 
| +        result->set_assigned_register(index); | 
| +        data()->MarkAllocated(rep, index); | 
| +        data()->fixed_double_live_ranges()[index] = result; | 
| +      } | 
| +      break; | 
| +    case MachineRepresentation::kSimd128: | 
| +      DCHECK(index < config()->num_simd128_registers()); | 
| +      result = data()->fixed_simd128_live_ranges()[index]; | 
| +      if (result == nullptr) { | 
| +        result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 
| +        DCHECK(result->IsFixed()); | 
| +        result->set_assigned_register(index); | 
| +        data()->MarkAllocated(rep, index); | 
| +        data()->fixed_simd128_live_ranges()[index] = result; | 
| +      } | 
| +      break; | 
| +    default: | 
| +      UNREACHABLE(); | 
| +      break; | 
| } | 
| return result; | 
| } | 
| @@ -2051,6 +2077,14 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, | 
| range->AddUseInterval(curr_position, curr_position.End(), | 
| allocation_zone()); | 
| } | 
| +        for (int i = 0; i < config()->num_allocatable_simd128_registers(); | 
| +             ++i) { | 
| +          int code = config()->GetAllocatableSimd128Code(i); | 
| +          TopLevelLiveRange* range = | 
| +              FixedFPLiveRangeFor(code, MachineRepresentation::kSimd128); | 
| +          range->AddUseInterval(curr_position, curr_position.End(), | 
| +                                allocation_zone()); | 
| +        } | 
| } | 
| } | 
|  | 
| @@ -2787,15 +2821,22 @@ void LinearScanAllocator::InactiveToActive(LiveRange* range) { | 
|  | 
|  | 
| bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { | 
| +  MachineRepresentation rep = current->representation(); | 
| int num_regs = num_registers(); | 
| int num_codes = num_allocatable_registers(); | 
| const int* codes = allocatable_register_codes(); | 
| -  if (!kSimpleFPAliasing && | 
| -      (current->representation() == MachineRepresentation::kFloat32)) { | 
| -    num_regs = data()->config()->num_float_registers(); | 
| -    num_codes = data()->config()->num_allocatable_float_registers(); | 
| -    codes = data()->config()->allocatable_float_codes(); | 
| +  if (!kSimpleFPAliasing) { | 
| +    if (rep == MachineRepresentation::kFloat32) { | 
| +      num_regs = data()->config()->num_float_registers(); | 
| +      num_codes = data()->config()->num_allocatable_float_registers(); | 
| +      codes = data()->config()->allocatable_float_codes(); | 
| +    } else if (rep == MachineRepresentation::kSimd128) { | 
| +      num_regs = data()->config()->num_simd128_registers(); | 
| +      num_codes = data()->config()->num_allocatable_simd128_registers(); | 
| +      codes = data()->config()->allocatable_simd128_codes(); | 
| +    } | 
| } | 
| + | 
| LifetimePosition free_until_pos[RegisterConfiguration::kMaxFPRegisters]; | 
| for (int i = 0; i < num_regs; i++) { | 
| free_until_pos[i] = LifetimePosition::MaxPosition(); | 
| @@ -2810,8 +2851,8 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { | 
| } else { | 
| int alias_base_index = -1; | 
| int aliases = data()->config()->GetAliases( | 
| -          cur_active->representation(), cur_reg, current->representation(), | 
| -          &alias_base_index); | 
| +          cur_active->representation(), cur_reg, rep, &alias_base_index); | 
| +      DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 
| while (aliases--) { | 
| int aliased_reg = alias_base_index + aliases; | 
| free_until_pos[aliased_reg] = | 
| @@ -2833,8 +2874,8 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { | 
| } else { | 
| int alias_base_index = -1; | 
| int aliases = data()->config()->GetAliases( | 
| -          cur_inactive->representation(), cur_reg, current->representation(), | 
| -          &alias_base_index); | 
| +          cur_inactive->representation(), cur_reg, rep, &alias_base_index); | 
| +      DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 
| while (aliases--) { | 
| int aliased_reg = alias_base_index + aliases; | 
| free_until_pos[aliased_reg] = | 
| @@ -2904,14 +2945,20 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { | 
| return; | 
| } | 
|  | 
| +  MachineRepresentation rep = current->representation(); | 
| int num_regs = num_registers(); | 
| int num_codes = num_allocatable_registers(); | 
| const int* codes = allocatable_register_codes(); | 
| -  if (!kSimpleFPAliasing && | 
| -      (current->representation() == MachineRepresentation::kFloat32)) { | 
| -    num_regs = data()->config()->num_float_registers(); | 
| -    num_codes = data()->config()->num_allocatable_float_registers(); | 
| -    codes = data()->config()->allocatable_float_codes(); | 
| +  if (!kSimpleFPAliasing) { | 
| +    if (rep == MachineRepresentation::kFloat32) { | 
| +      num_regs = data()->config()->num_float_registers(); | 
| +      num_codes = data()->config()->num_allocatable_float_registers(); | 
| +      codes = data()->config()->allocatable_float_codes(); | 
| +    } else if (rep == MachineRepresentation::kSimd128) { | 
| +      num_regs = data()->config()->num_simd128_registers(); | 
| +      num_codes = data()->config()->num_allocatable_simd128_registers(); | 
| +      codes = data()->config()->allocatable_simd128_codes(); | 
| +    } | 
| } | 
|  | 
| LifetimePosition use_pos[RegisterConfiguration::kMaxFPRegisters]; | 
| @@ -2940,8 +2987,8 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { | 
| } else { | 
| int alias_base_index = -1; | 
| int aliases = data()->config()->GetAliases( | 
| -          range->representation(), cur_reg, current->representation(), | 
| -          &alias_base_index); | 
| +          range->representation(), cur_reg, rep, &alias_base_index); | 
| +      DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 
| while (aliases--) { | 
| int aliased_reg = alias_base_index + aliases; | 
| if (is_fixed_or_cant_spill) { | 
| @@ -2976,8 +3023,8 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { | 
| } else { | 
| int alias_base_index = -1; | 
| int aliases = data()->config()->GetAliases( | 
| -          range->representation(), cur_reg, current->representation(), | 
| -          &alias_base_index); | 
| +          range->representation(), cur_reg, rep, &alias_base_index); | 
| +      DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 
| while (aliases--) { | 
| int aliased_reg = alias_base_index + aliases; | 
| if (is_fixed) { | 
|  |