Changeset 213714 in webkit for trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
- Timestamp:
- Mar 10, 2017, 9:49:42 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r213652 r213714 172 172 } 173 173 174 void add32(BaseIndex src, RegisterID dest) 175 { 176 m_assembler.addl_mr(src.offset, src.base, src.index, src.scale, dest); 177 } 178 174 179 void add32(RegisterID src, Address dest) 175 180 { … … 252 257 } 253 258 259 void and32(RegisterID src, BaseIndex dest) 260 { 261 m_assembler.andl_rm(src, dest.offset, dest.base, dest.index, dest.scale); 262 } 263 264 void and16(RegisterID src, Address dest) 265 { 266 m_assembler.andw_rm(src, dest.offset, dest.base); 267 } 268 269 void and16(RegisterID src, BaseIndex dest) 270 { 271 m_assembler.andw_rm(src, dest.offset, dest.base, dest.index, dest.scale); 272 } 273 274 void and8(RegisterID src, Address dest) 275 { 276 m_assembler.andb_rm(src, dest.offset, dest.base); 277 } 278 279 void and8(RegisterID src, BaseIndex dest) 280 { 281 m_assembler.andb_rm(src, dest.offset, dest.base, dest.index, dest.scale); 282 } 283 254 284 void and32(Address src, RegisterID dest) 255 285 { … … 257 287 } 258 288 289 void and32(BaseIndex src, RegisterID dest) 290 { 291 m_assembler.andl_mr(src.offset, src.base, src.index, src.scale, dest); 292 } 293 259 294 void and32(TrustedImm32 imm, Address address) 260 295 { 261 296 m_assembler.andl_im(imm.m_value, address.offset, address.base); 297 } 298 299 void and32(TrustedImm32 imm, BaseIndex address) 300 { 301 m_assembler.andl_im(imm.m_value, address.offset, address.base, address.index, address.scale); 302 } 303 304 void and16(TrustedImm32 imm, Address address) 305 { 306 m_assembler.andw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base); 307 } 308 309 void and16(TrustedImm32 imm, BaseIndex address) 310 { 311 m_assembler.andw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 312 } 313 314 void and8(TrustedImm32 imm, Address address) 315 { 316 m_assembler.andb_im(static_cast<int8_t>(imm.m_value), address.offset, address.base); 317 } 318 319 void and8(TrustedImm32 imm, BaseIndex address) 320 { 321 m_assembler.andb_im(static_cast<int8_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 262 322 } 263 323 … … 457 517 } 458 518 519 void neg32(BaseIndex srcDest) 520 { 521 m_assembler.negl_m(srcDest.offset, srcDest.base, srcDest.index, srcDest.scale); 522 } 523 524 void neg16(Address srcDest) 525 { 526 m_assembler.negw_m(srcDest.offset, srcDest.base); 527 } 528 529 void neg16(BaseIndex srcDest) 530 { 531 m_assembler.negw_m(srcDest.offset, srcDest.base, srcDest.index, srcDest.scale); 532 } 533 534 void neg8(Address srcDest) 535 { 536 m_assembler.negb_m(srcDest.offset, srcDest.base); 537 } 538 539 void neg8(BaseIndex srcDest) 540 { 541 m_assembler.negb_m(srcDest.offset, srcDest.base, srcDest.index, srcDest.scale); 542 } 543 459 544 void or32(RegisterID src, RegisterID dest) 460 545 { … … 472 557 } 473 558 559 void or32(RegisterID src, BaseIndex dest) 560 { 561 m_assembler.orl_rm(src, dest.offset, dest.base, dest.index, dest.scale); 562 } 563 564 void or16(RegisterID src, Address dest) 565 { 566 m_assembler.orw_rm(src, dest.offset, dest.base); 567 } 568 569 void or16(RegisterID src, BaseIndex dest) 570 { 571 m_assembler.orw_rm(src, dest.offset, dest.base, dest.index, dest.scale); 572 } 573 574 void or8(RegisterID src, Address dest) 575 { 576 m_assembler.orb_rm(src, dest.offset, dest.base); 577 } 578 579 void or8(RegisterID src, BaseIndex dest) 580 { 581 m_assembler.orb_rm(src, dest.offset, dest.base, dest.index, dest.scale); 582 } 583 474 584 void or32(Address src, RegisterID dest) 475 585 { … … 477 587 } 478 588 589 void or32(BaseIndex src, RegisterID dest) 590 { 591 m_assembler.orl_mr(src.offset, src.base, src.index, src.scale, dest); 592 } 593 479 594 void or32(TrustedImm32 imm, Address address) 480 595 { 481 596 m_assembler.orl_im(imm.m_value, address.offset, address.base); 597 } 598 599 void or32(TrustedImm32 imm, BaseIndex address) 600 { 601 m_assembler.orl_im(imm.m_value, address.offset, address.base, address.index, address.scale); 602 } 603 604 void or16(TrustedImm32 imm, Address address) 605 { 606 m_assembler.orw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base); 607 } 608 609 void or16(TrustedImm32 imm, BaseIndex address) 610 { 611 m_assembler.orw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 612 } 613 614 void or8(TrustedImm32 imm, Address address) 615 { 616 m_assembler.orb_im(static_cast<int8_t>(imm.m_value), address.offset, address.base); 617 } 618 619 void or8(TrustedImm32 imm, BaseIndex address) 620 { 621 m_assembler.orb_im(static_cast<int8_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 482 622 } 483 623 … … 655 795 } 656 796 797 void sub16(TrustedImm32 imm, Address address) 798 { 799 m_assembler.subw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base); 800 } 801 802 void sub8(TrustedImm32 imm, Address address) 803 { 804 m_assembler.subb_im(static_cast<int8_t>(imm.m_value), address.offset, address.base); 805 } 806 807 void sub32(TrustedImm32 imm, BaseIndex address) 808 { 809 m_assembler.subl_im(imm.m_value, address.offset, address.base, address.index, address.scale); 810 } 811 812 void sub16(TrustedImm32 imm, BaseIndex address) 813 { 814 m_assembler.subw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 815 } 816 817 void sub8(TrustedImm32 imm, BaseIndex address) 818 { 819 m_assembler.subb_im(static_cast<int8_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 820 } 821 657 822 void sub32(Address src, RegisterID dest) 658 823 { … … 660 825 } 661 826 827 void sub32(BaseIndex src, RegisterID dest) 828 { 829 m_assembler.subl_mr(src.offset, src.base, src.index, src.scale, dest); 830 } 831 662 832 void sub32(RegisterID src, Address dest) 663 833 { 664 834 m_assembler.subl_rm(src, dest.offset, dest.base); 835 } 836 837 void sub16(RegisterID src, Address dest) 838 { 839 m_assembler.subw_rm(src, dest.offset, dest.base); 840 } 841 842 void sub8(RegisterID src, Address dest) 843 { 844 m_assembler.subb_rm(src, dest.offset, dest.base); 845 } 846 847 void sub32(RegisterID src, BaseIndex dest) 848 { 849 m_assembler.subl_rm(src, dest.offset, dest.base, dest.index, dest.scale); 850 } 851 852 void sub16(RegisterID src, BaseIndex dest) 853 { 854 m_assembler.subw_rm(src, dest.offset, dest.base, dest.index, dest.scale); 855 } 856 857 void sub8(RegisterID src, BaseIndex dest) 858 { 859 m_assembler.subb_rm(src, dest.offset, dest.base, dest.index, dest.scale); 665 860 } 666 861 … … 678 873 } 679 874 875 void xor32(TrustedImm32 imm, BaseIndex dest) 876 { 877 if (imm.m_value == -1) 878 m_assembler.notl_m(dest.offset, dest.base, dest.index, dest.scale); 879 else 880 m_assembler.xorl_im(imm.m_value, dest.offset, dest.base, dest.index, dest.scale); 881 } 882 883 void xor16(TrustedImm32 imm, Address dest) 884 { 885 imm.m_value = static_cast<int16_t>(imm.m_value); 886 if (imm.m_value == -1) 887 m_assembler.notw_m(dest.offset, dest.base); 888 else 889 m_assembler.xorw_im(imm.m_value, dest.offset, dest.base); 890 } 891 892 void xor16(TrustedImm32 imm, BaseIndex dest) 893 { 894 imm.m_value = static_cast<int16_t>(imm.m_value); 895 if (imm.m_value == -1) 896 m_assembler.notw_m(dest.offset, dest.base, dest.index, dest.scale); 897 else 898 m_assembler.xorw_im(imm.m_value, dest.offset, dest.base, dest.index, dest.scale); 899 } 900 901 void xor8(TrustedImm32 imm, Address dest) 902 { 903 imm.m_value = static_cast<int8_t>(imm.m_value); 904 if (imm.m_value == -1) 905 m_assembler.notb_m(dest.offset, dest.base); 906 else 907 m_assembler.xorb_im(imm.m_value, dest.offset, dest.base); 908 } 909 910 void xor8(TrustedImm32 imm, BaseIndex dest) 911 { 912 imm.m_value = static_cast<int8_t>(imm.m_value); 913 if (imm.m_value == -1) 914 m_assembler.notb_m(dest.offset, dest.base, dest.index, dest.scale); 915 else 916 m_assembler.xorb_im(imm.m_value, dest.offset, dest.base, dest.index, dest.scale); 917 } 918 680 919 void xor32(TrustedImm32 imm, RegisterID dest) 681 920 { … … 691 930 } 692 931 932 void xor32(RegisterID src, BaseIndex dest) 933 { 934 m_assembler.xorl_rm(src, dest.offset, dest.base, dest.index, dest.scale); 935 } 936 937 void xor16(RegisterID src, Address dest) 938 { 939 m_assembler.xorw_rm(src, dest.offset, dest.base); 940 } 941 942 void xor16(RegisterID src, BaseIndex dest) 943 { 944 m_assembler.xorw_rm(src, dest.offset, dest.base, dest.index, dest.scale); 945 } 946 947 void xor8(RegisterID src, Address dest) 948 { 949 m_assembler.xorb_rm(src, dest.offset, dest.base); 950 } 951 952 void xor8(RegisterID src, BaseIndex dest) 953 { 954 m_assembler.xorb_rm(src, dest.offset, dest.base, dest.index, dest.scale); 955 } 956 693 957 void xor32(Address src, RegisterID dest) 694 958 { 695 959 m_assembler.xorl_mr(src.offset, src.base, dest); 960 } 961 962 void xor32(BaseIndex src, RegisterID dest) 963 { 964 m_assembler.xorl_mr(src.offset, src.base, src.index, src.scale, dest); 696 965 } 697 966 … … 742 1011 } 743 1012 1013 void not32(BaseIndex dest) 1014 { 1015 m_assembler.notl_m(dest.offset, dest.base, dest.index, dest.scale); 1016 } 1017 1018 void not16(Address dest) 1019 { 1020 m_assembler.notw_m(dest.offset, dest.base); 1021 } 1022 1023 void not16(BaseIndex dest) 1024 { 1025 m_assembler.notw_m(dest.offset, dest.base, dest.index, dest.scale); 1026 } 1027 1028 void not8(Address dest) 1029 { 1030 m_assembler.notb_m(dest.offset, dest.base); 1031 } 1032 1033 void not8(BaseIndex dest) 1034 { 1035 m_assembler.notb_m(dest.offset, dest.base, dest.index, dest.scale); 1036 } 1037 744 1038 void sqrtDouble(FPRegisterID src, FPRegisterID dst) 745 1039 { … … 1072 1366 void store16(RegisterID src, BaseIndex address) 1073 1367 { 1074 #if CPU(X86)1075 // On 32-bit x86 we can only store from the first 4 registers;1076 // esp..edi are mapped to the 'h' registers!1077 if (src >= 4) {1078 // Pick a temporary register.1079 RegisterID temp = getUnusedRegister(address);1080 1081 // Swap to the temporary register to perform the store.1082 swap(src, temp);1083 m_assembler.movw_rm(temp, address.offset, address.base, address.index, address.scale);1084 swap(src, temp);1085 return;1086 }1087 #endif1088 1368 m_assembler.movw_rm(src, address.offset, address.base, address.index, address.scale); 1089 1369 } … … 1091 1371 void store16(RegisterID src, Address address) 1092 1372 { 1093 #if CPU(X86)1094 // On 32-bit x86 we can only store from the first 4 registers;1095 // esp..edi are mapped to the 'h' registers!1096 if (src >= 4) {1097 // Pick a temporary register.1098 RegisterID temp = getUnusedRegister(address);1099 1100 // Swap to the temporary register to perform the store.1101 swap(src, temp);1102 m_assembler.movw_rm(temp, address.offset, address.base);1103 swap(src, temp);1104 return;1105 }1106 #endif1107 1373 m_assembler.movw_rm(src, address.offset, address.base); 1108 1374 } 1109 1375 1376 void store16(TrustedImm32 imm, BaseIndex address) 1377 { 1378 m_assembler.movw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base, address.index, address.scale); 1379 } 1380 1381 void store16(TrustedImm32 imm, Address address) 1382 { 1383 m_assembler.movw_im(static_cast<int16_t>(imm.m_value), address.offset, address.base); 1384 } 1110 1385 1111 1386 // Floating-point operation: … … 2746 3021 m_assembler.orl_im(0, 0, X86Registers::esp); 2747 3022 } 2748 3023 3024 void atomicStrongCAS8(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, Address address, RegisterID result) 3025 { 3026 atomicStrongCAS(cond, expectedAndResult, result, [&] { m_assembler.cmpxchgb_rm(newValue, address.offset, address.base); }); 3027 } 3028 3029 void atomicStrongCAS8(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, BaseIndex address, RegisterID result) 3030 { 3031 atomicStrongCAS(cond, expectedAndResult, result, [&] { m_assembler.cmpxchgb_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3032 } 3033 3034 void atomicStrongCAS16(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, Address address, RegisterID result) 3035 { 3036 atomicStrongCAS(cond, expectedAndResult, result, [&] { m_assembler.cmpxchgw_rm(newValue, address.offset, address.base); }); 3037 } 3038 3039 void atomicStrongCAS16(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, BaseIndex address, RegisterID result) 3040 { 3041 atomicStrongCAS(cond, expectedAndResult, result, [&] { m_assembler.cmpxchgw_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3042 } 3043 3044 void atomicStrongCAS32(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, Address address, RegisterID result) 3045 { 3046 atomicStrongCAS(cond, expectedAndResult, result, [&] { m_assembler.cmpxchgl_rm(newValue, address.offset, address.base); }); 3047 } 3048 3049 void atomicStrongCAS32(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, BaseIndex address, RegisterID result) 3050 { 3051 atomicStrongCAS(cond, expectedAndResult, result, [&] { m_assembler.cmpxchgl_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3052 } 3053 3054 void atomicStrongCAS8(RegisterID expectedAndResult, RegisterID newValue, Address address) 3055 { 3056 atomicStrongCAS(expectedAndResult, [&] { m_assembler.cmpxchgb_rm(newValue, address.offset, address.base); }); 3057 } 3058 3059 void atomicStrongCAS8(RegisterID expectedAndResult, RegisterID newValue, BaseIndex address) 3060 { 3061 atomicStrongCAS(expectedAndResult, [&] { m_assembler.cmpxchgb_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3062 } 3063 3064 void atomicStrongCAS16(RegisterID expectedAndResult, RegisterID newValue, Address address) 3065 { 3066 atomicStrongCAS(expectedAndResult, [&] { m_assembler.cmpxchgw_rm(newValue, address.offset, address.base); }); 3067 } 3068 3069 void atomicStrongCAS16(RegisterID expectedAndResult, RegisterID newValue, BaseIndex address) 3070 { 3071 atomicStrongCAS(expectedAndResult, [&] { m_assembler.cmpxchgw_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3072 } 3073 3074 void atomicStrongCAS32(RegisterID expectedAndResult, RegisterID newValue, Address address) 3075 { 3076 atomicStrongCAS(expectedAndResult, [&] { m_assembler.cmpxchgl_rm(newValue, address.offset, address.base); }); 3077 } 3078 3079 void atomicStrongCAS32(RegisterID expectedAndResult, RegisterID newValue, BaseIndex address) 3080 { 3081 atomicStrongCAS(expectedAndResult, [&] { m_assembler.cmpxchgl_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3082 } 3083 3084 Jump branchAtomicStrongCAS8(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, Address address) 3085 { 3086 return branchAtomicStrongCAS(cond, expectedAndResult, [&] { m_assembler.cmpxchgb_rm(newValue, address.offset, address.base); }); 3087 } 3088 3089 Jump branchAtomicStrongCAS8(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, BaseIndex address) 3090 { 3091 return branchAtomicStrongCAS(cond, expectedAndResult, [&] { m_assembler.cmpxchgb_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3092 } 3093 3094 Jump branchAtomicStrongCAS16(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, Address address) 3095 { 3096 return branchAtomicStrongCAS(cond, expectedAndResult, [&] { m_assembler.cmpxchgw_rm(newValue, address.offset, address.base); }); 3097 } 3098 3099 Jump branchAtomicStrongCAS16(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, BaseIndex address) 3100 { 3101 return branchAtomicStrongCAS(cond, expectedAndResult, [&] { m_assembler.cmpxchgw_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3102 } 3103 3104 Jump branchAtomicStrongCAS32(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, Address address) 3105 { 3106 return branchAtomicStrongCAS(cond, expectedAndResult, [&] { m_assembler.cmpxchgl_rm(newValue, address.offset, address.base); }); 3107 } 3108 3109 Jump branchAtomicStrongCAS32(StatusCondition cond, RegisterID expectedAndResult, RegisterID newValue, BaseIndex address) 3110 { 3111 return branchAtomicStrongCAS(cond, expectedAndResult, [&] { m_assembler.cmpxchgl_rm(newValue, address.offset, address.base, address.index, address.scale); }); 3112 } 3113 3114 // If you use weak CAS, you cannot rely on expectedAndClobbered to have any particular value after 3115 // this completes. On x86, it will contain the result of the strong CAS. On ARM, it will still have 3116 // the expected value. 3117 void atomicWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address, RegisterID result) 3118 { 3119 atomicStrongCAS8(cond, expectedAndClobbered, newValue, address, result); 3120 } 3121 3122 void atomicWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address, RegisterID result) 3123 { 3124 atomicStrongCAS8(cond, expectedAndClobbered, newValue, address, result); 3125 } 3126 3127 void atomicWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address, RegisterID result) 3128 { 3129 atomicStrongCAS16(cond, expectedAndClobbered, newValue, address, result); 3130 } 3131 3132 void atomicWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address, RegisterID result) 3133 { 3134 atomicStrongCAS16(cond, expectedAndClobbered, newValue, address, result); 3135 } 3136 3137 void atomicWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address, RegisterID result) 3138 { 3139 atomicStrongCAS32(cond, expectedAndClobbered, newValue, address, result); 3140 } 3141 3142 void atomicWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address, RegisterID result) 3143 { 3144 atomicStrongCAS32(cond, expectedAndClobbered, newValue, address, result); 3145 } 3146 3147 Jump branchAtomicWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address) 3148 { 3149 return branchAtomicStrongCAS8(cond, expectedAndClobbered, newValue, address); 3150 } 3151 3152 Jump branchAtomicWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address) 3153 { 3154 return branchAtomicStrongCAS8(cond, expectedAndClobbered, newValue, address); 3155 } 3156 3157 Jump branchAtomicWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address) 3158 { 3159 return branchAtomicStrongCAS16(cond, expectedAndClobbered, newValue, address); 3160 } 3161 3162 Jump branchAtomicWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address) 3163 { 3164 return branchAtomicStrongCAS16(cond, expectedAndClobbered, newValue, address); 3165 } 3166 3167 Jump branchAtomicWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address) 3168 { 3169 return branchAtomicStrongCAS32(cond, expectedAndClobbered, newValue, address); 3170 } 3171 3172 Jump branchAtomicWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address) 3173 { 3174 return branchAtomicStrongCAS32(cond, expectedAndClobbered, newValue, address); 3175 } 3176 3177 void atomicRelaxedWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address, RegisterID result) 3178 { 3179 atomicStrongCAS8(cond, expectedAndClobbered, newValue, address, result); 3180 } 3181 3182 void atomicRelaxedWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address, RegisterID result) 3183 { 3184 atomicStrongCAS8(cond, expectedAndClobbered, newValue, address, result); 3185 } 3186 3187 void atomicRelaxedWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address, RegisterID result) 3188 { 3189 atomicStrongCAS16(cond, expectedAndClobbered, newValue, address, result); 3190 } 3191 3192 void atomicRelaxedWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address, RegisterID result) 3193 { 3194 atomicStrongCAS16(cond, expectedAndClobbered, newValue, address, result); 3195 } 3196 3197 void atomicRelaxedWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address, RegisterID result) 3198 { 3199 atomicStrongCAS32(cond, expectedAndClobbered, newValue, address, result); 3200 } 3201 3202 void atomicRelaxedWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address, RegisterID result) 3203 { 3204 atomicStrongCAS32(cond, expectedAndClobbered, newValue, address, result); 3205 } 3206 3207 Jump branchAtomicRelaxedWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address) 3208 { 3209 return branchAtomicStrongCAS8(cond, expectedAndClobbered, newValue, address); 3210 } 3211 3212 Jump branchAtomicRelaxedWeakCAS8(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address) 3213 { 3214 return branchAtomicStrongCAS8(cond, expectedAndClobbered, newValue, address); 3215 } 3216 3217 Jump branchAtomicRelaxedWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address) 3218 { 3219 return branchAtomicStrongCAS16(cond, expectedAndClobbered, newValue, address); 3220 } 3221 3222 Jump branchAtomicRelaxedWeakCAS16(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address) 3223 { 3224 return branchAtomicStrongCAS16(cond, expectedAndClobbered, newValue, address); 3225 } 3226 3227 Jump branchAtomicRelaxedWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, Address address) 3228 { 3229 return branchAtomicStrongCAS32(cond, expectedAndClobbered, newValue, address); 3230 } 3231 3232 Jump branchAtomicRelaxedWeakCAS32(StatusCondition cond, RegisterID expectedAndClobbered, RegisterID newValue, BaseIndex address) 3233 { 3234 return branchAtomicStrongCAS32(cond, expectedAndClobbered, newValue, address); 3235 } 3236 3237 void atomicAdd8(TrustedImm32 imm, Address address) 3238 { 3239 m_assembler.lock(); 3240 add8(imm, address); 3241 } 3242 3243 void atomicAdd8(TrustedImm32 imm, BaseIndex address) 3244 { 3245 m_assembler.lock(); 3246 add8(imm, address); 3247 } 3248 3249 void atomicAdd8(RegisterID reg, Address address) 3250 { 3251 m_assembler.lock(); 3252 add8(reg, address); 3253 } 3254 3255 void atomicAdd8(RegisterID reg, BaseIndex address) 3256 { 3257 m_assembler.lock(); 3258 add8(reg, address); 3259 } 3260 3261 void atomicAdd16(TrustedImm32 imm, Address address) 3262 { 3263 m_assembler.lock(); 3264 add16(imm, address); 3265 } 3266 3267 void atomicAdd16(TrustedImm32 imm, BaseIndex address) 3268 { 3269 m_assembler.lock(); 3270 add16(imm, address); 3271 } 3272 3273 void atomicAdd16(RegisterID reg, Address address) 3274 { 3275 m_assembler.lock(); 3276 add16(reg, address); 3277 } 3278 3279 void atomicAdd16(RegisterID reg, BaseIndex address) 3280 { 3281 m_assembler.lock(); 3282 add16(reg, address); 3283 } 3284 3285 void atomicAdd32(TrustedImm32 imm, Address address) 3286 { 3287 m_assembler.lock(); 3288 add32(imm, address); 3289 } 3290 3291 void atomicAdd32(TrustedImm32 imm, BaseIndex address) 3292 { 3293 m_assembler.lock(); 3294 add32(imm, address); 3295 } 3296 3297 void atomicAdd32(RegisterID reg, Address address) 3298 { 3299 m_assembler.lock(); 3300 add32(reg, address); 3301 } 3302 3303 void atomicAdd32(RegisterID reg, BaseIndex address) 3304 { 3305 m_assembler.lock(); 3306 add32(reg, address); 3307 } 3308 3309 void atomicSub8(TrustedImm32 imm, Address address) 3310 { 3311 m_assembler.lock(); 3312 sub8(imm, address); 3313 } 3314 3315 void atomicSub8(TrustedImm32 imm, BaseIndex address) 3316 { 3317 m_assembler.lock(); 3318 sub8(imm, address); 3319 } 3320 3321 void atomicSub8(RegisterID reg, Address address) 3322 { 3323 m_assembler.lock(); 3324 sub8(reg, address); 3325 } 3326 3327 void atomicSub8(RegisterID reg, BaseIndex address) 3328 { 3329 m_assembler.lock(); 3330 sub8(reg, address); 3331 } 3332 3333 void atomicSub16(TrustedImm32 imm, Address address) 3334 { 3335 m_assembler.lock(); 3336 sub16(imm, address); 3337 } 3338 3339 void atomicSub16(TrustedImm32 imm, BaseIndex address) 3340 { 3341 m_assembler.lock(); 3342 sub16(imm, address); 3343 } 3344 3345 void atomicSub16(RegisterID reg, Address address) 3346 { 3347 m_assembler.lock(); 3348 sub16(reg, address); 3349 } 3350 3351 void atomicSub16(RegisterID reg, BaseIndex address) 3352 { 3353 m_assembler.lock(); 3354 sub16(reg, address); 3355 } 3356 3357 void atomicSub32(TrustedImm32 imm, Address address) 3358 { 3359 m_assembler.lock(); 3360 sub32(imm, address); 3361 } 3362 3363 void atomicSub32(TrustedImm32 imm, BaseIndex address) 3364 { 3365 m_assembler.lock(); 3366 sub32(imm, address); 3367 } 3368 3369 void atomicSub32(RegisterID reg, Address address) 3370 { 3371 m_assembler.lock(); 3372 sub32(reg, address); 3373 } 3374 3375 void atomicSub32(RegisterID reg, BaseIndex address) 3376 { 3377 m_assembler.lock(); 3378 sub32(reg, address); 3379 } 3380 3381 void atomicAnd8(TrustedImm32 imm, Address address) 3382 { 3383 m_assembler.lock(); 3384 and8(imm, address); 3385 } 3386 3387 void atomicAnd8(TrustedImm32 imm, BaseIndex address) 3388 { 3389 m_assembler.lock(); 3390 and8(imm, address); 3391 } 3392 3393 void atomicAnd8(RegisterID reg, Address address) 3394 { 3395 m_assembler.lock(); 3396 and8(reg, address); 3397 } 3398 3399 void atomicAnd8(RegisterID reg, BaseIndex address) 3400 { 3401 m_assembler.lock(); 3402 and8(reg, address); 3403 } 3404 3405 void atomicAnd16(TrustedImm32 imm, Address address) 3406 { 3407 m_assembler.lock(); 3408 and16(imm, address); 3409 } 3410 3411 void atomicAnd16(TrustedImm32 imm, BaseIndex address) 3412 { 3413 m_assembler.lock(); 3414 and16(imm, address); 3415 } 3416 3417 void atomicAnd16(RegisterID reg, Address address) 3418 { 3419 m_assembler.lock(); 3420 and16(reg, address); 3421 } 3422 3423 void atomicAnd16(RegisterID reg, BaseIndex address) 3424 { 3425 m_assembler.lock(); 3426 and16(reg, address); 3427 } 3428 3429 void atomicAnd32(TrustedImm32 imm, Address address) 3430 { 3431 m_assembler.lock(); 3432 and32(imm, address); 3433 } 3434 3435 void atomicAnd32(TrustedImm32 imm, BaseIndex address) 3436 { 3437 m_assembler.lock(); 3438 and32(imm, address); 3439 } 3440 3441 void atomicAnd32(RegisterID reg, Address address) 3442 { 3443 m_assembler.lock(); 3444 and32(reg, address); 3445 } 3446 3447 void atomicAnd32(RegisterID reg, BaseIndex address) 3448 { 3449 m_assembler.lock(); 3450 and32(reg, address); 3451 } 3452 3453 void atomicOr8(TrustedImm32 imm, Address address) 3454 { 3455 m_assembler.lock(); 3456 or8(imm, address); 3457 } 3458 3459 void atomicOr8(TrustedImm32 imm, BaseIndex address) 3460 { 3461 m_assembler.lock(); 3462 or8(imm, address); 3463 } 3464 3465 void atomicOr8(RegisterID reg, Address address) 3466 { 3467 m_assembler.lock(); 3468 or8(reg, address); 3469 } 3470 3471 void atomicOr8(RegisterID reg, BaseIndex address) 3472 { 3473 m_assembler.lock(); 3474 or8(reg, address); 3475 } 3476 3477 void atomicOr16(TrustedImm32 imm, Address address) 3478 { 3479 m_assembler.lock(); 3480 or16(imm, address); 3481 } 3482 3483 void atomicOr16(TrustedImm32 imm, BaseIndex address) 3484 { 3485 m_assembler.lock(); 3486 or16(imm, address); 3487 } 3488 3489 void atomicOr16(RegisterID reg, Address address) 3490 { 3491 m_assembler.lock(); 3492 or16(reg, address); 3493 } 3494 3495 void atomicOr16(RegisterID reg, BaseIndex address) 3496 { 3497 m_assembler.lock(); 3498 or16(reg, address); 3499 } 3500 3501 void atomicOr32(TrustedImm32 imm, Address address) 3502 { 3503 m_assembler.lock(); 3504 or32(imm, address); 3505 } 3506 3507 void atomicOr32(TrustedImm32 imm, BaseIndex address) 3508 { 3509 m_assembler.lock(); 3510 or32(imm, address); 3511 } 3512 3513 void atomicOr32(RegisterID reg, Address address) 3514 { 3515 m_assembler.lock(); 3516 or32(reg, address); 3517 } 3518 3519 void atomicOr32(RegisterID reg, BaseIndex address) 3520 { 3521 m_assembler.lock(); 3522 or32(reg, address); 3523 } 3524 3525 void atomicXor8(TrustedImm32 imm, Address address) 3526 { 3527 m_assembler.lock(); 3528 xor8(imm, address); 3529 } 3530 3531 void atomicXor8(TrustedImm32 imm, BaseIndex address) 3532 { 3533 m_assembler.lock(); 3534 xor8(imm, address); 3535 } 3536 3537 void atomicXor8(RegisterID reg, Address address) 3538 { 3539 m_assembler.lock(); 3540 xor8(reg, address); 3541 } 3542 3543 void atomicXor8(RegisterID reg, BaseIndex address) 3544 { 3545 m_assembler.lock(); 3546 xor8(reg, address); 3547 } 3548 3549 void atomicXor16(TrustedImm32 imm, Address address) 3550 { 3551 m_assembler.lock(); 3552 xor16(imm, address); 3553 } 3554 3555 void atomicXor16(TrustedImm32 imm, BaseIndex address) 3556 { 3557 m_assembler.lock(); 3558 xor16(imm, address); 3559 } 3560 3561 void atomicXor16(RegisterID reg, Address address) 3562 { 3563 m_assembler.lock(); 3564 xor16(reg, address); 3565 } 3566 3567 void atomicXor16(RegisterID reg, BaseIndex address) 3568 { 3569 m_assembler.lock(); 3570 xor16(reg, address); 3571 } 3572 3573 void atomicXor32(TrustedImm32 imm, Address address) 3574 { 3575 m_assembler.lock(); 3576 xor32(imm, address); 3577 } 3578 3579 void atomicXor32(TrustedImm32 imm, BaseIndex address) 3580 { 3581 m_assembler.lock(); 3582 xor32(imm, address); 3583 } 3584 3585 void atomicXor32(RegisterID reg, Address address) 3586 { 3587 m_assembler.lock(); 3588 xor32(reg, address); 3589 } 3590 3591 void atomicXor32(RegisterID reg, BaseIndex address) 3592 { 3593 m_assembler.lock(); 3594 xor32(reg, address); 3595 } 3596 3597 void atomicNeg8(Address address) 3598 { 3599 m_assembler.lock(); 3600 neg8(address); 3601 } 3602 3603 void atomicNeg8(BaseIndex address) 3604 { 3605 m_assembler.lock(); 3606 neg8(address); 3607 } 3608 3609 void atomicNeg16(Address address) 3610 { 3611 m_assembler.lock(); 3612 neg16(address); 3613 } 3614 3615 void atomicNeg16(BaseIndex address) 3616 { 3617 m_assembler.lock(); 3618 neg16(address); 3619 } 3620 3621 void atomicNeg32(Address address) 3622 { 3623 m_assembler.lock(); 3624 neg32(address); 3625 } 3626 3627 void atomicNeg32(BaseIndex address) 3628 { 3629 m_assembler.lock(); 3630 neg32(address); 3631 } 3632 3633 void atomicNot8(Address address) 3634 { 3635 m_assembler.lock(); 3636 not8(address); 3637 } 3638 3639 void atomicNot8(BaseIndex address) 3640 { 3641 m_assembler.lock(); 3642 not8(address); 3643 } 3644 3645 void atomicNot16(Address address) 3646 { 3647 m_assembler.lock(); 3648 not16(address); 3649 } 3650 3651 void atomicNot16(BaseIndex address) 3652 { 3653 m_assembler.lock(); 3654 not16(address); 3655 } 3656 3657 void atomicNot32(Address address) 3658 { 3659 m_assembler.lock(); 3660 not32(address); 3661 } 3662 3663 void atomicNot32(BaseIndex address) 3664 { 3665 m_assembler.lock(); 3666 not32(address); 3667 } 3668 3669 void atomicXchgAdd8(RegisterID reg, Address address) 3670 { 3671 m_assembler.lock(); 3672 m_assembler.xaddb_rm(reg, address.offset, address.base); 3673 } 3674 3675 void atomicXchgAdd8(RegisterID reg, BaseIndex address) 3676 { 3677 m_assembler.lock(); 3678 m_assembler.xaddb_rm(reg, address.offset, address.base, address.index, address.scale); 3679 } 3680 3681 void atomicXchgAdd16(RegisterID reg, Address address) 3682 { 3683 m_assembler.lock(); 3684 m_assembler.xaddw_rm(reg, address.offset, address.base); 3685 } 3686 3687 void atomicXchgAdd16(RegisterID reg, BaseIndex address) 3688 { 3689 m_assembler.lock(); 3690 m_assembler.xaddw_rm(reg, address.offset, address.base, address.index, address.scale); 3691 } 3692 3693 void atomicXchgAdd32(RegisterID reg, Address address) 3694 { 3695 m_assembler.lock(); 3696 m_assembler.xaddl_rm(reg, address.offset, address.base); 3697 } 3698 3699 void atomicXchgAdd32(RegisterID reg, BaseIndex address) 3700 { 3701 m_assembler.lock(); 3702 m_assembler.xaddl_rm(reg, address.offset, address.base, address.index, address.scale); 3703 } 3704 3705 void atomicXchg8(RegisterID reg, Address address) 3706 { 3707 m_assembler.lock(); 3708 m_assembler.xchgb_rm(reg, address.offset, address.base); 3709 } 3710 3711 void atomicXchg8(RegisterID reg, BaseIndex address) 3712 { 3713 m_assembler.lock(); 3714 m_assembler.xchgb_rm(reg, address.offset, address.base, address.index, address.scale); 3715 } 3716 3717 void atomicXchg16(RegisterID reg, Address address) 3718 { 3719 m_assembler.lock(); 3720 m_assembler.xchgw_rm(reg, address.offset, address.base); 3721 } 3722 3723 void atomicXchg16(RegisterID reg, BaseIndex address) 3724 { 3725 m_assembler.lock(); 3726 m_assembler.xchgw_rm(reg, address.offset, address.base, address.index, address.scale); 3727 } 3728 3729 void atomicXchg32(RegisterID reg, Address address) 3730 { 3731 m_assembler.lock(); 3732 m_assembler.xchgl_rm(reg, address.offset, address.base); 3733 } 3734 3735 void atomicXchg32(RegisterID reg, BaseIndex address) 3736 { 3737 m_assembler.lock(); 3738 m_assembler.xchgl_rm(reg, address.offset, address.base, address.index, address.scale); 3739 } 3740 3741 void loadAcq8(Address src, RegisterID dest) 3742 { 3743 load8(src, dest); 3744 } 3745 3746 void loadAcq8(BaseIndex src, RegisterID dest) 3747 { 3748 load8(src, dest); 3749 } 3750 3751 void loadAcq8SignedExtendTo32(Address src, RegisterID dest) 3752 { 3753 load8SignedExtendTo32(src, dest); 3754 } 3755 3756 void loadAcq8SignedExtendTo32(BaseIndex src, RegisterID dest) 3757 { 3758 load8SignedExtendTo32(src, dest); 3759 } 3760 3761 void loadAcq16(Address src, RegisterID dest) 3762 { 3763 load16(src, dest); 3764 } 3765 3766 void loadAcq16(BaseIndex src, RegisterID dest) 3767 { 3768 load16(src, dest); 3769 } 3770 3771 void loadAcq16SignedExtendTo32(Address src, RegisterID dest) 3772 { 3773 load16SignedExtendTo32(src, dest); 3774 } 3775 3776 void loadAcq16SignedExtendTo32(BaseIndex src, RegisterID dest) 3777 { 3778 load16SignedExtendTo32(src, dest); 3779 } 3780 3781 void loadAcq32(Address src, RegisterID dest) 3782 { 3783 load32(src, dest); 3784 } 3785 3786 void loadAcq32(BaseIndex src, RegisterID dest) 3787 { 3788 load32(src, dest); 3789 } 3790 3791 void storeRel8(RegisterID src, Address dest) 3792 { 3793 store8(src, dest); 3794 } 3795 3796 void storeRel8(RegisterID src, BaseIndex dest) 3797 { 3798 store8(src, dest); 3799 } 3800 3801 void storeRel8(TrustedImm32 imm, Address dest) 3802 { 3803 store8(imm, dest); 3804 } 3805 3806 void storeRel8(TrustedImm32 imm, BaseIndex dest) 3807 { 3808 store8(imm, dest); 3809 } 3810 3811 void storeRel16(RegisterID src, Address dest) 3812 { 3813 store16(src, dest); 3814 } 3815 3816 void storeRel16(RegisterID src, BaseIndex dest) 3817 { 3818 store16(src, dest); 3819 } 3820 3821 void storeRel16(TrustedImm32 imm, Address dest) 3822 { 3823 store16(imm, dest); 3824 } 3825 3826 void storeRel16(TrustedImm32 imm, BaseIndex dest) 3827 { 3828 store16(imm, dest); 3829 } 3830 3831 void storeRel32(RegisterID src, Address dest) 3832 { 3833 store32(src, dest); 3834 } 3835 3836 void storeRel32(RegisterID src, BaseIndex dest) 3837 { 3838 store32(src, dest); 3839 } 3840 3841 void storeRel32(TrustedImm32 imm, Address dest) 3842 { 3843 store32(imm, dest); 3844 } 3845 3846 void storeRel32(TrustedImm32 imm, BaseIndex dest) 3847 { 3848 store32(imm, dest); 3849 } 3850 2749 3851 // We take this to mean that it prevents motion of normal stores. So, it's a no-op on x86. 2750 3852 void storeFence() … … 2839 3941 } 2840 3942 3943 X86Assembler::Condition x86Condition(StatusCondition cond) 3944 { 3945 switch (cond) { 3946 case Success: 3947 return X86Assembler::ConditionE; 3948 case Failure: 3949 return X86Assembler::ConditionNE; 3950 } 3951 RELEASE_ASSERT_NOT_REACHED(); 3952 return X86Assembler::ConditionE; 3953 } 3954 2841 3955 void set32(X86Assembler::Condition cond, RegisterID dest) 2842 3956 { … … 2933 4047 srcIsNonZero.link(this); 2934 4048 } 4049 4050 template<typename Func> 4051 void atomicStrongCAS(StatusCondition cond, RegisterID expectedAndResult, RegisterID result, const Func& func) 4052 { 4053 swap(expectedAndResult, X86Registers::eax); 4054 m_assembler.lock(); 4055 func(); 4056 swap(expectedAndResult, X86Registers::eax); 4057 set32(x86Condition(cond), result); 4058 } 4059 4060 template<typename Func> 4061 void atomicStrongCAS(RegisterID expectedAndResult, const Func& func) 4062 { 4063 swap(expectedAndResult, X86Registers::eax); 4064 m_assembler.lock(); 4065 func(); 4066 swap(expectedAndResult, X86Registers::eax); 4067 } 4068 4069 template<typename Func> 4070 Jump branchAtomicStrongCAS(StatusCondition cond, RegisterID expectedAndResult, const Func& func) 4071 { 4072 swap(expectedAndResult, X86Registers::eax); 4073 m_assembler.lock(); 4074 func(); 4075 swap(expectedAndResult, X86Registers::eax); 4076 return Jump(m_assembler.jCC(x86Condition(cond))); 4077 } 2935 4078 2936 4079 private:
Note:
See TracChangeset
for help on using the changeset viewer.