Changeset 171177 in webkit
- Timestamp:
- Jul 17, 2014 12:58:05 AM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r171165 r171177 1 2014-07-17 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 CSS JIT: Clean up return path 4 https://bugs.webkit.org/show_bug.cgi?id=135011 5 6 Reviewed by Benjamin Poulain. 7 8 Clean up the existing CSS JIT return path before adding new early return path 9 for pseudo elements. 10 11 * cssjit/SelectorCompiler.cpp: 12 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker): 13 * cssjit/StackAllocator.h: 14 (WebCore::StackAllocator::StackReference::StackReference): 15 (WebCore::StackAllocator::StackReference::isValid): 16 (WebCore::StackAllocator::popAndDiscard): Deleted. 17 1 18 2014-07-16 Zalan Bujtas <zalan@apple.com> 2 19 -
trunk/Source/WebCore/cssjit/SelectorCompiler.cpp
r170876 r171177 1191 1191 m_registerAllocator.allocateRegister(elementAddressRegister); 1192 1192 1193 StackAllocator::StackReference temporaryStackBase; 1194 1193 1195 if (m_functionType == FunctionType::SelectorCheckerWithCheckingContext) 1194 1196 m_checkingContextStackReference = m_stackAllocator.push(checkingContextRegister); … … 1196 1198 if (m_needsAdjacentBacktrackingStart) 1197 1199 m_adjacentBacktrackingStart = m_stackAllocator.allocateUninitialized(); 1200 1201 // Remember the stack base of the temporary variables. 1202 if (m_checkingContextStackReference.isValid()) 1203 temporaryStackBase = m_checkingContextStackReference; 1204 else if (m_needsAdjacentBacktrackingStart) 1205 temporaryStackBase = m_adjacentBacktrackingStart; 1198 1206 1199 1207 Assembler::JumpList failureCases; … … 1224 1232 1225 1233 if (m_functionType == FunctionType::SimpleSelectorChecker) { 1226 if (!m_needsAdjacentBacktrackingStart && !reservedCalleeSavedRegisters && !needsEpilogue) { 1234 if (!temporaryStackBase.isValid() && !reservedCalleeSavedRegisters && !needsEpilogue) { 1235 ASSERT(!m_needsAdjacentBacktrackingStart); 1227 1236 // Success. 1228 1237 m_assembler.move(Assembler::TrustedImm32(1), returnRegister); … … 1235 1244 m_assembler.ret(); 1236 1245 } 1237 } else { 1238 // Success. 1239 m_assembler.move(Assembler::TrustedImm32(1), returnRegister); 1240 1241 // Failure. 1242 if (!failureCases.empty()) { 1243 Assembler::Jump skipFailureCase = m_assembler.jump(); 1244 failureCases.link(&m_assembler); 1245 m_assembler.move(Assembler::TrustedImm32(0), returnRegister); 1246 skipFailureCase.link(&m_assembler); 1247 } 1248 1249 if (m_needsAdjacentBacktrackingStart) 1250 m_stackAllocator.popAndDiscardUpTo(m_adjacentBacktrackingStart); 1251 if (reservedCalleeSavedRegisters) 1252 m_stackAllocator.pop(calleeSavedRegisterStackReferences, m_registerAllocator.restoreCalleeSavedRegisters()); 1253 if (needsEpilogue) 1254 generateEpilogue(); 1255 m_assembler.ret(); 1256 } 1257 } else { 1258 ASSERT(m_functionType == FunctionType::SelectorCheckerWithCheckingContext); 1259 1260 // Success. 1261 m_assembler.move(Assembler::TrustedImm32(1), returnRegister); 1262 1263 // Failure. 1264 if (!failureCases.empty()) { 1265 Assembler::Jump skipFailureCase = m_assembler.jump(); 1266 failureCases.link(&m_assembler); 1267 m_assembler.move(Assembler::TrustedImm32(0), returnRegister); 1268 skipFailureCase.link(&m_assembler); 1269 } 1270 1271 m_stackAllocator.popAndDiscardUpTo(m_checkingContextStackReference); 1272 if (reservedCalleeSavedRegisters) 1273 m_stackAllocator.pop(calleeSavedRegisterStackReferences, m_registerAllocator.restoreCalleeSavedRegisters()); 1274 if (needsEpilogue) 1275 generateEpilogue(); 1276 m_assembler.ret(); 1277 } 1246 return; 1247 } 1248 } 1249 1250 // Success. 1251 m_assembler.move(Assembler::TrustedImm32(1), returnRegister); 1252 1253 // Failure. 1254 if (!failureCases.empty()) { 1255 Assembler::Jump skipFailureCase = m_assembler.jump(); 1256 failureCases.link(&m_assembler); 1257 m_assembler.move(Assembler::TrustedImm32(0), returnRegister); 1258 skipFailureCase.link(&m_assembler); 1259 } 1260 1261 if (temporaryStackBase.isValid()) 1262 m_stackAllocator.popAndDiscardUpTo(temporaryStackBase); 1263 if (reservedCalleeSavedRegisters) 1264 m_stackAllocator.pop(calleeSavedRegisterStackReferences, m_registerAllocator.restoreCalleeSavedRegisters()); 1265 if (needsEpilogue) 1266 generateEpilogue(); 1267 m_assembler.ret(); 1278 1268 } 1279 1269 -
trunk/Source/WebCore/cssjit/StackAllocator.h
r170714 r171177 31 31 #include "RegisterAllocator.h" 32 32 #include <JavaScriptCore/MacroAssembler.h> 33 #include <limits> 33 34 34 35 namespace WebCore { … … 39 40 public: 40 41 StackReference() 41 : m_offsetFromTop( -1)42 : m_offsetFromTop(std::numeric_limits<unsigned>::max()) 42 43 { } 43 44 explicit StackReference(unsigned offset) … … 45 46 { } 46 47 operator unsigned() const { return m_offsetFromTop; } 48 bool isValid() const { return m_offsetFromTop != std::numeric_limits<unsigned>::max(); } 47 49 private: 48 50 unsigned m_offsetFromTop; … … 135 137 } 136 138 137 void popAndDiscard(StackReference stackReference)138 {139 RELEASE_ASSERT(stackReference == m_offsetFromTop);140 m_assembler.addPtr(JSC::MacroAssembler::TrustedImm32(stackUnitInBytes()), JSC::MacroAssembler::stackPointerRegister);141 m_offsetFromTop -= stackUnitInBytes();142 }143 144 139 void popAndDiscardUpTo(StackReference stackReference) 145 140 {
Note: See TracChangeset
for help on using the changeset viewer.