| Index: src/x64/ic-x64.cc
|
| ===================================================================
|
| --- src/x64/ic-x64.cc (revision 3816)
|
| +++ src/x64/ic-x64.cc (working copy)
|
| @@ -228,26 +228,40 @@
|
| }
|
|
|
|
|
| -void KeyedLoadIC::Generate(MacroAssembler* masm,
|
| - ExternalReference const& f) {
|
| +void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- rsp[0] : return address
|
| // -- rsp[8] : name
|
| // -- rsp[16] : receiver
|
| // -----------------------------------
|
|
|
| - __ movq(rax, Operand(rsp, kPointerSize));
|
| - __ movq(rcx, Operand(rsp, 2 * kPointerSize));
|
| __ pop(rbx);
|
| - __ push(rcx); // receiver
|
| - __ push(rax); // name
|
| + __ push(Operand(rsp, 1 * kPointerSize)); // receiver
|
| + __ push(Operand(rsp, 1 * kPointerSize)); // name
|
| __ push(rbx); // return address
|
|
|
| // Perform tail call to the entry.
|
| - __ TailCallRuntime(f, 2, 1);
|
| + __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedLoadIC_Miss)), 2, 1);
|
| }
|
|
|
|
|
| +void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
|
| + // ----------- S t a t e -------------
|
| + // -- rsp[0] : return address
|
| + // -- rsp[8] : name
|
| + // -- rsp[16] : receiver
|
| + // -----------------------------------
|
| +
|
| + __ pop(rbx);
|
| + __ push(Operand(rsp, 1 * kPointerSize)); // receiver
|
| + __ push(Operand(rsp, 1 * kPointerSize)); // name
|
| + __ push(rbx); // return address
|
| +
|
| + // Perform tail call to the entry.
|
| + __ TailCallRuntime(ExternalReference(Runtime::kKeyedGetProperty), 2, 1);
|
| +}
|
| +
|
| +
|
| void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- rsp[0] : return address
|
| @@ -317,7 +331,7 @@
|
| // Slow case: Load name and receiver from stack and jump to runtime.
|
| __ bind(&slow);
|
| __ IncrementCounter(&Counters::keyed_load_generic_slow, 1);
|
| - Generate(masm, ExternalReference(Runtime::kKeyedGetProperty));
|
| + GenerateRuntimeGetProperty(masm);
|
| __ bind(&check_string);
|
| // The key is not a smi.
|
| // Is it a string?
|
| @@ -555,21 +569,30 @@
|
| // Slow case: Load name and receiver from stack and jump to runtime.
|
| __ bind(&slow);
|
| __ IncrementCounter(&Counters::keyed_load_external_array_slow, 1);
|
| - Generate(masm, ExternalReference(Runtime::kKeyedGetProperty));
|
| + GenerateRuntimeGetProperty(masm);
|
| }
|
|
|
|
|
| -void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
|
| +void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| - // -- rsp[0] : return address
|
| - // -- rsp[8] : name
|
| + // -- rax : value
|
| + // -- rsp[0] : return address
|
| + // -- rsp[8] : key
|
| // -- rsp[16] : receiver
|
| // -----------------------------------
|
| - Generate(masm, ExternalReference(IC_Utility(kKeyedLoadIC_Miss)));
|
| +
|
| + __ pop(rcx);
|
| + __ push(Operand(rsp, 1 * kPointerSize)); // receiver
|
| + __ push(Operand(rsp, 1 * kPointerSize)); // key
|
| + __ push(rax); // value
|
| + __ push(rcx); // return address
|
| +
|
| + // Do tail-call to runtime routine.
|
| + __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedStoreIC_Miss)), 3, 1);
|
| }
|
|
|
|
|
| -void KeyedStoreIC::Generate(MacroAssembler* masm, ExternalReference const& f) {
|
| +void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- rax : value
|
| // -- rsp[0] : return address
|
| @@ -584,7 +607,7 @@
|
| __ push(rcx); // return address
|
|
|
| // Do tail-call to runtime routine.
|
| - __ TailCallRuntime(f, 3, 1);
|
| + __ TailCallRuntime(ExternalReference(Runtime::kSetProperty), 3, 1);
|
| }
|
|
|
|
|
| @@ -659,7 +682,7 @@
|
|
|
| // Slow case: call runtime.
|
| __ bind(&slow);
|
| - Generate(masm, ExternalReference(Runtime::kSetProperty));
|
| + GenerateRuntimeSetProperty(masm);
|
|
|
| // Check whether the elements is a pixel array.
|
| // rax: value
|
| @@ -923,7 +946,7 @@
|
|
|
| // Slow case: call runtime.
|
| __ bind(&slow);
|
| - Generate(masm, ExternalReference(Runtime::kSetProperty));
|
| + GenerateRuntimeSetProperty(masm);
|
| }
|
|
|
|
|
| @@ -1153,22 +1176,20 @@
|
| }
|
|
|
|
|
| -void LoadIC::Generate(MacroAssembler* masm, ExternalReference const& f) {
|
| +void LoadIC::GenerateMiss(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- rcx : name
|
| // -- rsp[0] : return address
|
| // -- rsp[8] : receiver
|
| // -----------------------------------
|
|
|
| - __ movq(rax, Operand(rsp, kPointerSize));
|
| -
|
| __ pop(rbx);
|
| - __ push(rax); // receiver
|
| + __ push(Operand(rsp, 0)); // receiver
|
| __ push(rcx); // name
|
| __ push(rbx); // return address
|
|
|
| // Perform tail call to the entry.
|
| - __ TailCallRuntime(f, 2, 1);
|
| + __ TailCallRuntime(ExternalReference(IC_Utility(kLoadIC_Miss)), 2, 1);
|
| }
|
|
|
|
|
| @@ -1224,17 +1245,6 @@
|
| }
|
|
|
|
|
| -void LoadIC::GenerateMiss(MacroAssembler* masm) {
|
| - // ----------- S t a t e -------------
|
| - // -- rcx : name
|
| - // -- rsp[0] : return address
|
| - // -- rsp[8] : receiver
|
| - // -----------------------------------
|
| -
|
| - Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss)));
|
| -}
|
| -
|
| -
|
| void LoadIC::GenerateNormal(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- rcx : name
|
| @@ -1278,7 +1288,7 @@
|
| // Cache miss: Restore receiver from stack and jump to runtime.
|
| __ bind(&miss);
|
| __ movq(rax, Operand(rsp, 1 * kPointerSize));
|
| - Generate(masm, ExternalReference(IC_Utility(kLoadIC_Miss)));
|
| + GenerateMiss(masm);
|
| }
|
|
|
|
|
|
|