Changeset 290828 in webkit for trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
- Timestamp:
- Mar 4, 2022, 5:16:16 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r290647 r290828 56 56 57 57 public: 58 template<typename MacroAssemblerType, typename Condition, typename ...Args> 59 friend void JSC::MacroAssemblerHelpers::load8OnCondition(MacroAssemblerType&, Condition, Args...); 60 template<typename MacroAssemblerType, typename Condition, typename ...Args> 61 friend void JSC::MacroAssemblerHelpers::load16OnCondition(MacroAssemblerType&, Condition, Args...); 62 58 63 #define DUMMY_REGISTER_VALUE(id, name, r, cs) 0, 59 64 static constexpr unsigned numGPRs = std::initializer_list<int>({ FOR_EACH_GP_REGISTER(DUMMY_REGISTER_VALUE) }).size(); … … 188 193 void add32(AbsoluteAddress src, RegisterID dest) 189 194 { 190 load32(s rc.m_ptr, dataTempRegister);195 load32(setupArmAddress(src), dataTempRegister); 191 196 add32(dataTempRegister, dest); 192 197 } … … 254 259 { 255 260 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 256 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 257 258 m_assembler.ldr(scratch, addressTempRegister, ARMThumbImmediate::makeUInt12(0)); 261 262 load32(setupArmAddress(address), scratch); 259 263 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); 260 264 if (armImm.isValid()) … … 380 384 { 381 385 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); 386 load8(setupArmAddress(address), dataTempRegister); 382 387 if (armImm.isValid()) { 383 move(TrustedImmPtr(address.m_ptr), addressTempRegister);384 load8(Address(addressTempRegister), dataTempRegister);385 388 m_assembler.orr(dataTempRegister, dataTempRegister, armImm); 386 389 store8(dataTempRegister, Address(addressTempRegister)); 387 390 } else { 388 move(TrustedImmPtr(address.m_ptr), addressTempRegister);389 load8(Address(addressTempRegister), dataTempRegister);390 391 move(imm, addressTempRegister); 391 392 m_assembler.orr(dataTempRegister, dataTempRegister, addressTempRegister); … … 398 399 { 399 400 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); 401 load16(setupArmAddress(dest), dataTempRegister); 400 402 if (armImm.isValid()) { 401 move(TrustedImmPtr(dest.m_ptr), addressTempRegister);402 load16(Address(addressTempRegister), dataTempRegister);403 403 m_assembler.orr(dataTempRegister, dataTempRegister, armImm); 404 404 store16(dataTempRegister, Address(addressTempRegister)); 405 405 } else { 406 move(TrustedImmPtr(dest.m_ptr), addressTempRegister);407 load16(Address(addressTempRegister), dataTempRegister);408 406 move(imm, addressTempRegister); 409 407 m_assembler.orr(dataTempRegister, dataTempRegister, addressTempRegister); … … 420 418 void or32(RegisterID src, AbsoluteAddress dest) 421 419 { 422 move(TrustedImmPtr(dest.m_ptr), addressTempRegister); 423 load32(Address(addressTempRegister), dataTempRegister); 420 load32(setupArmAddress(dest), dataTempRegister); 424 421 or32(src, dataTempRegister); 425 422 store32(dataTempRegister, Address(addressTempRegister)); … … 429 426 { 430 427 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); 428 load32(setupArmAddress(address), dataTempRegister); 431 429 if (armImm.isValid()) { 432 move(TrustedImmPtr(address.m_ptr), addressTempRegister);433 load32(Address(addressTempRegister), dataTempRegister);434 430 m_assembler.orr(dataTempRegister, dataTempRegister, armImm); 435 431 store32(dataTempRegister, Address(addressTempRegister)); 436 432 } else { 437 move(TrustedImmPtr(address.m_ptr), addressTempRegister);438 load32(Address(addressTempRegister), dataTempRegister);439 433 move(imm, addressTempRegister); 440 434 m_assembler.orr(dataTempRegister, dataTempRegister, addressTempRegister); … … 601 595 void sub32(TrustedImm32 imm, AbsoluteAddress address) 602 596 { 603 load32( address.m_ptr, dataTempRegister);597 load32(setupArmAddress(address), dataTempRegister); 604 598 605 599 ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); … … 815 809 void load32(const void* address, RegisterID dest) 816 810 { 817 move(TrustedImmPtr(address), addressTempRegister); 818 m_assembler.ldr(dest, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); 819 cachedAddressTempRegister().invalidate(); 820 } 821 811 load32(setupArmAddress(AbsoluteAddress(address)), dest); 812 } 813 822 814 void abortWithReason(AbortReason reason) 823 815 { … … 862 854 void load8(const void* address, RegisterID dest) 863 855 { 864 move(TrustedImmPtr(address), dest); 865 load8(Address(dest), dest); 856 load8(setupArmAddress(AbsoluteAddress(address), dest), dest); 866 857 } 867 858 868 859 void load16(const void* address, RegisterID dest) 869 860 { 870 move(TrustedImmPtr(address), addressTempRegister); 871 m_assembler.ldrh(dest, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); 861 load16(setupArmAddress(AbsoluteAddress(address), dest), dest); 872 862 } 873 863 … … 973 963 void store32(RegisterID src, const void* address) 974 964 { 975 move(TrustedImmPtr(address), addressTempRegister); 976 m_assembler.str(src, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); 965 store32(src, setupArmAddress(AbsoluteAddress(address))); 977 966 } 978 967 … … 995 984 void store8(RegisterID src, const void *address) 996 985 { 997 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 998 move(TrustedImmPtr(address), scratch); 999 store8(src, ArmAddress(scratch, 0)); 986 store8(src, setupArmAddress(AbsoluteAddress(address))); 1000 987 } 1001 988 … … 1031 1018 void store16(RegisterID src, const void* address) 1032 1019 { 1033 move(TrustedImmPtr(address), addressTempRegister); 1034 m_assembler.strh(src, addressTempRegister, ARMThumbImmediate::makeUInt12(0)); 1020 store16(src, setupArmAddress(AbsoluteAddress(address))); 1035 1021 } 1036 1022 … … 1080 1066 void storePair32(RegisterID src1, RegisterID src2, const void* address) 1081 1067 { 1082 move(TrustedImmPtr(address), addressTempRegister); 1083 storePair32(src1, src2, addressTempRegister); 1068 ArmAddress armAddress = setupArmAddress(AbsoluteAddress(address)); 1069 ASSERT(armAddress.type == ArmAddress::HasOffset); 1070 storePair32(src1, src2, Address(armAddress.base, armAddress.u.offset)); 1084 1071 } 1085 1072 … … 1559 1546 } 1560 1547 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(valueDelta); 1561 if (armImm.isValid()) { 1548 // Only use an add/sub if it results in a shorter instruction, 1549 // otherwise we introduce a data dependency for no gain. 1550 if (armImm.isValid() && armImm.isUInt8()) { 1562 1551 if (valueDeltaSave > 0) 1563 1552 m_assembler.add(dest, dest, armImm); … … 1749 1738 void add32Impl(TrustedImm32 imm, AbsoluteAddress address, bool updateFlags = false) 1750 1739 { 1751 load32( address.m_ptr, dataTempRegister);1740 load32(setupArmAddress(address), dataTempRegister); 1752 1741 1753 1742 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); … … 1901 1890 // Use addressTempRegister instead of dataTempRegister, since branch32 uses dataTempRegister. 1902 1891 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1903 move(TrustedImmPtr(address.m_ptr), addressTempRegister);1904 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister);1892 ArmAddress armAddress = setupArmAddress(address); 1893 MacroAssemblerHelpers::load8OnCondition(*this, cond, armAddress, addressTempRegister); 1905 1894 return branch32(cond, addressTempRegister, right8); 1906 1895 } … … 1937 1926 { 1938 1927 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1939 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1940 load32(Address(addressTempRegister), addressTempRegister); 1928 load32(setupArmAddress(address), addressTempRegister); 1941 1929 return branchTest32(cond, addressTempRegister, mask); 1942 1930 } … … 1964 1952 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1965 1953 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1966 move(TrustedImmPtr(address.m_ptr), addressTempRegister);1967 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister);1954 ArmAddress armAddress = setupArmAddress(address); 1955 MacroAssemblerHelpers::load8OnCondition(*this, cond, armAddress, addressTempRegister); 1968 1956 return branchTest32(cond, addressTempRegister, mask8); 1969 1957 } … … 1991 1979 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1992 1980 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 1993 move(TrustedImmPtr(address.m_ptr), addressTempRegister);1994 MacroAssemblerHelpers::load16OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister);1981 ArmAddress armAddress = setupArmAddress(address); 1982 MacroAssemblerHelpers::load16OnCondition(*this, cond, armAddress, addressTempRegister); 1995 1983 return branchTest32(cond, addressTempRegister, mask16); 1996 1984 } … … 2021 2009 void farJump(AbsoluteAddress address, PtrTag) 2022 2010 { 2023 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 2024 load32(Address(addressTempRegister), addressTempRegister); 2011 load32(setupArmAddress(address), addressTempRegister); 2025 2012 cachedDataTempRegister().invalidate(); 2026 2013 m_assembler.bx(addressTempRegister); … … 2493 2480 } 2494 2481 2482 std::optional<int32_t> absoluteAddressWithinShortOffset(AbsoluteAddress address, CachedTempRegister &cachedRegister) 2483 { 2484 intptr_t addressAsInt = reinterpret_cast<uintptr_t>(address.m_ptr); 2485 intptr_t currentRegisterContents; 2486 if (cachedRegister.value(currentRegisterContents)) { 2487 intptr_t addressDelta = addressAsInt - currentRegisterContents; 2488 if ((addressDelta >= -0xff) && (addressDelta <= 0xfff)) 2489 return reinterpret_cast<int32_t>(addressDelta); 2490 } 2491 return { }; 2492 } 2493 2494 ArmAddress setupArmAddress(AbsoluteAddress address, RegisterID scratch = addressTempRegister) 2495 { 2496 if (auto offset = absoluteAddressWithinShortOffset(address, cachedAddressTempRegister())) 2497 return ArmAddress(addressTempRegister, *offset); 2498 if (auto offset = absoluteAddressWithinShortOffset(address, cachedDataTempRegister())) 2499 return ArmAddress(dataTempRegister, *offset); 2500 move(TrustedImmPtr(address.m_ptr), scratch); 2501 return ArmAddress(scratch); 2502 } 2503 2495 2504 RegisterID makeBaseIndexBase(BaseIndex address) 2496 2505 {
Note:
See TracChangeset
for help on using the changeset viewer.