Changeset 165293 in webkit
- Timestamp:
- Mar 7, 2014 2:22:46 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r165282 r165293 1 2014-03-07 Michael Saboff <msaboff@apple.com> 2 3 Clarify how we deal with "special" registers 4 https://bugs.webkit.org/show_bug.cgi?id=129806 5 6 Already reviewed change being relanded. 7 8 Relanding change set r165196 as it wasn't responsible for the breakage reported in 9 https://bugs.webkit.org/show_bug.cgi?id=129822. That appears to be a build or 10 11 Reviewed by Michael Saboff. 12 configuration issue. 13 14 * assembler/ARM64Assembler.h: 15 (JSC::ARM64Assembler::lastRegister): 16 * assembler/MacroAssembler.h: 17 (JSC::MacroAssembler::nextRegister): 18 * ftl/FTLLocation.cpp: 19 (JSC::FTL::Location::restoreInto): 20 * ftl/FTLSaveRestore.cpp: 21 (JSC::FTL::saveAllRegisters): 22 (JSC::FTL::restoreAllRegisters): 23 * ftl/FTLSlowPathCall.cpp: 24 * jit/RegisterSet.cpp: 25 (JSC::RegisterSet::reservedHardwareRegisters): 26 (JSC::RegisterSet::runtimeRegisters): 27 (JSC::RegisterSet::specialRegisters): 28 (JSC::RegisterSet::calleeSaveRegisters): 29 * jit/RegisterSet.h: 30 1 31 2014-03-07 Mark Hahnenberg <mhahnenberg@apple.com> 2 32 -
trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h
r165216 r165293 1 1 /* 2 * Copyright (C) 2012 Apple Inc. All rights reserved.2 * Copyright (C) 2012, 2014 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 479 479 480 480 static RegisterID firstRegister() { return ARM64Registers::x0; } 481 static RegisterID lastRegister() { return ARM64Registers:: x28; }481 static RegisterID lastRegister() { return ARM64Registers::sp; } 482 482 483 483 static FPRegisterID firstFPRegister() { return ARM64Registers::q0; } -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r165216 r165293 1 1 /* 2 * Copyright (C) 2008, 2012, 2013 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2012, 2013, 2014 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 70 70 public: 71 71 72 static bool isStackRelated(RegisterID reg)73 {74 return reg == stackPointerRegister || reg == framePointerRegister;75 }76 77 static RegisterID firstRealRegister()78 {79 RegisterID firstRegister = MacroAssembler::firstRegister();80 while (MacroAssembler::isStackRelated(firstRegister))81 firstRegister = static_cast<RegisterID>(firstRegister + 1);82 return firstRegister;83 }84 85 72 static RegisterID nextRegister(RegisterID reg) 86 73 { 87 RegisterID result = static_cast<RegisterID>(reg + 1); 88 while (MacroAssembler::isStackRelated(result)) 89 result = static_cast<RegisterID>(result + 1); 90 return result; 91 } 92 93 static RegisterID secondRealRegister() 94 { 95 return nextRegister(firstRealRegister()); 74 return static_cast<RegisterID>(reg + 1); 96 75 } 97 76 -
trunk/Source/JavaScriptCore/ftl/FTLLocation.cpp
r165216 r165293 30 30 31 31 #include "FTLSaveRestore.h" 32 #include "RegisterSet.h" 32 33 #include <wtf/CommaPrinter.h> 33 34 #include <wtf/DataLog.h> … … 158 159 void Location::restoreInto(MacroAssembler& jit, char* savedRegisters, GPRReg result, unsigned numFramesToPop) const 159 160 { 160 if (involvesGPR() && MacroAssembler::isStackRelated(gpr())) {161 if (involvesGPR() && RegisterSet::stackRegisters().get(gpr())) { 161 162 // Make the result GPR contain the appropriate stack register. 162 163 if (numFramesToPop) { … … 175 176 176 177 if (isGPR()) { 177 if ( MacroAssembler::isStackRelated(gpr())) {178 if (RegisterSet::stackRegisters().get(gpr())) { 178 179 // Already restored into result. 179 180 } else … … 198 199 199 200 case Indirect: 200 if ( MacroAssembler::isStackRelated(gpr())) {201 if (RegisterSet::stackRegisters().get(gpr())) { 201 202 // The stack register is already recovered into result. 202 203 jit.load64(MacroAssembler::Address(result, offset()), result); -
trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.cpp
r165216 r165293 1 1 /* 2 * Copyright (C) 2013 Apple Inc. All rights reserved.2 * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 32 32 #include "GPRInfo.h" 33 33 #include "MacroAssembler.h" 34 #include "RegisterSet.h" 34 35 35 36 namespace JSC { namespace FTL { … … 70 71 } 71 72 73 namespace { 74 75 struct Regs { 76 Regs() 77 { 78 special = RegisterSet::stackRegisters(); 79 special.merge(RegisterSet::reservedHardwareRegisters()); 80 81 first = MacroAssembler::firstRegister(); 82 while (special.get(first)) 83 first = MacroAssembler::nextRegister(first); 84 second = MacroAssembler::nextRegister(first); 85 while (special.get(second)) 86 second = MacroAssembler::nextRegister(second); 87 } 88 89 RegisterSet special; 90 GPRReg first; 91 GPRReg second; 92 }; 93 94 } // anonymous namespace 95 72 96 void saveAllRegisters(MacroAssembler& jit, char* scratchMemory) 73 97 { 98 Regs regs; 99 74 100 // Get the first register out of the way, so that we can use it as a pointer. 75 jit.poke64( MacroAssembler::firstRealRegister(), 0);76 jit.move(MacroAssembler::TrustedImmPtr(scratchMemory), MacroAssembler::firstRealRegister());101 jit.poke64(regs.first, 0); 102 jit.move(MacroAssembler::TrustedImmPtr(scratchMemory), regs.first); 77 103 78 104 // Get all of the other GPRs out of the way. 79 for (MacroAssembler::RegisterID reg = MacroAssembler::secondRealRegister(); reg <= MacroAssembler::lastRegister(); reg = MacroAssembler::nextRegister(reg)) 80 jit.store64(reg, MacroAssembler::Address(MacroAssembler::firstRealRegister(), offsetOfGPR(reg))); 105 for (MacroAssembler::RegisterID reg = regs.second; reg <= MacroAssembler::lastRegister(); reg = MacroAssembler::nextRegister(reg)) { 106 if (regs.special.get(reg)) 107 continue; 108 jit.store64(reg, MacroAssembler::Address(regs.first, offsetOfGPR(reg))); 109 } 81 110 82 111 // Restore the first register into the second one and save it. 83 jit.peek64( MacroAssembler::secondRealRegister(), 0);84 jit.store64( MacroAssembler::secondRealRegister(), MacroAssembler::Address(MacroAssembler::firstRealRegister(), offsetOfGPR(MacroAssembler::firstRealRegister())));112 jit.peek64(regs.second, 0); 113 jit.store64(regs.second, MacroAssembler::Address(regs.first, offsetOfGPR(regs.first))); 85 114 86 115 // Finally save all FPR's. 87 for (MacroAssembler::FPRegisterID reg = MacroAssembler::firstFPRegister(); reg <= MacroAssembler::lastFPRegister(); reg = MacroAssembler::nextFPRegister(reg)) 88 jit.storeDouble(reg, MacroAssembler::Address(MacroAssembler::firstRealRegister(), offsetOfFPR(reg))); 116 for (MacroAssembler::FPRegisterID reg = MacroAssembler::firstFPRegister(); reg <= MacroAssembler::lastFPRegister(); reg = MacroAssembler::nextFPRegister(reg)) { 117 if (regs.special.get(reg)) 118 continue; 119 jit.storeDouble(reg, MacroAssembler::Address(regs.first, offsetOfFPR(reg))); 120 } 89 121 } 90 122 91 123 void restoreAllRegisters(MacroAssembler& jit, char* scratchMemory) 92 124 { 125 Regs regs; 126 93 127 // Give ourselves a pointer to the scratch memory. 94 jit.move(MacroAssembler::TrustedImmPtr(scratchMemory), MacroAssembler::firstRealRegister());128 jit.move(MacroAssembler::TrustedImmPtr(scratchMemory), regs.first); 95 129 96 130 // Restore all FPR's. 97 for (MacroAssembler::FPRegisterID reg = MacroAssembler::firstFPRegister(); reg <= MacroAssembler::lastFPRegister(); reg = MacroAssembler::nextFPRegister(reg)) 98 jit.loadDouble(MacroAssembler::Address(MacroAssembler::firstRealRegister(), offsetOfFPR(reg)), reg); 131 for (MacroAssembler::FPRegisterID reg = MacroAssembler::firstFPRegister(); reg <= MacroAssembler::lastFPRegister(); reg = MacroAssembler::nextFPRegister(reg)) { 132 if (regs.special.get(reg)) 133 continue; 134 jit.loadDouble(MacroAssembler::Address(regs.first, offsetOfFPR(reg)), reg); 135 } 99 136 100 for (MacroAssembler::RegisterID reg = MacroAssembler::secondRealRegister(); reg <= MacroAssembler::lastRegister(); reg = MacroAssembler::nextRegister(reg)) 101 jit.load64(MacroAssembler::Address(MacroAssembler::firstRealRegister(), offsetOfGPR(reg)), reg); 137 for (MacroAssembler::RegisterID reg = regs.second; reg <= MacroAssembler::lastRegister(); reg = MacroAssembler::nextRegister(reg)) { 138 if (regs.special.get(reg)) 139 continue; 140 jit.load64(MacroAssembler::Address(regs.first, offsetOfGPR(reg)), reg); 141 } 102 142 103 jit.load64(MacroAssembler::Address( MacroAssembler::firstRealRegister(), offsetOfGPR(MacroAssembler::firstRealRegister())), MacroAssembler::firstRealRegister());143 jit.load64(MacroAssembler::Address(regs.first, offsetOfGPR(regs.first)), regs.first); 104 144 } 105 145 -
trunk/Source/JavaScriptCore/ftl/FTLSlowPathCall.cpp
r165216 r165293 53 53 , m_returnRegister(returnRegister) 54 54 { 55 // We don't care that you're using callee-save or stackregisters.55 // We don't care that you're using callee-save, stack, or hardware registers. 56 56 m_usedRegisters.exclude(RegisterSet::stackRegisters()); 57 m_usedRegisters.exclude(RegisterSet::reservedHardwareRegisters()); 57 58 m_usedRegisters.exclude(RegisterSet::calleeSaveRegisters()); 58 59 -
trunk/Source/JavaScriptCore/jit/RegisterSet.cpp
r165216 r165293 43 43 } 44 44 45 RegisterSet RegisterSet::reservedHardwareRegisters() 46 { 47 RegisterSet result; 48 #if CPU(ARM64) 49 result.set(ARM64Registers::lr); 50 #endif 51 return result; 52 } 53 54 RegisterSet RegisterSet::runtimeRegisters() 55 { 56 RegisterSet result; 57 #if USE(JSVALUE64) 58 result.set(GPRInfo::tagTypeNumberRegister); 59 result.set(GPRInfo::tagMaskRegister); 60 #endif 61 return result; 62 } 63 45 64 RegisterSet RegisterSet::specialRegisters() 46 65 { 47 66 RegisterSet result; 48 67 result.merge(stackRegisters()); 49 result.set(GPRInfo::callFrameRegister); 50 #if USE(JSVALUE64) 51 result.set(GPRInfo::tagTypeNumberRegister); 52 result.set(GPRInfo::tagMaskRegister); 53 #endif 54 #if CPU(ARM64) 55 result.set(ARM64Registers::lr); 56 #endif 68 result.merge(reservedHardwareRegisters()); 69 result.merge(runtimeRegisters()); 57 70 return result; 58 71 } … … 70 83 #elif CPU(ARM64) 71 84 // We don't include LR in the set of callee-save registers even though it technically belongs 72 // there. But, the way we use this list, it makes no sense to have it there. 85 // there. This is because we use this set to describe the set of registers that need to be saved 86 // beyond what you would save by the platform-agnostic "preserve return address" and "restore 87 // return address" operations in CCallHelpers. 73 88 for ( 74 89 ARM64Registers::RegisterID reg = ARM64Registers::x19; -
trunk/Source/JavaScriptCore/jit/RegisterSet.h
r165216 r165293 43 43 44 44 static RegisterSet stackRegisters(); 45 static RegisterSet specialRegisters(); 45 static RegisterSet reservedHardwareRegisters(); 46 static RegisterSet runtimeRegisters(); 47 static RegisterSet specialRegisters(); // The union of stack, reserved hardware, and runtime registers. 46 48 static RegisterSet calleeSaveRegisters(); 47 49 static RegisterSet allGPRs();
Note: See TracChangeset
for help on using the changeset viewer.