Changeset 286020 in webkit
- Timestamp:
- Nov 18, 2021, 12:04:48 PM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 10 edited
-
ChangeLog (modified) (1 diff)
-
assembler/MacroAssembler.h (modified) (1 diff)
-
assembler/MacroAssemblerARM64.h (modified) (6 diffs)
-
assembler/MacroAssemblerARMv7.h (modified) (5 diffs)
-
assembler/MacroAssemblerHelpers.h (modified) (2 diffs)
-
assembler/MacroAssemblerMIPS.h (modified) (3 diffs)
-
assembler/MacroAssemblerX86Common.h (modified) (1 diff)
-
assembler/MacroAssemblerX86_64.h (modified) (1 diff)
-
assembler/X86Assembler.h (modified) (2 diffs)
-
assembler/testmasm.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r286018 r286020 1 2021-11-18 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Add branchTest16 operation 4 https://bugs.webkit.org/show_bug.cgi?id=233275 5 6 Reviewed by Mark Lam. 7 8 This patch adds branchTest16 to all macro assemblers. And it also fixes the existing bug of 9 edge case of branchTest8: when we cannot represent the imm as ARM logical value, then we are 10 failing to emit the right instructions. Probably this bug does not appear since we are not using 11 such a value as an imm for branchTest8. We added tests to testmasm so that these code is stressed 12 now. 13 14 * assembler/MacroAssembler.h: 15 (JSC::MacroAssembler::branchTest16): 16 * assembler/MacroAssemblerARM64.h: 17 (JSC::MacroAssemblerARM64::load16SignedExtendTo32): 18 (JSC::MacroAssemblerARM64::branchTest32): 19 (JSC::MacroAssemblerARM64::branchTest8): 20 (JSC::MacroAssemblerARM64::branchTest16): 21 * assembler/MacroAssemblerARMv7.h: 22 (JSC::MacroAssemblerARMv7::branchTest16): 23 (JSC::MacroAssemblerARMv7::test32): 24 (JSC::MacroAssemblerARMv7::test8): 25 * assembler/MacroAssemblerHelpers.h: 26 (JSC::MacroAssemblerHelpers::mask16OnCondition): 27 (JSC::MacroAssemblerHelpers::load16OnCondition): 28 * assembler/MacroAssemblerMIPS.h: 29 (JSC::MacroAssemblerMIPS::load16): 30 (JSC::MacroAssemblerMIPS::load16SignedExtendTo32): 31 (JSC::MacroAssemblerMIPS::mask16OnTest): 32 (JSC::MacroAssemblerMIPS::branchTest16): 33 * assembler/MacroAssemblerX86Common.h: 34 (JSC::MacroAssemblerX86Common::branchTest16): 35 * assembler/MacroAssemblerX86_64.h: 36 (JSC::MacroAssemblerX86_64::branchTest16): 37 * assembler/X86Assembler.h: 38 (JSC::X86Assembler::cmpw_im): 39 (JSC::X86Assembler::testw_im): 40 * assembler/testmasm.cpp: 41 (JSC::testBranchTest8): 42 (JSC::testBranchTest16): 43 1 44 2021-11-18 David Kilzer <ddkilzer@apple.com> 2 45 -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r284330 r286020 879 879 { 880 880 return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask); 881 } 882 883 using MacroAssemblerBase::branchTest16; 884 Jump branchTest16(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) 885 { 886 return MacroAssemblerBase::branchTest16(cond, Address(address.base, address.offset), mask); 881 887 } 882 888 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r284330 r286020 1806 1806 } 1807 1807 1808 void load16SignedExtendTo32(const void* address, RegisterID dest) 1809 { 1810 moveToCachedReg(TrustedImmPtr(address), cachedMemoryTempRegister()); 1811 m_assembler.ldrsh<32>(dest, memoryTempRegister, ARM64Registers::zr); 1812 if (dest == memoryTempRegister) 1813 cachedMemoryTempRegister().invalidate(); 1814 } 1815 1808 1816 void zeroExtend16To32(RegisterID src, RegisterID dest) 1809 1817 { … … 3411 3419 } 3412 3420 3421 ASSERT(reg != dataTempRegister); 3413 3422 move(mask, getCachedDataTempRegisterIDAndInvalidate()); 3414 3423 m_assembler.tst<32>(reg, dataTempRegister); … … 3515 3524 { 3516 3525 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 3517 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCached DataTempRegisterIDAndInvalidate());3518 return branchTest32(cond, dataTempRegister, mask8);3526 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedMemoryTempRegisterIDAndInvalidate()); 3527 return branchTest32(cond, memoryTempRegister, mask8); 3519 3528 } 3520 3529 … … 3522 3531 { 3523 3532 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 3524 MacroAssemblerHelpers::load8OnCondition(*this, cond, address.m_ptr, getCached DataTempRegisterIDAndInvalidate());3525 return branchTest32(cond, dataTempRegister, mask8);3533 MacroAssemblerHelpers::load8OnCondition(*this, cond, address.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate()); 3534 return branchTest32(cond, memoryTempRegister, mask8); 3526 3535 } 3527 3536 … … 3529 3538 { 3530 3539 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 3531 move(TrustedImmPtr(reinterpret_cast<void*>(address.offset)), getCached DataTempRegisterIDAndInvalidate());3540 move(TrustedImmPtr(reinterpret_cast<void*>(address.offset)), getCachedMemoryTempRegisterIDAndInvalidate()); 3532 3541 3533 3542 if (MacroAssemblerHelpers::isUnsigned<MacroAssemblerARM64>(cond)) 3534 m_assembler.ldrb( dataTempRegister, address.base, dataTempRegister);3543 m_assembler.ldrb(memoryTempRegister, address.base, memoryTempRegister); 3535 3544 else 3536 m_assembler.ldrsb<32>( dataTempRegister, address.base, dataTempRegister);3537 3538 return branchTest32(cond, dataTempRegister, mask8);3545 m_assembler.ldrsb<32>(memoryTempRegister, address.base, memoryTempRegister); 3546 3547 return branchTest32(cond, memoryTempRegister, mask8); 3539 3548 } 3540 3549 … … 3542 3551 { 3543 3552 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 3544 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedDataTempRegisterIDAndInvalidate()); 3545 return branchTest32(cond, dataTempRegister, mask8); 3553 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedMemoryTempRegisterIDAndInvalidate()); 3554 return branchTest32(cond, memoryTempRegister, mask8); 3555 } 3556 3557 Jump branchTest16(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 3558 { 3559 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 3560 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, getCachedMemoryTempRegisterIDAndInvalidate()); 3561 return branchTest32(cond, memoryTempRegister, mask16); 3562 } 3563 3564 Jump branchTest16(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 3565 { 3566 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 3567 MacroAssemblerHelpers::load16OnCondition(*this, cond, address.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate()); 3568 return branchTest32(cond, memoryTempRegister, mask16); 3569 } 3570 3571 Jump branchTest16(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) 3572 { 3573 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 3574 move(TrustedImmPtr(reinterpret_cast<void*>(address.offset)), getCachedMemoryTempRegisterIDAndInvalidate()); 3575 3576 if (MacroAssemblerHelpers::isUnsigned<MacroAssemblerARM64>(cond)) 3577 m_assembler.ldrh(memoryTempRegister, address.base, memoryTempRegister); 3578 else 3579 m_assembler.ldrsh<32>(memoryTempRegister, address.base, memoryTempRegister); 3580 3581 return branchTest32(cond, memoryTempRegister, mask16); 3582 } 3583 3584 Jump branchTest16(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 3585 { 3586 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 3587 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, getCachedMemoryTempRegisterIDAndInvalidate()); 3588 return branchTest32(cond, memoryTempRegister, mask16); 3546 3589 } 3547 3590 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r284103 r286020 1773 1773 Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 1774 1774 { 1775 // use addressTempRegister incase the branchTest 8we call uses dataTempRegister. :-/1775 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1776 1776 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1777 1777 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); … … 1781 1781 Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 1782 1782 { 1783 // use addressTempRegister incase the branchTest 8we call uses dataTempRegister. :-/1783 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1784 1784 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1785 1785 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); … … 1789 1789 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 1790 1790 { 1791 // use addressTempRegister incase the branchTest 8we call uses dataTempRegister. :-/1791 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1792 1792 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1793 1793 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1794 1794 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister); 1795 1795 return branchTest32(cond, addressTempRegister, mask8); 1796 } 1797 1798 Jump branchTest16(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 1799 { 1800 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1801 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 1802 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, addressTempRegister); 1803 return branchTest32(cond, addressTempRegister, mask16); 1804 } 1805 1806 Jump branchTest16(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 1807 { 1808 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1809 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 1810 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, addressTempRegister); 1811 return branchTest32(cond, addressTempRegister, mask16); 1812 } 1813 1814 Jump branchTest16(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 1815 { 1816 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1817 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 1818 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1819 MacroAssemblerHelpers::load16OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister); 1820 return branchTest32(cond, addressTempRegister, mask16); 1796 1821 } 1797 1822 … … 2042 2067 void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) 2043 2068 { 2044 load32(address, dataTempRegister);2045 test32( dataTempRegister, mask);2069 load32(address, addressTempRegister); 2070 test32(addressTempRegister, mask); 2046 2071 m_assembler.it(armV7Condition(cond), false); 2047 2072 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); … … 2052 2077 { 2053 2078 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2054 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);2055 test32( dataTempRegister, mask8);2079 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); 2080 test32(addressTempRegister, mask8); 2056 2081 m_assembler.it(armV7Condition(cond), false); 2057 2082 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerHelpers.h
r280508 r286020 127 127 } 128 128 129 template<typename MacroAssemblerType> 130 inline typename MacroAssemblerType::TrustedImm32 mask16OnCondition(MacroAssemblerType&, typename MacroAssemblerType::RelationalCondition cond, typename MacroAssemblerType::TrustedImm32 value) 131 { 132 if (isUnsigned<MacroAssemblerType>(cond)) 133 return typename MacroAssemblerType::TrustedImm32(static_cast<uint16_t>(value.m_value)); 134 return typename MacroAssemblerType::TrustedImm32(static_cast<int16_t>(value.m_value)); 135 } 136 137 template<typename MacroAssemblerType> 138 inline typename MacroAssemblerType::TrustedImm32 mask16OnCondition(MacroAssemblerType&, typename MacroAssemblerType::ResultCondition cond, typename MacroAssemblerType::TrustedImm32 value) 139 { 140 // If condition is Zero or NonZero, upper bits are unrelated. 141 // Since branchTest32 handles -1 in an optimized manner, we keep -1 as is instead of converting it to 0xffff. 142 if (cond == MacroAssemblerType::Zero || cond == MacroAssemblerType::NonZero) { 143 if (value.m_value == -1) 144 return value; 145 } 146 if (isUnsigned<MacroAssemblerType>(cond)) 147 return typename MacroAssemblerType::TrustedImm32(static_cast<uint16_t>(value.m_value)); 148 ASSERT_WITH_MESSAGE(cond != MacroAssemblerType::Overflow, "Overflow is not used for 16bit test operations."); 149 ASSERT(isSigned<MacroAssemblerType>(cond)); 150 return typename MacroAssemblerType::TrustedImm32(static_cast<int16_t>(value.m_value)); 151 } 152 129 153 template<typename MacroAssemblerType, typename Condition, typename ...Args> 130 154 void load8OnCondition(MacroAssemblerType& jit, Condition cond, Args... args) … … 135 159 } 136 160 161 template<typename MacroAssemblerType, typename Condition, typename ...Args> 162 void load16OnCondition(MacroAssemblerType& jit, Condition cond, Args... args) 163 { 164 if (isUnsigned<MacroAssemblerType>(cond)) 165 return jit.load16(std::forward<Args>(args)...); 166 return jit.load16SignedExtendTo32(std::forward<Args>(args)...); 167 } 168 137 169 } } // namespace JSC -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r283970 r286020 1273 1273 } 1274 1274 1275 ALWAYS_INLINE void load16(AbsoluteAddress address, RegisterID dest) 1276 { 1277 load16(address.m_ptr, dest); 1278 } 1279 1280 /* Need to use zero-extened load half-word for load16. */ 1281 void load16SignedExtendTo32(Address address, RegisterID dest) 1282 { 1283 if (address.offset >= -32768 && address.offset <= 32767 1284 && !m_fixedWidth) 1285 m_assembler.lh(dest, address.base, address.offset); 1286 else { 1287 /* 1288 lui addrTemp, (offset + 0x8000) >> 16 1289 addu addrTemp, addrTemp, base 1290 lh dest, (offset & 0xffff)(addrTemp) 1291 */ 1292 m_assembler.lui(addrTempRegister, (address.offset + 0x8000) >> 16); 1293 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1294 m_assembler.lh(dest, addrTempRegister, address.offset); 1295 } 1296 } 1297 1275 1298 void load16SignedExtendTo32(BaseIndex address, RegisterID dest) 1276 1299 { … … 1293 1316 } 1294 1317 } 1318 1319 ALWAYS_INLINE void load16SignedExtendTo32(AbsoluteAddress address, RegisterID dest) 1320 { 1321 load16SignedExtendTo32(address.m_ptr, dest); 1322 } 1323 1324 void load16SignedExtendTo32(const void* address, RegisterID dest) 1325 { 1326 if (m_fixedWidth) { 1327 /* 1328 li addrTemp, address 1329 lh dest, 0(addrTemp) 1330 */ 1331 move(TrustedImmPtr(address), addrTempRegister); 1332 m_assembler.lh(dest, addrTempRegister, 0); 1333 } else { 1334 uintptr_t adr = reinterpret_cast<uintptr_t>(address); 1335 m_assembler.lui(addrTempRegister, (adr + 0x8000) >> 16); 1336 m_assembler.lh(dest, addrTempRegister, adr & 0xffff); 1337 } 1338 } 1339 1295 1340 1296 1341 void loadPair32(RegisterID src, RegisterID dest1, RegisterID dest2) … … 2042 2087 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister); 2043 2088 return branchTest32(cond, dataTempRegister, mask8); 2089 } 2090 2091 TrustedImm32 mask16OnTest(ResultCondition cond, TrustedImm32 mask) 2092 { 2093 if (mask.m_value == -1 && !m_fixedWidth) 2094 return TrustedImm32(-1); 2095 return MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 2096 } 2097 2098 Jump branchTest16(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 2099 { 2100 TrustedImm32 mask16 = mask16OnTest(cond, mask); 2101 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, dataTempRegister); 2102 return branchTest32(cond, dataTempRegister, mask16); 2103 } 2104 2105 Jump branchTest16(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 2106 { 2107 TrustedImm32 mask16 = mask16OnTest(cond, mask); 2108 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, dataTempRegister); 2109 return branchTest32(cond, dataTempRegister, mask16); 2110 } 2111 2112 Jump branchTest16(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 2113 { 2114 TrustedImm32 mask16 = mask16OnTest(cond, mask); 2115 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, dataTempRegister); 2116 return branchTest32(cond, dataTempRegister, mask16); 2044 2117 } 2045 2118 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r284330 r286020 2757 2757 else 2758 2758 m_assembler.testb_im(mask8.m_value, address.offset, address.base, address.index, address.scale); 2759 return Jump(m_assembler.jCC(x86Condition(cond))); 2760 } 2761 2762 Jump branchTest16(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 2763 { 2764 TrustedImm32 mask16(static_cast<int16_t>(mask.m_value)); 2765 if (mask16.m_value == -1) 2766 m_assembler.cmpw_im(0, address.offset, address.base); 2767 else 2768 m_assembler.testw_im(mask16.m_value, address.offset, address.base); 2769 return Jump(m_assembler.jCC(x86Condition(cond))); 2770 } 2771 2772 Jump branchTest16(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 2773 { 2774 TrustedImm32 mask16(static_cast<int16_t>(mask.m_value)); 2775 if (mask16.m_value == -1) 2776 m_assembler.cmpw_im(0, address.offset, address.base, address.index, address.scale); 2777 else 2778 m_assembler.testw_im(mask16.m_value, address.offset, address.base, address.index, address.scale); 2759 2779 return Jump(m_assembler.jCC(x86Condition(cond))); 2760 2780 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
r283970 r286020 1564 1564 return MacroAssemblerX86Common::branchTest8(cond, Address(scratchRegister()), mask8); 1565 1565 } 1566 1566 1567 using MacroAssemblerX86Common::branchTest16; 1568 Jump branchTest16(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) 1569 { 1570 TrustedImm32 mask16(static_cast<int16_t>(mask.m_value)); 1571 TrustedImmPtr addr(reinterpret_cast<void*>(address.offset)); 1572 MacroAssemblerX86Common::move(addr, scratchRegister()); 1573 return MacroAssemblerX86Common::branchTest16(cond, BaseIndex(scratchRegister(), address.base, TimesOne), mask16); 1574 } 1575 1576 Jump branchTest16(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 1577 { 1578 TrustedImm32 mask16(static_cast<int16_t>(mask.m_value)); 1579 MacroAssemblerX86Common::move(TrustedImmPtr(address.m_ptr), scratchRegister()); 1580 return MacroAssemblerX86Common::branchTest16(cond, Address(scratchRegister()), mask16); 1581 } 1582 1567 1583 void xchg64(RegisterID reg, Address address) 1568 1584 { -
trunk/Source/JavaScriptCore/assembler/X86Assembler.h
r272191 r286020 2050 2050 } 2051 2051 2052 void cmpw_im(int imm, int offset, RegisterID base) 2053 { 2054 if (CAN_SIGN_EXTEND_8_32(imm)) { 2055 m_formatter.prefix(PRE_OPERAND_SIZE); 2056 m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, base, offset); 2057 m_formatter.immediate8(imm); 2058 } else { 2059 m_formatter.prefix(PRE_OPERAND_SIZE); 2060 m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, base, offset); 2061 m_formatter.immediate16(imm); 2062 } 2063 } 2064 2052 2065 void cmpw_im(int imm, int offset, RegisterID base, RegisterID index, int scale) 2053 2066 { … … 2152 2165 m_formatter.oneByteOp(OP_TEST_EvGv, src, dst); 2153 2166 } 2154 2167 2168 void testw_im(int imm, int offset, RegisterID base) 2169 { 2170 m_formatter.prefix(PRE_OPERAND_SIZE); 2171 m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, offset); 2172 m_formatter.immediate16(imm); 2173 } 2174 2175 void testw_im(int imm, int offset, RegisterID base, RegisterID index, int scale) 2176 { 2177 m_formatter.prefix(PRE_OPERAND_SIZE); 2178 m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, index, scale, offset); 2179 m_formatter.immediate16(imm); 2180 } 2181 2155 2182 void testb_i8r(int imm, RegisterID dst) 2156 2183 { -
trunk/Source/JavaScriptCore/assembler/testmasm.cpp
r283970 r286020 325 325 jit.ret(); 326 326 }), expected); 327 } 328 329 void testBranchTest8() 330 { 331 for (auto value : int32Operands()) { 332 for (auto value2 : int32Operands()) { 333 auto test1 = compile([=] (CCallHelpers& jit) { 334 emitFunctionPrologue(jit); 335 336 auto branch = jit.branchTest8(MacroAssembler::NonZero, CCallHelpers::Address(GPRInfo::argumentGPR0, 1), CCallHelpers::TrustedImm32(value2)); 337 jit.move(CCallHelpers::TrustedImm32(0), GPRInfo::returnValueGPR); 338 auto done = jit.jump(); 339 branch.link(&jit); 340 jit.move(CCallHelpers::TrustedImm32(1), GPRInfo::returnValueGPR); 341 done.link(&jit); 342 343 emitFunctionEpilogue(jit); 344 jit.ret(); 345 }); 346 347 auto test2 = compile([=] (CCallHelpers& jit) { 348 emitFunctionPrologue(jit); 349 350 auto branch = jit.branchTest8(MacroAssembler::NonZero, CCallHelpers::BaseIndex(GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, CCallHelpers::TimesOne), CCallHelpers::TrustedImm32(value2)); 351 jit.move(CCallHelpers::TrustedImm32(0), GPRInfo::returnValueGPR); 352 auto done = jit.jump(); 353 branch.link(&jit); 354 jit.move(CCallHelpers::TrustedImm32(1), GPRInfo::returnValueGPR); 355 done.link(&jit); 356 357 emitFunctionEpilogue(jit); 358 jit.ret(); 359 }); 360 361 int result = 0; 362 if (static_cast<uint8_t>(value) & static_cast<uint8_t>(value2)) 363 result = 1; 364 365 uint8_t array[] = { 366 0, 367 static_cast<uint8_t>(value) 368 }; 369 CHECK_EQ(invoke<int>(test1, array), result); 370 CHECK_EQ(invoke<int>(test2, array, 1), result); 371 } 372 } 373 } 374 375 void testBranchTest16() 376 { 377 for (auto value : int32Operands()) { 378 for (auto value2 : int32Operands()) { 379 auto test1 = compile([=] (CCallHelpers& jit) { 380 emitFunctionPrologue(jit); 381 382 auto branch = jit.branchTest16(MacroAssembler::NonZero, CCallHelpers::Address(GPRInfo::argumentGPR0, 2), CCallHelpers::TrustedImm32(value2)); 383 jit.move(CCallHelpers::TrustedImm32(0), GPRInfo::returnValueGPR); 384 auto done = jit.jump(); 385 branch.link(&jit); 386 jit.move(CCallHelpers::TrustedImm32(1), GPRInfo::returnValueGPR); 387 done.link(&jit); 388 389 emitFunctionEpilogue(jit); 390 jit.ret(); 391 }); 392 393 auto test2 = compile([=] (CCallHelpers& jit) { 394 emitFunctionPrologue(jit); 395 396 auto branch = jit.branchTest16(MacroAssembler::NonZero, CCallHelpers::BaseIndex(GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, CCallHelpers::TimesTwo), CCallHelpers::TrustedImm32(value2)); 397 jit.move(CCallHelpers::TrustedImm32(0), GPRInfo::returnValueGPR); 398 auto done = jit.jump(); 399 branch.link(&jit); 400 jit.move(CCallHelpers::TrustedImm32(1), GPRInfo::returnValueGPR); 401 done.link(&jit); 402 403 emitFunctionEpilogue(jit); 404 jit.ret(); 405 }); 406 407 int result = 0; 408 if (static_cast<uint16_t>(value) & static_cast<uint16_t>(value2)) 409 result = 1; 410 411 uint16_t array[] = { 412 0, 413 static_cast<uint16_t>(value) 414 }; 415 CHECK_EQ(invoke<int>(test1, array), result); 416 CHECK_EQ(invoke<int>(test2, array, 1), result); 417 } 418 } 327 419 } 328 420 … … 5650 5742 RUN(testSub32ArgImm()); 5651 5743 5744 RUN(testBranchTest8()); 5745 RUN(testBranchTest16()); 5746 5652 5747 #if CPU(X86_64) 5653 5748 RUN(testBranchTestBit32RegReg());
Note:
See TracChangeset
for help on using the changeset viewer.