Changeset 209725 in webkit for trunk/Source/JavaScriptCore/jit/CallFrameShuffler.cpp
- Timestamp:
- Dec 12, 2016, 1:46:45 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/jit/CallFrameShuffler.cpp
r209678 r209725 43 43 , m_alignedNewFrameSize(CallFrame::headerSizeInRegisters 44 44 + roundArgumentCountToAlignFrame(data.args.size())) 45 #if USE(JSVALUE64) 46 , m_argumentsInRegisters(data.argumentsInRegisters) 47 #endif 45 48 , m_frameDelta(m_alignedNewFrameSize - m_alignedOldFrameSize) 46 49 , m_lockedRegisters(RegisterSet::allRegisters()) … … 55 58 56 59 ASSERT(!data.callee.isInJSStack() || data.callee.virtualRegister().isLocal()); 57 addNew(VirtualRegister(CallFrameSlot::callee), data.callee); 58 60 #if USE(JSVALUE64) 61 if (data.argumentsInRegisters) 62 addNew(JSValueRegs(argumentRegisterForCallee()), data.callee); 63 else 64 #endif 65 addNew(VirtualRegister(CallFrameSlot::callee), data.callee); 66 59 67 for (size_t i = 0; i < data.args.size(); ++i) { 60 68 ASSERT(!data.args[i].isInJSStack() || data.args[i].virtualRegister().isLocal()); 61 addNew(virtualRegisterForArgument(i), data.args[i]); 69 #if USE(JSVALUE64) 70 if (data.argumentsInRegisters && i < NUMBER_OF_JS_FUNCTION_ARGUMENT_REGISTERS) 71 addNew(JSValueRegs(argumentRegisterForFunctionArgument(i)), data.args[i]); 72 else 73 #endif 74 addNew(virtualRegisterForArgument(i), data.args[i]); 62 75 } 63 76 … … 186 199 } 187 200 #else 188 if (newCachedRecovery) 201 if (newCachedRecovery) { 189 202 out.print(" ", reg, " <- ", newCachedRecovery->recovery()); 203 if (newCachedRecovery->gprTargets().size() > 1) { 204 for (size_t i = 1; i < newCachedRecovery->gprTargets().size(); i++) 205 out.print(", ", newCachedRecovery->gprTargets()[i].gpr(), " <- ", newCachedRecovery->recovery()); 206 } 207 } 190 208 #endif 191 209 out.print("\n"); … … 497 515 || cachedRecovery.recovery().isConstant()); 498 516 499 if (verbose )517 if (verbose && cachedRecovery.targets().size()) 500 518 dataLog(" * Storing ", cachedRecovery.recovery()); 501 519 for (size_t i = 0; i < cachedRecovery.targets().size(); ++i) { … … 506 524 emitStore(cachedRecovery, addressForNew(target)); 507 525 setNew(target, nullptr); 508 }509 if (verbose)510 dataLog("\n");526 if (verbose) 527 dataLog("\n"); 528 } 511 529 cachedRecovery.clearTargets(); 512 530 if (!cachedRecovery.wantedJSValueRegs() && cachedRecovery.wantedFPR() == InvalidFPRReg) … … 607 625 ASSERT(!isUndecided()); 608 626 609 updateDangerFrontier();627 initDangerFrontier(); 610 628 611 629 // First, we try to store any value that goes above the danger … … 703 721 } 704 722 705 #if USE(JSVALUE64)706 if (m_tagTypeNumber != InvalidGPRReg && m_newRegisters[m_tagTypeNumber])707 releaseGPR(m_tagTypeNumber);708 #endif709 710 723 // Handle 2) by loading all registers. We don't have to do any 711 724 // writes, since they have been taken care of above. 725 // Note that we need m_tagTypeNumber to remain locked to box wanted registers. 712 726 if (verbose) 713 727 dataLog(" Loading wanted registers into registers\n"); … … 743 757 // We need to handle 4) first because it implies releasing 744 758 // m_newFrameBase, which could be a wanted register. 759 // Note that we delay setting the argument count register as it needs to be released in step 3. 745 760 if (verbose) 746 761 dataLog(" * Storing the argument count into ", VirtualRegister { CallFrameSlot::argumentCount }, "\n"); 762 747 763 m_jit.store32(MacroAssembler::TrustedImm32(0), 748 764 addressForNew(VirtualRegister { CallFrameSlot::argumentCount }).withOffset(TagOffset)); 749 m_jit.store32(MacroAssembler::TrustedImm32(argCount()), 750 addressForNew(VirtualRegister { CallFrameSlot::argumentCount }).withOffset(PayloadOffset)); 765 766 #if USE(JSVALUE64) 767 if (!m_argumentsInRegisters) { 768 #endif 769 m_jit.store32(MacroAssembler::TrustedImm32(argCount()), 770 addressForNew(VirtualRegister { CallFrameSlot::argumentCount }).withOffset(PayloadOffset)); 771 #if USE(JSVALUE64) 772 } 773 #endif 751 774 752 775 if (!isSlowPath()) { … … 768 791 emitDisplace(*cachedRecovery); 769 792 } 793 794 #if USE(JSVALUE64) 795 // For recoveries with multiple register targets, copy the contents of the first target to the 796 // remaining targets. 797 for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) { 798 CachedRecovery* cachedRecovery { m_newRegisters[reg] }; 799 if (!cachedRecovery || cachedRecovery->gprTargets().size() < 2) 800 continue; 801 802 GPRReg sourceGPR = cachedRecovery->gprTargets()[0].gpr(); 803 for (size_t i = 1; i < cachedRecovery->gprTargets().size(); i++) 804 m_jit.move(sourceGPR, cachedRecovery->gprTargets()[i].gpr()); 805 } 806 807 if (m_argumentsInRegisters) 808 m_jit.move(MacroAssembler::TrustedImm32(argCount()), argumentRegisterForArgumentCount()); 809 #endif 770 810 } 771 811
Note:
See TracChangeset
for help on using the changeset viewer.