Title: [158883] trunk/Source/_javascript_Core
Revision
158883
Author
[email protected]
Date
2013-11-07 15:45:56 -0800 (Thu, 07 Nov 2013)

Log Message

Change CallFrameRegister to architected frame pointer register
https://bugs.webkit.org/show_bug.cgi?id=123956

Reviewed by Geoffrey Garen.

Changed X86 and ARM variants as well as MIPS to use their respective architected
frame pointer registers.  The freed up callFrameRegisteris are made available to 
the DFG register allocator.  Modified the FTL OSR exit compiler to use a temporary
register as a stand in for the destination callFrameRegister since the FTL frame
pointer register is needed to extract values from the FTL stack.

Reviewed by Geoffrey Garen.

* assembler/ARMAssembler.h:
* assembler/ARMv7Assembler.h:
* assembler/MacroAssemblerMIPS.h:
* ftl/FTLOSRExitCompiler.cpp:
(JSC::FTL::compileStub):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::addressFor):
* jit/GPRInfo.h:
(JSC::GPRInfo::toRegister):
(JSC::GPRInfo::toIndex):
* jit/JITOperations.cpp:
* jit/JSInterfaceJIT.h:
* jit/ThunkGenerators.cpp:
(JSC::callToJavaScript):
* offlineasm/arm.rb:
* offlineasm/arm64.rb:
* offlineasm/mips.rb:
* offlineasm/x86.rb:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (158882 => 158883)


--- trunk/Source/_javascript_Core/ChangeLog	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-11-07 23:45:56 UTC (rev 158883)
@@ -1,3 +1,37 @@
+2013-11-07  Michael Saboff  <[email protected]>
+
+        Change CallFrameRegister to architected frame pointer register
+        https://bugs.webkit.org/show_bug.cgi?id=123956
+
+        Reviewed by Geoffrey Garen.
+
+        Changed X86 and ARM variants as well as MIPS to use their respective architected
+        frame pointer registers.  The freed up callFrameRegisteris are made available to 
+        the DFG register allocator.  Modified the FTL OSR exit compiler to use a temporary
+        register as a stand in for the destination callFrameRegister since the FTL frame
+        pointer register is needed to extract values from the FTL stack.
+
+        Reviewed by Geoffrey Garen.
+
+        * assembler/ARMAssembler.h:
+        * assembler/ARMv7Assembler.h:
+        * assembler/MacroAssemblerMIPS.h:
+        * ftl/FTLOSRExitCompiler.cpp:
+        (JSC::FTL::compileStub):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::addressFor):
+        * jit/GPRInfo.h:
+        (JSC::GPRInfo::toRegister):
+        (JSC::GPRInfo::toIndex):
+        * jit/JITOperations.cpp:
+        * jit/JSInterfaceJIT.h:
+        * jit/ThunkGenerators.cpp:
+        (JSC::callToJavaScript):
+        * offlineasm/arm.rb:
+        * offlineasm/arm64.rb:
+        * offlineasm/mips.rb:
+        * offlineasm/x86.rb:
+
 2013-11-07  Oliver Hunt  <[email protected]>
 
         Reproducible crash when using Map (affects Web Inspector)

Modified: trunk/Source/_javascript_Core/assembler/ARMAssembler.h (158882 => 158883)


--- trunk/Source/_javascript_Core/assembler/ARMAssembler.h	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/assembler/ARMAssembler.h	2013-11-07 23:45:56 UTC (rev 158883)
@@ -43,13 +43,13 @@
             r2,
             r3,
             r4,
-            r5, fp = r5, // frame pointer
+            r5,
             r6, S0 = r6,
             r7,
             r8,
             r9,
             r10,
-            r11,
+            r11, fp = r11, // frame pointer
             r12, ip = r12, S1 = r12,
             r13, sp = r13,
             r14, lr = r14,

Modified: trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h (158882 => 158883)


--- trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h	2013-11-07 23:45:56 UTC (rev 158883)
@@ -45,11 +45,11 @@
         r4,
         r5,
         r6,
-        r7, wr = r7,   // thumb work register
+        r7, fp = r7,   // frame pointer
         r8,
         r9, sb = r9,   // static base
         r10, sl = r10, // stack limit
-        r11, fp = r11, // frame pointer
+        r11,
         r12, ip = r12,
         r13, sp = r13,
         r14, lr = r14,

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (158882 => 158883)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h	2013-11-07 23:45:56 UTC (rev 158883)
@@ -101,7 +101,7 @@
     };
 
     static const RegisterID stackPointerRegister = MIPSRegisters::sp;
-    static const RegisterID framePointerRegister = MIPSRegisters::s0;
+    static const RegisterID framePointerRegister = MIPSRegisters::fp;
     static const RegisterID returnAddressRegister = MIPSRegisters::ra;
 
     // Integer arithmetic operations:

Modified: trunk/Source/_javascript_Core/ftl/FTLOSRExitCompiler.cpp (158882 => 158883)


--- trunk/Source/_javascript_Core/ftl/FTLOSRExitCompiler.cpp	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/ftl/FTLOSRExitCompiler.cpp	2013-11-07 23:45:56 UTC (rev 158883)
@@ -55,6 +55,9 @@
     
     RELEASE_ASSERT(record->patchpointID == exit.m_stackmapID);
     
+    // This code requires framePointerRegister is the same as callFrameRegister
+    static_assert(MacroAssembler::framePointerRegister == GPRInfo::callFrameRegister, "MacroAssembler::framePointerRegister and GPRInfo::callFrameRegister must be the same");
+
     CCallHelpers jit(vm, codeBlock);
     
     // We need scratch space to save all registers and to build up the JSStack.
@@ -76,7 +79,8 @@
     // call frame.
     
     // Get the call frame and tag thingies.
-    record->locations[0].restoreInto(jit, jitCode->stackmaps, registerScratch, GPRInfo::callFrameRegister);
+    // Restore the exiting function's callFrame value into a regT4
+    record->locations[0].restoreInto(jit, jitCode->stackmaps, registerScratch, GPRInfo::regT4);
     jit.move(MacroAssembler::TrustedImm64(TagTypeNumber), GPRInfo::tagTypeNumberRegister);
     jit.move(MacroAssembler::TrustedImm64(TagMask), GPRInfo::tagMaskRegister);
     
@@ -126,7 +130,7 @@
         case ExitValueInJSStackAsInt32:
         case ExitValueInJSStackAsInt52:
         case ExitValueInJSStackAsDouble:
-            jit.load64(AssemblyHelpers::addressFor(value.virtualRegister()), GPRInfo::regT0);
+            jit.load64(AssemblyHelpers::addressFor(value.virtualRegister(), GPRInfo::regT4), GPRInfo::regT0);
             break;
             
         default:
@@ -146,14 +150,19 @@
         jit.load64(scratch + index, GPRInfo::regT0);
         reboxAccordingToFormat(
             value.valueFormat(), jit, GPRInfo::regT0, GPRInfo::regT1, GPRInfo::regT2);
-        jit.store64(GPRInfo::regT0, AssemblyHelpers::addressFor(operand));
+        jit.store64(GPRInfo::regT0, AssemblyHelpers::addressFor(static_cast<VirtualRegister>(operand), GPRInfo::regT4));
     }
     
+    // Save the current framePointer into regT3 for the epilogue.
+    // Put regT4 into callFrameRegister
+    jit.move(MacroAssembler::framePointerRegister, GPRInfo::regT3);
+    jit.move(GPRInfo::regT4, GPRInfo::callFrameRegister);
+    
     handleExitCounts(jit, exit);
     reifyInlinedCallFrames(jit, exit);
     
-    jit.move(MacroAssembler::framePointerRegister, MacroAssembler::stackPointerRegister);
-    jit.pop(MacroAssembler::framePointerRegister);
+    jit.move(GPRInfo::regT3, MacroAssembler::stackPointerRegister);
+    jit.pop(GPRInfo::regT3); // ignore prior framePointer
     jit.pop(GPRInfo::nonArgGPR0); // ignore the result.
     
     if (exit.m_lastSetOperand.isValid()) {

Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.h (158882 => 158883)


--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2013-11-07 23:45:56 UTC (rev 158883)
@@ -176,6 +176,11 @@
     {
         return Address(GPRInfo::callFrameRegister, byteOffset);
     }
+    static Address addressFor(VirtualRegister virtualRegister, GPRReg baseReg)
+    {
+        ASSERT(virtualRegister.isValid());
+        return Address(baseReg, virtualRegister.offset() * sizeof(Register));
+    }
     static Address addressFor(VirtualRegister virtualRegister)
     {
         ASSERT(virtualRegister.isValid());

Modified: trunk/Source/_javascript_Core/jit/GPRInfo.h (158882 => 158883)


--- trunk/Source/_javascript_Core/jit/GPRInfo.h	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/jit/GPRInfo.h	2013-11-07 23:45:56 UTC (rev 158883)
@@ -284,7 +284,7 @@
 class GPRInfo {
 public:
     typedef GPRReg RegisterType;
-    static const unsigned numberOfRegisters = 5;
+    static const unsigned numberOfRegisters = 6;
     static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS;
 
     // Temporary registers.
@@ -292,11 +292,12 @@
     static const GPRReg regT1 = X86Registers::edx;
     static const GPRReg regT2 = X86Registers::ecx;
     static const GPRReg regT3 = X86Registers::ebx;
-    static const GPRReg regT4 = X86Registers::esi;
+    static const GPRReg regT4 = X86Registers::edi;
+    static const GPRReg regT5 = X86Registers::esi;
     // These registers match the baseline JIT.
     static const GPRReg cachedResultRegister = regT0;
     static const GPRReg cachedResultRegister2 = regT1;
-    static const GPRReg callFrameRegister = X86Registers::edi;
+    static const GPRReg callFrameRegister = X86Registers::ebp;
     // These constants provide the names for the general purpose argument & return value registers.
     static const GPRReg argumentGPR0 = X86Registers::ecx; // regT2
     static const GPRReg argumentGPR1 = X86Registers::edx; // regT1
@@ -310,7 +311,7 @@
     static GPRReg toRegister(unsigned index)
     {
         ASSERT(index < numberOfRegisters);
-        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4 };
+        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5 };
         return registerForIndex[index];
     }
 
@@ -318,7 +319,7 @@
     {
         ASSERT(reg != InvalidGPRReg);
         ASSERT(static_cast<int>(reg) < 8);
-        static const unsigned indexForRegister[8] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 4, InvalidIndex };
+        static const unsigned indexForRegister[8] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 5, 4 };
         unsigned result = indexForRegister[reg];
         ASSERT(result != InvalidIndex);
         return result;
@@ -347,12 +348,12 @@
 class GPRInfo {
 public:
     typedef GPRReg RegisterType;
-    static const unsigned numberOfRegisters = 9;
+    static const unsigned numberOfRegisters = 10;
     static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS;
 
     // These registers match the baseline JIT.
     static const GPRReg cachedResultRegister = X86Registers::eax;
-    static const GPRReg callFrameRegister = X86Registers::r13;
+    static const GPRReg callFrameRegister = X86Registers::ebp;
     static const GPRReg tagTypeNumberRegister = X86Registers::r14;
     static const GPRReg tagMaskRegister = X86Registers::r15;
     // Temporary registers.
@@ -365,6 +366,7 @@
     static const GPRReg regT6 = X86Registers::r8;
     static const GPRReg regT7 = X86Registers::r9;
     static const GPRReg regT8 = X86Registers::r10;
+    static const GPRReg regT9 = X86Registers::r13;
     // These constants provide the names for the general purpose argument & return value registers.
     static const GPRReg argumentGPR0 = X86Registers::edi; // regT4
     static const GPRReg argumentGPR1 = X86Registers::esi; // regT5
@@ -382,7 +384,7 @@
     static GPRReg toRegister(unsigned index)
     {
         ASSERT(index < numberOfRegisters);
-        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8 };
+        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8, regT9 };
         return registerForIndex[index];
     }
     
@@ -397,7 +399,7 @@
     {
         ASSERT(reg != InvalidGPRReg);
         ASSERT(static_cast<int>(reg) < 16);
-        static const unsigned indexForRegister[16] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 5, 4, 6, 7, 8, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
+        static const unsigned indexForRegister[16] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 5, 4, 6, 7, 8, InvalidIndex, InvalidIndex, 9, InvalidIndex, InvalidIndex };
         unsigned result = indexForRegister[reg];
         ASSERT(result != InvalidIndex);
         return result;
@@ -428,7 +430,7 @@
 class GPRInfo {
 public:
     typedef GPRReg RegisterType;
-    static const unsigned numberOfRegisters = 9;
+    static const unsigned numberOfRegisters = 10;
     static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS;
 
     // Temporary registers.
@@ -441,10 +443,11 @@
     static const GPRReg regT6 = ARMRegisters::r10;
     static const GPRReg regT7 = ARMRegisters::r11;
     static const GPRReg regT8 = ARMRegisters::r3;
+    static const GPRReg regT9 = ARMRegisters::r5;
     // These registers match the baseline JIT.
     static const GPRReg cachedResultRegister = regT0;
     static const GPRReg cachedResultRegister2 = regT1;
-    static const GPRReg callFrameRegister = ARMRegisters::r5;
+    static const GPRReg callFrameRegister = ARMRegisters::fp;
     // These constants provide the names for the general purpose argument & return value registers.
     static const GPRReg argumentGPR0 = ARMRegisters::r0; // regT0
     static const GPRReg argumentGPR1 = ARMRegisters::r1; // regT1
@@ -460,7 +463,7 @@
     static GPRReg toRegister(unsigned index)
     {
         ASSERT(index < numberOfRegisters);
-        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8 };
+        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8, regT9 };
         return registerForIndex[index];
     }
 
@@ -468,7 +471,7 @@
     {
         ASSERT(static_cast<unsigned>(reg) != InvalidGPRReg);
         ASSERT(static_cast<unsigned>(reg) < 16);
-        static const unsigned indexForRegister[16] = { 0, 1, 2, 8, 3, InvalidIndex, InvalidIndex, InvalidIndex, 4, 5, 6, 7, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
+        static const unsigned indexForRegister[16] = { 0, 1, 2, 8, 3, 9, InvalidIndex, InvalidIndex, 4, 5, 6, 7, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
         unsigned result = indexForRegister[reg];
         ASSERT(result != InvalidIndex);
         return result;
@@ -504,7 +507,7 @@
     // These registers match the baseline JIT.
     static const GPRReg cachedResultRegister = ARM64Registers::x0;
     static const GPRReg timeoutCheckRegister = ARM64Registers::x26;
-    static const GPRReg callFrameRegister = ARM64Registers::x25;
+    static const GPRReg callFrameRegister = ARM64Registers::fp;
     static const GPRReg tagTypeNumberRegister = ARM64Registers::x27;
     static const GPRReg tagMaskRegister = ARM64Registers::x28;
     // Temporary registers.
@@ -592,7 +595,7 @@
 class GPRInfo {
 public:
     typedef GPRReg RegisterType;
-    static const unsigned numberOfRegisters = 6;
+    static const unsigned numberOfRegisters = 7;
     static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS;
 
     // Temporary registers.
@@ -602,10 +605,11 @@
     static const GPRReg regT3 = MIPSRegisters::s2;
     static const GPRReg regT4 = MIPSRegisters::t5;
     static const GPRReg regT5 = MIPSRegisters::t6;
+    static const GPRReg regT6 = MIPSRegisters::s0;
     // These registers match the baseline JIT.
     static const GPRReg cachedResultRegister = regT0;
     static const GPRReg cachedResultRegister2 = regT1;
-    static const GPRReg callFrameRegister = MIPSRegisters::s0;
+    static const GPRReg callFrameRegister = MIPSRegisters::fp;
     // These constants provide the names for the general purpose argument & return value registers.
     static const GPRReg argumentGPR0 = MIPSRegisters::a0;
     static const GPRReg argumentGPR1 = MIPSRegisters::a1;
@@ -621,7 +625,7 @@
     static GPRReg toRegister(unsigned index)
     {
         ASSERT(index < numberOfRegisters);
-        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5 };
+        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6 };
         return registerForIndex[index];
     }
 
@@ -632,7 +636,7 @@
         static const unsigned indexForRegister[24] = {
             InvalidIndex, InvalidIndex, 0, 1, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex,
             InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, 2, 4, 5, InvalidIndex,
-            InvalidIndex, InvalidIndex, 3, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex
+            6, InvalidIndex, 3, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex
         };
         unsigned result = indexForRegister[reg];
         ASSERT(result != InvalidIndex);

Modified: trunk/Source/_javascript_Core/jit/JITOperations.cpp (158882 => 158883)


--- trunk/Source/_javascript_Core/jit/JITOperations.cpp	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/jit/JITOperations.cpp	2013-11-07 23:45:56 UTC (rev 158883)
@@ -1717,8 +1717,8 @@
 ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n"
 HIDE_SYMBOL(getHostCallReturnValue) "\n"
 SYMBOL_STRING(getHostCallReturnValue) ":" "\n"
-    "mov 0(%r13), %r13\n" // CallerFrameAndPC::callerFrame
-    "mov %r13, %rdi\n"
+    "mov 0(%rbp), %rbp\n" // CallerFrameAndPC::callerFrame
+    "mov %rbp, %rdi\n"
     "jmp " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n"
 );
 
@@ -1728,8 +1728,8 @@
 ".globl " SYMBOL_STRING(getHostCallReturnValue) "\n"
 HIDE_SYMBOL(getHostCallReturnValue) "\n"
 SYMBOL_STRING(getHostCallReturnValue) ":" "\n"
-    "mov 0(%edi), %edi\n" // CallerFrameAndPC::callerFrame
-    "mov %edi, 4(%esp)\n"
+    "mov 0(%ebp), %ebp\n" // CallerFrameAndPC::callerFrame
+    "mov %ebp, 4(%esp)\n"
     "jmp " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n"
 );
 

Modified: trunk/Source/_javascript_Core/jit/JSInterfaceJIT.h (158882 => 158883)


--- trunk/Source/_javascript_Core/jit/JSInterfaceJIT.h	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/jit/JSInterfaceJIT.h	2013-11-07 23:45:56 UTC (rev 158883)
@@ -73,7 +73,7 @@
         static const RegisterID thirdArgumentRegister = X86Registers::r8;
 #endif
 
-        static const RegisterID callFrameRegister = X86Registers::r13;
+        static const RegisterID callFrameRegister = X86Registers::ebp;
         static const RegisterID tagTypeNumberRegister = X86Registers::r14;
         static const RegisterID tagMaskRegister = X86Registers::r15;
 
@@ -98,7 +98,7 @@
         static const RegisterID firstArgumentRegister = X86Registers::ecx;
         static const RegisterID secondArgumentRegister = X86Registers::edx;
         
-        static const RegisterID callFrameRegister = X86Registers::edi;
+        static const RegisterID callFrameRegister = X86Registers::ebp;
         
         static const RegisterID regT0 = X86Registers::eax;
         static const RegisterID regT1 = X86Registers::edx;
@@ -124,7 +124,7 @@
         static const RegisterID regT4 = ARMRegisters::r7;
         static const RegisterID regT5 = ARMRegisters::r8;
 
-        static const RegisterID callFrameRegister = ARMRegisters::r5;
+        static const RegisterID callFrameRegister = ARMRegisters::fp;
 
         static const FPRegisterID fpRegT0 = ARMRegisters::d0;
         static const FPRegisterID fpRegT1 = ARMRegisters::d1;
@@ -146,7 +146,7 @@
         static const RegisterID regT3 = ARM64Registers::x23;
         static const RegisterID regT4 = ARM64Registers::x24;
         
-        static const RegisterID callFrameRegister = ARM64Registers::x25;
+        static const RegisterID callFrameRegister = ARM64Registers::fp;
         static const RegisterID timeoutCheckRegister = ARM64Registers::x26;
         static const RegisterID tagTypeNumberRegister = ARM64Registers::x27;
         static const RegisterID tagMaskRegister = ARM64Registers::x28;
@@ -178,7 +178,7 @@
         static const RegisterID regT4 = MIPSRegisters::t5;
         static const RegisterID regT5 = MIPSRegisters::t6;
 
-        static const RegisterID callFrameRegister = MIPSRegisters::s0;
+        static const RegisterID callFrameRegister = MIPSRegisters::fp;
         
         static const FPRegisterID fpRegT0 = MIPSRegisters::f4;
         static const FPRegisterID fpRegT1 = MIPSRegisters::f6;

Modified: trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp (158882 => 158883)


--- trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2013-11-07 23:45:56 UTC (rev 158883)
@@ -221,11 +221,11 @@
     jit.push(ARMRegisters::r10);
     jit.push(ARMRegisters::r11);
     jit.push(ARMRegisters::lr);
-
+    jit.move(ARMRegisters::r11, GPRInfo::nonArgGPR0);
     jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp);
 
 #   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG ARMRegisters::r11
+#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
 #elif CPU(ARM_THUMB2)
     jit.push(ARMRegisters::lr);
     jit.push(ARMRegisters::r4);
@@ -236,10 +236,11 @@
     jit.push(ARMRegisters::r9);
     jit.push(ARMRegisters::r10);
     jit.push(ARMRegisters::r11);
+    jit.move(ARMRegisters::r7, GPRInfo::nonArgGPR0);
     jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp);
 
 #   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG ARMRegisters::r7
+#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
 #elif CPU(ARM64)
     jit.push(ARM64Registers::lr);
     jit.push(ARM64Registers::x19);
@@ -253,9 +254,10 @@
     jit.push(ARM64Registers::x27);
     jit.push(ARM64Registers::x28);
     jit.push(ARM64Registers::x29);
+    jit.move(ARM64Registers::x29, GPRInfo::nonArgGPR0);
 
 #   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG ARM64Registers::x29
+#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
 #elif CPU(MIPS)
     jit.subPtr(CCallHelpers::TrustedImm32(STACK_LENGTH), MIPSRegisters::sp);
     jit.storePtr(MIPSRegisters::ra, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_RETURN_ADDRESS_OFFSET));
@@ -267,9 +269,10 @@
 #if WTF_MIPS_PIC
     jit.storePtr(MIPSRegisters::gp), CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_GP_OFFSET));
 #endif
+    jit.move(MIPSRegisters::fp, GPRInfo::nonArgGPR0);
 
 #   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG MIPSRegisters::fp
+#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
 #elif CPU(SH4)
     jit.push(SH4Registers::fp);
     jit.push(SH4Registers::pr);

Modified: trunk/Source/_javascript_Core/offlineasm/arm.rb (158882 => 158883)


--- trunk/Source/_javascript_Core/offlineasm/arm.rb	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/offlineasm/arm.rb	2013-11-07 23:45:56 UTC (rev 158883)
@@ -99,7 +99,7 @@
         when "t4"
             "r10"
         when "cfr"
-            "r5"
+            isARMv7 ?  "r7" : "r11"
         when "lr"
             "lr"
         when "sp"

Modified: trunk/Source/_javascript_Core/offlineasm/arm64.rb (158882 => 158883)


--- trunk/Source/_javascript_Core/offlineasm/arm64.rb	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/offlineasm/arm64.rb	2013-11-07 23:45:56 UTC (rev 158883)
@@ -117,7 +117,7 @@
         when 't6'
             arm64GPRName('x12', kind)
         when 'cfr'
-            arm64GPRName('x25', kind)
+            arm64GPRName('x29', kind)
         when 'csr1'
             arm64GPRName('x27', kind)
         when 'csr2'

Modified: trunk/Source/_javascript_Core/offlineasm/mips.rb (158882 => 158883)


--- trunk/Source/_javascript_Core/offlineasm/mips.rb	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/offlineasm/mips.rb	2013-11-07 23:45:56 UTC (rev 158883)
@@ -101,7 +101,7 @@
         when "t8"
             "$t8"
         when "cfr"
-            "$s0"
+            "$fp"
         when "lr"
             "$ra"
         when "sp"

Modified: trunk/Source/_javascript_Core/offlineasm/x86.rb (158882 => 158883)


--- trunk/Source/_javascript_Core/offlineasm/x86.rb	2013-11-07 23:40:44 UTC (rev 158882)
+++ trunk/Source/_javascript_Core/offlineasm/x86.rb	2013-11-07 23:45:56 UTC (rev 158883)
@@ -166,26 +166,24 @@
             if isX64
                 case kind
                 when :half
-                    "%r13w"
+                    "%bp"
                 when :int
-                    "%r13d"
+                    "%ebp"
                 when :ptr
-                    "%r13"
+                    "%rbp"
                 when :quad
-                    "%r13"
+                    "%rbp"
                 else
                     raise
                 end
             else
                 case kind
-                when :byte
-                    "%dil"
                 when :half
-                    "%di"
+                    "%bp"
                 when :int
-                    "%edi"
+                    "%ebp"
                 when :ptr
-                    "%edi"
+                    "%ebp"
                 else
                     raise
                 end
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to