Changeset 231554 in webkit
- Timestamp:
- May 9, 2018 7:17:01 AM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r231553 r231554 1 2018-05-09 Srdjan Lazarevic <srdjan.lazarevic@rt-rk.com> 2 3 [MIPS] Optimize generated JIT code using r2 4 https://bugs.webkit.org/show_bug.cgi?id=184584 5 6 Reviewed by Yusuke Suzuki. 7 8 EXT and MFHC1 instructions from MIPSR2 implemented and used where it is possible. 9 Also, done some code size optimizations that were discovered in meantime. 10 11 * assembler/MIPSAssembler.h: 12 (JSC::MIPSAssembler::ext): 13 (JSC::MIPSAssembler::mfhc1): 14 * assembler/MacroAssemblerMIPS.cpp: 15 * assembler/MacroAssemblerMIPS.h: 16 (JSC::MacroAssemblerMIPS::isPowerOf2): 17 (JSC::MacroAssemblerMIPS::bitPosition): 18 (JSC::MacroAssemblerMIPS::loadAddress): 19 (JSC::MacroAssemblerMIPS::getEffectiveAddress): 20 (JSC::MacroAssemblerMIPS::load8): 21 (JSC::MacroAssemblerMIPS::load8SignedExtendTo32): 22 (JSC::MacroAssemblerMIPS::load32): 23 (JSC::MacroAssemblerMIPS::load16Unaligned): 24 (JSC::MacroAssemblerMIPS::load32WithUnalignedHalfWords): 25 (JSC::MacroAssemblerMIPS::load16): 26 (JSC::MacroAssemblerMIPS::load16SignedExtendTo32): 27 (JSC::MacroAssemblerMIPS::store8): 28 (JSC::MacroAssemblerMIPS::store16): 29 (JSC::MacroAssemblerMIPS::store32): 30 (JSC::MacroAssemblerMIPS::branchTest32): 31 (JSC::MacroAssemblerMIPS::loadFloat): 32 (JSC::MacroAssemblerMIPS::loadDouble): 33 (JSC::MacroAssemblerMIPS::storeFloat): 34 (JSC::MacroAssemblerMIPS::storeDouble): 35 1 36 2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com> 2 37 -
trunk/Source/JavaScriptCore/assembler/MIPSAssembler.h
r230310 r231554 239 239 OP_SH_FD = 6, 240 240 OP_SH_FS = 11, 241 OP_SH_FT = 16 241 OP_SH_FT = 16, 242 OP_SH_MSB = 11, 243 OP_SH_LSB = 6 242 244 }; 243 245 … … 318 320 ori(dest, dest, imm); 319 321 } 322 } 323 324 void ext(RegisterID rt, RegisterID rs, int pos, int size) 325 { 326 int msb = size - 1; 327 emitInst(0x7c000000 | (rt << OP_SH_RT) | (rs << OP_SH_RS) | (pos << OP_SH_LSB) | (msb << OP_SH_MSB)); 328 } 329 330 void mfhc1(RegisterID rt, FPRegisterID fs) 331 { 332 emitInst(0x4460000 | (rt << OP_SH_RT) | (fs << OP_SH_FS)); 320 333 } 321 334 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.cpp
r225301 r231554 31 31 #include "ProbeContext.h" 32 32 #include <wtf/InlineASM.h> 33 #include <wtf/MathExtras.h> 33 34 34 35 namespace JSC { -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r231290 r231554 52 52 } 53 53 54 inline bool isPowerOf2(int32_t v) 55 { 56 return hasOneBitSet(v); 57 } 58 59 inline int bitPosition(int32_t v) 60 { 61 return getLSBSet(v); 62 } 63 54 64 static const Scale ScalePtr = TimesFour; 55 65 … … 102 112 DoubleLessThanOrUnordered, 103 113 DoubleLessThanOrEqualOrUnordered 114 }; 115 116 enum class LoadAddressMode { 117 ScaleAndAddOffsetIfOffsetIsOutOfBounds, 118 Scale 104 119 }; 105 120 … … 311 326 } 312 327 328 void loadAddress(BaseIndex address, LoadAddressMode mode) 329 { 330 if (mode == LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds) { 331 if (!address.scale) 332 m_assembler.addu(addrTempRegister, address.index, address.base); 333 else { 334 m_assembler.sll(addrTempRegister, address.index, address.scale); 335 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 336 } 337 if (address.offset < -32768 || address.offset > 32767) { 338 m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16); 339 m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister); 340 } 341 } else { 342 if (!address.scale) 343 m_assembler.addu(addrTempRegister, address.index, address.base); 344 else { 345 m_assembler.sll(addrTempRegister, address.index, address.scale); 346 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 347 } 348 } 349 } 350 313 351 void getEffectiveAddress(BaseIndex address, RegisterID dest) 314 352 { 315 m_assembler.sll(addrTempRegister, address.index, address.scale); 316 m_assembler.addu(dest, addrTempRegister, address.base); 353 if (!address.scale && !m_fixedWidth) 354 m_assembler.addu(dest, address.index, address.base); 355 else { 356 m_assembler.sll(addrTempRegister, address.index, address.scale); 357 m_assembler.addu(dest, addrTempRegister, address.base); 358 } 317 359 if (address.offset) 318 360 add32(TrustedImm32(address.offset), dest); … … 846 888 void load8(BaseIndex address, RegisterID dest) 847 889 { 848 if (address.offset >= -32768 && address.offset <= 32767 849 && !m_fixedWidth) { 850 /* 851 sll addrTemp, address.index, address.scale 852 addu addrTemp, addrTemp, address.base 853 lbu dest, address.offset(addrTemp) 854 */ 855 if (!address.scale) 856 m_assembler.addu(addrTempRegister, address.index, address.base); 857 else { 858 m_assembler.sll(addrTempRegister, address.index, address.scale); 859 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 860 } 890 if (!m_fixedWidth) { 891 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 861 892 m_assembler.lbu(dest, addrTempRegister, address.offset); 862 893 } else { … … 868 899 lbu dest, (address.offset & 0xffff)(at) 869 900 */ 870 if (!address.scale && !m_fixedWidth) 871 m_assembler.addu(addrTempRegister, address.index, address.base); 872 else { 873 m_assembler.sll(addrTempRegister, address.index, address.scale); 874 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 875 } 901 m_assembler.sll(addrTempRegister, address.index, address.scale); 902 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 876 903 m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16); 877 904 m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister); … … 920 947 void load8SignedExtendTo32(BaseIndex address, RegisterID dest) 921 948 { 922 if (address.offset >= -32768 && address.offset <= 32767 923 && !m_fixedWidth) { 924 /* 925 sll addrTemp, address.index, address.scale 926 addu addrTemp, addrTemp, address.base 927 lb dest, address.offset(addrTemp) 928 */ 929 if (!address.scale) 930 m_assembler.addu(addrTempRegister, address.index, address.base); 931 else { 932 m_assembler.sll(addrTempRegister, address.index, address.scale); 933 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 934 } 949 if (!m_fixedWidth) { 950 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 935 951 m_assembler.lb(dest, addrTempRegister, address.offset); 936 952 } else { … … 942 958 lb dest, (address.offset & 0xffff)(at) 943 959 */ 944 if (!address.scale && !m_fixedWidth) 945 m_assembler.addu(addrTempRegister, address.index, address.base); 946 else { 947 m_assembler.sll(addrTempRegister, address.index, address.scale); 948 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 949 } 960 m_assembler.sll(addrTempRegister, address.index, address.scale); 961 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 950 962 m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16); 951 963 m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister); … … 995 1007 void load32(BaseIndex address, RegisterID dest) 996 1008 { 997 if (address.offset >= -32768 && address.offset <= 32767 998 && !m_fixedWidth) { 999 /* 1000 sll addrTemp, address.index, address.scale 1001 addu addrTemp, addrTemp, address.base 1002 lw dest, address.offset(addrTemp) 1003 */ 1004 if (!address.scale) 1005 m_assembler.addu(addrTempRegister, address.index, address.base); 1006 else { 1007 m_assembler.sll(addrTempRegister, address.index, address.scale); 1008 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1009 } 1009 if (!m_fixedWidth) { 1010 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1010 1011 m_assembler.lw(dest, addrTempRegister, address.offset); 1011 1012 } else { … … 1036 1037 or dest, dest, immTemp 1037 1038 */ 1038 m_assembler.sll(addrTempRegister, address.index, address.scale); 1039 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1039 loadAddress(address, LoadAddressMode::Scale); 1040 1040 #if CPU(BIG_ENDIAN) 1041 1041 m_assembler.lbu(immTempRegister, addrTempRegister, address.offset + 1); … … 1090 1090 lwr dest, address.offset(addrTemp) 1091 1091 */ 1092 m_assembler.sll(addrTempRegister, address.index, address.scale); 1093 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1092 loadAddress(address, LoadAddressMode::Scale); 1094 1093 #if CPU(BIG_ENDIAN) 1095 1094 m_assembler.lwl(dest, addrTempRegister, address.offset); … … 1190 1189 void load16(BaseIndex address, RegisterID dest) 1191 1190 { 1192 if (address.offset >= -32768 && address.offset <= 32767 1193 && !m_fixedWidth) { 1194 /* 1195 sll addrTemp, address.index, address.scale 1196 addu addrTemp, addrTemp, address.base 1197 lhu dest, address.offset(addrTemp) 1198 */ 1199 m_assembler.sll(addrTempRegister, address.index, address.scale); 1200 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1191 if (!m_fixedWidth) { 1192 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1201 1193 m_assembler.lhu(dest, addrTempRegister, address.offset); 1202 1194 } else { … … 1218 1210 void load16SignedExtendTo32(BaseIndex address, RegisterID dest) 1219 1211 { 1220 if (address.offset >= -32768 && address.offset <= 32767 1221 && !m_fixedWidth) { 1222 /* 1223 sll addrTemp, address.index, address.scale 1224 addu addrTemp, addrTemp, address.base 1225 lh dest, address.offset(addrTemp) 1226 */ 1227 m_assembler.sll(addrTempRegister, address.index, address.scale); 1228 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1212 if (!m_fixedWidth) { 1213 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1229 1214 m_assembler.lh(dest, addrTempRegister, address.offset); 1230 1215 } else { … … 1263 1248 void store8(RegisterID src, BaseIndex address) 1264 1249 { 1265 if (address.offset >= -32768 && address.offset <= 32767 1266 && !m_fixedWidth) { 1267 /* 1268 sll addrTemp, address.index, address.scale 1269 addu addrTemp, addrTemp, address.base 1270 sb src, address.offset(addrTemp) 1271 */ 1272 if (!address.scale) 1273 m_assembler.addu(addrTempRegister, address.index, address.base); 1274 else { 1275 m_assembler.sll(addrTempRegister, address.index, address.scale); 1276 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1277 } 1250 if (!m_fixedWidth) { 1251 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1278 1252 m_assembler.sb(src, addrTempRegister, address.offset); 1279 1253 } else { … … 1285 1259 sb src, (address.offset & 0xffff)(at) 1286 1260 */ 1287 if (!address.scale && !m_fixedWidth) 1288 m_assembler.addu(addrTempRegister, address.index, address.base); 1289 else { 1290 m_assembler.sll(addrTempRegister, address.index, address.scale); 1291 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1292 } 1261 m_assembler.sll(addrTempRegister, address.index, address.scale); 1262 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1293 1263 m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16); 1294 1264 m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister); … … 1385 1355 void store16(RegisterID src, BaseIndex address) 1386 1356 { 1387 if (address.offset >= -32768 && address.offset <= 32767 1388 && !m_fixedWidth) { 1389 /* 1390 sll addrTemp, address.index, address.scale 1391 addu addrTemp, addrTemp, address.base 1392 sh src, address.offset(addrTemp) 1393 */ 1394 m_assembler.sll(addrTempRegister, address.index, address.scale); 1395 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1357 if (!m_fixedWidth) { 1358 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1396 1359 m_assembler.sh(src, addrTempRegister, address.offset); 1397 1360 } else { … … 1430 1393 void store32(RegisterID src, BaseIndex address) 1431 1394 { 1432 if (address.offset >= -32768 && address.offset <= 32767 1433 && !m_fixedWidth) { 1434 /* 1435 sll addrTemp, address.index, address.scale 1436 addu addrTemp, addrTemp, address.base 1437 sw src, address.offset(addrTemp) 1438 */ 1439 if (!address.scale) 1440 m_assembler.addu(addrTempRegister, address.index, address.base); 1441 else { 1442 m_assembler.sll(addrTempRegister, address.index, address.scale); 1443 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1444 } 1395 if (!m_fixedWidth) { 1396 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1445 1397 m_assembler.sw(src, addrTempRegister, address.offset); 1446 1398 } else { … … 1489 1441 void store32(TrustedImm32 imm, BaseIndex address) 1490 1442 { 1491 if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) { 1492 /* 1493 sll addrTemp, address.index, address.scale 1494 addu addrTemp, addrTemp, address.base 1495 sw src, address.offset(addrTemp) 1496 */ 1497 if (!address.scale) 1498 m_assembler.addu(addrTempRegister, address.index, address.base); 1499 else { 1500 m_assembler.sll(addrTempRegister, address.index, address.scale); 1501 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 1502 } 1443 if (!m_fixedWidth) { 1444 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 1503 1445 if (!imm.m_value) 1504 1446 m_assembler.sw(MIPSRegisters::zero, addrTempRegister, address.offset); … … 1519 1461 m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16); 1520 1462 m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister); 1521 if (!imm.m_value && !m_fixedWidth) 1522 m_assembler.sw(MIPSRegisters::zero, addrTempRegister, address.offset); 1523 else { 1524 move(imm, immTempRegister); 1525 m_assembler.sw(immTempRegister, addrTempRegister, address.offset); 1526 } 1463 move(imm, immTempRegister); 1464 m_assembler.sw(immTempRegister, addrTempRegister, address.offset); 1527 1465 } 1528 1466 } … … 1898 1836 } 1899 1837 } 1838 #if WTF_MIPS_ISA_REV(2) 1839 if (isPowerOf2(mask.m_value)) { 1840 uint16_t pos= bitPosition(mask.m_value); 1841 m_assembler.ext(cmpTempRegister, reg, pos, 1); 1842 switch (cond) { 1843 case Zero: 1844 return branchEqual(cmpTempRegister, MIPSRegisters::zero); 1845 case NonZero: 1846 return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); 1847 case Signed: 1848 m_assembler.slt(cmpTempRegister, cmpTempRegister, MIPSRegisters::zero); 1849 return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); 1850 default: 1851 RELEASE_ASSERT_NOT_REACHED(); 1852 } 1853 } 1854 #endif 1900 1855 if (mask.m_value >= 0 && mask.m_value <= 65535) { 1901 1856 m_assembler.andi(cmpTempRegister, reg, mask.m_value); … … 2764 2719 void loadFloat(BaseIndex address, FPRegisterID dest) 2765 2720 { 2766 if (address.offset >= -32768 && address.offset <= 32767 2767 && !m_fixedWidth) { 2768 /* 2769 sll addrTemp, address.index, address.scale 2770 addu addrTemp, addrTemp, address.base 2771 lwc1 dest, address.offset(addrTemp) 2772 */ 2773 m_assembler.sll(addrTempRegister, address.index, address.scale); 2774 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 2721 if (!m_fixedWidth) { 2722 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 2775 2723 m_assembler.lwc1(dest, addrTempRegister, address.offset); 2776 2724 } else { … … 2840 2788 { 2841 2789 #if WTF_MIPS_ISA(1) 2842 if (address.offset >= -32768 && address.offset <= 32767 2843 && !m_fixedWidth) { 2844 /* 2845 sll addrTemp, address.index, address.scale 2846 addu addrTemp, addrTemp, address.base 2847 lwc1 dest, address.offset(addrTemp) 2848 lwc1 dest+1, (address.offset+4)(addrTemp) 2849 */ 2850 m_assembler.sll(addrTempRegister, address.index, address.scale); 2851 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 2790 if (!m_fixedWidth) { 2791 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 2852 2792 m_assembler.lwc1(dest, addrTempRegister, address.offset); 2853 2793 m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, address.offset + 4); … … 2869 2809 } 2870 2810 #else 2871 if (address.offset >= -32768 && address.offset <= 32767 2872 && !m_fixedWidth) { 2873 /* 2874 sll addrTemp, address.index, address.scale 2875 addu addrTemp, addrTemp, address.base 2876 ldc1 dest, address.offset(addrTemp) 2877 */ 2878 m_assembler.sll(addrTempRegister, address.index, address.scale); 2879 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 2811 if (!m_fixedWidth) { 2812 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 2880 2813 m_assembler.ldc1(dest, addrTempRegister, address.offset); 2881 2814 } else { … … 2925 2858 void storeFloat(FPRegisterID src, BaseIndex address) 2926 2859 { 2927 if (address.offset >= -32768 && address.offset <= 32767 2928 && !m_fixedWidth) { 2929 /* 2930 sll addrTemp, address.index, address.scale 2931 addu addrTemp, addrTemp, address.base 2932 swc1 src, address.offset(addrTemp) 2933 */ 2934 m_assembler.sll(addrTempRegister, address.index, address.scale); 2935 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 2860 if (!m_fixedWidth) { 2861 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 2936 2862 m_assembler.swc1(src, addrTempRegister, address.offset); 2937 2863 } else { … … 3001 2927 { 3002 2928 #if WTF_MIPS_ISA(1) 3003 if (address.offset >= -32768 && address.offset <= 32767 3004 && !m_fixedWidth) { 3005 /* 3006 sll addrTemp, address.index, address.scale 3007 addu addrTemp, addrTemp, address.base 3008 swc1 src, address.offset(addrTemp) 3009 swc1 src+1, (address.offset + 4)(addrTemp) 3010 */ 3011 m_assembler.sll(addrTempRegister, address.index, address.scale); 3012 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 2929 if (!m_fixedWidth) { 2930 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 3013 2931 m_assembler.swc1(src, addrTempRegister, address.offset); 3014 2932 m_assembler.swc1(FPRegisterID(src + 1), addrTempRegister, address.offset + 4); … … 3030 2948 } 3031 2949 #else 3032 if (address.offset >= -32768 && address.offset <= 32767 3033 && !m_fixedWidth) { 3034 /* 3035 sll addrTemp, address.index, address.scale 3036 addu addrTemp, addrTemp, address.base 3037 sdc1 src, address.offset(addrTemp) 3038 */ 3039 m_assembler.sll(addrTempRegister, address.index, address.scale); 3040 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 2950 if (!m_fixedWidth) { 2951 loadAddress(address, LoadAddressMode::ScaleAndAddOffsetIfOffsetIsOutOfBounds); 3041 2952 m_assembler.sdc1(src, addrTempRegister, address.offset); 3042 2953 } else {
Note: See TracChangeset
for help on using the changeset viewer.