Changeset 290589 in webkit for trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
- Timestamp:
- Feb 28, 2022, 1:56:27 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r287301 r290589 64 64 MacroAssemblerARMv7() 65 65 : m_makeJumpPatchable(false) 66 , m_cachedDataTempRegister(this, dataTempRegister) 67 , m_cachedAddressTempRegister(this, addressTempRegister) 66 68 { 67 69 } … … 194 196 // Avoid unpredictable instruction if the destination is the stack pointer 195 197 if (dest == ARMRegisters::sp && src != dest) { 196 add32(imm, src, addressTempRegister); 197 move(addressTempRegister, dest); 198 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 199 add32(imm, src, scratch); 200 move(scratch, dest); 198 201 return; 199 202 } … … 223 226 void add32(Address src, RegisterID dest) 224 227 { 228 // load32 will invalidate the cachedDataTempRegister() for us 225 229 load32(src, dataTempRegister); 226 230 add32(dataTempRegister, dest); … … 235 239 void getEffectiveAddress(BaseIndex address, RegisterID dest) 236 240 { 237 m_assembler.lsl(addressTempRegister, address.index, static_cast<int>(address.scale)); 238 m_assembler.add(dest, address.base, addressTempRegister); 241 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 242 m_assembler.lsl(scratch, address.index, static_cast<int>(address.scale)); 243 m_assembler.add(dest, address.base, scratch); 239 244 if (address.offset) 240 245 add32(TrustedImm32(address.offset), dest); … … 248 253 void add64(TrustedImm32 imm, AbsoluteAddress address) 249 254 { 255 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 250 256 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 251 257 252 m_assembler.ldr( dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(0));258 m_assembler.ldr(scratch, addressTempRegister, ARMThumbImmediate::makeUInt12(0)); 253 259 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); 254 260 if (armImm.isValid()) 255 m_assembler.add_S( dataTempRegister, dataTempRegister, armImm);261 m_assembler.add_S(scratch, scratch, armImm); 256 262 else { 257 263 move(imm, addressTempRegister); 258 m_assembler.add_S( dataTempRegister, dataTempRegister, addressTempRegister);264 m_assembler.add_S(scratch, scratch, addressTempRegister); 259 265 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 260 266 } 261 m_assembler.str( dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(0));262 263 m_assembler.ldr( dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(4));264 m_assembler.adc( dataTempRegister, dataTempRegister, ARMThumbImmediate::makeEncodedImm(imm.m_value >> 31));265 m_assembler.str( dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt12(4));267 m_assembler.str(scratch, addressTempRegister, ARMThumbImmediate::makeUInt12(0)); 268 269 m_assembler.ldr(scratch, addressTempRegister, ARMThumbImmediate::makeUInt12(4)); 270 m_assembler.adc(scratch, scratch, ARMThumbImmediate::makeEncodedImm(imm.m_value >> 31)); 271 m_assembler.str(scratch, addressTempRegister, ARMThumbImmediate::makeUInt12(4)); 266 272 } 267 273 … … 318 324 void lshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest) 319 325 { 326 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 320 327 // Clamp the shift to the range 0..31 321 328 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(0x1f); 322 329 ASSERT(armImm.isValid()); 323 m_assembler.ARM_and( dataTempRegister, shiftAmount, armImm);324 325 m_assembler.lsl(dest, src, dataTempRegister);330 m_assembler.ARM_and(scratch, shiftAmount, armImm); 331 332 m_assembler.lsl(dest, src, scratch); 326 333 } 327 334 … … 343 350 void mul32(RegisterID src, RegisterID dest) 344 351 { 345 m_assembler.smull(dest, dataTempRegister, dest, src); 352 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 353 m_assembler.smull(dest, scratch, dest, src); 346 354 } 347 355 348 356 void mul32(RegisterID left, RegisterID right, RegisterID dest) 349 357 { 350 m_assembler.smull(dest, dataTempRegister, left, right); 358 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 359 m_assembler.smull(dest, scratch, left, right); 351 360 } 352 361 … … 354 363 { 355 364 move(imm, dataTempRegister); 365 cachedDataTempRegister().invalidate(); 356 366 m_assembler.smull(dest, dataTempRegister, src, dataTempRegister); 357 367 } … … 478 488 void rshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest) 479 489 { 490 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 480 491 // Clamp the shift to the range 0..31 481 492 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(0x1f); 482 493 ASSERT(armImm.isValid()); 483 m_assembler.ARM_and( dataTempRegister, shiftAmount, armImm);484 485 m_assembler.asr(dest, src, dataTempRegister);494 m_assembler.ARM_and(scratch, shiftAmount, armImm); 495 496 m_assembler.asr(dest, src, scratch); 486 497 } 487 498 … … 506 517 void urshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest) 507 518 { 519 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 508 520 // Clamp the shift to the range 0..31 509 521 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(0x1f); 510 522 ASSERT(armImm.isValid()); 511 m_assembler.ARM_and( dataTempRegister, shiftAmount, armImm);523 m_assembler.ARM_and(scratch, shiftAmount, armImm); 512 524 513 m_assembler.lsr(dest, src, dataTempRegister);525 m_assembler.lsr(dest, src, scratch); 514 526 } 515 527 … … 659 671 void load32(ArmAddress address, RegisterID dest) 660 672 { 673 if (dest == addressTempRegister) 674 cachedAddressTempRegister().invalidate(); 675 else if (dest == dataTempRegister) 676 cachedDataTempRegister().invalidate(); 677 661 678 if (address.type == ArmAddress::HasIndex) 662 679 m_assembler.ldr(dest, address.base, address.u.index, address.u.scale); … … 673 690 void load16(ArmAddress address, RegisterID dest) 674 691 { 692 if (dest == addressTempRegister) 693 cachedAddressTempRegister().invalidate(); 694 else if (dest == dataTempRegister) 695 cachedDataTempRegister().invalidate(); 696 675 697 if (address.type == ArmAddress::HasIndex) 676 698 m_assembler.ldrh(dest, address.base, address.u.index, address.u.scale); … … 688 710 { 689 711 ASSERT(address.type == ArmAddress::HasIndex); 712 if (dest == addressTempRegister) 713 cachedAddressTempRegister().invalidate(); 714 else if (dest == dataTempRegister) 715 cachedDataTempRegister().invalidate(); 716 690 717 m_assembler.ldrsh(dest, address.base, address.u.index, address.u.scale); 691 718 } … … 693 720 void load8(ArmAddress address, RegisterID dest) 694 721 { 722 if (dest == addressTempRegister) 723 cachedAddressTempRegister().invalidate(); 724 else if (dest == dataTempRegister) 725 cachedDataTempRegister().invalidate(); 726 695 727 if (address.type == ArmAddress::HasIndex) 696 728 m_assembler.ldrb(dest, address.base, address.u.index, address.u.scale); … … 708 740 { 709 741 ASSERT(address.type == ArmAddress::HasIndex); 742 if (dest == addressTempRegister) 743 cachedAddressTempRegister().invalidate(); 744 else if (dest == dataTempRegister) 745 cachedDataTempRegister().invalidate(); 746 710 747 m_assembler.ldrsb(dest, address.base, address.u.index, address.u.scale); 711 748 } … … 780 817 move(TrustedImmPtr(address), addressTempRegister); 781 818 m_assembler.ldr(dest, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); 819 cachedAddressTempRegister().invalidate(); 782 820 } 783 821 … … 876 914 if (absOffset < 0) 877 915 absOffset = -absOffset; 878 if (!(absOffset & ~0x3fc)) 916 if (!(absOffset & ~0x3fc)) { 917 if ((dest1 == addressTempRegister) || (dest2 == addressTempRegister)) 918 cachedAddressTempRegister().invalidate(); 919 if ((dest1 == dataTempRegister) || (dest2 == dataTempRegister)) 920 cachedDataTempRegister().invalidate(); 879 921 m_assembler.ldrd(dest1, dest2, address.base, address.offset, /* index: */ true, /* wback: */ false); 880 else if (address.base == dest1) {922 } else if (address.base == dest1) { 881 923 load32(address.withOffset(4), dest2); 882 924 load32(address, dest1); … … 953 995 void store8(RegisterID src, const void *address) 954 996 { 955 move(TrustedImmPtr(address), addressTempRegister); 956 store8(src, ArmAddress(addressTempRegister, 0)); 997 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 998 move(TrustedImmPtr(address), scratch); 999 store8(src, ArmAddress(scratch, 0)); 957 1000 } 958 1001 … … 1024 1067 { 1025 1068 ASSERT(src1 != dataTempRegister && src2 != dataTempRegister); 1069 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 1026 1070 // The 'addressTempRegister' might be used when the offset is wide, so use 'dataTempRegister' 1027 1071 if (address.scale == TimesOne) 1028 m_assembler.add( dataTempRegister, address.base, address.index);1072 m_assembler.add(scratch, address.base, address.index); 1029 1073 else { 1030 1074 ShiftTypeAndAmount shift { ARMShiftType::SRType_LSL, static_cast<unsigned>(address.scale) }; 1031 m_assembler.add( dataTempRegister, address.base, address.index, shift);1032 } 1033 storePair32(src1, src2, Address( dataTempRegister, address.offset));1075 m_assembler.add(scratch, address.base, address.index, shift); 1076 } 1077 storePair32(src1, src2, Address(scratch, address.offset)); 1034 1078 } 1035 1079 … … 1084 1128 // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. 1085 1129 if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { 1086 add32(TrustedImm32(offset), base, addressTempRegister); 1087 base = addressTempRegister; 1130 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1131 add32(TrustedImm32(offset), base, scratch); 1132 base = scratch; 1088 1133 offset = 0; 1089 1134 } … … 1099 1144 // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. 1100 1145 if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { 1101 add32(TrustedImm32(offset), base, addressTempRegister); 1102 base = addressTempRegister; 1146 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1147 add32(TrustedImm32(offset), base, scratch); 1148 base = scratch; 1103 1149 offset = 0; 1104 1150 } … … 1112 1158 lshift32(TrustedImm32(address.scale), addressTempRegister); 1113 1159 add32(address.base, addressTempRegister); 1160 cachedAddressTempRegister().invalidate(); 1114 1161 loadDouble(Address(addressTempRegister, address.offset), dest); 1115 1162 } … … 1120 1167 lshift32(TrustedImm32(address.scale), addressTempRegister); 1121 1168 add32(address.base, addressTempRegister); 1169 cachedAddressTempRegister().invalidate(); 1122 1170 loadFloat(Address(addressTempRegister, address.offset), dest); 1123 1171 } … … 1153 1201 // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. 1154 1202 if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { 1155 add32(TrustedImm32(offset), base, addressTempRegister); 1156 base = addressTempRegister; 1203 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1204 add32(TrustedImm32(offset), base, scratch); 1205 base = scratch; 1157 1206 offset = 0; 1158 1207 } … … 1168 1217 // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. 1169 1218 if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { 1170 add32(TrustedImm32(offset), base, addressTempRegister); 1171 base = addressTempRegister; 1219 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1220 add32(TrustedImm32(offset), base, scratch); 1221 base = scratch; 1172 1222 offset = 0; 1173 1223 } … … 1187 1237 lshift32(TrustedImm32(address.scale), addressTempRegister); 1188 1238 add32(address.base, addressTempRegister); 1239 cachedAddressTempRegister().invalidate(); 1189 1240 storeDouble(src, Address(addressTempRegister, address.offset)); 1190 1241 } … … 1195 1246 lshift32(TrustedImm32(address.scale), addressTempRegister); 1196 1247 add32(address.base, addressTempRegister); 1248 cachedAddressTempRegister().invalidate(); 1197 1249 storeFloat(src, Address(addressTempRegister, address.offset)); 1198 1250 } … … 1364 1416 Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed) 1365 1417 { 1418 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 1366 1419 // Convert into dest. 1367 1420 m_assembler.vcvt_floatingPointToSigned(fpTempRegisterAsSingle(), src); … … 1371 1424 // clamped to 0x80000000, so 2x dest is zero in this case. In the case of 1372 1425 // overflow the result will be equal to -2. 1373 Jump underflow = branchAdd32(Zero, dest, dest, dataTempRegister);1374 Jump noOverflow = branch32(NotEqual, dataTempRegister, TrustedImm32(-2));1426 Jump underflow = branchAdd32(Zero, dest, dest, scratch); 1427 Jump noOverflow = branch32(NotEqual, scratch, TrustedImm32(-2)); 1375 1428 1376 1429 // For BranchIfTruncateSuccessful, we branch if 'noOverflow' jumps. … … 1415 1468 if (negZeroCheck) { 1416 1469 Jump valueIsNonZero = branchTest32(NonZero, dest); 1417 m_assembler.vmov(dataTempRegister, ARMRegisters::asSingleUpper(src)); 1418 failureCases.append(branch32(LessThan, dataTempRegister, TrustedImm32(0))); 1470 RegisterID scratch = getCachedDataTempRegisterIDAndInvalidate(); 1471 m_assembler.vmov(scratch, ARMRegisters::asSingleUpper(src)); 1472 failureCases.append(branch32(LessThan, scratch, TrustedImm32(0))); 1419 1473 valueIsNonZero.link(this); 1420 1474 } … … 1483 1537 m_assembler.push(1 << src1 | 1 << src2); 1484 1538 } 1485 1539 1540 ALWAYS_INLINE void long_move(TrustedImm32 imm, RegisterID dest) 1541 { 1542 uint32_t value = imm.m_value; 1543 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(value)); 1544 if (value & 0xffff0000) 1545 m_assembler.movt(dest, ARMThumbImmediate::makeUInt16(value >> 16)); 1546 } 1547 1548 bool short_move(RegisterID dest, CachedTempRegister& cachedRegister, intptr_t valueAsInt) 1549 { 1550 intptr_t currentRegisterContents; 1551 if (cachedRegister.value(currentRegisterContents)) { 1552 intptr_t valueDelta = valueAsInt - currentRegisterContents; 1553 intptr_t valueDeltaSave = valueDelta; 1554 if (valueDelta < 0) { 1555 valueDelta = -valueDelta; 1556 } else if (!valueDelta) { 1557 // If valueDelta is 0, no need to emit or update anything. 1558 return true; 1559 } 1560 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(valueDelta); 1561 if (armImm.isValid()) { 1562 if (valueDeltaSave > 0) 1563 m_assembler.add(dest, dest, armImm); 1564 else if (valueDeltaSave < 0) 1565 m_assembler.sub(dest, dest, armImm); 1566 return true; 1567 } 1568 } 1569 return false; 1570 } 1571 1486 1572 // Register move operations: 1487 1573 // … … 1493 1579 1494 1580 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(value); 1581 intptr_t valueAsInt = reinterpret_cast<intptr_t>(reinterpret_cast<void *>(value)); 1495 1582 1496 1583 if (armImm.isValid()) … … 1498 1585 else if ((armImm = ARMThumbImmediate::makeEncodedImm(~value)).isValid()) 1499 1586 m_assembler.mvn(dest, armImm); 1500 else { 1501 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(value)); 1502 if (value & 0xffff0000) 1503 m_assembler.movt(dest, ARMThumbImmediate::makeUInt16(value >> 16)); 1504 } 1587 else if (dest == addressTempRegister) { 1588 if (!short_move(dest, cachedAddressTempRegister(), valueAsInt)) 1589 long_move(imm, dest); 1590 } else if (dest == dataTempRegister) { 1591 if (!short_move(dest, cachedDataTempRegister(), valueAsInt)) 1592 long_move(imm, dest); 1593 } else { 1594 long_move(imm, dest); 1595 } 1596 1597 if (dest == addressTempRegister) 1598 cachedAddressTempRegister().setValue(valueAsInt); 1599 else if (dest == dataTempRegister) 1600 cachedDataTempRegister().setValue(valueAsInt); 1601 1505 1602 } 1506 1603 … … 1509 1606 if (src != dest) 1510 1607 m_assembler.mov(dest, src); 1608 if (dest == dataTempRegister) 1609 cachedDataTempRegister().invalidate(); 1610 else if (dest == addressTempRegister) 1611 cachedAddressTempRegister().invalidate(); 1511 1612 } 1512 1613 … … 1610 1711 if (!(left & 8) && armImm.isUInt3() && (left != addressTempRegister)) { 1611 1712 // This is common enough to warrant a special case to save 2 bytes 1612 m_assembler.add_S(addressTempRegister, left, armImm); 1713 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1714 m_assembler.add_S(scratch, left, armImm); 1613 1715 return; 1614 1716 } … … 1780 1882 { 1781 1883 // use addressTempRegister incase the branch8 we call uses dataTempRegister. :-/ 1884 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1782 1885 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1783 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);1784 return branch8(cond, addressTempRegister, right8);1886 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, scratch); 1887 return branch8(cond, scratch, right8); 1785 1888 } 1786 1889 … … 1788 1891 { 1789 1892 // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ 1893 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1790 1894 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1791 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister);1792 return branch32(cond, addressTempRegister, right8);1895 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, scratch); 1896 return branch32(cond, scratch, right8); 1793 1897 } 1794 1898 … … 1841 1945 { 1842 1946 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1947 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1843 1948 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1844 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister);1845 return branchTest32(cond, addressTempRegister, mask8);1949 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, scratch); 1950 return branchTest32(cond, scratch, mask8); 1846 1951 } 1847 1952 … … 1849 1954 { 1850 1955 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1956 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1851 1957 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1852 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister);1853 return branchTest32(cond, addressTempRegister, mask8);1958 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, scratch); 1959 return branchTest32(cond, scratch, mask8); 1854 1960 } 1855 1961 … … 1866 1972 { 1867 1973 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1974 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1868 1975 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 1869 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, addressTempRegister);1870 return branchTest32(cond, addressTempRegister, mask16);1976 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, scratch); 1977 return branchTest32(cond, scratch, mask16); 1871 1978 } 1872 1979 … … 1874 1981 { 1875 1982 // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ 1983 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 1876 1984 TrustedImm32 mask16 = MacroAssemblerHelpers::mask16OnCondition(*this, cond, mask); 1877 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, addressTempRegister);1878 return branchTest32(cond, addressTempRegister, mask16);1985 MacroAssemblerHelpers::load16OnCondition(*this, cond, address, scratch); 1986 return branchTest32(cond, scratch, mask16); 1879 1987 } 1880 1988 … … 1890 1998 void farJump(RegisterID target, PtrTag) 1891 1999 { 2000 cachedDataTempRegister().invalidate(); 2001 cachedAddressTempRegister().invalidate(); 1892 2002 m_assembler.bx(target); 1893 2003 } … … 1896 2006 { 1897 2007 move(target, addressTempRegister); 2008 cachedDataTempRegister().invalidate(); 2009 cachedAddressTempRegister().invalidate(); 1898 2010 m_assembler.bx(addressTempRegister); 1899 2011 } … … 1903 2015 { 1904 2016 load32(address, addressTempRegister); 2017 cachedDataTempRegister().invalidate(); // addressTempRegister already invalidated by the load 1905 2018 m_assembler.bx(addressTempRegister); 1906 2019 } … … 1910 2023 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1911 2024 load32(Address(addressTempRegister), addressTempRegister); 2025 cachedDataTempRegister().invalidate(); 1912 2026 m_assembler.bx(addressTempRegister); 1913 2027 } … … 1978 2092 { 1979 2093 m_assembler.smull(dest, dataTempRegister, src1, src2); 1980 2094 // The invalidation of cachedDataTempRegister is handled by the branch. 1981 2095 if (cond == Overflow) { 1982 m_assembler.asr(addressTempRegister, dest, 31); 1983 return branch32(NotEqual, addressTempRegister, dataTempRegister); 2096 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 2097 m_assembler.asr(scratch, dest, 31); 2098 return branch32(NotEqual, scratch, dataTempRegister); 1984 2099 } 1985 2100 … … 2064 2179 { 2065 2180 moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); 2181 invalidateAllTempRegisters(); 2066 2182 return Call(m_assembler.blx(dataTempRegister), Call::LinkableNear); 2067 2183 } … … 2070 2186 { 2071 2187 moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); 2188 invalidateAllTempRegisters(); 2072 2189 return Call(m_assembler.bx(dataTempRegister), Call::LinkableNearTail); 2073 2190 } … … 2076 2193 { 2077 2194 moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); 2195 invalidateAllTempRegisters(); 2078 2196 return Call(m_assembler.blx(dataTempRegister), Call::Linkable); 2079 2197 } … … 2081 2199 ALWAYS_INLINE Call call(RegisterID target, PtrTag) 2082 2200 { 2201 invalidateAllTempRegisters(); 2083 2202 return Call(m_assembler.blx(target), Call::None); 2084 2203 } … … 2087 2206 { 2088 2207 load32(address, addressTempRegister); 2208 cachedDataTempRegister().invalidate(); 2089 2209 return Call(m_assembler.blx(addressTempRegister), Call::None); 2090 2210 } … … 2116 2236 { 2117 2237 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 2118 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 2119 compare32(cond, addressTempRegister, right8, dest); 2238 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 2239 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, scratch); 2240 compare32(cond, scratch, right8, dest); 2120 2241 } 2121 2242 … … 2144 2265 { 2145 2266 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2146 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); 2147 test32(addressTempRegister, mask8); 2267 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 2268 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, scratch); 2269 test32(scratch, mask8); 2148 2270 m_assembler.it(armV7Condition(cond), false); 2149 2271 m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(1)); … … 2328 2450 m_assembler.label(); // Force nop-padding if we're in the middle of a watchpoint. 2329 2451 moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); 2452 cachedDataTempRegister().invalidate(); 2330 2453 return Jump(m_assembler.bx(dataTempRegister), m_makeJumpPatchable ? ARMv7Assembler::JumpNoConditionFixedSize : ARMv7Assembler::JumpNoCondition); 2331 2454 } … … 2336 2459 m_assembler.it(cond, true, true); 2337 2460 moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); 2461 cachedDataTempRegister().invalidate(); 2338 2462 return Jump(m_assembler.bx(dataTempRegister), m_makeJumpPatchable ? ARMv7Assembler::JumpConditionFixedSize : ARMv7Assembler::JumpCondition, cond); 2339 2463 } … … 2346 2470 if (address.offset) { 2347 2471 ARMThumbImmediate imm = ARMThumbImmediate::makeUInt12OrEncodedImm(address.offset); 2348 if (imm.isValid()) 2349 m_assembler.add(addressTempRegister, address.base, imm); 2350 else { 2472 if (imm.isValid()) { 2473 RegisterID scratch = getCachedAddressTempRegisterIDAndInvalidate(); 2474 m_assembler.add(scratch, address.base, imm); 2475 } else { 2351 2476 move(TrustedImm32(address.offset), addressTempRegister); 2477 cachedAddressTempRegister().invalidate(); 2352 2478 m_assembler.add(addressTempRegister, addressTempRegister, address.base); 2353 2479 } … … 2380 2506 } 2381 2507 2508 cachedAddressTempRegister().invalidate(); 2382 2509 return addressTempRegister; 2383 2510 } … … 2386 2513 { 2387 2514 uint32_t value = imm.m_value; 2515 intptr_t valueAsInt = reinterpret_cast<intptr_t>(reinterpret_cast<void *>(value)); 2516 if (dst == dataTempRegister) 2517 cachedDataTempRegister().setValue(valueAsInt); 2518 else if (dst == addressTempRegister) 2519 cachedAddressTempRegister().setValue(valueAsInt); 2388 2520 m_assembler.movT3(dst, ARMThumbImmediate::makeUInt16(value & 0xffff)); 2389 2521 m_assembler.movt(dst, ARMThumbImmediate::makeUInt16(value >> 16)); … … 2405 2537 } 2406 2538 2539 ALWAYS_INLINE CachedTempRegister& cachedDataTempRegister() 2540 { 2541 return m_cachedDataTempRegister; 2542 } 2543 2544 ALWAYS_INLINE CachedTempRegister& cachedAddressTempRegister() 2545 { 2546 RELEASE_ASSERT(m_allowScratchRegister); 2547 return m_cachedAddressTempRegister; 2548 } 2549 2550 ALWAYS_INLINE RegisterID getCachedDataTempRegisterIDAndInvalidate() 2551 { 2552 return cachedDataTempRegister().registerIDInvalidate(); 2553 } 2554 2555 ALWAYS_INLINE RegisterID getCachedAddressTempRegisterIDAndInvalidate() 2556 { 2557 return cachedAddressTempRegister().registerIDInvalidate(); 2558 } 2407 2559 private: 2408 2560 friend class LinkBuffer; … … 2418 2570 2419 2571 bool m_makeJumpPatchable; 2572 CachedTempRegister m_cachedDataTempRegister; 2573 CachedTempRegister m_cachedAddressTempRegister; 2420 2574 }; 2421 2575
Note:
See TracChangeset
for help on using the changeset viewer.