Changeset 221703 in webkit for trunk/Source/JavaScriptCore/b3
- Timestamp:
- Sep 6, 2017, 2:04:25 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore/b3
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/b3/B3Procedure.cpp
r219898 r221703 53 53 , m_code(new Air::Code(*this)) 54 54 { 55 m_code->setNumEntrypoints(m_numEntrypoints); 55 56 } 56 57 … … 421 422 } 422 423 424 void Procedure::setNumEntrypoints(unsigned numEntrypoints) 425 { 426 m_numEntrypoints = numEntrypoints; 427 m_code->setNumEntrypoints(numEntrypoints); 428 } 429 423 430 } } // namespace JSC::B3 424 431 -
trunk/Source/JavaScriptCore/b3/B3Procedure.h
r219898 r221703 187 187 188 188 unsigned numEntrypoints() const { return m_numEntrypoints; } 189 void setNumEntrypoints(unsigned numEntrypoints) { m_numEntrypoints = numEntrypoints; }190 189 JS_EXPORT_PRIVATE void setNumEntrypoints(unsigned); 190 191 191 // Only call this after code generation is complete. Note that the label for the 0th entrypoint 192 192 // should point to exactly where the code generation cursor was before you started generating -
trunk/Source/JavaScriptCore/b3/air/AirCode.cpp
r221602 r221703 31 31 #include "AirCCallSpecial.h" 32 32 #include "AirCFG.h" 33 #include "AllowMacroScratchRegisterUsageIf.h" 33 34 #include "B3BasicBlockUtils.h" 34 35 #include "B3Procedure.h" … … 38 39 namespace JSC { namespace B3 { namespace Air { 39 40 41 static void defaultPrologueGenerator(CCallHelpers& jit, Code& code) 42 { 43 jit.emitFunctionPrologue(); 44 if (code.frameSize()) { 45 AllowMacroScratchRegisterUsageIf allowScratch(jit, isARM64()); 46 jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister); 47 } 48 49 jit.emitSave(code.calleeSaveRegisterAtOffsetList()); 50 } 51 40 52 Code::Code(Procedure& proc) 41 53 : m_proc(proc) 42 54 , m_cfg(new CFG(*this)) 43 55 , m_lastPhaseName("initial") 56 , m_defaultPrologueGenerator(createSharedTask<PrologueGeneratorFunction>(&defaultPrologueGenerator)) 44 57 { 45 58 // Come up with initial orderings of registers. The user may replace this with something else. … … 295 308 } 296 309 310 void Code::setNumEntrypoints(unsigned numEntrypoints) 311 { 312 m_prologueGenerators.clear(); 313 m_prologueGenerators.reserveCapacity(numEntrypoints); 314 for (unsigned i = 0; i < numEntrypoints; ++i) 315 m_prologueGenerators.uncheckedAppend(m_defaultPrologueGenerator.copyRef()); 316 } 317 297 318 } } } // namespace JSC::B3::Air 298 319 -
trunk/Source/JavaScriptCore/b3/air/AirCode.h
r221602 r221703 172 172 // Note: It is only valid to call this function after LowerEntrySwitch. 173 173 std::optional<unsigned> entrypointIndex(BasicBlock*) const; 174 void setPrologueForEntrypoint(unsigned entrypointIndex, RefPtr<PrologueGenerator> generator) 175 { 176 // Note: We allow this to be called even before we set m_entrypoints just for convenience to users of this API. 177 m_entrypointIndexToGenerator.set(entrypointIndex, generator); 178 } 179 RefPtr<PrologueGenerator> prologueGeneratorForEntrypoint(unsigned entrypointIndex) 180 { 181 return m_entrypointIndexToGenerator.get(entrypointIndex); 182 } 174 175 // Note: We allow this to be called even before we set m_entrypoints just for convenience to users of this API. 176 // However, if you call this before setNumEntrypoints, setNumEntrypoints will overwrite this value. 177 void setPrologueForEntrypoint(unsigned entrypointIndex, Ref<PrologueGenerator>&& generator) 178 { 179 m_prologueGenerators[entrypointIndex] = WTFMove(generator); 180 } 181 const Ref<PrologueGenerator>& prologueGeneratorForEntrypoint(unsigned entrypointIndex) 182 { 183 return m_prologueGenerators[entrypointIndex]; 184 } 185 186 void setNumEntrypoints(unsigned); 183 187 184 188 // This is used by lowerEntrySwitch(). … … 187 191 { 188 192 m_entrypoints = std::forward<Vector>(vector); 193 RELEASE_ASSERT(m_entrypoints.size() == m_prologueGenerators.size()); 189 194 } 190 195 … … 199 204 { 200 205 m_entrypointLabels = std::forward<Vector>(vector); 206 RELEASE_ASSERT(m_entrypointLabels.size() == m_prologueGenerators.size()); 201 207 } 202 208 … … 369 375 Vector<FrequentedBlock> m_entrypoints; // This is empty until after lowerEntrySwitch(). 370 376 Vector<CCallHelpers::Label> m_entrypointLabels; // This is empty until code generation. 371 HashMap<unsigned, RefPtr<PrologueGenerator>, WTF::IntHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> m_entrypointIndexToGenerator;377 Vector<Ref<PrologueGenerator>, 1> m_prologueGenerators; 372 378 RefPtr<WasmBoundsCheckGenerator> m_wasmBoundsCheckGenerator; 373 379 const char* m_lastPhaseName; 374 380 std::unique_ptr<Disassembler> m_disassembler; 375 381 unsigned m_optLevel { defaultOptLevel() }; 382 Ref<PrologueGenerator> m_defaultPrologueGenerator; 376 383 }; 377 384 -
trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp
r221602 r221703 47 47 #include "AirSimplifyCFG.h" 48 48 #include "AirValidate.h" 49 #include "AllowMacroScratchRegisterUsageIf.h"50 49 #include "B3Common.h" 51 50 #include "B3Procedure.h" … … 215 214 disassembler->startEntrypoint(jit); 216 215 217 if (RefPtr<PrologueGenerator> prologueGenerator = code.prologueGeneratorForEntrypoint(*entrypointIndex)) 218 prologueGenerator->run(jit, code); 219 else { 220 jit.emitFunctionPrologue(); 221 if (code.frameSize()) { 222 AllowMacroScratchRegisterUsageIf allowScratch(jit, isARM64()); 223 jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister); 224 } 225 226 jit.emitSave(code.calleeSaveRegisterAtOffsetList()); 227 } 216 code.prologueGeneratorForEntrypoint(*entrypointIndex)->run(jit, code); 228 217 229 218 if (disassembler)
Note:
See TracChangeset
for help on using the changeset viewer.