Changeset 158883 in webkit
- Timestamp:
- Nov 7, 2013 3:45:56 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r158875 r158883 1 2013-11-07 Michael Saboff <msaboff@apple.com> 2 3 Change CallFrameRegister to architected frame pointer register 4 https://bugs.webkit.org/show_bug.cgi?id=123956 5 6 Reviewed by Geoffrey Garen. 7 8 Changed X86 and ARM variants as well as MIPS to use their respective architected 9 frame pointer registers. The freed up callFrameRegisteris are made available to 10 the DFG register allocator. Modified the FTL OSR exit compiler to use a temporary 11 register as a stand in for the destination callFrameRegister since the FTL frame 12 pointer register is needed to extract values from the FTL stack. 13 14 Reviewed by Geoffrey Garen. 15 16 * assembler/ARMAssembler.h: 17 * assembler/ARMv7Assembler.h: 18 * assembler/MacroAssemblerMIPS.h: 19 * ftl/FTLOSRExitCompiler.cpp: 20 (JSC::FTL::compileStub): 21 * jit/AssemblyHelpers.h: 22 (JSC::AssemblyHelpers::addressFor): 23 * jit/GPRInfo.h: 24 (JSC::GPRInfo::toRegister): 25 (JSC::GPRInfo::toIndex): 26 * jit/JITOperations.cpp: 27 * jit/JSInterfaceJIT.h: 28 * jit/ThunkGenerators.cpp: 29 (JSC::callToJavaScript): 30 * offlineasm/arm.rb: 31 * offlineasm/arm64.rb: 32 * offlineasm/mips.rb: 33 * offlineasm/x86.rb: 34 1 35 2013-11-07 Oliver Hunt <oliver@apple.com> 2 36 -
trunk/Source/JavaScriptCore/assembler/ARMAssembler.h
r158208 r158883 44 44 r3, 45 45 r4, 46 r5, fp = r5, // frame pointer46 r5, 47 47 r6, S0 = r6, 48 48 r7, … … 50 50 r9, 51 51 r10, 52 r11, 52 r11, fp = r11, // frame pointer 53 53 r12, ip = r12, S1 = r12, 54 54 r13, sp = r13, -
trunk/Source/JavaScriptCore/assembler/ARMv7Assembler.h
r157264 r158883 46 46 r5, 47 47 r6, 48 r7, wr = r7, // thumb work register48 r7, fp = r7, // frame pointer 49 49 r8, 50 50 r9, sb = r9, // static base 51 51 r10, sl = r10, // stack limit 52 r11, fp = r11, // frame pointer52 r11, 53 53 r12, ip = r12, 54 54 r13, sp = r13, -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r158670 r158883 102 102 103 103 static const RegisterID stackPointerRegister = MIPSRegisters::sp; 104 static const RegisterID framePointerRegister = MIPSRegisters:: s0;104 static const RegisterID framePointerRegister = MIPSRegisters::fp; 105 105 static const RegisterID returnAddressRegister = MIPSRegisters::ra; 106 106 -
trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp
r158535 r158883 56 56 RELEASE_ASSERT(record->patchpointID == exit.m_stackmapID); 57 57 58 // This code requires framePointerRegister is the same as callFrameRegister 59 static_assert(MacroAssembler::framePointerRegister == GPRInfo::callFrameRegister, "MacroAssembler::framePointerRegister and GPRInfo::callFrameRegister must be the same"); 60 58 61 CCallHelpers jit(vm, codeBlock); 59 62 … … 77 80 78 81 // Get the call frame and tag thingies. 79 record->locations[0].restoreInto(jit, jitCode->stackmaps, registerScratch, GPRInfo::callFrameRegister); 82 // Restore the exiting function's callFrame value into a regT4 83 record->locations[0].restoreInto(jit, jitCode->stackmaps, registerScratch, GPRInfo::regT4); 80 84 jit.move(MacroAssembler::TrustedImm64(TagTypeNumber), GPRInfo::tagTypeNumberRegister); 81 85 jit.move(MacroAssembler::TrustedImm64(TagMask), GPRInfo::tagMaskRegister); … … 127 131 case ExitValueInJSStackAsInt52: 128 132 case ExitValueInJSStackAsDouble: 129 jit.load64(AssemblyHelpers::addressFor(value.virtualRegister() ), GPRInfo::regT0);133 jit.load64(AssemblyHelpers::addressFor(value.virtualRegister(), GPRInfo::regT4), GPRInfo::regT0); 130 134 break; 131 135 … … 147 151 reboxAccordingToFormat( 148 152 value.valueFormat(), jit, GPRInfo::regT0, GPRInfo::regT1, GPRInfo::regT2); 149 jit.store64(GPRInfo::regT0, AssemblyHelpers::addressFor(operand)); 150 } 153 jit.store64(GPRInfo::regT0, AssemblyHelpers::addressFor(static_cast<VirtualRegister>(operand), GPRInfo::regT4)); 154 } 155 156 // Save the current framePointer into regT3 for the epilogue. 157 // Put regT4 into callFrameRegister 158 jit.move(MacroAssembler::framePointerRegister, GPRInfo::regT3); 159 jit.move(GPRInfo::regT4, GPRInfo::callFrameRegister); 151 160 152 161 handleExitCounts(jit, exit); 153 162 reifyInlinedCallFrames(jit, exit); 154 163 155 jit.move( MacroAssembler::framePointerRegister, MacroAssembler::stackPointerRegister);156 jit.pop( MacroAssembler::framePointerRegister);164 jit.move(GPRInfo::regT3, MacroAssembler::stackPointerRegister); 165 jit.pop(GPRInfo::regT3); // ignore prior framePointer 157 166 jit.pop(GPRInfo::nonArgGPR0); // ignore the result. 158 167 -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h
r158459 r158883 177 177 return Address(GPRInfo::callFrameRegister, byteOffset); 178 178 } 179 static Address addressFor(VirtualRegister virtualRegister, GPRReg baseReg) 180 { 181 ASSERT(virtualRegister.isValid()); 182 return Address(baseReg, virtualRegister.offset() * sizeof(Register)); 183 } 179 184 static Address addressFor(VirtualRegister virtualRegister) 180 185 { -
trunk/Source/JavaScriptCore/jit/GPRInfo.h
r158677 r158883 285 285 public: 286 286 typedef GPRReg RegisterType; 287 static const unsigned numberOfRegisters = 5;287 static const unsigned numberOfRegisters = 6; 288 288 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 289 289 … … 293 293 static const GPRReg regT2 = X86Registers::ecx; 294 294 static const GPRReg regT3 = X86Registers::ebx; 295 static const GPRReg regT4 = X86Registers::esi; 295 static const GPRReg regT4 = X86Registers::edi; 296 static const GPRReg regT5 = X86Registers::esi; 296 297 // These registers match the baseline JIT. 297 298 static const GPRReg cachedResultRegister = regT0; 298 299 static const GPRReg cachedResultRegister2 = regT1; 299 static const GPRReg callFrameRegister = X86Registers::e di;300 static const GPRReg callFrameRegister = X86Registers::ebp; 300 301 // These constants provide the names for the general purpose argument & return value registers. 301 302 static const GPRReg argumentGPR0 = X86Registers::ecx; // regT2 … … 311 312 { 312 313 ASSERT(index < numberOfRegisters); 313 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4 };314 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5 }; 314 315 return registerForIndex[index]; 315 316 } … … 319 320 ASSERT(reg != InvalidGPRReg); 320 321 ASSERT(static_cast<int>(reg) < 8); 321 static const unsigned indexForRegister[8] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 4, InvalidIndex};322 static const unsigned indexForRegister[8] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 5, 4 }; 322 323 unsigned result = indexForRegister[reg]; 323 324 ASSERT(result != InvalidIndex); … … 348 349 public: 349 350 typedef GPRReg RegisterType; 350 static const unsigned numberOfRegisters = 9;351 static const unsigned numberOfRegisters = 10; 351 352 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 352 353 353 354 // These registers match the baseline JIT. 354 355 static const GPRReg cachedResultRegister = X86Registers::eax; 355 static const GPRReg callFrameRegister = X86Registers:: r13;356 static const GPRReg callFrameRegister = X86Registers::ebp; 356 357 static const GPRReg tagTypeNumberRegister = X86Registers::r14; 357 358 static const GPRReg tagMaskRegister = X86Registers::r15; … … 366 367 static const GPRReg regT7 = X86Registers::r9; 367 368 static const GPRReg regT8 = X86Registers::r10; 369 static const GPRReg regT9 = X86Registers::r13; 368 370 // These constants provide the names for the general purpose argument & return value registers. 369 371 static const GPRReg argumentGPR0 = X86Registers::edi; // regT4 … … 383 385 { 384 386 ASSERT(index < numberOfRegisters); 385 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8 };387 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8, regT9 }; 386 388 return registerForIndex[index]; 387 389 } … … 398 400 ASSERT(reg != InvalidGPRReg); 399 401 ASSERT(static_cast<int>(reg) < 16); 400 static const unsigned indexForRegister[16] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 5, 4, 6, 7, 8, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };402 static const unsigned indexForRegister[16] = { 0, 2, 1, 3, InvalidIndex, InvalidIndex, 5, 4, 6, 7, 8, InvalidIndex, InvalidIndex, 9, InvalidIndex, InvalidIndex }; 401 403 unsigned result = indexForRegister[reg]; 402 404 ASSERT(result != InvalidIndex); … … 429 431 public: 430 432 typedef GPRReg RegisterType; 431 static const unsigned numberOfRegisters = 9;433 static const unsigned numberOfRegisters = 10; 432 434 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 433 435 … … 442 444 static const GPRReg regT7 = ARMRegisters::r11; 443 445 static const GPRReg regT8 = ARMRegisters::r3; 446 static const GPRReg regT9 = ARMRegisters::r5; 444 447 // These registers match the baseline JIT. 445 448 static const GPRReg cachedResultRegister = regT0; 446 449 static const GPRReg cachedResultRegister2 = regT1; 447 static const GPRReg callFrameRegister = ARMRegisters:: r5;450 static const GPRReg callFrameRegister = ARMRegisters::fp; 448 451 // These constants provide the names for the general purpose argument & return value registers. 449 452 static const GPRReg argumentGPR0 = ARMRegisters::r0; // regT0 … … 461 464 { 462 465 ASSERT(index < numberOfRegisters); 463 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8 };466 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8, regT9 }; 464 467 return registerForIndex[index]; 465 468 } … … 469 472 ASSERT(static_cast<unsigned>(reg) != InvalidGPRReg); 470 473 ASSERT(static_cast<unsigned>(reg) < 16); 471 static const unsigned indexForRegister[16] = { 0, 1, 2, 8, 3, InvalidIndex, InvalidIndex, InvalidIndex, 4, 5, 6, 7, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };474 static const unsigned indexForRegister[16] = { 0, 1, 2, 8, 3, 9, InvalidIndex, InvalidIndex, 4, 5, 6, 7, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex }; 472 475 unsigned result = indexForRegister[reg]; 473 476 ASSERT(result != InvalidIndex); … … 505 508 static const GPRReg cachedResultRegister = ARM64Registers::x0; 506 509 static const GPRReg timeoutCheckRegister = ARM64Registers::x26; 507 static const GPRReg callFrameRegister = ARM64Registers:: x25;510 static const GPRReg callFrameRegister = ARM64Registers::fp; 508 511 static const GPRReg tagTypeNumberRegister = ARM64Registers::x27; 509 512 static const GPRReg tagMaskRegister = ARM64Registers::x28; … … 593 596 public: 594 597 typedef GPRReg RegisterType; 595 static const unsigned numberOfRegisters = 6;598 static const unsigned numberOfRegisters = 7; 596 599 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 597 600 … … 603 606 static const GPRReg regT4 = MIPSRegisters::t5; 604 607 static const GPRReg regT5 = MIPSRegisters::t6; 608 static const GPRReg regT6 = MIPSRegisters::s0; 605 609 // These registers match the baseline JIT. 606 610 static const GPRReg cachedResultRegister = regT0; 607 611 static const GPRReg cachedResultRegister2 = regT1; 608 static const GPRReg callFrameRegister = MIPSRegisters:: s0;612 static const GPRReg callFrameRegister = MIPSRegisters::fp; 609 613 // These constants provide the names for the general purpose argument & return value registers. 610 614 static const GPRReg argumentGPR0 = MIPSRegisters::a0; … … 622 626 { 623 627 ASSERT(index < numberOfRegisters); 624 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5 };628 static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6 }; 625 629 return registerForIndex[index]; 626 630 } … … 633 637 InvalidIndex, InvalidIndex, 0, 1, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, 634 638 InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, 2, 4, 5, InvalidIndex, 635 InvalidIndex, InvalidIndex, 3, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex639 6, InvalidIndex, 3, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex 636 640 }; 637 641 unsigned result = indexForRegister[reg]; -
trunk/Source/JavaScriptCore/jit/JITOperations.cpp
r158586 r158883 1718 1718 HIDE_SYMBOL(getHostCallReturnValue) "\n" 1719 1719 SYMBOL_STRING(getHostCallReturnValue) ":" "\n" 1720 "mov 0(%r 13), %r13\n" // CallerFrameAndPC::callerFrame1721 "mov %r 13, %rdi\n"1720 "mov 0(%rbp), %rbp\n" // CallerFrameAndPC::callerFrame 1721 "mov %rbp, %rdi\n" 1722 1722 "jmp " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" 1723 1723 ); … … 1729 1729 HIDE_SYMBOL(getHostCallReturnValue) "\n" 1730 1730 SYMBOL_STRING(getHostCallReturnValue) ":" "\n" 1731 "mov 0(%e di), %edi\n" // CallerFrameAndPC::callerFrame1732 "mov %e di, 4(%esp)\n"1731 "mov 0(%ebp), %ebp\n" // CallerFrameAndPC::callerFrame 1732 "mov %ebp, 4(%esp)\n" 1733 1733 "jmp " LOCAL_REFERENCE(getHostCallReturnValueWithExecState) "\n" 1734 1734 ); -
trunk/Source/JavaScriptCore/jit/JSInterfaceJIT.h
r158751 r158883 74 74 #endif 75 75 76 static const RegisterID callFrameRegister = X86Registers:: r13;76 static const RegisterID callFrameRegister = X86Registers::ebp; 77 77 static const RegisterID tagTypeNumberRegister = X86Registers::r14; 78 78 static const RegisterID tagMaskRegister = X86Registers::r15; … … 99 99 static const RegisterID secondArgumentRegister = X86Registers::edx; 100 100 101 static const RegisterID callFrameRegister = X86Registers::e di;101 static const RegisterID callFrameRegister = X86Registers::ebp; 102 102 103 103 static const RegisterID regT0 = X86Registers::eax; … … 125 125 static const RegisterID regT5 = ARMRegisters::r8; 126 126 127 static const RegisterID callFrameRegister = ARMRegisters:: r5;127 static const RegisterID callFrameRegister = ARMRegisters::fp; 128 128 129 129 static const FPRegisterID fpRegT0 = ARMRegisters::d0; … … 147 147 static const RegisterID regT4 = ARM64Registers::x24; 148 148 149 static const RegisterID callFrameRegister = ARM64Registers:: x25;149 static const RegisterID callFrameRegister = ARM64Registers::fp; 150 150 static const RegisterID timeoutCheckRegister = ARM64Registers::x26; 151 151 static const RegisterID tagTypeNumberRegister = ARM64Registers::x27; … … 179 179 static const RegisterID regT5 = MIPSRegisters::t6; 180 180 181 static const RegisterID callFrameRegister = MIPSRegisters:: s0;181 static const RegisterID callFrameRegister = MIPSRegisters::fp; 182 182 183 183 static const FPRegisterID fpRegT0 = MIPSRegisters::f4; -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r158858 r158883 222 222 jit.push(ARMRegisters::r11); 223 223 jit.push(ARMRegisters::lr); 224 224 jit.move(ARMRegisters::r11, GPRInfo::nonArgGPR0); 225 225 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp); 226 226 227 227 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 228 # define PREVIOUS_CALLFRAME_REG ARMRegisters::r11228 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 229 229 #elif CPU(ARM_THUMB2) 230 230 jit.push(ARMRegisters::lr); … … 237 237 jit.push(ARMRegisters::r10); 238 238 jit.push(ARMRegisters::r11); 239 jit.move(ARMRegisters::r7, GPRInfo::nonArgGPR0); 239 240 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp); 240 241 241 242 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 242 # define PREVIOUS_CALLFRAME_REG ARMRegisters::r7243 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 243 244 #elif CPU(ARM64) 244 245 jit.push(ARM64Registers::lr); … … 254 255 jit.push(ARM64Registers::x28); 255 256 jit.push(ARM64Registers::x29); 257 jit.move(ARM64Registers::x29, GPRInfo::nonArgGPR0); 256 258 257 259 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 258 # define PREVIOUS_CALLFRAME_REG ARM64Registers::x29260 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 259 261 #elif CPU(MIPS) 260 262 jit.subPtr(CCallHelpers::TrustedImm32(STACK_LENGTH), MIPSRegisters::sp); … … 268 270 jit.storePtr(MIPSRegisters::gp), CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_GP_OFFSET)); 269 271 #endif 272 jit.move(MIPSRegisters::fp, GPRInfo::nonArgGPR0); 270 273 271 274 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 272 # define PREVIOUS_CALLFRAME_REG MIPSRegisters::fp275 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 273 276 #elif CPU(SH4) 274 277 jit.push(SH4Registers::fp); -
trunk/Source/JavaScriptCore/offlineasm/arm.rb
r157474 r158883 100 100 "r10" 101 101 when "cfr" 102 "r5"102 isARMv7 ? "r7" : "r11" 103 103 when "lr" 104 104 "lr" -
trunk/Source/JavaScriptCore/offlineasm/arm64.rb
r157474 r158883 118 118 arm64GPRName('x12', kind) 119 119 when 'cfr' 120 arm64GPRName('x2 5', kind)120 arm64GPRName('x29', kind) 121 121 when 'csr1' 122 122 arm64GPRName('x27', kind) -
trunk/Source/JavaScriptCore/offlineasm/mips.rb
r153375 r158883 102 102 "$t8" 103 103 when "cfr" 104 "$ s0"104 "$fp" 105 105 when "lr" 106 106 "$ra" -
trunk/Source/JavaScriptCore/offlineasm/x86.rb
r154095 r158883 167 167 case kind 168 168 when :half 169 "% r13w"169 "%bp" 170 170 when :int 171 "% r13d"171 "%ebp" 172 172 when :ptr 173 "%r 13"173 "%rbp" 174 174 when :quad 175 "%r 13"175 "%rbp" 176 176 else 177 177 raise … … 179 179 else 180 180 case kind 181 when :byte182 "%dil"183 181 when :half 184 "% di"182 "%bp" 185 183 when :int 186 "%e di"184 "%ebp" 187 185 when :ptr 188 "%e di"186 "%ebp" 189 187 else 190 188 raise
Note: See TracChangeset
for help on using the changeset viewer.