Changeset 284851 in webkit
- Timestamp:
- Oct 25, 2021, 5:17:53 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 6 edited
-
JSTests/ChangeLog (modified) (1 diff)
-
JSTests/stress/dont-branch-around-regalloc-enumerator-get-by-val-float.js (added)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (modified) (17 diffs)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (modified) (2 diffs)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (modified) (13 diffs)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r284757 r284851 1 2021-10-25 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Don't branch around register allocation in DFG enumerator get by val 4 https://bugs.webkit.org/show_bug.cgi?id=232260 5 rdar://84544469 6 7 Reviewed by Robin Morisset. 8 9 * stress/dont-branch-around-regalloc-enumerator-get-by-val-float.js: Added. 10 (foo): 11 1 12 2021-10-24 Alexey Shvayka <ashvayka@apple.com> 2 13 -
trunk/Source/JavaScriptCore/ChangeLog
r284788 r284851 1 2021-10-25 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Don't branch around register allocation in DFG enumerator get by val 4 https://bugs.webkit.org/show_bug.cgi?id=232260 5 rdar://84544469 6 7 Reviewed by Robin Morisset. 8 9 * dfg/DFGSpeculativeJIT.cpp: 10 (JSC::DFG::SpeculativeJIT::compileGetByValOnString): 11 (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): 12 (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): 13 (JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithString): 14 (JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithSymbol): 15 (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): 16 (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments): 17 (JSC::DFG::SpeculativeJIT::compileEnumeratorGetByVal): 18 * dfg/DFGSpeculativeJIT.h: 19 * dfg/DFGSpeculativeJIT32_64.cpp: 20 (JSC::DFG::SpeculativeJIT::compileGetByVal): 21 (JSC::DFG::SpeculativeJIT::compile): 22 * dfg/DFGSpeculativeJIT64.cpp: 23 (JSC::DFG::SpeculativeJIT::compileGetByVal): 24 (JSC::DFG::SpeculativeJIT::compile): 25 1 26 2021-10-25 Mikhail R. Gadelha <mikhail@igalia.com> 2 27 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r284700 r284851 2594 2594 } 2595 2595 2596 void SpeculativeJIT::compileGetByValOnString(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)2596 void SpeculativeJIT::compileGetByValOnString(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 2597 2597 { 2598 2598 SpeculateCellOperand base(this, m_graph.child(node, 0)); … … 2605 2605 JSValueRegs resultRegs; 2606 2606 DataFormat format; 2607 std::tie(resultRegs, format ) = prefix(node->arrayMode().isOutOfBounds() ? DataFormatJS : DataFormatCell);2607 std::tie(resultRegs, format, std::ignore) = prefix(node->arrayMode().isOutOfBounds() ? DataFormatJS : DataFormatCell); 2608 2608 GPRReg scratchReg = resultRegs.payloadGPR(); 2609 2609 … … 3389 3389 } 3390 3390 3391 void SpeculativeJIT::compileGetByValOnIntTypedArray(Node* node, TypedArrayType type, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)3391 void SpeculativeJIT::compileGetByValOnIntTypedArray(Node* node, TypedArrayType type, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 3392 3392 { 3393 3393 ASSERT(isInt(type)); … … 3412 3412 JSValueRegs resultRegs; 3413 3413 DataFormat format; 3414 std::tie(resultRegs, format ) = prefix(DataFormatInt32);3414 std::tie(resultRegs, format, std::ignore) = prefix(DataFormatInt32); 3415 3415 bool shouldBox = format == DataFormatJS; 3416 3416 … … 3657 3657 } 3658 3658 3659 void SpeculativeJIT::compileGetByValOnFloatTypedArray(Node* node, TypedArrayType type, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)3659 void SpeculativeJIT::compileGetByValOnFloatTypedArray(Node* node, TypedArrayType type, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 3660 3660 { 3661 3661 ASSERT(isFloat(type)); … … 3665 3665 StorageOperand storage(this, m_graph.varArgChild(node, 2)); 3666 3666 GPRTemporary scratch(this); 3667 FPRTemporary result(this); 3667 3668 3668 3669 GPRReg baseReg = base.gpr(); … … 3670 3671 GPRReg storageReg = storage.gpr(); 3671 3672 GPRReg scratchGPR = scratch.gpr(); 3673 FPRReg resultReg = result.fpr(); 3672 3674 3673 3675 JSValueRegs resultRegs; 3674 3676 DataFormat format; 3675 std::tie(resultRegs, format) = prefix(DataFormatDouble); 3676 3677 FPRTemporary result(this); 3678 FPRReg resultReg = result.fpr(); 3677 std::tie(resultRegs, format, std::ignore) = prefix(DataFormatDouble); 3678 3679 3679 emitTypedArrayBoundsCheck(node, baseReg, propertyReg, scratchGPR); 3680 3680 switch (elementSize(type)) { … … 3738 3738 } 3739 3739 3740 void SpeculativeJIT::compileGetByValForObjectWithString(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)3740 void SpeculativeJIT::compileGetByValForObjectWithString(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 3741 3741 { 3742 3742 SpeculateCellOperand arg1(this, m_graph.varArgChild(node, 0)); … … 3747 3747 3748 3748 JSValueRegs resultRegs; 3749 std::tie(resultRegs, std::ignore) = prefix(DataFormatJS); 3749 CanUseFlush canUseFlush = CanUseFlush::Yes; 3750 std::tie(resultRegs, std::ignore, canUseFlush) = prefix(DataFormatJS); 3750 3751 3751 3752 speculateObject(m_graph.varArgChild(node, 0), arg1GPR); 3752 3753 speculateString(m_graph.varArgChild(node, 1), arg2GPR); 3753 3754 3754 flushRegisters(); 3755 if (canUseFlush == CanUseFlush::No) 3756 silentSpillAllRegisters(resultRegs); 3757 else 3758 flushRegisters(); 3755 3759 callOperation(operationGetByValObjectString, resultRegs, TrustedImmPtr::weakPointer(m_graph, m_graph.globalObjectFor(node->origin.semantic)), arg1GPR, arg2GPR); 3760 if (canUseFlush == CanUseFlush::No) 3761 silentFillAllRegisters(); 3756 3762 m_jit.exceptionCheck(); 3757 3763 … … 3759 3765 } 3760 3766 3761 void SpeculativeJIT::compileGetByValForObjectWithSymbol(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)3767 void SpeculativeJIT::compileGetByValForObjectWithSymbol(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 3762 3768 { 3763 3769 SpeculateCellOperand arg1(this, m_graph.varArgChild(node, 0)); … … 3768 3774 3769 3775 JSValueRegs resultRegs; 3770 std::tie(resultRegs, std::ignore) = prefix(DataFormatJS); 3776 CanUseFlush canUseFlush = CanUseFlush::Yes; 3777 std::tie(resultRegs, std::ignore, canUseFlush) = prefix(DataFormatJS); 3771 3778 3772 3779 speculateObject(m_graph.varArgChild(node, 0), arg1GPR); 3773 3780 speculateSymbol(m_graph.varArgChild(node, 1), arg2GPR); 3774 3781 3775 flushRegisters(); 3782 if (canUseFlush == CanUseFlush::No) 3783 silentSpillAllRegisters(resultRegs); 3784 else 3785 flushRegisters(); 3776 3786 callOperation(operationGetByValObjectSymbol, resultRegs, TrustedImmPtr::weakPointer(m_graph, m_graph.globalObjectFor(node->origin.semantic)), arg1GPR, arg2GPR); 3787 if (canUseFlush == CanUseFlush::No) 3788 silentFillAllRegisters(); 3777 3789 m_jit.exceptionCheck(); 3778 3790 … … 8111 8123 } 8112 8124 8113 void SpeculativeJIT::compileGetByValOnDirectArguments(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)8125 void SpeculativeJIT::compileGetByValOnDirectArguments(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 8114 8126 { 8115 8127 SpeculateCellOperand base(this, m_graph.varArgChild(node, 0)); … … 8120 8132 8121 8133 JSValueRegs resultRegs; 8122 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);8134 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 8123 8135 GPRReg scratchReg = resultRegs.payloadGPR(); 8124 8136 … … 8152 8164 } 8153 8165 8154 void SpeculativeJIT::compileGetByValOnScopedArguments(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)8166 void SpeculativeJIT::compileGetByValOnScopedArguments(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 8155 8167 { 8156 8168 SpeculateCellOperand base(this, m_graph.varArgChild(node, 0)); … … 8168 8180 8169 8181 JSValueRegs resultRegs; 8170 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);8182 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 8171 8183 8172 8184 m_jit.loadPtr( … … 15866 15878 MacroAssembler::Jump badStructureSlowPath; 15867 15879 15868 compileGetByVal(node, scopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat)>([&] (DataFormat) {15880 compileGetByVal(node, scopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat)>([&] (DataFormat) { 15869 15881 Edge storageEdge = m_graph.varArgChild(node, 2); 15870 15882 StorageOperand storage; … … 15939 15951 15940 15952 notFastNamedCases.link(&m_jit); 15941 return std:: make_pair(resultRegs, DataFormatJS);15953 return std::tuple { resultRegs, DataFormatJS, CanUseFlush::No }; 15942 15954 })); 15943 15955 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r284330 r284851 1359 1359 1360 1360 // We use a scopedLambda to placate register allocation validation. 1361 void compileGetByVal(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat>(DataFormat preferredFormat)>& prefix); 1361 enum class CanUseFlush { Yes, No }; 1362 void compileGetByVal(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1362 1363 1363 1364 void compileGetCharCodeAt(Node*); 1364 void compileGetByValOnString(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1365 void compileGetByValOnString(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1365 1366 void compileFromCharCode(Node*); 1366 1367 1367 void compileGetByValOnDirectArguments(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1368 void compileGetByValOnScopedArguments(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1368 void compileGetByValOnDirectArguments(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1369 void compileGetByValOnScopedArguments(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1369 1370 1370 1371 void compileGetPrivateName(Node*); … … 1446 1447 void compileGetTypedArrayByteOffsetAsInt52(Node*); 1447 1448 #endif 1448 void compileGetByValOnIntTypedArray(Node*, TypedArrayType, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1449 void compileGetByValOnIntTypedArray(Node*, TypedArrayType, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1449 1450 void compilePutByValForIntTypedArray(GPRReg base, GPRReg property, Node*, TypedArrayType); 1450 void compileGetByValOnFloatTypedArray(Node*, TypedArrayType, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1451 void compileGetByValOnFloatTypedArray(Node*, TypedArrayType, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1451 1452 void compilePutByValForFloatTypedArray(GPRReg base, GPRReg property, Node*, TypedArrayType); 1452 void compileGetByValForObjectWithString(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1453 void compileGetByValForObjectWithSymbol(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix);1453 void compileGetByValForObjectWithString(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1454 void compileGetByValForObjectWithSymbol(Node*, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix); 1454 1455 void compilePutByValForCellWithString(Node*, Edge& child1, Edge& child2, Edge& child3); 1455 1456 void compilePutByValForCellWithSymbol(Node*, Edge& child1, Edge& child2, Edge& child3); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r284788 r284851 1816 1816 } 1817 1817 1818 void SpeculativeJIT::compileGetByVal(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)1818 void SpeculativeJIT::compileGetByVal(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 1819 1819 { 1820 1820 switch (node->arrayMode().type()) { … … 1834 1834 1835 1835 JSValueRegs resultRegs; 1836 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);1836 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 1837 1837 1838 1838 speculationCheck(OutOfBounds, JSValueRegs(), node, … … 1864 1864 1865 1865 JSValueRegs resultRegs; 1866 std::tie(resultRegs, std::ignore) = prefix(DataFormatJS); 1867 1868 flushRegisters(); 1866 CanUseFlush canUseFlush = CanUseFlush::Yes; 1867 std::tie(resultRegs, std::ignore, canUseFlush) = prefix(DataFormatJS); 1868 1869 if (canUseFlush == CanUseFlush::No) 1870 silentSpillAllRegisters(resultRegs); 1871 else 1872 flushRegisters(); 1869 1873 callOperation(operationGetByVal, resultRegs, TrustedImmPtr::weakPointer(m_graph, m_graph.globalObjectFor(node->origin.semantic)), baseGPR, propertyRegs); 1874 if (canUseFlush == CanUseFlush::No) 1875 silentFillAllRegisters(); 1870 1876 m_jit.exceptionCheck(); 1871 1877 … … 1880 1886 auto generate = [&] (JSValueRegs baseRegs) { 1881 1887 JSValueRegs resultRegs; 1882 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);1888 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 1883 1889 1884 1890 CodeOrigin codeOrigin = node->origin.semantic; … … 1947 1953 JSValueRegs resultRegs; 1948 1954 DataFormat format; 1949 std::tie(resultRegs, format ) = prefix(node->arrayMode().type() == Array::Int32 ? DataFormatInt32 : DataFormatJS);1955 std::tie(resultRegs, format, std::ignore) = prefix(node->arrayMode().type() == Array::Int32 ? DataFormatInt32 : DataFormatJS); 1950 1956 1951 1957 speculationCheck(OutOfBounds, JSValueRegs(), nullptr, m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(storageReg, Butterfly::offsetOfPublicLength()))); … … 2004 2010 2005 2011 JSValueRegs resultRegs; 2006 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2012 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2007 2013 2008 2014 MacroAssembler::JumpList slowCases; … … 2037 2043 JSValueRegs resultRegs; 2038 2044 DataFormat format; 2039 std::tie(resultRegs, format ) = prefix(DataFormatDouble);2045 std::tie(resultRegs, format, std::ignore) = prefix(DataFormatDouble); 2040 2046 2041 2047 speculationCheck(OutOfBounds, JSValueRegs(), nullptr, m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(storageReg, Butterfly::offsetOfPublicLength()))); … … 2069 2075 2070 2076 JSValueRegs resultRegs; 2071 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2077 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2072 2078 2073 2079 MacroAssembler::JumpList slowCases; … … 2099 2105 2100 2106 JSValueRegs resultRegs; 2101 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2107 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2102 2108 2103 2109 speculationCheck(OutOfBounds, JSValueRegs(), nullptr, m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(storageReg, ArrayStorage::vectorLengthOffset()))); … … 2123 2129 2124 2130 JSValueRegs resultRegs; 2125 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2131 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2126 2132 2127 2133 JITCompiler::Jump outOfBounds = m_jit.branch32( … … 2595 2601 // Relies on StringCharAt node having same basic layout as GetByVal 2596 2602 JSValueRegsTemporary result; 2597 compileGetByValOnString(node, scopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) {2603 compileGetByValOnString(node, scopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) { 2598 2604 result = JSValueRegsTemporary(this); 2599 2605 ASSERT(preferredFormat == DataFormatJS || preferredFormat == DataFormatCell); 2600 return std:: make_pair(result.regs(), preferredFormat);2606 return std::tuple { result.regs(), preferredFormat, CanUseFlush::Yes }; 2601 2607 })); 2602 2608 break; … … 2637 2643 JSValueRegsTemporary jsValueResult; 2638 2644 GPRTemporary oneRegResult; 2639 compileGetByVal(node, scopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) {2645 compileGetByVal(node, scopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) { 2640 2646 JSValueRegs resultRegs; 2641 2647 switch (preferredFormat) { … … 2654 2660 } 2655 2661 }; 2656 return std:: make_pair(resultRegs, preferredFormat);2662 return std::tuple { resultRegs, preferredFormat, CanUseFlush::Yes }; 2657 2663 })); 2658 2664 break; -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r284700 r284851 2331 2331 } 2332 2332 2333 void SpeculativeJIT::compileGetByVal(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>& prefix)2333 void SpeculativeJIT::compileGetByVal(Node* node, const ScopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>& prefix) 2334 2334 { 2335 2335 switch (node->arrayMode().type()) { … … 2346 2346 2347 2347 JSValueRegs resultRegs; 2348 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2348 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2349 2349 2350 2350 speculationCheck(OutOfBounds, JSValueRegs(), node, … … 2378 2378 2379 2379 JSValueRegs resultRegs; 2380 std::tie(resultRegs, std::ignore) = prefix(DataFormatJS); 2381 2382 flushRegisters(); 2380 CanUseFlush canUseFlush = CanUseFlush::Yes; 2381 std::tie(resultRegs, std::ignore, canUseFlush) = prefix(DataFormatJS); 2382 2383 if (canUseFlush == CanUseFlush::No) 2384 silentSpillAllRegisters(resultRegs); 2385 else 2386 flushRegisters(); 2383 2387 callOperation(operationGetByVal, resultRegs, TrustedImmPtr::weakPointer(m_graph, m_graph.globalObjectFor(node->origin.semantic)), baseGPR, propertyGPR); 2388 if (canUseFlush == CanUseFlush::No) 2389 silentFillAllRegisters(); 2384 2390 m_jit.exceptionCheck(); 2385 2391 … … 2404 2410 2405 2411 JSValueRegs resultRegs; 2406 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2412 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2407 2413 GPRReg resultGPR = resultRegs.gpr(); 2408 2414 … … 2462 2468 JSValueRegs resultRegs; 2463 2469 DataFormat format; 2464 std::tie(resultRegs, format ) = prefix(node->arrayMode().type() == Array::Int32 ? DataFormatJSInt32 : DataFormatJS);2470 std::tie(resultRegs, format, std::ignore) = prefix(node->arrayMode().type() == Array::Int32 ? DataFormatJSInt32 : DataFormatJS); 2465 2471 GPRReg result = resultRegs.gpr(); 2466 2472 … … 2494 2500 2495 2501 JSValueRegs resultRegs; 2496 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2502 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2497 2503 GPRReg resultReg = resultRegs.gpr(); 2498 2504 … … 2538 2544 JSValueRegs resultRegs; 2539 2545 DataFormat format; 2540 std::tie(resultRegs, format ) = prefix(DataFormatDouble);2546 std::tie(resultRegs, format, std::ignore) = prefix(DataFormatDouble); 2541 2547 2542 2548 speculationCheck(OutOfBounds, JSValueRegs(), nullptr, m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(storageReg, Butterfly::offsetOfPublicLength()))); … … 2573 2579 JSValueRegs resultRegs; 2574 2580 DataFormat format; 2575 std::tie(resultRegs, format ) = prefix(resultIsUnboxed ? DataFormatDouble : DataFormatJS);2581 std::tie(resultRegs, format, std::ignore) = prefix(resultIsUnboxed ? DataFormatDouble : DataFormatJS); 2576 2582 2577 2583 MacroAssembler::JumpList slowCases; … … 2626 2632 2627 2633 JSValueRegs resultRegs; 2628 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2634 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2629 2635 GPRReg resultGPR = resultRegs.gpr(); 2630 2636 … … 2651 2657 2652 2658 JSValueRegs resultRegs; 2653 std::tie(resultRegs, std::ignore ) = prefix(DataFormatJS);2659 std::tie(resultRegs, std::ignore, std::ignore) = prefix(DataFormatJS); 2654 2660 GPRReg resultReg = resultRegs.gpr(); 2655 2661 … … 3243 3249 // Relies on StringCharAt node having same basic layout as GetByVal 3244 3250 JSValueRegsTemporary result; 3245 compileGetByValOnString(node, scopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) {3251 compileGetByValOnString(node, scopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) { 3246 3252 result = JSValueRegsTemporary(this); 3247 3253 ASSERT(preferredFormat == DataFormatJS || preferredFormat == DataFormatCell); 3248 return std:: make_pair(result.regs(), preferredFormat);3254 return std::tuple { result.regs(), preferredFormat, CanUseFlush::Yes }; 3249 3255 })); 3250 3256 break; … … 3285 3291 case GetByVal: { 3286 3292 JSValueRegsTemporary result; 3287 compileGetByVal(node, scopedLambda<std::tuple<JSValueRegs, DataFormat >(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) {3293 compileGetByVal(node, scopedLambda<std::tuple<JSValueRegs, DataFormat, CanUseFlush>(DataFormat preferredFormat)>([&] (DataFormat preferredFormat) { 3288 3294 JSValueRegs resultRegs; 3289 3295 switch (preferredFormat) { … … 3296 3302 } 3297 3303 }; 3298 return std:: make_pair(resultRegs, preferredFormat);3304 return std::tuple { resultRegs, preferredFormat, CanUseFlush::Yes }; 3299 3305 })); 3300 3306 break;
Note:
See TracChangeset
for help on using the changeset viewer.