| Index: src/arm64/ic-arm64.cc
 | 
| diff --git a/src/arm64/ic-arm64.cc b/src/arm64/ic-arm64.cc
 | 
| index f1de3fa790fe1a92d653b562b95fc8ddfc97c1f5..0bcd8774b4c5d69223a315d7c9d8b7239e37db6a 100644
 | 
| --- a/src/arm64/ic-arm64.cc
 | 
| +++ b/src/arm64/ic-arm64.cc
 | 
| @@ -407,18 +407,16 @@ static MemOperand GenerateUnmappedArgumentsLookup(MacroAssembler* masm,
 | 
|  
 | 
|  
 | 
|  void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
 | 
| -  // ----------- S t a t e -------------
 | 
| -  //  -- x2    : name
 | 
| -  //  -- lr    : return address
 | 
| -  //  -- x0    : receiver
 | 
| -  // -----------------------------------
 | 
| -  ASSERT(x0.is(ReceiverRegister()));
 | 
| -  ASSERT(x2.is(NameRegister()));
 | 
| +  // The return address is in lr.
 | 
| +  Register receiver = ReceiverRegister();
 | 
| +  Register name = NameRegister();
 | 
| +  ASSERT(receiver.is(x1));
 | 
| +  ASSERT(name.is(x2));
 | 
|  
 | 
|    // Probe the stub cache.
 | 
|    Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC);
 | 
|    masm->isolate()->stub_cache()->GenerateProbe(
 | 
| -      masm, flags, x0, x2, x3, x4, x5, x6);
 | 
| +      masm, flags, receiver, name, x3, x4, x5, x6);
 | 
|  
 | 
|    // Cache miss: Jump to runtime.
 | 
|    GenerateMiss(masm);
 | 
| @@ -429,16 +427,16 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) {
 | 
|    // ----------- S t a t e -------------
 | 
|    //  -- x2    : name
 | 
|    //  -- lr    : return address
 | 
| -  //  -- x0    : receiver
 | 
| +  //  -- x1    : receiver
 | 
|    // -----------------------------------
 | 
| -  ASSERT(x0.is(ReceiverRegister()));
 | 
| +  ASSERT(x1.is(ReceiverRegister()));
 | 
|    ASSERT(x2.is(NameRegister()));
 | 
|    Label miss, slow;
 | 
|  
 | 
| -  GenerateNameDictionaryReceiverCheck(masm, x0, x1, x3, x4, &miss);
 | 
| +  GenerateNameDictionaryReceiverCheck(masm, x1, x0, x3, x4, &miss);
 | 
|  
 | 
| -  // x1 now holds the property dictionary.
 | 
| -  GenerateDictionaryLoad(masm, &slow, x1, x2, x0, x3, x4);
 | 
| +  // x0 now holds the property dictionary.
 | 
| +  GenerateDictionaryLoad(masm, &slow, x0, x2, x0, x3, x4);
 | 
|    __ Ret();
 | 
|  
 | 
|    // Dictionary load failed, go slow (but don't miss).
 | 
| @@ -452,7 +450,7 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) {
 | 
|  
 | 
|  
 | 
|  void LoadIC::GenerateMiss(MacroAssembler* masm) {
 | 
| -  // The return address is on the stack.
 | 
| +  // The return address is in lr.
 | 
|    Isolate* isolate = masm->isolate();
 | 
|    ASM_LOCATION("LoadIC::GenerateMiss");
 | 
|  
 | 
| @@ -467,27 +465,23 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
 | 
|  
 | 
|  
 | 
|  void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
 | 
| -  // The return address is on the stack.
 | 
| +  // The return address is in lr.
 | 
|    __ Push(ReceiverRegister(), NameRegister());
 | 
|    __ TailCallRuntime(Runtime::kGetProperty, 2, 1);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) {
 | 
| -  // ---------- S t a t e --------------
 | 
| -  //  -- lr     : return address
 | 
| -  //  -- x0     : key
 | 
| -  //  -- x1     : receiver
 | 
| -  // -----------------------------------
 | 
| +  // The return address is in lr.
 | 
|    Register result = x0;
 | 
|    Register receiver = ReceiverRegister();
 | 
|    Register key = NameRegister();
 | 
|    ASSERT(receiver.is(x1));
 | 
| -  ASSERT(key.is(x0));
 | 
| +  ASSERT(key.is(x2));
 | 
|  
 | 
|    Label miss, unmapped;
 | 
|  
 | 
| -  Register map_scratch = x2;
 | 
| +  Register map_scratch = x0;
 | 
|    MemOperand mapped_location = GenerateMappedArgumentsLookup(
 | 
|        masm, receiver, key, map_scratch, x3, x4, &unmapped, &miss);
 | 
|    __ Ldr(result, mapped_location);
 | 
| @@ -497,10 +491,8 @@ void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) {
 | 
|    // Parameter map is left in map_scratch when a jump on unmapped is done.
 | 
|    MemOperand unmapped_location =
 | 
|        GenerateUnmappedArgumentsLookup(masm, key, map_scratch, x3, &miss);
 | 
| -  __ Ldr(x2, unmapped_location);
 | 
| -  __ JumpIfRoot(x2, Heap::kTheHoleValueRootIndex, &miss);
 | 
| -  // Move the result in x0. x0 must be preserved on miss.
 | 
| -  __ Mov(result, x2);
 | 
| +  __ Ldr(result, unmapped_location);
 | 
| +  __ JumpIfRoot(result, Heap::kTheHoleValueRootIndex, &miss);
 | 
|    __ Ret();
 | 
|  
 | 
|    __ Bind(&miss);
 | 
| @@ -560,7 +552,7 @@ void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) {
 | 
|  
 | 
|  
 | 
|  void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
 | 
| -  // The return address is on the stack.
 | 
| +  // The return address is in lr.
 | 
|    Isolate* isolate = masm->isolate();
 | 
|  
 | 
|    __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, x10, x11);
 | 
| @@ -576,14 +568,12 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
 | 
|  
 | 
|  
 | 
|  // IC register specifications
 | 
| -const Register LoadIC::ReceiverRegister() { return x0; }
 | 
| +const Register LoadIC::ReceiverRegister() { return x1; }
 | 
|  const Register LoadIC::NameRegister() { return x2; }
 | 
| -const Register KeyedLoadIC::ReceiverRegister() { return x1; }
 | 
| -const Register KeyedLoadIC::NameRegister() { return x0; }
 | 
|  
 | 
|  
 | 
|  void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
 | 
| -  // The return address is on the stack.
 | 
| +  // The return address is in lr.
 | 
|    __ Push(ReceiverRegister(), NameRegister());
 | 
|    __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1);
 | 
|  }
 | 
| @@ -753,34 +743,30 @@ static void GenerateKeyedLoadWithNameKey(MacroAssembler* masm,
 | 
|  
 | 
|  
 | 
|  void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
 | 
| -  // ---------- S t a t e --------------
 | 
| -  //  -- lr     : return address
 | 
| -  //  -- x0     : key
 | 
| -  //  -- x1     : receiver
 | 
| -  // -----------------------------------
 | 
| +  // The return address is in lr.
 | 
|    Label slow, check_name, index_smi, index_name;
 | 
|  
 | 
|    Register key = NameRegister();
 | 
|    Register receiver = ReceiverRegister();
 | 
| -  ASSERT(key.is(x0));
 | 
| +  ASSERT(key.is(x2));
 | 
|    ASSERT(receiver.is(x1));
 | 
|  
 | 
|    __ JumpIfNotSmi(key, &check_name);
 | 
|    __ Bind(&index_smi);
 | 
|    // Now the key is known to be a smi. This place is also jumped to from below
 | 
|    // where a numeric string is converted to a smi.
 | 
| -  GenerateKeyedLoadWithSmiKey(masm, key, receiver, x2, x3, x4, x5, x6, &slow);
 | 
| +  GenerateKeyedLoadWithSmiKey(masm, key, receiver, x7, x3, x4, x5, x6, &slow);
 | 
|  
 | 
| -  // Slow case, key and receiver still in x0 and x1.
 | 
| +  // Slow case.
 | 
|    __ Bind(&slow);
 | 
|    __ IncrementCounter(
 | 
| -      masm->isolate()->counters()->keyed_load_generic_slow(), 1, x2, x3);
 | 
| +      masm->isolate()->counters()->keyed_load_generic_slow(), 1, x4, x3);
 | 
|    GenerateRuntimeGetProperty(masm);
 | 
|  
 | 
|    __ Bind(&check_name);
 | 
| -  GenerateKeyNameCheck(masm, key, x2, x3, &index_name, &slow);
 | 
| +  GenerateKeyNameCheck(masm, key, x0, x3, &index_name, &slow);
 | 
|  
 | 
| -  GenerateKeyedLoadWithNameKey(masm, key, receiver, x2, x3, x4, x5, x6, &slow);
 | 
| +  GenerateKeyedLoadWithNameKey(masm, key, receiver, x7, x3, x4, x5, x6, &slow);
 | 
|  
 | 
|    __ Bind(&index_name);
 | 
|    __ IndexFromHash(x3, key);
 | 
| @@ -790,7 +776,7 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
 | 
|  
 | 
|  
 | 
|  void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
 | 
| -  // Return address is on the stack.
 | 
| +  // Return address is in lr.
 | 
|    Label miss;
 | 
|  
 | 
|    Register receiver = ReceiverRegister();
 | 
| @@ -819,15 +805,14 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) {
 | 
|  
 | 
|  
 | 
|  void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
 | 
| -  // Return address is on the stack.
 | 
| +  // Return address is in lr.
 | 
|    Label slow;
 | 
|  
 | 
|    Register receiver = ReceiverRegister();
 | 
|    Register key = NameRegister();
 | 
| -  Register scratch1 = x2;
 | 
| -  Register scratch2 = x3;
 | 
| -  ASSERT(!scratch1.is(receiver) && !scratch1.is(key));
 | 
| -  ASSERT(!scratch2.is(receiver) && !scratch2.is(key));
 | 
| +  Register scratch1 = x3;
 | 
| +  Register scratch2 = x4;
 | 
| +  ASSERT(!AreAliased(scratch1, scratch2, receiver, key));
 | 
|  
 | 
|    // Check that the receiver isn't a smi.
 | 
|    __ JumpIfSmi(receiver, &slow);
 | 
| 
 |