Changeset 103643 in vbox
- Timestamp:
- Mar 2, 2024 1:38:31 AM (12 months ago)
- svn:sync-xref-src-repo-rev:
- 162003
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h
r103640 r103643 61 61 * memory/register as the destination. 62 62 */ 63 #define IEMOP_BODY_BINARY_rm_r8_RW(a_fnNormalU8, a_fnLockedU8 ) \63 #define IEMOP_BODY_BINARY_rm_r8_RW(a_fnNormalU8, a_fnLockedU8, a_EmitterBasename, a_fRegRegNativeArchs, a_fMemRegNativeArchs) \ 64 64 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ 65 65 \ … … 70 70 { \ 71 71 IEM_MC_BEGIN(3, 0, 0, 0); \ 72 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \73 IEM_MC_ARG(uint8_t, u8Src, 1); \74 IEM_MC_ARG(uint32_t *, pEFlags, 2); \75 \76 72 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 73 IEM_MC_ARG(uint8_t, u8Src, 1); \ 77 74 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 78 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 79 IEM_MC_REF_EFLAGS(pEFlags); \ 80 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 81 \ 75 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 76 IEM_MC_LOCAL(uint8_t, u8Dst); \ 77 IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 78 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 79 IEM_MC_LOCAL(uint32_t, uEFlags); \ 80 IEM_MC_FETCH_EFLAGS(uEFlags); \ 81 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \ 82 IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_RM(pVCpu, bRm), u8Dst); \ 83 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 84 } IEM_MC_NATIVE_ELSE() { \ 85 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 86 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 87 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 88 IEM_MC_REF_EFLAGS(pEFlags); \ 89 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 90 } IEM_MC_NATIVE_ENDIF(); \ 82 91 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 83 92 IEM_MC_END(); \ … … 139 148 * operands. 140 149 */ 141 #define IEMOP_BODY_BINARY_rm_r8_RO(a_fnNormalU8 ) \150 #define IEMOP_BODY_BINARY_rm_r8_RO(a_fnNormalU8, a_EmitterBasename, a_fRegRegNativeArchs, a_fMemRegNativeArchs) \ 142 151 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ 143 152 \ … … 148 157 { \ 149 158 IEM_MC_BEGIN(3, 0, 0, 0); \ 150 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \151 IEM_MC_ARG(uint8_t, u8Src, 1); \152 IEM_MC_ARG(uint32_t *, pEFlags, 2); \153 \154 159 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 160 IEM_MC_ARG(uint8_t, u8Src, 1); \ 155 161 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 156 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 157 IEM_MC_REF_EFLAGS(pEFlags); \ 158 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 159 \ 162 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 163 IEM_MC_LOCAL(uint8_t, u8Dst); \ 164 IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 165 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 166 IEM_MC_LOCAL(uint32_t, uEFlags); \ 167 IEM_MC_FETCH_EFLAGS(uEFlags); \ 168 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \ 169 IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_RM(pVCpu, bRm), u8Dst); \ 170 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 171 } IEM_MC_NATIVE_ELSE() { \ 172 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 173 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 174 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 175 IEM_MC_REF_EFLAGS(pEFlags); \ 176 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 177 } IEM_MC_NATIVE_ENDIF(); \ 160 178 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 161 179 IEM_MC_END(); \ … … 171 189 { \ 172 190 IEM_MC_BEGIN(3, 3, 0, 0); \ 173 IEM_MC_ARG(uint8_t const *, pu8Dst, 0); \174 IEM_MC_ARG(uint8_t, u8Src, 1); \175 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \176 191 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 177 IEM_MC_LOCAL(uint8_t, bUnmapInfo); \178 \179 192 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 180 193 IEMOP_HLP_DONE_DECODING(); \ 194 \ 195 IEM_MC_LOCAL(uint8_t, bUnmapInfo); \ 196 IEM_MC_ARG(uint8_t const *, pu8Dst, 0); \ 181 197 IEM_MC_MEM_MAP_U8_RO(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 198 IEM_MC_ARG(uint8_t, u8Src, 1); \ 182 199 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 200 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 183 201 IEM_MC_FETCH_EFLAGS(EFlags); \ 184 202 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ … … 191 209 else \ 192 210 { \ 211 /** @todo we should probably decode the address first. */ \ 193 212 IEMOP_HLP_DONE_DECODING(); \ 194 213 IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \ … … 201 220 * destination. 202 221 */ 203 #define IEMOP_BODY_BINARY_r8_rm(a_fnNormalU8 ) \222 #define IEMOP_BODY_BINARY_r8_rm(a_fnNormalU8, a_EmitterBasename, a_fNativeArchs) \ 204 223 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ 205 224 \ … … 211 230 IEM_MC_BEGIN(3, 0, 0, 0); \ 212 231 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 213 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 214 IEM_MC_ARG(uint8_t, u8Src, 1); \ 215 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 216 \ 232 IEM_MC_ARG(uint8_t, u8Src, 1); \ 217 233 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 218 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 219 IEM_MC_REF_EFLAGS(pEFlags); \ 220 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 221 \ 234 IEM_MC_NATIVE_IF(a_fNativeArchs) { \ 235 IEM_MC_LOCAL(uint8_t, u8Dst); \ 236 IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 237 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 238 IEM_MC_LOCAL(uint32_t, uEFlags); \ 239 IEM_MC_FETCH_EFLAGS(uEFlags); \ 240 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \ 241 IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); \ 242 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 243 } IEM_MC_NATIVE_ELSE() { \ 244 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 245 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 246 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 247 IEM_MC_REF_EFLAGS(pEFlags); \ 248 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 249 } IEM_MC_NATIVE_ENDIF(); \ 222 250 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 223 251 IEM_MC_END(); \ … … 229 257 */ \ 230 258 IEM_MC_BEGIN(3, 1, 0, 0); \ 231 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \232 IEM_MC_ARG(uint8_t, u8Src, 1); \233 IEM_MC_ARG(uint32_t *, pEFlags, 2); \234 259 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 235 \236 260 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 237 261 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 262 IEM_MC_ARG(uint8_t, u8Src, 1); \ 238 263 IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 239 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 240 IEM_MC_REF_EFLAGS(pEFlags); \ 241 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 242 \ 264 IEM_MC_NATIVE_IF(a_fNativeArchs) { \ 265 IEM_MC_LOCAL(uint8_t, u8Dst); \ 266 IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 267 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 268 IEM_MC_LOCAL(uint32_t, uEFlags); \ 269 IEM_MC_FETCH_EFLAGS(uEFlags); \ 270 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \ 271 IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); \ 272 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 273 } IEM_MC_NATIVE_ELSE() { \ 274 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 275 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 276 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 277 IEM_MC_REF_EFLAGS(pEFlags); \ 278 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \ 279 } IEM_MC_NATIVE_ENDIF(); \ 243 280 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 244 281 IEM_MC_END(); \ … … 727 764 { 728 765 IEMOP_MNEMONIC2(MR, ADD, add, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 729 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_add_u8, iemAImpl_add_u8_locked );766 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_add_u8, iemAImpl_add_u8_locked, add, 0, 0); 730 767 } 731 768 … … 757 794 { 758 795 IEMOP_MNEMONIC2(RM, ADD, add, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 759 IEMOP_BODY_BINARY_r8_rm(iemAImpl_add_u8 );796 IEMOP_BODY_BINARY_r8_rm(iemAImpl_add_u8, add, 0); 760 797 } 761 798 … … 848 885 IEMOP_MNEMONIC2(MR, OR, or, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 849 886 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 850 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked );887 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked, or, 0, 0); 851 888 } 852 889 … … 883 920 IEMOP_MNEMONIC2(RM, OR, or, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 884 921 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 885 IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8 );922 IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8, or, 0); 886 923 } 887 924 … … 1007 1044 { 1008 1045 IEMOP_MNEMONIC2(MR, ADC, adc, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 1009 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_adc_u8, iemAImpl_adc_u8_locked );1046 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_adc_u8, iemAImpl_adc_u8_locked, adc, 0, 0); 1010 1047 } 1011 1048 … … 1038 1075 { 1039 1076 IEMOP_MNEMONIC2(RM, ADC, adc, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 1040 IEMOP_BODY_BINARY_r8_rm(iemAImpl_adc_u8 );1077 IEMOP_BODY_BINARY_r8_rm(iemAImpl_adc_u8, adc, 0); 1041 1078 } 1042 1079 … … 1119 1156 { 1120 1157 IEMOP_MNEMONIC2(MR, SBB, sbb, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 1121 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sbb_u8, iemAImpl_sbb_u8_locked );1158 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sbb_u8, iemAImpl_sbb_u8_locked, sbb, 0, 0); 1122 1159 } 1123 1160 … … 1144 1181 { 1145 1182 IEMOP_MNEMONIC2(RM, SBB, sbb, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 1146 IEMOP_BODY_BINARY_r8_rm(iemAImpl_sbb_u8 );1183 IEMOP_BODY_BINARY_r8_rm(iemAImpl_sbb_u8, sbb, 0); 1147 1184 } 1148 1185 … … 1225 1262 IEMOP_MNEMONIC2(MR, AND, and, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 1226 1263 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 1227 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_and_u8, iemAImpl_and_u8_locked );1264 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_and_u8, iemAImpl_and_u8_locked, and, 0, 0); 1228 1265 } 1229 1266 … … 1252 1289 IEMOP_MNEMONIC2(RM, AND, and, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 1253 1290 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 1254 IEMOP_BODY_BINARY_r8_rm(iemAImpl_and_u8 );1291 IEMOP_BODY_BINARY_r8_rm(iemAImpl_and_u8, and, 0); 1255 1292 } 1256 1293 … … 1340 1377 { 1341 1378 IEMOP_MNEMONIC2(MR, SUB, sub, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 1342 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sub_u8, iemAImpl_sub_u8_locked );1379 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sub_u8, iemAImpl_sub_u8_locked, sub, 0, 0); 1343 1380 } 1344 1381 … … 1365 1402 { 1366 1403 IEMOP_MNEMONIC2(RM, SUB, sub, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 1367 IEMOP_BODY_BINARY_r8_rm(iemAImpl_sub_u8 );1404 IEMOP_BODY_BINARY_r8_rm(iemAImpl_sub_u8, sub, 0); 1368 1405 } 1369 1406 … … 1451 1488 IEMOP_MNEMONIC2(MR, XOR, xor, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 1452 1489 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 1453 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_xor_u8, iemAImpl_xor_u8_locked );1490 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_xor_u8, iemAImpl_xor_u8_locked, xor, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64, 0); 1454 1491 } 1455 1492 … … 1478 1515 IEMOP_MNEMONIC2(RM, XOR, xor, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 1479 1516 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 1480 IEMOP_BODY_BINARY_r8_rm(iemAImpl_xor_u8); 1517 /** @todo xor al,al optimization */ 1518 IEMOP_BODY_BINARY_r8_rm(iemAImpl_xor_u8, xor, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64); 1481 1519 } 1482 1520 … … 1651 1689 { 1652 1690 IEMOP_MNEMONIC(cmp_Eb_Gb, "cmp Eb,Gb"); 1653 IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_cmp_u8 );1691 IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_cmp_u8, cmp, 0, 0); 1654 1692 } 1655 1693 … … 1673 1711 { 1674 1712 IEMOP_MNEMONIC(cmp_Gb_Eb, "cmp Gb,Eb"); 1675 IEMOP_BODY_BINARY_r8_rm(iemAImpl_cmp_u8 );1713 IEMOP_BODY_BINARY_r8_rm(iemAImpl_cmp_u8, cmp, 0); 1676 1714 } 1677 1715 … … 5233 5271 IEMOP_MNEMONIC(test_Eb_Gb, "test Eb,Gb"); 5234 5272 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 5235 IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_test_u8 );5273 IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_test_u8, test, 0, 0); 5236 5274 } 5237 5275
Note:
See TracChangeset
for help on using the changeset viewer.