Changeset 91280 in webkit
- Timestamp:
- Jul 19, 2011 11:55:16 AM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r91275 r91280 1 2011-07-19 Filip Pizlo <fpizlo@apple.com> 2 3 DFG JIT sometimes emits spill code even when the respective values 4 are never needed. 5 https://bugs.webkit.org/show_bug.cgi?id=64774 6 7 Reviewed by Gavin Barraclough. 8 9 The main high-level change is that it is now easier to call use() on a 10 virtual register. JSValueOperand and its other-typed relatives now have 11 a handy use() method, and jsValueResult() and friends now make it easier to 12 pass UseChildrenCalledExplicitly. 13 14 The rest of this patch hoists the call to use() as high as possible for 15 all of those cases where either flushRegisters() or silentSpillAllRegisters() 16 may be called. 17 18 * dfg/DFGJITCodeGenerator.cpp: 19 (JSC::DFG::JITCodeGenerator::cachedGetById): 20 (JSC::DFG::JITCodeGenerator::cachedGetMethod): 21 (JSC::DFG::JITCodeGenerator::nonSpeculativePeepholeBranch): 22 (JSC::DFG::JITCodeGenerator::nonSpeculativeNonPeepholeCompare): 23 (JSC::DFG::JITCodeGenerator::nonSpeculativeCompare): 24 (JSC::DFG::JITCodeGenerator::nonSpeculativePeepholeStrictEq): 25 (JSC::DFG::JITCodeGenerator::nonSpeculativeNonPeepholeStrictEq): 26 (JSC::DFG::JITCodeGenerator::nonSpeculativeStrictEq): 27 (JSC::DFG::JITCodeGenerator::emitBranch): 28 * dfg/DFGJITCodeGenerator.h: 29 (JSC::DFG::JITCodeGenerator::use): 30 (JSC::DFG::JITCodeGenerator::integerResult): 31 (JSC::DFG::JITCodeGenerator::jsValueResult): 32 (JSC::DFG::IntegerOperand::use): 33 (JSC::DFG::DoubleOperand::use): 34 (JSC::DFG::JSValueOperand::use): 35 * dfg/DFGNonSpeculativeJIT.cpp: 36 (JSC::DFG::NonSpeculativeJIT::valueToNumber): 37 (JSC::DFG::NonSpeculativeJIT::valueToInt32): 38 (JSC::DFG::NonSpeculativeJIT::knownConstantArithOp): 39 (JSC::DFG::NonSpeculativeJIT::basicArithOp): 40 (JSC::DFG::NonSpeculativeJIT::compile): 41 * dfg/DFGSpeculativeJIT.cpp: 42 (JSC::DFG::SpeculativeJIT::compile): 43 * dfg/DFGSpeculativeJIT.h: 44 (JSC::DFG::SpeculateStrictInt32Operand::use): 45 (JSC::DFG::SpeculateCellOperand::use): 46 1 47 2011-07-19 Xan Lopez <xlopez@igalia.com> 2 48 -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.cpp
r91226 r91280 392 392 } 393 393 394 JITCompiler::Call JITCodeGenerator::cachedGetById(GPRReg baseGPR, GPRReg resultGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget, NodeType nodeType) 395 { 396 GPRReg scratchGPR; 397 398 if (resultGPR == baseGPR) 399 scratchGPR = tryAllocate(); 400 else 401 scratchGPR = resultGPR; 402 394 JITCompiler::Call JITCodeGenerator::cachedGetById(GPRReg baseGPR, GPRReg resultGPR, GPRReg scratchGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget, NodeType nodeType) 395 { 403 396 JITCompiler::DataLabelPtr structureToCompare; 404 397 JITCompiler::Jump structureCheck = m_jit.branchPtrWithPatch(JITCompiler::NotEqual, JITCompiler::Address(baseGPR, JSCell::structureOffset()), structureToCompare, JITCompiler::TrustedImmPtr(reinterpret_cast<void*>(-1))); … … 512 505 } 513 506 514 void JITCodeGenerator::cachedGetMethod(GPRReg baseGPR, GPRReg resultGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget)507 void JITCodeGenerator::cachedGetMethod(GPRReg baseGPR, GPRReg resultGPR, GPRReg scratchGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget) 515 508 { 516 509 JITCompiler::Call slowCall; … … 528 521 wrongProtoStructure.link(&m_jit); 529 522 530 slowCall = cachedGetById(baseGPR, resultGPR, identifierNumber, slowPathTarget, GetMethod);523 slowCall = cachedGetById(baseGPR, resultGPR, scratchGPR, identifierNumber, slowPathTarget, GetMethod); 531 524 532 525 done.link(&m_jit); … … 654 647 655 648 if (isKnownNotInteger(node.child1()) || isKnownNotInteger(node.child2())) { 656 flushRegisters();657 658 649 GPRResult result(this); 659 650 GPRReg resultGPR = result.gpr(); 660 651 652 arg1.use(); 653 arg2.use(); 654 655 flushRegisters(); 656 661 657 callOperation(helperFunction, resultGPR, arg1GPR, arg2GPR); 662 658 addBranch(m_jit.branchTest8(callResultCondition, resultGPR), taken); … … 664 660 GPRTemporary result(this, arg2); 665 661 GPRReg resultGPR = result.gpr(); 662 663 arg1.use(); 664 arg2.use(); 666 665 667 666 if (!isKnownInteger(node.child1())) … … 702 701 703 702 if (isKnownNotInteger(node.child1()) || isKnownNotInteger(node.child2())) { 704 flushRegisters();705 706 703 GPRResult result(this); 707 704 GPRReg resultGPR = result.gpr(); 708 705 706 arg1.use(); 707 arg2.use(); 708 709 flushRegisters(); 710 709 711 callOperation(helperFunction, resultGPR, arg1GPR, arg2GPR); 710 712 711 713 m_jit.or32(TrustedImm32(ValueFalse), resultGPR); 712 jsValueResult(resultGPR, m_compileIndex );714 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 713 715 } else { 714 716 GPRTemporary result(this, arg2); 715 717 GPRReg resultGPR = result.gpr(); 718 719 arg1.use(); 720 arg2.use(); 716 721 717 722 if (!isKnownInteger(node.child1())) … … 741 746 m_jit.or32(TrustedImm32(ValueFalse), resultGPR); 742 747 743 jsValueResult(resultGPR, m_compileIndex );748 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 744 749 } 745 750 } … … 753 758 nonSpeculativePeepholeBranch(node, branchNodeIndex, cond, helperFunction); 754 759 755 use(node.child1());756 use(node.child2());757 760 m_compileIndex = branchNodeIndex; 758 761 … … 788 791 GPRReg resultGPR = result.gpr(); 789 792 793 arg1.use(); 794 arg2.use(); 795 790 796 if (isKnownCell(node.child1()) && isKnownCell(node.child2())) { 791 797 // see if we get lucky: if the arguments are cells and they reference the same … … 840 846 GPRReg resultGPR = result.gpr(); 841 847 848 arg1.use(); 849 arg2.use(); 850 842 851 if (isKnownCell(node.child1()) && isKnownCell(node.child2())) { 843 852 // see if we get lucky: if the arguments are cells and they reference the same … … 899 908 } 900 909 901 jsValueResult(resultGPR, m_compileIndex );910 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 902 911 } 903 912 … … 913 922 nonSpeculativePeepholeStrictEq(node, branchNodeIndex, invert); 914 923 915 use(node.child1());916 use(node.child2());917 924 m_compileIndex = branchNodeIndex; 918 925 … … 932 939 GPRTemporary result(this); 933 940 GPRReg resultGPR = result.gpr(); 941 942 value.use(); 934 943 935 944 BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset()); … … 952 961 addBranch(m_jit.jump(), notTaken); 953 962 954 noResult(m_compileIndex );963 noResult(m_compileIndex, UseChildrenCalledExplicitly); 955 964 } 956 965 -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h
r91226 r91280 158 158 } 159 159 160 // Called on an operand once it has been consumed by a parent node. 161 void use(NodeIndex nodeIndex) 162 { 163 VirtualRegister virtualRegister = m_jit.graph()[nodeIndex].virtualRegister(); 164 GenerationInfo& info = m_generationInfo[virtualRegister]; 165 166 // use() returns true when the value becomes dead, and any 167 // associated resources may be freed. 168 if (!info.use()) 169 return; 170 171 // Release the associated machine registers. 172 DataFormat registerFormat = info.registerFormat(); 173 if (registerFormat == DataFormatDouble) 174 m_fprs.release(info.fpr()); 175 else if (registerFormat != DataFormatNone) 176 m_gprs.release(info.gpr()); 177 } 178 160 179 static void writeBarrier(MacroAssembler&, GPRReg ownerGPR, GPRReg scratchGPR); 161 180 … … 356 375 { 357 376 return unboxDouble(gpr, fprAllocate()); 358 }359 360 // Called on an operand once it has been consumed by a parent node.361 void use(NodeIndex nodeIndex)362 {363 VirtualRegister virtualRegister = m_jit.graph()[nodeIndex].virtualRegister();364 GenerationInfo& info = m_generationInfo[virtualRegister];365 366 // use() returns true when the value becomes dead, and any367 // associated resources may be freed.368 if (!info.use())369 return;370 371 // Release the associated machine registers.372 DataFormat registerFormat = info.registerFormat();373 if (registerFormat == DataFormatDouble)374 m_fprs.release(info.fpr());375 else if (registerFormat != DataFormatNone)376 m_gprs.release(info.gpr());377 377 } 378 378 … … 560 560 } 561 561 562 JITCompiler::Call cachedGetById(GPRReg baseGPR, GPRReg resultGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget = JITCompiler::Jump(), NodeType = GetById);562 JITCompiler::Call cachedGetById(GPRReg baseGPR, GPRReg resultGPR, GPRReg scratchGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget = JITCompiler::Jump(), NodeType = GetById); 563 563 void cachedPutById(GPRReg baseGPR, GPRReg valueGPR, GPRReg scratchGPR, unsigned identifierNumber, PutKind, JITCompiler::Jump slowPathTarget = JITCompiler::Jump()); 564 void cachedGetMethod(GPRReg baseGPR, GPRReg resultGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget = JITCompiler::Jump());564 void cachedGetMethod(GPRReg baseGPR, GPRReg resultGPR, GPRReg scratchGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget = JITCompiler::Jump()); 565 565 566 566 void nonSpeculativeNonPeepholeCompareNull(NodeIndex operand, bool invert = false); … … 613 613 } 614 614 } 615 void integerResult(GPRReg reg, NodeIndex nodeIndex, UseChildrenMode mode) 616 { 617 integerResult(reg, nodeIndex, DataFormatInteger, mode); 618 } 615 619 void noResult(NodeIndex nodeIndex, UseChildrenMode mode = CallUseChildren) 616 620 { … … 644 648 GenerationInfo& info = m_generationInfo[virtualRegister]; 645 649 info.initJSValue(nodeIndex, node.refCount(), reg, format); 650 } 651 void jsValueResult(GPRReg reg, NodeIndex nodeIndex, UseChildrenMode mode) 652 { 653 jsValueResult(reg, nodeIndex, DataFormatJS, mode); 646 654 } 647 655 void doubleResult(FPRReg reg, NodeIndex nodeIndex, UseChildrenMode mode = CallUseChildren) … … 996 1004 return m_gprOrInvalid; 997 1005 } 1006 1007 void use() 1008 { 1009 m_jit->use(m_index); 1010 } 998 1011 999 1012 private: … … 1033 1046 return m_fprOrInvalid; 1034 1047 } 1048 1049 void use() 1050 { 1051 m_jit->use(m_index); 1052 } 1035 1053 1036 1054 private: … … 1068 1086 m_gprOrInvalid = m_jit->fillJSValue(index()); 1069 1087 return m_gprOrInvalid; 1088 } 1089 1090 void use() 1091 { 1092 m_jit->use(m_index); 1070 1093 } 1071 1094 -
trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp
r91226 r91280 60 60 { 61 61 GPRReg jsValueGpr = operand.gpr(); 62 operand.use(); 62 63 63 64 JITCompiler::Jump isInteger = m_jit.branchPtr(MacroAssembler::AboveOrEqual, jsValueGpr, GPRInfo::tagTypeNumberRegister); … … 88 89 { 89 90 GPRReg jsValueGpr = operand.gpr(); 91 operand.use(); 90 92 91 93 JITCompiler::Jump isInteger = m_jit.branchPtr(MacroAssembler::AboveOrEqual, jsValueGpr, GPRInfo::tagTypeNumberRegister); … … 127 129 GPRTemporary result(this, regArg); 128 130 GPRReg resultGPR = result.gpr(); 131 132 regArg.use(); 133 use(immChild); 129 134 130 135 JITCompiler::Jump notInt; … … 221 226 done.link(&m_jit); 222 227 223 jsValueResult(resultGPR, m_compileIndex );228 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 224 229 } 225 230 … … 235 240 236 241 GPRReg resultGPR = result.gpr(); 242 243 arg1.use(); 244 arg2.use(); 237 245 238 246 JITCompiler::JumpList slowPath; … … 300 308 done.link(&m_jit); 301 309 302 jsValueResult(resultGPR, m_compileIndex );310 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 303 311 } 304 312 … … 448 456 DoubleOperand op1(this, node.child1()); 449 457 GPRTemporary result(this); 458 op1.use(); 450 459 numberToInt32(op1.fpr(), result.gpr()); 451 integerResult(result.gpr(), m_compileIndex );460 integerResult(result.gpr(), m_compileIndex, UseChildrenCalledExplicitly); 452 461 break; 453 462 } … … 456 465 GPRTemporary result(this, op1); 457 466 valueToInt32(op1, result.gpr()); 458 integerResult(result.gpr(), m_compileIndex );467 integerResult(result.gpr(), m_compileIndex, UseChildrenCalledExplicitly); 459 468 break; 460 469 } … … 475 484 GPRTemporary result(this); 476 485 valueToNumber(op1, result.gpr()); 477 jsValueResult(result.gpr(), m_compileIndex );486 jsValueResult(result.gpr(), m_compileIndex, UseChildrenCalledExplicitly); 478 487 break; 479 488 } … … 538 547 FPRReg op1FPR = op1Double.fpr(); 539 548 FPRReg op2FPR = op2Double.fpr(); 549 550 op1.use(); 551 op2.use(); 540 552 541 553 JITCompiler::Jump firstOpNotInt; … … 624 636 done.link(&m_jit); 625 637 626 jsValueResult(X86Registers::edx, m_compileIndex );638 jsValueResult(X86Registers::edx, m_compileIndex, UseChildrenCalledExplicitly); 627 639 break; 628 640 } … … 631 643 JSValueOperand arg1(this, node.child1()); 632 644 GPRTemporary result(this); 633 645 634 646 GPRReg arg1GPR = arg1.gpr(); 635 647 GPRReg resultGPR = result.gpr(); 636 648 649 arg1.use(); 650 637 651 m_jit.move(arg1GPR, resultGPR); 638 652 m_jit.xorPtr(TrustedImm32(static_cast<int32_t>(ValueFalse)), resultGPR); … … 649 663 650 664 m_jit.xorPtr(TrustedImm32(static_cast<int32_t>(ValueTrue)), resultGPR); 651 jsValueResult(resultGPR, m_compileIndex );665 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 652 666 break; 653 667 } … … 704 718 GPRReg storageGPR = storage.gpr(); 705 719 GPRReg cleanIndexGPR = cleanIndex.gpr(); 720 721 base.use(); 722 property.use(); 706 723 707 724 JITCompiler::Jump baseNotCell = m_jit.branchTestPtr(MacroAssembler::NonZero, baseGPR, GPRInfo::tagMaskRegister); … … 740 757 done.link(&m_jit); 741 758 742 jsValueResult(storageGPR, m_compileIndex );759 jsValueResult(storageGPR, m_compileIndex, UseChildrenCalledExplicitly); 743 760 break; 744 761 } … … 752 769 GPRReg arg2GPR = arg2.gpr(); 753 770 GPRReg arg3GPR = arg3.gpr(); 771 772 arg1.use(); 773 arg2.use(); 774 arg3.use(); 754 775 flushRegisters(); 755 776 756 GPRResult result(this);757 777 callOperation(m_jit.codeBlock()->isStrictMode() ? operationPutByValStrict : operationPutByValNonStrict, arg1GPR, arg2GPR, arg3GPR); 758 778 759 noResult(m_compileIndex );779 noResult(m_compileIndex, UseChildrenCalledExplicitly); 760 780 break; 761 781 } … … 766 786 GPRTemporary result(this, base); 767 787 GPRReg resultGPR = result.gpr(); 788 GPRReg scratchGPR; 789 790 if (resultGPR == baseGPR) 791 scratchGPR = tryAllocate(); 792 else 793 scratchGPR = resultGPR; 794 795 base.use(); 768 796 769 797 JITCompiler::Jump notCell = m_jit.branchTestPtr(MacroAssembler::NonZero, baseGPR, GPRInfo::tagMaskRegister); 770 798 771 cachedGetById(baseGPR, resultGPR, node.identifierNumber(), notCell);772 773 jsValueResult(resultGPR, m_compileIndex );799 cachedGetById(baseGPR, resultGPR, scratchGPR, node.identifierNumber(), notCell); 800 801 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 774 802 break; 775 803 } … … 780 808 GPRTemporary result(this, base); 781 809 GPRReg resultGPR = result.gpr(); 810 GPRReg scratchGPR; 811 if (resultGPR == baseGPR) 812 scratchGPR = tryAllocate(); 813 else 814 scratchGPR = resultGPR; 815 816 base.use(); 782 817 783 818 JITCompiler::Jump notCell = m_jit.branchTestPtr(MacroAssembler::NonZero, baseGPR, GPRInfo::tagMaskRegister); 784 819 785 cachedGetMethod(baseGPR, resultGPR, node.identifierNumber(), notCell);786 787 jsValueResult(resultGPR, m_compileIndex );820 cachedGetMethod(baseGPR, resultGPR, scratchGPR, node.identifierNumber(), notCell); 821 822 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 788 823 break; 789 824 } … … 795 830 GPRReg valueGPR = value.gpr(); 796 831 GPRReg baseGPR = base.gpr(); 832 GPRReg scratchGPR = scratch.gpr(); 833 834 base.use(); 835 value.use(); 797 836 798 837 JITCompiler::Jump notCell = m_jit.branchTestPtr(MacroAssembler::NonZero, baseGPR, GPRInfo::tagMaskRegister); 799 838 800 cachedPutById(baseGPR, valueGPR, scratch .gpr(), node.identifierNumber(), NotDirect, notCell);801 802 noResult(m_compileIndex );839 cachedPutById(baseGPR, valueGPR, scratchGPR, node.identifierNumber(), NotDirect, notCell); 840 841 noResult(m_compileIndex, UseChildrenCalledExplicitly); 803 842 break; 804 843 } … … 811 850 GPRReg baseGPR = base.gpr(); 812 851 852 base.use(); 853 value.use(); 854 813 855 JITCompiler::Jump notCell = m_jit.branchTestPtr(MacroAssembler::NonZero, baseGPR, GPRInfo::tagMaskRegister); 814 856 815 857 cachedPutById(baseGPR, valueGPR, scratch.gpr(), node.identifierNumber(), Direct, notCell); 816 858 817 noResult(m_compileIndex );859 noResult(m_compileIndex, UseChildrenCalledExplicitly); 818 860 break; 819 861 } … … 925 967 GPRReg prototypeReg = prototype.gpr(); 926 968 GPRReg scratchReg = scratch.gpr(); 969 970 value.use(); 971 base.use(); 972 prototype.use(); 927 973 928 974 // Check that operands are cells (base is checked by CheckHasInstance, so we can just assert). … … 974 1020 wasNotInstance.link(&m_jit); 975 1021 wasNotDefaultHasInstance.link(&m_jit); 976 jsValueResult(scratchReg, m_compileIndex );1022 jsValueResult(scratchReg, m_compileIndex, UseChildrenCalledExplicitly); 977 1023 break; 978 1024 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r91226 r91280 850 850 if (baseNode.op != GetLocal || m_jit.graph().getPrediction(baseNode.local()) != PredictArray) 851 851 speculationCheck(m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(baseReg), MacroAssembler::TrustedImmPtr(m_jit.globalData()->jsArrayVPtr))); 852 853 base.use(); 854 property.use(); 855 value.use(); 856 852 857 MacroAssembler::Jump withinArrayBounds = m_jit.branch32(MacroAssembler::Below, propertyReg, MacroAssembler::Address(baseReg, JSArray::vectorLengthOffset())); 853 858 … … 884 889 wasBeyondArrayBounds.link(&m_jit); 885 890 886 noResult(m_compileIndex );891 noResult(m_compileIndex, UseChildrenCalledExplicitly); 887 892 break; 888 893 } … … 962 967 SpeculateCellOperand base(this, node.child1()); 963 968 GPRTemporary result(this, base); 964 969 970 GPRReg baseGPR = base.gpr(); 965 971 GPRReg resultGPR = result.gpr(); 966 967 cachedGetById(base.gpr(), resultGPR, node.identifierNumber()); 968 969 jsValueResult(resultGPR, m_compileIndex); 972 GPRReg scratchGPR; 973 974 if (resultGPR == baseGPR) 975 scratchGPR = tryAllocate(); 976 else 977 scratchGPR = resultGPR; 978 979 base.use(); 980 981 cachedGetById(baseGPR, resultGPR, scratchGPR, node.identifierNumber()); 982 983 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 970 984 break; 971 985 } … … 975 989 GPRTemporary result(this, base); 976 990 991 GPRReg baseGPR = base.gpr(); 977 992 GPRReg resultGPR = result.gpr(); 978 979 cachedGetMethod(base.gpr(), resultGPR, node.identifierNumber()); 980 981 jsValueResult(resultGPR, m_compileIndex); 993 GPRReg scratchGPR; 994 995 if (resultGPR == baseGPR) 996 scratchGPR = tryAllocate(); 997 else 998 scratchGPR = resultGPR; 999 1000 base.use(); 1001 1002 cachedGetMethod(baseGPR, resultGPR, scratchGPR, node.identifierNumber()); 1003 1004 jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly); 982 1005 break; 983 1006 } … … 987 1010 JSValueOperand value(this, node.child2()); 988 1011 GPRTemporary scratch(this); 989 990 cachedPutById(base.gpr(), value.gpr(), scratch.gpr(), node.identifierNumber(), NotDirect); 991 992 noResult(m_compileIndex); 1012 1013 GPRReg baseGPR = base.gpr(); 1014 GPRReg valueGPR = value.gpr(); 1015 GPRReg scratchGPR = scratch.gpr(); 1016 1017 base.use(); 1018 value.use(); 1019 1020 cachedPutById(baseGPR, valueGPR, scratchGPR, node.identifierNumber(), NotDirect); 1021 1022 noResult(m_compileIndex, UseChildrenCalledExplicitly); 993 1023 break; 994 1024 } … … 998 1028 JSValueOperand value(this, node.child2()); 999 1029 GPRTemporary scratch(this); 1000 1001 cachedPutById(base.gpr(), value.gpr(), scratch.gpr(), node.identifierNumber(), Direct); 1002 1003 noResult(m_compileIndex); 1030 1031 GPRReg baseGPR = base.gpr(); 1032 GPRReg valueGPR = value.gpr(); 1033 GPRReg scratchGPR = scratch.gpr(); 1034 1035 base.use(); 1036 value.use(); 1037 1038 cachedPutById(baseGPR, valueGPR, scratchGPR, node.identifierNumber(), Direct); 1039 1040 noResult(m_compileIndex, UseChildrenCalledExplicitly); 1004 1041 break; 1005 1042 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r91156 r91280 294 294 return m_gprOrInvalid; 295 295 } 296 297 void use() 298 { 299 m_jit->use(m_index); 300 } 296 301 297 302 private: … … 365 370 m_gprOrInvalid = m_jit->fillSpeculateCell(index()); 366 371 return m_gprOrInvalid; 372 } 373 374 void use() 375 { 376 m_jit->use(m_index); 367 377 } 368 378
Note: See TracChangeset
for help on using the changeset viewer.