VirtualBox

Changeset 104195 in vbox for trunk/src


Ignore:
Timestamp:
Apr 5, 2024 2:45:23 PM (10 months ago)
Author:
vboxsync
Message:

VMM/IEM: Refactoring assembly helpers to not pass eflags by reference but instead by value and return the updated value (via eax/w0) - first chunk: ADD,ADC,SUB,SBB,CMP,TEST,AND,OR,XOR. bugref:10376

Location:
trunk/src/VBox/VMM
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl-arm64.S

    r104173 r104195  
    191191 */
    192192
    193 /* void iemAImpl_cmp_u8(uint8_t const *puDst, uint8_t uSrc, uint32_t *pEFlags); */
     193/* uint32_t iemAImpl_cmp_u8(uint32_t fEFlags, uint8_t const *puDst, uint8_t uSrc); */
    194194        .p2align        2
    195195        .private_extern NAME(iemAImpl_sub_u8)
     
    198198        .cfi_startproc
    199199        /* Do the subtraction. */
    200         ldrb    w8, [x0]
    201         /*and     w1, w1, #0xff - should not be necessary. */
    202         subs    w9, w8, w1                      /* w9 = w8 (*puDst) - w1 (uSrc)  */
     200        ldrb    w8, [x1]
     201        /*and     w2, w2, #0xff - should not be necessary. */
     202        subs    w9, w8, w2                      /* w9 = w8 (*puDst) - w2 (uSrc)  */
     203        strb    w9, [x1]
    203204        setf8   w9
    204         strb    w9, [x0]
    205 
    206         /* Load EFLAGS. */
    207         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
     205
     206        /* Calculate EFLAGS (passed in and returned via x0). */
    208207        and     w9, w9, #0xffff
    209         CALC_EFLAGS x10, x9, x8, x1, x11, X86_EFL_OF
     208        CALC_EFLAGS x0, x9, x8, x2, x11, X86_EFL_OF
    210209
    211210        /* The overflow flag calc done by setf16 isn't correct for subtraction, so we have to
    212211           figure it out ourselves. (See IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC for details.) */
    213         eor     w11, w8, w1                     /* input dst ^ source (simplified from ~(dst ^ (source ^ 0x8000)) ). */
     212        eor     w11, w8, w2                     /* input dst ^ source (simplified from ~(dst ^ (source ^ 0x8000)) ). */
    214213        eor     w12, w8, w9
    215214        and     w11, w12, w11
    216215        lsr     w11, w11, #7
    217         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    218 
    219         /* Done with EFLAGS. */
    220         str     w10, [x2]
    221         ret
    222         .cfi_endproc
    223 
    224 
    225 /* void iemAImpl_cmp_u16(uint16_t const *puDst, uint16_t uSrc, uint32_t *pEFlags); */
     216        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     217
     218        ret
     219        .cfi_endproc
     220
     221
     222/* uint32_t iemAImpl_cmp_u16(uint32_t fEFlags, uint16_t const *puDst, uint16_t uSrc); */
    226223        .p2align        2
    227224        .private_extern NAME(iemAImpl_sub_u16)
     
    230227        .cfi_startproc
    231228        /* Do the subtraction. */
    232         ldrh    w8, [x0]
    233         /*and     w1, w1, #0xffff - should not be necessary. */
    234         subs    w9, w8, w1                      /* w9 = w8 (*puDst) - w1 (uSrc)  */
     229        ldrh    w8, [x1]
     230        /*and     w2, w2, #0xffff - should not be necessary. */
     231        subs    w9, w8, w2                      /* w9 = w8 (*puDst) - w2 (uSrc)  */
    235232        setf16  w9
    236         strh    w9, [x0]
    237 
    238         /* Load EFLAGS. */
    239         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
     233        strh    w9, [x1]
     234
     235        /* Calculate EFLAGS (passed in and returned via x0). */
    240236        and     w9, w9, #0xffff
    241         CALC_EFLAGS x10, x9, x8, x1, x11, X86_EFL_OF
     237        CALC_EFLAGS x0, x9, x8, x2, x11, X86_EFL_OF
    242238
    243239        /* The overflow flag calc done by setf16 isn't correct for subtraction, so we have to
    244240           figure it out ourselves. (See IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC for details.) */
    245         eor     w11, w8, w1                     /* input dst ^ source (simplified from ~(dst ^ (source ^ 0x8000)) ). */
     241        eor     w11, w8, w2                     /* input dst ^ source (simplified from ~(dst ^ (source ^ 0x8000)) ). */
    246242        eor     w12, w8, w9
    247243        and     w11, w12, w11
    248244        lsr     w11, w11, #15
    249         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    250 
    251         /* Done with EFLAGS. */
    252         str     w10, [x2]
    253         ret
    254         .cfi_endproc
    255 
    256 
    257 /* void iemAImpl_cmp_u32(uint32_t const *puDst, uint32_t uSrc, uint32_t *pEFlags); */
     245        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     246
     247        ret
     248        .cfi_endproc
     249
     250
     251/* uint32_t iemAImpl_cmp_u32(uint32_t fEFlags, uint32_t const *puDst, uint32_t uSrc); */
    258252        .p2align        2
    259253        .private_extern NAME(iemAImpl_sub_u32)
     
    262256        .cfi_startproc
    263257        /* Do the subtraction. */
    264         ldr     w8, [x0]
    265         subs    w9, w8, w1                      /* w9 = w8 (*puDst) - w1 (uSrc)  */
    266         str     w9, [x0]
    267 
    268         /* Load EFLAGS. */
    269         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
     258        ldr     w8, [x1]
     259        subs    w9, w8, w2                      /* w9 = w8 (*puDst) - w2 (uSrc)  */
     260        str     w9, [x1]
     261
     262        /* Calculate EFLAGS (passed in and returned via x0). */
    270263
    271264#if 0
     
    274267        mrs     x11, NZCV                       /* w11[31] = N; w11[30] = Z; w11[29] = C; w11[29] = V */
    275268        lsr     w11, w11, #28
    276         bfi     w10, w11, #X86_EFL_OF_BIT, #1
     269        bfi     w0, w11, #X86_EFL_OF_BIT, #1
    277270        lsr     w11, w11, #1
    278271        eor     w11, w11, #1                    /* inverts the carry flag to x86 style. */
    279         bfi     w10, w11, #X86_EFL_CF_BIT, #1   /* CF(0) = C */
     272        bfi     w0, w11, #X86_EFL_CF_BIT, #1    /* CF(0) = C */
    280273        lsr     w11, w11, #1
    281         bfi     w10, w11, #X86_EFL_ZF_BIT, #2   /* SF(7),ZF(6) = NZ */
     274        bfi     w0, w11, #X86_EFL_ZF_BIT, #2    /* SF(7),ZF(6) = NZ */
    282275#elif 1 /* seems the faster one... */
    283276        cfinv
    284277        mrs     x11, NZCV                       /* w11[31] = N; w11[30] = Z; w11[29] = C; w11[29] = V */
    285278        lsr     w11, w11, #28
    286         bfi     w10, w11, #X86_EFL_OF_BIT, #1
     279        bfi     w0, w11, #X86_EFL_OF_BIT, #1
    287280        lsr     w11, w11, #1
    288         bfi     w10, w11, #X86_EFL_CF_BIT, #1   /* CF(0) = C */
     281        bfi     w0, w11, #X86_EFL_CF_BIT, #1    /* CF(0) = C */
    289282        lsr     w11, w11, #1
    290         bfi     w10, w11, #X86_EFL_ZF_BIT, #2   /* SF(7),ZF(6) = NZ */
     283        bfi     w0, w11, #X86_EFL_ZF_BIT, #2    /* SF(7),ZF(6) = NZ */
    291284#else
    292285        cset    w11, eq
    293         bfi     w10, w11, #X86_EFL_ZF_BIT, #1
     286        bfi     w0, w11, #X86_EFL_ZF_BIT, #1
    294287        cset    w11, cc
    295         bfi     w10, w11, #X86_EFL_CF_BIT, #1
     288        bfi     w0, w11, #X86_EFL_CF_BIT, #1
    296289        cset    w11, vs
    297         bfi     w10, w11, #X86_EFL_OF_BIT, #1
     290        bfi     w0, w11, #X86_EFL_OF_BIT, #1
    298291        cset    w11, mi
    299         bfi     w10, w11, #X86_EFL_SF_BIT, #1
     292        bfi     w0, w11, #X86_EFL_SF_BIT, #1
    300293#endif
    301294
     
    305298        eor     w11, w11, w11, LSR #1
    306299        eor     w11, w11, #1
    307         bfi     w10, w11, #X86_EFL_PF_BIT, #1   /* PF(2) = popcount(w9 & 0xff) & 1 ^ 1 */
     300        bfi     w0, w11, #X86_EFL_PF_BIT, #1    /* PF(2) = popcount(w9 & 0xff) & 1 ^ 1 */
    308301
    309302        /* Auxilary carry / borrow flag.  This is related to 8-bit BCD. */
    310         eor     w11, w8, w1
     303        eor     w11, w8, w2
    311304        eor     w11, w11, w9
    312305        lsr     w11, w11, #X86_EFL_AF_BIT
    313         bfi     w10, w11, #X86_EFL_AF_BIT, #1   /* AF(4) = (w8 ^ w1 ^ w9 & X86_EFL_AF) >> X86_EFL_AF_BIT */
     306        bfi     w0, w11, #X86_EFL_AF_BIT, #1    /* AF(4) = (w8 ^ w2 ^ w9 & X86_EFL_AF) >> X86_EFL_AF_BIT */
    314307#else
    315         CALC_EFLAGS x10, x9, x8, x1, x11
     308        CALC_EFLAGS x0, x9, x8, x2, x11
    316309#endif
    317310
    318         str     w10, [x2]
    319         ret
    320         .cfi_endproc
    321 
    322 
    323 /* void iemAImpl_cmp_u64(uint64_t const *puDst, uint64_t uSrc, uint32_t *pEFlags); */
     311        ret
     312        .cfi_endproc
     313
     314
     315/* uint32_t iemAImpl_cmp_u64(uint32_t fEFlags, uint64_t const *puDst, uint64_t uSrc); */
    324316        .p2align        2
    325317        .private_extern NAME(iemAImpl_sub_u64)
     
    328320        .cfi_startproc
    329321        /* Do the subtraction. */
    330         ldr     x8, [x0]
    331         subs    x9, x8, x1                      /* x9 = x8 (*puDst) - x1 (uSrc)  */
    332         str     x9, [x0]
    333 
    334         /* Load EFLAGS. */
    335         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
    336         CALC_EFLAGS x10, x9, x8, x1, x11
    337 
    338         str     w10, [x2]
     322        ldr     x8, [x1]
     323        subs    x9, x8, x2                      /* x9 = x8 (*puDst) - x2 (uSrc)  */
     324        str     x9, [x1]
     325
     326        /* Calculate EFLAGS (passed in and returned via x0). */
     327        CALC_EFLAGS x0, x9, x8, x2, x11
     328
    339329        ret
    340330        .cfi_endproc
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r104188 r104195  
    4141;;
    4242; This is handy for generating absolutly correct EFLAGS.
    43 %define IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
     43;%define IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
    4444
    4545
     
    291291;
    292292; @remarks      Clobbers T0, stack. Changes EFLAGS.
     293; @param        1       The parameter (A0..A3) holding the eflags value.
     294; @param        2       The set of modified flags.
     295; @param        3       The set of undefined flags.
     296; @param        4       The flags that must be loaded.
     297;
     298%macro IEM_MAYBE_LOAD_FLAGS 4
     299 %ifdef IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
     300        pushf                                                   ; store current flags
     301        mov     T0_32, %1                                       ; load the guest flags
     302        and     dword [xSP], ~(%2 | %3 | X86_EFL_STATUS_BITS)   ; mask out the modified and undefined flags
     303        and     T0_32, (%2 | %3 | X86_EFL_STATUS_BITS)          ; select the modified and undefined flags.
     304        or      [xSP], T0                                       ; merge guest flags with host flags.
     305        popf                                                    ; load the mixed flags.
     306
     307 %elif (%3 + %4) != 0
     308  %if 1        ; This approach seems faster on intel 10980XE
     309   %if (%3 | %4) == X86_EFL_CF
     310        ; Use bt to load bit into CF
     311        bt      %1, X86_EFL_CF_BIT
     312   %else
     313        ; Use ADD to set OF and SHAF for the rest. ASSUMES T0_32 is eax!
     314        mov     eax, %1
     315    %if (%3 | %4) == X86_EFL_OF
     316        ; Use ADD to set OF.
     317        shl     eax, 31 - X86_EFL_OF_BIT
     318        add     eax, 80000000h
     319    %elif ((%3 | %4) & X86_EFL_OF) != 0
     320        ; Use ADD to set OF.
     321        xchg    al, ah
     322        shl     al, 15 - X86_EFL_OF_BIT
     323        add     al, 80h
     324        ; Use SAHF to set the other status flags.
     325        sahf
     326    %else ; OF not needed; so al -> ah and load ah into eflags.
     327     %if 1 ; Pretty similar on 10980XE, but shl seems faster on average.
     328        shl     eax, 8
     329     %else
     330        xchg    al, ah
     331     %endif
     332        sahf
     333    %endif
     334   %endif
     335
     336  %else
     337        pushf                           ; store current flags
     338        mov     T0_32, %1               ; load the guest flags
     339        and     dword [xSP], ~(%2 | %3) ; mask out the modified and undefined flags
     340        and     T0_32, (%2 | %3)        ; select the modified and undefined flags.
     341        or      [xSP], T0               ; merge guest flags with host flags.
     342        popf                            ; load the mixed flags.
     343  %endif
     344 %endif
     345%endmacro
     346
     347;;
     348; Load the relevant flags from [%1].
     349;
     350; @remarks      Clobbers T0, stack. Changes EFLAGS.
     351; @param        1       The parameter (A0..A3) holding the eflags value.
     352; @param        2       The set of flags to load.
     353; @param        3       The set of undefined flags.
     354;
     355%macro IEM_LOAD_FLAGS 3
     356 %ifdef IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
     357        pushf                                                   ; store current flags
     358        mov     T0_32, %1                                       ; load the guest flags
     359        and     dword [xSP], ~(%2 | %3 | X86_EFL_STATUS_BITS)   ; mask out the modified, undefined and status flags
     360        and     T0_32, (%2 | %3 | X86_EFL_STATUS_BITS)          ; select the modified, undefined and status flags.
     361        or      [xSP], T0                                       ; merge guest flags with host flags.
     362        popf                                                    ; load the mixed flags.
     363
     364 %elif 1        ; This approach seems faster on intel 10980XE
     365  %if (%3 | %2) == X86_EFL_CF
     366        ; Use bt to load bit into CF
     367        bt      %1, X86_EFL_CF_BIT
     368  %else
     369        mov     eax, %1                   ; ASSUMES T0_32 is eax!!
     370   %if (%3 | %2) == X86_EFL_OF
     371        ; Use ADD to set OF.
     372        shl     eax, 31 - X86_EFL_OF_BIT
     373        add     eax, 80000000h
     374   %elif ((%3 | %2) & X86_EFL_OF) != 0
     375        ; Use ADD to set OF.
     376        xchg    al, ah
     377        shl     al, 15 - X86_EFL_OF_BIT
     378        add     al, 80h
     379        ; Use SAHF to set the other status flags.
     380        sahf
     381   %else ; OF not needed; so al -> ah and load ah into eflags.
     382    %if 1 ; Pretty similar on 10980XE, but shl seems faster on average.
     383        shl     eax, 8
     384    %else
     385        xchg    al, ah
     386    %endif
     387        sahf
     388   %endif
     389  %endif ; (%3 | %2) != X86_EFL_CF
     390
     391 %else
     392        pushf                           ; store current flags
     393        mov     T0_32, %1               ; load the guest flags
     394        and     dword [xSP], ~(%2 | %3) ; mask out the modified and undefined flags
     395        and     T0_32, (%2 | %3)        ; select the modified and undefined flags.
     396        or      [xSP], T0               ; merge guest flags with host flags.
     397        popf                            ; load the mixed flags.
     398 %endif
     399%endmacro
     400
     401;;
     402; Merge incoming guest EFLAGS (%1) with host EFLAGS into EAX (T0).
     403;
     404; @remarks  Clobbers T0, T1, %1, stack.
     405; @param        1       The parameter (A0..A3) holding the OLD eflags value. Clobbered.
     406; @param        2       The mask of modified flags to save.
     407; @param        3       The mask of undefined flags to (maybe) save.
     408; @param        4       The mask of flags that are zeroed (and thus doesn't require loading, just clearing)
     409;
     410%macro IEM_SAVE_FLAGS_RETVAL 4 0
     411 %if (%2 | %3 | %4) != 0
     412        mov     T1_32, %1                                       ; flags
     413  %ifdef IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
     414        pushf
     415        pop     T0
     416        and     %1, ~(%2 | %3 | %4 | X86_EFL_STATUS_BITS)       ; clear the modified & undefined & zeroed & status flags.
     417        and     T0_32, (%2 | %3 | X86_EFL_STATUS_BITS)          ; select the modified, undefined and status flags.
     418  %else
     419   %if (%2 | %3 | %4) == X86_EFL_CF
     420        setc    T0_8
     421   %elif (%2 | %3) == X86_EFL_OF
     422        seto    T0_8
     423        shl     T0_32, X86_EFL_OF_BIT
     424   %elif (%2 | %3) == X86_EFL_ZF
     425        setz    T0_8                    ; On 10980XE this is faster than the next option 5596 vs 5936 ps/call (cmpxchg8b-positive).
     426        shl     T0_32, X86_EFL_ZF_BIT
     427   %elif (%2 | %3) <= 0xff
     428        lahf
     429        movzx   eax, ah                 ; ASSUMES T0_32 is eax!
     430   %elif 1                              ; The locked functions are generally faster on 10980XE with this approach
     431        lahf                            ; while there seems only to be a tiny advantage in most other test.
     432        movzx   eax, ah                 ; ASSUMES T0_32 is eax!
     433        jno     .of_is_clear
     434        or      eax, X86_EFL_OF
     435.of_is_clear:
     436   %else
     437        pushf                           ; this is a bit slow
     438        pop     T0
     439   %endif
     440        and     %1, ~(%2 | %3 | %4)     ; clear the modified & undefined & zeroed flags.
     441        and     T0_32, (%2 | %3)        ; select the modified and undefined flags.
     442  %endif
     443        or      T0_32, %1               ; combine the flags. ASSUMES T0 = eax!
     444        ;mov     %1, T0_32               ; save the flags.
     445 %endif
     446%endmacro
     447
     448;;
     449; Calculates the new EFLAGS based on the CPU EFLAGS and fixed clear and set bit masks.
     450;
     451; @remarks  Clobbers T0, T1, stack.
     452; @param        1       The parameter (A0..A3) holding the eflags value.
     453; @param        2       The mask of modified flags to save.
     454; @param        3       Mask of additional flags to always clear
     455; @param        4       Mask of additional flags to always set.
     456;
     457;; @todo make it stuff the result into EAX?
     458%macro IEM_SAVE_AND_ADJUST_FLAGS 4
     459 %if (%2 | %3 | %4) != 0
     460        pushf
     461        pop     T1
     462        mov     T0_32, %1               ; load flags.
     463        and     T0_32, ~(%2 | %3)       ; clear the modified and always cleared flags.
     464        and     T1_32, (%2)             ; select the modified flags.
     465        or      T0_32, T1_32            ; combine the flags.
     466  %if (%4) != 0
     467        or      T0_32, %4               ; add the always set flags.
     468  %endif
     469        mov     %1, T0_32               ; save the result.
     470 %endif
     471%endmacro
     472
     473;;
     474; Calculates the new EFLAGS based on the CPU EFLAGS (%2), a clear mask (%3),
     475; signed input (%4[%5]) and parity index (%6).
     476;
     477; This is used by MUL and IMUL, where we got result (%4 & %6) in xAX which is
     478; also T0. So, we have to use T1 for the EFLAGS calculation and save T0/xAX
     479; while we extract the %2 flags from the CPU EFLAGS or use T2 (only AMD64).
     480;
     481; @remarks  Clobbers T0, T1, stack, %6, EFLAGS.
     482; @param        1       The parameter (A0..A3) holding the eflags value.
     483; @param        2       The mask of modified flags to save.
     484; @param        3       Mask of additional flags to always clear
     485; @param        4       The result register to set SF by.
     486; @param        5       The width of the %4 register in bits (8, 16, 32, or 64).
     487; @param        6       The (full) register containing the parity table index. Will be modified!
     488
     489%macro IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF 6
     490 %ifdef RT_ARCH_AMD64
     491        pushf
     492        pop     T2
     493 %else
     494        push    T0
     495        pushf
     496        pop     T0
     497 %endif
     498        mov     T1_32, %1               ; load flags.
     499        and     T1_32, ~(%2 | %3 | X86_EFL_PF | X86_EFL_SF)  ; clear the modified, always cleared flags and the two flags we calc.
     500 %ifdef RT_ARCH_AMD64
     501        and     T2_32, (%2)             ; select the modified flags.
     502        or      T1_32, T2_32            ; combine the flags.
     503 %else
     504        and     T0_32, (%2)             ; select the modified flags.
     505        or      T1_32, T0_32            ; combine the flags.
     506        pop     T0
     507 %endif
     508
     509        ; First calculate SF as it's likely to be refereing to the same register as %6 does.
     510        bt      %4, %5 - 1
     511        jnc     %%sf_clear
     512        or      T1_32, X86_EFL_SF
     513 %%sf_clear:
     514
     515        ; Parity last.
     516        and     %6, 0xff
     517 %ifdef RT_ARCH_AMD64
     518        lea     T2, [NAME(g_afParity) xWrtRIP]
     519        or      T1_8, [T2 + %6]
     520 %else
     521        or      T1_8, [NAME(g_afParity) + %6]
     522 %endif
     523
     524        mov     %1, T1_32               ; save the result.
     525%endmacro
     526
     527;;
     528; Calculates the new EFLAGS using fixed clear and set bit masks.
     529;
     530; @remarks  Clobbers T0.
     531; @param        1       The parameter (A0..A3) holding the eflags value.
     532; @param        2       Mask of additional flags to always clear
     533; @param        3       Mask of additional flags to always set.
     534;
     535%macro IEM_ADJUST_FLAGS 3
     536 %if (%2 | %3) != 0
     537        mov     T0_32, %1               ; Load flags.
     538  %if (%2) != 0
     539        and     T0_32, ~(%2)            ; Remove the always cleared flags.
     540  %endif
     541  %if (%3) != 0
     542        or      T0_32, %3               ; Add the always set flags.
     543  %endif
     544        mov     %1, T0_32               ; Save the result.
     545 %endif
     546%endmacro
     547
     548;;
     549; Calculates the new EFLAGS using fixed clear and set bit masks.
     550;
     551; @remarks  Clobbers T0, %4, EFLAGS.
     552; @param        1       The parameter (A0..A3) holding the eflags value.
     553; @param        2       Mask of additional flags to always clear
     554; @param        3       Mask of additional flags to always set.
     555; @param        4       The (full) register containing the parity table index. Will be modified!
     556;
     557%macro IEM_ADJUST_FLAGS_WITH_PARITY 4
     558        mov     T0_32, %1               ; Load flags.
     559        and     T0_32, ~(%2 | X86_EFL_PF) ; Remove PF and the always cleared flags.
     560 %if (%3) != 0
     561        or      T0_32, %3               ; Add the always set flags.
     562 %endif
     563        and     %4, 0xff
     564 %ifdef RT_ARCH_AMD64
     565        lea     T2, [NAME(g_afParity) xWrtRIP]
     566        or      T0_8, [T2 + %4]
     567 %else
     568        or      T0_8, [NAME(g_afParity) + %4]
     569 %endif
     570        mov     %1, T0_32               ; Save the result.
     571%endmacro
     572
     573
     574;;;; OLD EFLAGS macros.
     575;;;; OLD EFLAGS macros.
     576;;;; OLD EFLAGS macros.
     577;;;; OLD EFLAGS macros.
     578;;;; OLD EFLAGS macros.
     579
     580;;
     581; Load the relevant flags from [%1] if there are undefined flags (%3).
     582;
     583; @remarks      Clobbers T0, stack. Changes EFLAGS.
    293584; @param        1       The parameter (A0..A3) pointing to the eflags.
    294585; @param        2       The set of modified flags.
     
    296587; @param        4       The flags that must be loaded.
    297588;
    298 %macro IEM_MAYBE_LOAD_FLAGS 4
     589%macro IEM_MAYBE_LOAD_FLAGS_OLD 4
    299590 %ifdef IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
    300591        pushf                                                   ; store current flags
     
    353644; @param        3       The set of undefined flags.
    354645;
    355 %macro IEM_LOAD_FLAGS 3
     646%macro IEM_LOAD_FLAGS_OLD 3
    356647 %ifdef IEM_AIMPL_WITH_LOAD_AND_SAVE_ALL_STATUS_FLAGS
    357648        pushf                                                   ; store current flags
     
    408699; @param        4       The mask of flags that are zeroed (and thus doesn't require loading, just clearing)
    409700;
    410 %macro IEM_SAVE_FLAGS 4 0
     701%macro IEM_SAVE_FLAGS_OLD 4 0
    411702 %if (%2 | %3 | %4) != 0
    412703        mov     T1_32, [%1]                                     ; flags
     
    455746; @param        4       Mask of additional flags to always set.
    456747;
    457 %macro IEM_SAVE_AND_ADJUST_FLAGS 4
     748%macro IEM_SAVE_AND_ADJUST_FLAGS_OLD 4
    458749 %if (%2 | %3 | %4) != 0
    459750        pushf
     
    486777; @param        6       The (full) register containing the parity table index. Will be modified!
    487778
    488 %macro IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF 6
     779%macro IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD 6
    489780 %ifdef RT_ARCH_AMD64
    490781        pushf
     
    532823; @param        3       Mask of additional flags to always set.
    533824;
    534 %macro IEM_ADJUST_FLAGS 3
     825%macro IEM_ADJUST_FLAGS_OLD 3
    535826 %if (%2 | %3) != 0
    536827        mov     T0_32, [%1]             ; Load flags.
     
    554845; @param        4       The (full) register containing the parity table index. Will be modified!
    555846;
    556 %macro IEM_ADJUST_FLAGS_WITH_PARITY 4
     847%macro IEM_ADJUST_FLAGS_WITH_PARITY_OLD 4
    557848        mov     T0_32, [%1]                 ; Load flags.
    558849        and     T0_32, ~(%2 | X86_EFL_PF)   ; Remove PF and the always cleared flags.
     
    569860        mov     [%1], T0_32             ; Save the result.
    570861%endmacro
     862
    571863
    572864
     
    676968BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
    677969        PROLOGUE_3_ARGS
    678         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    679         %1      byte [A0], A1_8
    680         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     970        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     971        %1      byte [A1], A2_8
     972        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    681973        EPILOGUE_3_ARGS
    682974ENDPROC iemAImpl_ %+ %1 %+ _u8
     
    684976BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
    685977        PROLOGUE_3_ARGS
    686         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    687         %1      word [A0], A1_16
    688         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     978        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     979        %1      word [A1], A2_16
     980        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    689981        EPILOGUE_3_ARGS
    690982ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    692984BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    693985        PROLOGUE_3_ARGS
    694         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    695         %1      dword [A0], A1_32
    696         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     986        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     987        %1      dword [A1], A2_32
     988        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    697989        EPILOGUE_3_ARGS
    698990ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    701993BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
    702994        PROLOGUE_3_ARGS
    703         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    704         %1      qword [A0], A1
    705         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     995        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     996        %1      qword [A1], A2
     997        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    706998        EPILOGUE_3_ARGS_EX 8
    707999ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    7121004BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 12
    7131005        PROLOGUE_3_ARGS
    714         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    715         lock %1 byte [A0], A1_8
    716         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     1006        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     1007        lock %1 byte [A1], A2_8
     1008        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    7171009        EPILOGUE_3_ARGS
    7181010ENDPROC iemAImpl_ %+ %1 %+ _u8_locked
     
    7201012BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
    7211013        PROLOGUE_3_ARGS
    722         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    723         lock %1 word [A0], A1_16
    724         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     1014        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     1015        lock %1 word [A1], A2_16
     1016        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    7251017        EPILOGUE_3_ARGS
    7261018ENDPROC iemAImpl_ %+ %1 %+ _u16_locked
     
    7281020BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
    7291021        PROLOGUE_3_ARGS
    730         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    731         lock %1 dword [A0], A1_32
    732         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     1022        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     1023        lock %1 dword [A1], A2_32
     1024        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    7331025        EPILOGUE_3_ARGS
    7341026ENDPROC iemAImpl_ %+ %1 %+ _u32_locked
     
    7371029BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
    7381030        PROLOGUE_3_ARGS
    739         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, %5
    740         lock %1 qword [A0], A1
    741         IEM_SAVE_FLAGS                 A2, %3, %4, %6
     1031        IEM_MAYBE_LOAD_FLAGS               A0_32, %3, %4, %5
     1032        lock %1 qword [A1], A2
     1033        IEM_SAVE_FLAGS_RETVAL              A0_32, %3, %4, %6
    7421034        EPILOGUE_3_ARGS_EX 8
    7431035ENDPROC iemAImpl_ %+ %1 %+ _u64_locked
     
    7761068BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
    7771069        PROLOGUE_4_ARGS
    778         IEM_MAYBE_LOAD_FLAGS           A3, %2, %3, 0 ;; @todo do we need to load undefined flags for any platform?
     1070        IEM_MAYBE_LOAD_FLAGS_OLD           A3, %2, %3, 0 ;; @todo do we need to load undefined flags for any platform?
    7791071        %1      T0_32, A1_32, A2_32
    7801072        mov     [A0], T0_32
    781         IEM_SAVE_FLAGS                 A3, %2, %3, %4
     1073        IEM_SAVE_FLAGS_OLD                 A3, %2, %3, %4
    7821074        EPILOGUE_4_ARGS
    7831075ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    7861078BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
    7871079        PROLOGUE_4_ARGS
    788         IEM_MAYBE_LOAD_FLAGS           A3, %2, %3, 0
     1080        IEM_MAYBE_LOAD_FLAGS_OLD           A3, %2, %3, 0
    7891081        %1      T0, A1, A2
    7901082        mov     [A0], T0
    791         IEM_SAVE_FLAGS                 A3, %2, %3, %4
     1083        IEM_SAVE_FLAGS_OLD                 A3, %2, %3, %4
    7921084        EPILOGUE_4_ARGS
    7931085ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    8171109BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    8181110        PROLOGUE_4_ARGS
    819         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, 0 ;; @todo check if any undefined flags are passed thru
     1111        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0 ;; @todo check if any undefined flags are passed thru
    8201112        mov     T0_32, [A0]
    8211113        %1      T0_32, A1_32
    8221114        mov     [A0], T0_32
    823         IEM_SAVE_FLAGS                 A2, %2, %3, %4
     1115        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
    8241116        EPILOGUE_4_ARGS
    8251117ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    8281120BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
    8291121        PROLOGUE_4_ARGS
    830         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, 0
     1122        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0
    8311123        mov     T0, [A0]
    8321124        %1      T0, A1
    8331125        mov     [A0], T0
    834         IEM_SAVE_FLAGS                 A2, %2, %3, %4
     1126        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
    8351127        EPILOGUE_4_ARGS
    8361128ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    10521344BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
    10531345        PROLOGUE_3_ARGS
    1054         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, 0
     1346        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %3, %4, 0
    10551347        %1      word [A0], A1_16
    1056         IEM_SAVE_FLAGS                 A2, %3, %4, 0
     1348        IEM_SAVE_FLAGS_OLD                 A2, %3, %4, 0
    10571349        EPILOGUE_3_ARGS
    10581350ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    10601352BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    10611353        PROLOGUE_3_ARGS
    1062         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, 0
     1354        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %3, %4, 0
    10631355        %1      dword [A0], A1_32
    1064         IEM_SAVE_FLAGS                 A2, %3, %4, 0
     1356        IEM_SAVE_FLAGS_OLD                 A2, %3, %4, 0
    10651357        EPILOGUE_3_ARGS
    10661358ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    10691361BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
    10701362        PROLOGUE_3_ARGS
    1071         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, 0
     1363        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %3, %4, 0
    10721364        %1      qword [A0], A1
    1073         IEM_SAVE_FLAGS                 A2, %3, %4, 0
     1365        IEM_SAVE_FLAGS_OLD                 A2, %3, %4, 0
    10741366        EPILOGUE_3_ARGS_EX 8
    10751367ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    10801372BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
    10811373        PROLOGUE_3_ARGS
    1082         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, 0
     1374        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %3, %4, 0
    10831375        lock %1 word [A0], A1_16
    1084         IEM_SAVE_FLAGS                 A2, %3, %4, 0
     1376        IEM_SAVE_FLAGS_OLD                 A2, %3, %4, 0
    10851377        EPILOGUE_3_ARGS
    10861378ENDPROC iemAImpl_ %+ %1 %+ _u16_locked
     
    10881380BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
    10891381        PROLOGUE_3_ARGS
    1090         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, 0
     1382        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %3, %4, 0
    10911383        lock %1 dword [A0], A1_32
    1092         IEM_SAVE_FLAGS                 A2, %3, %4, 0
     1384        IEM_SAVE_FLAGS_OLD                 A2, %3, %4, 0
    10931385        EPILOGUE_3_ARGS
    10941386ENDPROC iemAImpl_ %+ %1 %+ _u32_locked
     
    10971389BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
    10981390        PROLOGUE_3_ARGS
    1099         IEM_MAYBE_LOAD_FLAGS           A2, %3, %4, 0
     1391        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %3, %4, 0
    11001392        lock %1 qword [A0], A1
    1101         IEM_SAVE_FLAGS                 A2, %3, %4, 0
     1393        IEM_SAVE_FLAGS_OLD                 A2, %3, %4, 0
    11021394        EPILOGUE_3_ARGS_EX 8
    11031395ENDPROC iemAImpl_ %+ %1 %+ _u64_locked
     
    11421434BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
    11431435        PROLOGUE_3_ARGS
    1144         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru
     1436        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru
    11451437        %1      T0_16, A1_16
    11461438%if %4 != 0
     
    11491441        mov     [A0], T0_16
    11501442.unchanged_dst:
    1151         IEM_SAVE_FLAGS                 A2, %2, %3, 0
     1443        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, 0
    11521444        EPILOGUE_3_ARGS
    11531445ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    11581450;bad;        jz      .unchanged_dst
    11591451;bad;        mov     [A0], T1_16
    1160 ;bad;        IEM_ADJUST_FLAGS_WITH_PARITY    A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF | X86_EFL_ZF, 0, T1
     1452;bad;        IEM_ADJUST_FLAGS_WITH_PARITY_OLD    A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF | X86_EFL_ZF, 0, T1
    11611453;bad;        EPILOGUE_3_ARGS
    11621454;bad;.unchanged_dst:
     
    11641456;bad;        mov     [A0], T1_16
    11651457;bad;%endif
    1166 ;bad;        IEM_ADJUST_FLAGS                A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF, X86_EFL_ZF | X86_EFL_PF
     1458;bad;        IEM_ADJUST_FLAGS_OLD                A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF, X86_EFL_ZF | X86_EFL_PF
    11671459;bad;        EPILOGUE_3_ARGS
    11681460;bad;ENDPROC iemAImpl_ %+ %1 %+ _u16_intel
     
    11761468;bad;        mov     [A0], T0_16
    11771469;bad;.unchanged_dst:
    1178 ;bad;        IEM_SAVE_AND_ADJUST_FLAGS       A2, %2, 0, 0    ; Only the ZF flag is modified on AMD Zen 2.
     1470;bad;        IEM_SAVE_AND_ADJUST_FLAGS_OLD       A2, %2, 0, 0    ; Only the ZF flag is modified on AMD Zen 2.
    11791471;bad;        EPILOGUE_3_ARGS
    11801472;bad;ENDPROC iemAImpl_ %+ %1 %+ _u16_amd
     
    11841476BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    11851477        PROLOGUE_3_ARGS
    1186         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru
     1478        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru
    11871479        %1      T0_32, A1_32
    11881480%if %4 != 0
     
    11911483        mov     [A0], T0_32
    11921484.unchanged_dst:
    1193         IEM_SAVE_FLAGS                 A2, %2, %3, 0
     1485        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, 0
    11941486        EPILOGUE_3_ARGS
    11951487ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    12021494;bad;%endif
    12031495;bad;        mov     [A0], T1_32
    1204 ;bad;        IEM_ADJUST_FLAGS_WITH_PARITY    A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF | X86_EFL_ZF, 0, T1
     1496;bad;        IEM_ADJUST_FLAGS_WITH_PARITY_OLD    A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF | X86_EFL_ZF, 0, T1
    12051497;bad;        EPILOGUE_3_ARGS
    12061498;bad;.unchanged_dst:
    1207 ;bad;        IEM_ADJUST_FLAGS                A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF, X86_EFL_ZF | X86_EFL_PF
     1499;bad;        IEM_ADJUST_FLAGS_OLD                A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF, X86_EFL_ZF | X86_EFL_PF
    12081500;bad;        EPILOGUE_3_ARGS
    12091501;bad;ENDPROC iemAImpl_ %+ %1 %+ _u32_intel
     
    12171509;bad;        mov     [A0], T0_32
    12181510;bad;.unchanged_dst:
    1219 ;bad;        IEM_SAVE_AND_ADJUST_FLAGS       A2, %2, 0, 0    ; Only the ZF flag is modified on AMD Zen 2.
     1511;bad;        IEM_SAVE_AND_ADJUST_FLAGS_OLD       A2, %2, 0, 0    ; Only the ZF flag is modified on AMD Zen 2.
    12201512;bad;        EPILOGUE_3_ARGS
    12211513;bad;ENDPROC iemAImpl_ %+ %1 %+ _u32_amd
     
    12271519BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
    12281520        PROLOGUE_3_ARGS
    1229         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru
     1521        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru
    12301522        %1      T0, A1
    12311523%if %4 != 0
     
    12341526        mov     [A0], T0
    12351527.unchanged_dst:
    1236         IEM_SAVE_FLAGS                 A2, %2, %3, 0
     1528        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, 0
    12371529        EPILOGUE_3_ARGS_EX 8
    12381530ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    12451537;bad;%endif
    12461538;bad;        mov     [A0], T1
    1247 ;bad;        IEM_ADJUST_FLAGS_WITH_PARITY    A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF | X86_EFL_ZF, 0, T1
     1539;bad;        IEM_ADJUST_FLAGS_WITH_PARITY_OLD    A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF | X86_EFL_ZF, 0, T1
    12481540;bad;        EPILOGUE_3_ARGS
    12491541;bad;.unchanged_dst:
    1250 ;bad;        IEM_ADJUST_FLAGS                A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF, X86_EFL_ZF | X86_EFL_PF
     1542;bad;        IEM_ADJUST_FLAGS_OLD                A2, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_CF, X86_EFL_ZF | X86_EFL_PF
    12511543;bad;        EPILOGUE_3_ARGS
    12521544;bad;ENDPROC iemAImpl_ %+ %1 %+ _u64_intel
     
    12601552;bad;        mov     [A0], T0
    12611553;bad;.unchanged_dst:
    1262 ;bad;        IEM_SAVE_AND_ADJUST_FLAGS       A2, %2, 0, 0    ; Only the ZF flag is modified on AMD Zen 2.
     1554;bad;        IEM_SAVE_AND_ADJUST_FLAGS_OLD       A2, %2, 0, 0    ; Only the ZF flag is modified on AMD Zen 2.
    12631555;bad;        EPILOGUE_3_ARGS_EX 8
    12641556;bad;ENDPROC iemAImpl_ %+ %1 %+ _u64_amd
     
    12951587BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
    12961588        PROLOGUE_3_ARGS
    1297         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, 0
     1589        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0
    12981590        %1      T0_16, A1_16
    12991591        mov     [A0], T0_16
    1300         IEM_SAVE_FLAGS                 A2, %2, %3, %4
     1592        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
    13011593        EPILOGUE_3_ARGS
    13021594ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    13041596BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    13051597        PROLOGUE_3_ARGS
    1306         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, 0
     1598        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0
    13071599        %1      T0_32, A1_32
    13081600        mov     [A0], T0_32
    1309         IEM_SAVE_FLAGS                 A2, %2, %3, %4
     1601        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
    13101602        EPILOGUE_3_ARGS
    13111603ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    13141606BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
    13151607        PROLOGUE_3_ARGS
    1316         IEM_MAYBE_LOAD_FLAGS           A2, %2, %3, 0
     1608        IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0
    13171609        %1      T0, A1
    13181610        mov     [A0], T0
    1319         IEM_SAVE_FLAGS                 A2, %2, %3, %4
     1611        IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
    13201612        EPILOGUE_3_ARGS_EX 8
    13211613ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    13381630BEGINPROC_FASTCALL iemAImpl_imul_two_u16 %+ %3, 12
    13391631        PROLOGUE_3_ARGS
    1340         IEM_MAYBE_LOAD_FLAGS                    A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)
     1632        IEM_MAYBE_LOAD_FLAGS_OLD                    A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)
    13411633        imul    A1_16, word [A0]
    13421634        mov     [A0], A1_16
    13431635 %if %4 != 1
    1344         IEM_SAVE_FLAGS                          A2, %1, %2, 0
     1636        IEM_SAVE_FLAGS_OLD                          A2, %1, %2, 0
    13451637 %else
    1346         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF    A2, %1, X86_EFL_AF | X86_EFL_ZF, A1_16, 16, A1 ; intel
     1638        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD    A2, %1, X86_EFL_AF | X86_EFL_ZF, A1_16, 16, A1 ; intel
    13471639 %endif
    13481640        EPILOGUE_3_ARGS
     
    13511643BEGINPROC_FASTCALL iemAImpl_imul_two_u32 %+ %3, 12
    13521644        PROLOGUE_3_ARGS
    1353         IEM_MAYBE_LOAD_FLAGS                    A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)
     1645        IEM_MAYBE_LOAD_FLAGS_OLD                    A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)
    13541646        imul    A1_32, dword [A0]
    13551647        mov     [A0], A1_32
    13561648 %if %4 != 1
    1357         IEM_SAVE_FLAGS                          A2, %1, %2, 0
     1649        IEM_SAVE_FLAGS_OLD                          A2, %1, %2, 0
    13581650 %else
    1359         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF    A2, %1, X86_EFL_AF | X86_EFL_ZF, A1_32, 32, A1 ; intel
     1651        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD    A2, %1, X86_EFL_AF | X86_EFL_ZF, A1_32, 32, A1 ; intel
    13601652 %endif
    13611653        EPILOGUE_3_ARGS
     
    13651657BEGINPROC_FASTCALL iemAImpl_imul_two_u64 %+ %3, 16
    13661658        PROLOGUE_3_ARGS
    1367         IEM_MAYBE_LOAD_FLAGS                    A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)
     1659        IEM_MAYBE_LOAD_FLAGS_OLD                    A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)
    13681660        imul    A1, qword [A0]
    13691661        mov     [A0], A1
    13701662 %if %4 != 1
    1371         IEM_SAVE_FLAGS                          A2, %1, %2, 0
     1663        IEM_SAVE_FLAGS_OLD                          A2, %1, %2, 0
    13721664 %else
    1373         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF    A2, %1, X86_EFL_AF | X86_EFL_ZF, A1, 64, A1 ; intel
     1665        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD    A2, %1, X86_EFL_AF | X86_EFL_ZF, A1, 64, A1 ; intel
    13741666 %endif
    13751667        EPILOGUE_3_ARGS_EX 8
     
    14771769BEGINPROC_FASTCALL iemAImpl_xadd_u8, 12
    14781770        PROLOGUE_3_ARGS
    1479         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1771        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    14801772        mov     T0_8, [A1]
    14811773        xadd    [A0], T0_8
    14821774        mov     [A1], T0_8
    1483         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1775        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    14841776        EPILOGUE_3_ARGS
    14851777ENDPROC iemAImpl_xadd_u8
     
    14871779BEGINPROC_FASTCALL iemAImpl_xadd_u16, 12
    14881780        PROLOGUE_3_ARGS
    1489         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1781        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    14901782        mov     T0_16, [A1]
    14911783        xadd    [A0], T0_16
    14921784        mov     [A1], T0_16
    1493         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1785        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    14941786        EPILOGUE_3_ARGS
    14951787ENDPROC iemAImpl_xadd_u16
     
    14971789BEGINPROC_FASTCALL iemAImpl_xadd_u32, 12
    14981790        PROLOGUE_3_ARGS
    1499         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1791        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15001792        mov     T0_32, [A1]
    15011793        xadd    [A0], T0_32
    15021794        mov     [A1], T0_32
    1503         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1795        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15041796        EPILOGUE_3_ARGS
    15051797ENDPROC iemAImpl_xadd_u32
     
    15081800BEGINPROC_FASTCALL iemAImpl_xadd_u64, 12
    15091801        PROLOGUE_3_ARGS
    1510         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1802        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15111803        mov     T0, [A1]
    15121804        xadd    [A0], T0
    15131805        mov     [A1], T0
    1514         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1806        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15151807        EPILOGUE_3_ARGS
    15161808ENDPROC iemAImpl_xadd_u64
     
    15191811BEGINPROC_FASTCALL iemAImpl_xadd_u8_locked, 12
    15201812        PROLOGUE_3_ARGS
    1521         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1813        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15221814        mov     T0_8, [A1]
    15231815        lock xadd [A0], T0_8
    15241816        mov     [A1], T0_8
    1525         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1817        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15261818        EPILOGUE_3_ARGS
    15271819ENDPROC iemAImpl_xadd_u8_locked
     
    15291821BEGINPROC_FASTCALL iemAImpl_xadd_u16_locked, 12
    15301822        PROLOGUE_3_ARGS
    1531         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1823        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15321824        mov     T0_16, [A1]
    15331825        lock xadd [A0], T0_16
    15341826        mov     [A1], T0_16
    1535         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1827        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15361828        EPILOGUE_3_ARGS
    15371829ENDPROC iemAImpl_xadd_u16_locked
     
    15391831BEGINPROC_FASTCALL iemAImpl_xadd_u32_locked, 12
    15401832        PROLOGUE_3_ARGS
    1541         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1833        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15421834        mov     T0_32, [A1]
    15431835        lock xadd [A0], T0_32
    15441836        mov     [A1], T0_32
    1545         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1837        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15461838        EPILOGUE_3_ARGS
    15471839ENDPROC iemAImpl_xadd_u32_locked
     
    15501842BEGINPROC_FASTCALL iemAImpl_xadd_u64_locked, 12
    15511843        PROLOGUE_3_ARGS
    1552         IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1844        IEM_MAYBE_LOAD_FLAGS_OLD A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15531845        mov     T0, [A1]
    15541846        lock xadd [A0], T0
    15551847        mov     [A1], T0
    1556         IEM_SAVE_FLAGS       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
     1848        IEM_SAVE_FLAGS_OLD       A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0, 0
    15571849        EPILOGUE_3_ARGS
    15581850ENDPROC iemAImpl_xadd_u64_locked
     
    15851877        mov     ebx, [r8]
    15861878        mov     ecx, [r8 + 4]
    1587         IEM_MAYBE_LOAD_FLAGS r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     1879        IEM_MAYBE_LOAD_FLAGS_OLD r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    15881880        mov     eax, [r11]
    15891881        mov     edx, [r11 + 4]
     
    15931885        mov     [r11], eax
    15941886        mov     [r11 + 4], edx
    1595         IEM_SAVE_FLAGS       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     1887        IEM_SAVE_FLAGS_OLD       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    15961888
    15971889        pop     rbx
     
    16051897        mov     ebx, [r11]
    16061898        mov     ecx, [r11 + 4]
    1607         IEM_MAYBE_LOAD_FLAGS r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     1899        IEM_MAYBE_LOAD_FLAGS_OLD r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    16081900        mov     eax, [rsi]
    16091901        mov     edx, [rsi + 4]
     
    16131905        mov     [rsi], eax
    16141906        mov     [rsi + 4], edx
    1615         IEM_SAVE_FLAGS       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     1907        IEM_SAVE_FLAGS_OLD       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    16161908
    16171909        pop     rbx
     
    16321924        mov     ebx, [ecx]
    16331925        mov     ecx, [ecx + 4]
    1634         IEM_MAYBE_LOAD_FLAGS ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     1926        IEM_MAYBE_LOAD_FLAGS_OLD ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    16351927        mov     eax, [esi]
    16361928        mov     edx, [esi + 4]
     
    16401932        mov     [esi], eax
    16411933        mov     [esi + 4], edx
    1642         IEM_SAVE_FLAGS       ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, edi)
     1934        IEM_SAVE_FLAGS_OLD       ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, edi)
    16431935
    16441936        pop     ebp
     
    16601952        mov     ebx, [r8]
    16611953        mov     ecx, [r8 + 4]
    1662         IEM_MAYBE_LOAD_FLAGS r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     1954        IEM_MAYBE_LOAD_FLAGS_OLD r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    16631955        mov     eax, [r11]
    16641956        mov     edx, [r11 + 4]
     
    16681960        mov     [r11], eax
    16691961        mov     [r11 + 4], edx
    1670         IEM_SAVE_FLAGS       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     1962        IEM_SAVE_FLAGS_OLD       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    16711963
    16721964        pop     rbx
     
    16801972        mov     ebx, [r11]
    16811973        mov     ecx, [r11 + 4]
    1682         IEM_MAYBE_LOAD_FLAGS r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     1974        IEM_MAYBE_LOAD_FLAGS_OLD r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    16831975        mov     eax, [rsi]
    16841976        mov     edx, [rsi + 4]
     
    16881980        mov     [rsi], eax
    16891981        mov     [rsi + 4], edx
    1690         IEM_SAVE_FLAGS       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     1982        IEM_SAVE_FLAGS_OLD       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    16911983
    16921984        pop     rbx
     
    17071999        mov     ebx, [ecx]
    17082000        mov     ecx, [ecx + 4]
    1709         IEM_MAYBE_LOAD_FLAGS ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     2001        IEM_MAYBE_LOAD_FLAGS_OLD ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    17102002        mov     eax, [esi]
    17112003        mov     edx, [esi + 4]
     
    17152007        mov     [esi], eax
    17162008        mov     [esi + 4], edx
    1717         IEM_SAVE_FLAGS       ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, edi)
     2009        IEM_SAVE_FLAGS_OLD       ebp, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, edi)
    17182010
    17192011        pop     ebp
     
    17512043        mov     rbx, [r8]
    17522044        mov     rcx, [r8 + 8]
    1753         IEM_MAYBE_LOAD_FLAGS r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     2045        IEM_MAYBE_LOAD_FLAGS_OLD r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    17542046        mov     rax, [r11]
    17552047        mov     rdx, [r11 + 8]
     
    17592051        mov     [r11], rax
    17602052        mov     [r11 + 8], rdx
    1761         IEM_SAVE_FLAGS       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     2053        IEM_SAVE_FLAGS_OLD       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    17622054
    17632055        pop     rbx
     
    17712063        mov     rbx, [r11]
    17722064        mov     rcx, [r11 + 8]
    1773         IEM_MAYBE_LOAD_FLAGS r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     2065        IEM_MAYBE_LOAD_FLAGS_OLD r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    17742066        mov     rax, [rsi]
    17752067        mov     rdx, [rsi + 8]
     
    17792071        mov     [rsi], rax
    17802072        mov     [rsi + 8], rdx
    1781         IEM_SAVE_FLAGS       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     2073        IEM_SAVE_FLAGS_OLD       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    17822074
    17832075        pop     rbx
     
    17962088        mov     rbx, [r8]
    17972089        mov     rcx, [r8 + 8]
    1798         IEM_MAYBE_LOAD_FLAGS r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     2090        IEM_MAYBE_LOAD_FLAGS_OLD r9, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    17992091        mov     rax, [r11]
    18002092        mov     rdx, [r11 + 8]
     
    18042096        mov     [r11], rax
    18052097        mov     [r11 + 8], rdx
    1806         IEM_SAVE_FLAGS       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     2098        IEM_SAVE_FLAGS_OLD       r9, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    18072099
    18082100        pop     rbx
     
    18162108        mov     rbx, [r11]
    18172109        mov     rcx, [r11 + 8]
    1818         IEM_MAYBE_LOAD_FLAGS r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
     2110        IEM_MAYBE_LOAD_FLAGS_OLD r10, (X86_EFL_ZF), 0, 0 ; clobbers T0 (eax)
    18192111        mov     rax, [rsi]
    18202112        mov     rdx, [rsi + 8]
     
    18242116        mov     [rsi], rax
    18252117        mov     [rsi + 8], rdx
    1826         IEM_SAVE_FLAGS       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
     2118        IEM_SAVE_FLAGS_OLD       r10, (X86_EFL_ZF), 0, 0 ; clobbers T0+T1 (eax, r11)
    18272119
    18282120        pop     rbx
     
    18472139BEGINPROC_FASTCALL iemAImpl_cmpxchg_u8 %+ %2, 16
    18482140        PROLOGUE_4_ARGS
    1849         IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
     2141        IEM_MAYBE_LOAD_FLAGS_OLD A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
    18502142        mov     al, [A1]
    18512143        %1 cmpxchg [A0], A2_8
    18522144        mov     [A1], al
    1853         IEM_SAVE_FLAGS       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
     2145        IEM_SAVE_FLAGS_OLD       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
    18542146        EPILOGUE_4_ARGS
    18552147ENDPROC iemAImpl_cmpxchg_u8 %+ %2
     
    18572149BEGINPROC_FASTCALL iemAImpl_cmpxchg_u16 %+ %2, 16
    18582150        PROLOGUE_4_ARGS
    1859         IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
     2151        IEM_MAYBE_LOAD_FLAGS_OLD A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
    18602152        mov     ax, [A1]
    18612153        %1 cmpxchg [A0], A2_16
    18622154        mov     [A1], ax
    1863         IEM_SAVE_FLAGS       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
     2155        IEM_SAVE_FLAGS_OLD       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
    18642156        EPILOGUE_4_ARGS
    18652157ENDPROC iemAImpl_cmpxchg_u16 %+ %2
     
    18672159BEGINPROC_FASTCALL iemAImpl_cmpxchg_u32 %+ %2, 16
    18682160        PROLOGUE_4_ARGS
    1869         IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
     2161        IEM_MAYBE_LOAD_FLAGS_OLD A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
    18702162        mov     eax, [A1]
    18712163        %1 cmpxchg [A0], A2_32
    18722164        mov     [A1], eax
    1873         IEM_SAVE_FLAGS       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
     2165        IEM_SAVE_FLAGS_OLD       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
    18742166        EPILOGUE_4_ARGS
    18752167ENDPROC iemAImpl_cmpxchg_u32 %+ %2
     
    18782170%ifdef RT_ARCH_AMD64
    18792171        PROLOGUE_4_ARGS
    1880         IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
     2172        IEM_MAYBE_LOAD_FLAGS_OLD A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0 (eax)
    18812173        mov     rax, [A1]
    18822174        %1 cmpxchg [A0], A2
    18832175        mov     [A1], rax
    1884         IEM_SAVE_FLAGS       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
     2176        IEM_SAVE_FLAGS_OLD       A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, r11/edi)
    18852177        EPILOGUE_4_ARGS
    18862178%else
     
    19002192        mov     ebx, [ecx]
    19012193        mov     ecx, [ecx + 4]
    1902         IEM_MAYBE_LOAD_FLAGS ebp, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0  ; clobbers T0 (eax)
     2194        IEM_MAYBE_LOAD_FLAGS_OLD ebp, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0  ; clobbers T0 (eax)
    19032195        mov     eax, [esi]
    19042196        mov     edx, [esi + 4]
     
    19132205        mov     [esi], eax
    19142206        mov     [esi + 4], edx
    1915         IEM_SAVE_FLAGS       ebp, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, edi)
     2207        IEM_SAVE_FLAGS_OLD       ebp, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0, 0 ; clobbers T0+T1 (eax, edi)
    19162208
    19172209        pop     ebp
     
    19542246BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 8
    19552247        PROLOGUE_2_ARGS
    1956         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2248        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    19572249        %1      byte [A0]
    1958         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2250        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    19592251        EPILOGUE_2_ARGS
    19602252ENDPROC iemAImpl_ %+ %1 %+ _u8
     
    19622254BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 8
    19632255        PROLOGUE_2_ARGS
    1964         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2256        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    19652257        lock %1 byte [A0]
    1966         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2258        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    19672259        EPILOGUE_2_ARGS
    19682260ENDPROC iemAImpl_ %+ %1 %+ _u8_locked
     
    19702262BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 8
    19712263        PROLOGUE_2_ARGS
    1972         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2264        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    19732265        %1      word [A0]
    1974         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2266        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    19752267        EPILOGUE_2_ARGS
    19762268ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    19782270BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 8
    19792271        PROLOGUE_2_ARGS
    1980         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2272        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    19812273        lock %1 word [A0]
    1982         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2274        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    19832275        EPILOGUE_2_ARGS
    19842276ENDPROC iemAImpl_ %+ %1 %+ _u16_locked
     
    19862278BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 8
    19872279        PROLOGUE_2_ARGS
    1988         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2280        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    19892281        %1      dword [A0]
    1990         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2282        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    19912283        EPILOGUE_2_ARGS
    19922284ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    19942286BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 8
    19952287        PROLOGUE_2_ARGS
    1996         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2288        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    19972289        lock %1 dword [A0]
    1998         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2290        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    19992291        EPILOGUE_2_ARGS
    20002292ENDPROC iemAImpl_ %+ %1 %+ _u32_locked
     
    20032295BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 8
    20042296        PROLOGUE_2_ARGS
    2005         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2297        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    20062298        %1      qword [A0]
    2007         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2299        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    20082300        EPILOGUE_2_ARGS
    20092301ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    20112303BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 8
    20122304        PROLOGUE_2_ARGS
    2013         IEM_MAYBE_LOAD_FLAGS A1, %2, %3, 0
     2305        IEM_MAYBE_LOAD_FLAGS_OLD A1, %2, %3, 0
    20142306        lock %1 qword [A0]
    2015         IEM_SAVE_FLAGS       A1, %2, %3, 0
     2307        IEM_SAVE_FLAGS_OLD       A1, %2, %3, 0
    20162308        EPILOGUE_2_ARGS
    20172309ENDPROC iemAImpl_ %+ %1 %+ _u64_locked
     
    20912383BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
    20922384        PROLOGUE_3_ARGS
    2093         IEM_MAYBE_LOAD_FLAGS A2, %2, %3, %4
     2385        IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    20942386 %ifdef ASM_CALL64_GCC
    20952387        mov     cl, A1_8
     
    20992391        %1      byte [A1], cl
    21002392 %endif
    2101         IEM_SAVE_FLAGS       A2, %2, %3, 0
     2393        IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    21022394.zero_shift:
    21032395        EPILOGUE_3_ARGS
     
    21062398BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
    21072399        PROLOGUE_3_ARGS
    2108         IEM_MAYBE_LOAD_FLAGS A2, %2, %3, %4
     2400        IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    21092401 %ifdef ASM_CALL64_GCC
    21102402        mov     cl, A1_8
     
    21142406        %1      word [A1], cl
    21152407 %endif
    2116         IEM_SAVE_FLAGS       A2, %2, %3, 0
     2408        IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    21172409        EPILOGUE_3_ARGS
    21182410ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    21202412BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    21212413        PROLOGUE_3_ARGS
    2122         IEM_MAYBE_LOAD_FLAGS A2, %2, %3, %4
     2414        IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    21232415 %ifdef ASM_CALL64_GCC
    21242416        mov     cl, A1_8
     
    21282420        %1      dword [A1], cl
    21292421 %endif
    2130         IEM_SAVE_FLAGS       A2, %2, %3, 0
     2422        IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    21312423        EPILOGUE_3_ARGS
    21322424ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    21352427BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
    21362428        PROLOGUE_3_ARGS
    2137         IEM_MAYBE_LOAD_FLAGS A2, %2, %3, %4
     2429        IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    21382430  %ifdef ASM_CALL64_GCC
    21392431        mov     cl, A1_8
     
    21432435        %1      qword [A1], cl
    21442436  %endif
    2145         IEM_SAVE_FLAGS       A2, %2, %3, 0
     2437        IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    21462438        EPILOGUE_3_ARGS
    21472439ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    21842476BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 16
    21852477        PROLOGUE_4_ARGS
    2186         ;IEM_LOAD_FLAGS      A3, %4, %3
    2187         IEM_MAYBE_LOAD_FLAGS A3, %2, %3, %4
     2478        ;IEM_LOAD_FLAGS_OLD      A3, %4, %3
     2479        IEM_MAYBE_LOAD_FLAGS_OLD A3, %2, %3, %4
    21882480 %ifdef ASM_CALL64_GCC
    21892481        xchg    A3, A2
     
    21942486        %1      [A2], A1_16, cl
    21952487 %endif
    2196         IEM_SAVE_FLAGS      A3, %2, %3, 0
     2488        IEM_SAVE_FLAGS_OLD      A3, %2, %3, 0
    21972489        EPILOGUE_4_ARGS
    21982490ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    22002492BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
    22012493        PROLOGUE_4_ARGS
    2202         ;IEM_LOAD_FLAGS      A3, %4, %3
    2203         IEM_MAYBE_LOAD_FLAGS A3, %2, %3, %4
     2494        ;IEM_LOAD_FLAGS_OLD      A3, %4, %3
     2495        IEM_MAYBE_LOAD_FLAGS_OLD A3, %2, %3, %4
    22042496 %ifdef ASM_CALL64_GCC
    22052497        xchg    A3, A2
     
    22102502        %1      [A2], A1_32, cl
    22112503 %endif
    2212         IEM_SAVE_FLAGS      A3, %2, %3, 0
     2504        IEM_SAVE_FLAGS_OLD      A3, %2, %3, 0
    22132505        EPILOGUE_4_ARGS
    22142506ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    22172509BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
    22182510        PROLOGUE_4_ARGS
    2219         ;IEM_LOAD_FLAGS      A3, %4, %3
    2220         IEM_MAYBE_LOAD_FLAGS A3, %2, %3, %4
     2511        ;IEM_LOAD_FLAGS_OLD      A3, %4, %3
     2512        IEM_MAYBE_LOAD_FLAGS_OLD A3, %2, %3, %4
    22212513 %ifdef ASM_CALL64_GCC
    22222514        xchg    A3, A2
     
    22272519        %1      [A2], A1, cl
    22282520 %endif
    2229         IEM_SAVE_FLAGS      A3, %2, %3, 0
     2521        IEM_SAVE_FLAGS_OLD      A3, %2, %3, 0
    22302522        EPILOGUE_4_ARGS_EX 12
    22312523ENDPROC iemAImpl_ %+ %1 %+ _u64
     
    22662558BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8 %+ %4, 12
    22672559        PROLOGUE_3_ARGS
    2268         IEM_MAYBE_LOAD_FLAGS                     A2, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2560        IEM_MAYBE_LOAD_FLAGS_OLD                     A2, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    22692561        mov     al, [A0]
    22702562        %1      A1_8
    22712563        mov     [A0], ax
    22722564 %if %5 != 1
    2273         IEM_SAVE_FLAGS                           A2, %2, %3, 0
     2565        IEM_SAVE_FLAGS_OLD                           A2, %2, %3, 0
    22742566 %else
    2275         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF     A2, %2, X86_EFL_AF | X86_EFL_ZF, ax, 8, xAX ; intel
     2567        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD     A2, %2, X86_EFL_AF | X86_EFL_ZF, ax, 8, xAX ; intel
    22762568 %endif
    22772569        xor     eax, eax
     
    22812573BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16 %+ %4, 16
    22822574        PROLOGUE_4_ARGS
    2283         IEM_MAYBE_LOAD_FLAGS                     A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2575        IEM_MAYBE_LOAD_FLAGS_OLD                     A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    22842576        mov     ax, [A0]
    22852577 %ifdef ASM_CALL64_GCC
     
    22942586 %endif
    22952587 %if %5 != 1
    2296         IEM_SAVE_FLAGS                           A3, %2, %3, 0
     2588        IEM_SAVE_FLAGS_OLD                           A3, %2, %3, 0
    22972589 %else
    2298         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF     A3, %2, X86_EFL_AF | X86_EFL_ZF, ax, 16, xAX ; intel
     2590        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD     A3, %2, X86_EFL_AF | X86_EFL_ZF, ax, 16, xAX ; intel
    22992591 %endif
    23002592        xor     eax, eax
     
    23042596BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32 %+ %4, 16
    23052597        PROLOGUE_4_ARGS
    2306         IEM_MAYBE_LOAD_FLAGS                     A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2598        IEM_MAYBE_LOAD_FLAGS_OLD                     A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    23072599        mov     eax, [A0]
    23082600 %ifdef ASM_CALL64_GCC
     
    23172609 %endif
    23182610 %if %5 != 1
    2319         IEM_SAVE_FLAGS                           A3, %2, %3, 0
     2611        IEM_SAVE_FLAGS_OLD                           A3, %2, %3, 0
    23202612 %else
    2321         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF     A3, %2, X86_EFL_AF | X86_EFL_ZF, eax, 32, xAX ; intel
     2613        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD     A3, %2, X86_EFL_AF | X86_EFL_ZF, eax, 32, xAX ; intel
    23222614 %endif
    23232615        xor     eax, eax
     
    23282620BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64 %+ %4, 20
    23292621        PROLOGUE_4_ARGS
    2330         IEM_MAYBE_LOAD_FLAGS                     A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2622        IEM_MAYBE_LOAD_FLAGS_OLD                     A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    23312623        mov     rax, [A0]
    23322624  %ifdef ASM_CALL64_GCC
     
    23412633  %endif
    23422634  %if %5 != 1
    2343         IEM_SAVE_FLAGS                           A3, %2, %3, 0
     2635        IEM_SAVE_FLAGS_OLD                           A3, %2, %3, 0
    23442636  %else
    2345         IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF     A3, %2, X86_EFL_AF | X86_EFL_ZF, rax, 64, xAX ; intel
     2637        IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_OLD     A3, %2, X86_EFL_AF | X86_EFL_ZF, rax, 64, xAX ; intel
    23462638  %endif
    23472639        xor     eax, eax
     
    24622754 %endif
    24632755
    2464         IEM_MAYBE_LOAD_FLAGS A2, %2, %3, %3 ; Undefined flags may be passed thru (Intel)
     2756        IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %3 ; Undefined flags may be passed thru (Intel)
    24652757        mov     ax, [A0]
    24662758        %1      A1_8
    24672759        mov     [A0], ax
    24682760 %if %6 == 2 ; AMD64 3990X: Set AF and clear PF, ZF and SF.
    2469         IEM_ADJUST_FLAGS    A2, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
     2761        IEM_ADJUST_FLAGS_OLD    A2, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
    24702762 %else
    2471         IEM_SAVE_FLAGS      A2, %2, %3, 0
     2763        IEM_SAVE_FLAGS_OLD      A2, %2, %3, 0
    24722764 %endif
    24732765        xor     eax, eax
     
    25282820 %endif
    25292821
    2530         IEM_MAYBE_LOAD_FLAGS A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2822        IEM_MAYBE_LOAD_FLAGS_OLD A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    25312823 %ifdef ASM_CALL64_GCC
    25322824        mov     T1, A2
     
    25452837 %endif
    25462838 %if %6 == 2 ; AMD64 3990X: Set AF and clear PF, ZF and SF.
    2547         IEM_ADJUST_FLAGS    A3, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
     2839        IEM_ADJUST_FLAGS_OLD    A3, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
    25482840 %else
    2549         IEM_SAVE_FLAGS      A3, %2, %3, 0
     2841        IEM_SAVE_FLAGS_OLD      A3, %2, %3, 0
    25502842 %endif
    25512843        xor     eax, eax
     
    26142906 %endif
    26152907
    2616         IEM_MAYBE_LOAD_FLAGS A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2908        IEM_MAYBE_LOAD_FLAGS_OLD A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    26172909        mov     eax, [A0]
    26182910 %ifdef ASM_CALL64_GCC
     
    26322924 %endif
    26332925 %if %6 == 2 ; AMD64 3990X: Set AF and clear PF, ZF and SF.
    2634         IEM_ADJUST_FLAGS    A3, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
     2926        IEM_ADJUST_FLAGS_OLD    A3, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
    26352927 %else
    2636         IEM_SAVE_FLAGS      A3, %2, %3, 0
     2928        IEM_SAVE_FLAGS_OLD      A3, %2, %3, 0
    26372929 %endif
    26382930        xor     eax, eax
     
    27022994  %endif
    27032995
    2704         IEM_MAYBE_LOAD_FLAGS A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
     2996        IEM_MAYBE_LOAD_FLAGS_OLD A3, %2, %3, %3 ; Undefined flags may be passed thru (AMD)
    27052997        mov     rax, [A0]
    27062998  %ifdef ASM_CALL64_GCC
     
    27203012  %endif
    27213013  %if %6 == 2 ; AMD64 3990X: Set AF and clear PF, ZF and SF.
    2722         IEM_ADJUST_FLAGS    A3, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
     3014        IEM_ADJUST_FLAGS_OLD    A3, X86_EFL_PF | X86_EFL_ZF | X86_EFL_SF, X86_EFL_AF
    27233015  %else
    2724         IEM_SAVE_FLAGS      A3, %2, %3, 0
     3016        IEM_SAVE_FLAGS_OLD      A3, %2, %3, 0
    27253017  %endif
    27263018        xor     eax, eax
     
    47565048        movdqu  xmm1, [A1]
    47575049        ptest   xmm0, xmm1
    4758         IEM_SAVE_FLAGS A2, X86_EFL_ZF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_AF | X86_EFL_PF | X86_EFL_SF
     5050        IEM_SAVE_FLAGS_OLD A2, X86_EFL_ZF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_AF | X86_EFL_PF | X86_EFL_SF
    47595051
    47605052        IEMIMPL_SSE_EPILOGUE
     
    47695061        vmovdqu ymm1, [A1]
    47705062        vptest  ymm0, ymm1
    4771         IEM_SAVE_FLAGS A2, X86_EFL_ZF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_AF | X86_EFL_PF | X86_EFL_SF
     5063        IEM_SAVE_FLAGS_OLD A2, X86_EFL_ZF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_AF | X86_EFL_PF | X86_EFL_SF
    47725064
    47735065        IEMIMPL_SSE_EPILOGUE
     
    56435935        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    56445936
    5645         IEM_SAVE_FLAGS A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     5937        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
    56465938        mov    [T2], ecx
    56475939
     
    56845976
    56855977        pop     xDX
    5686         IEM_SAVE_FLAGS A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     5978        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
    56875979        mov    [T2], ecx
    56885980
     
    57186010        IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8
    57196011
    5720         IEM_SAVE_FLAGS A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     6012        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
    57216013        movdqu  [A0], xmm0
    57226014
     
    57586050
    57596051        pop     xDX
    5760         IEM_SAVE_FLAGS A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
     6052        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF, 0, X86_EFL_AF | X86_EFL_PF
    57616053        movdqu  [A0], xmm0
    57626054
     
    61026394        movd    xmm1, A3_32
    61036395        ucomiss xmm0, xmm1
    6104         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6396        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    61056397
    61066398        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    61176409        movd    xmm1, A3_32
    61186410        vucomiss xmm0, xmm1
    6119         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6411        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    61206412
    61216413        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    61426434        movq    xmm1, A3
    61436435        ucomisd xmm0, xmm1
    6144         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6436        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    61456437
    61466438        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    61576449        movq    xmm1, A3
    61586450        vucomisd xmm0, xmm1
    6159         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6451        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    61606452
    61616453        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    61816473        movd    xmm1, A3_32
    61826474        comiss xmm0, xmm1
    6183         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6475        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    61846476
    61856477        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    61966488        movd    xmm1, A3_32
    61976489        vcomiss xmm0, xmm1
    6198         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6490        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    61996491
    62006492        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    62216513        movq    xmm1, A3
    62226514        comisd xmm0, xmm1
    6223         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6515        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    62246516
    62256517        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    62366528        movq    xmm1, A3
    62376529        vcomisd xmm0, xmm1
    6238         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6530        IEM_SAVE_FLAGS_OLD A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    62396531
    62406532        SSE_AVX_ST_MXCSR R0_32, A0_32
     
    64886780        %1      %2
    64896781        mov     [A0], %2
    6490         IEM_SAVE_FLAGS A1, X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF
     6782        IEM_SAVE_FLAGS_OLD A1, X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF
    64916783
    64926784        EPILOGUE_2_ARGS
     
    65706862        PROLOGUE_4_ARGS
    65716863
    6572         IEM_LOAD_FLAGS A2, %2, 0
     6864        IEM_LOAD_FLAGS_OLD A2, %2, 0
    65736865        %1      A1_32, [A0]
    65746866        mov     [A0], A1_32
    6575         IEM_SAVE_FLAGS A2, %2, 0, 0
     6867        IEM_SAVE_FLAGS_OLD A2, %2, 0, 0
    65766868
    65776869        EPILOGUE_4_ARGS
     
    65906882        PROLOGUE_4_ARGS
    65916883
    6592         IEM_LOAD_FLAGS A2, %2, 0
     6884        IEM_LOAD_FLAGS_OLD A2, %2, 0
    65936885        %1      A1, [A0]
    65946886        mov     [A0], A1
    6595         IEM_SAVE_FLAGS A2, %2, 0, 0
     6887        IEM_SAVE_FLAGS_OLD A2, %2, 0, 0
    65966888
    65976889        EPILOGUE_4_ARGS
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r104188 r104195  
    120120 *
    121121 * @returns Status bits.
    122  * @param   a_pfEFlags      Pointer to the 32-bit EFLAGS value to update.
     122 * @param   a_fEFlagsVar    The 32-bit EFLAGS variable to update.
    123123 * @param   a_uResult       Unsigned result value.
    124124 * @param   a_uSrc          The source value (for AF calc).
     
    128128 * @param   a_uSrcOf        The a_uSrc value to use for overflow calculation.
    129129 */
    130 #define IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(a_pfEFlags, a_uResult, a_uDst, a_uSrc, a_cBitsWidth, a_CfExpr, a_uSrcOf) \
     130#define IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(a_fEFlagsVar, a_uResult, a_uDst, a_uSrc, a_cBitsWidth, a_CfExpr, a_uSrcOf) \
    131131    do { \
    132         uint32_t fEflTmp = *(a_pfEFlags); \
    133         fEflTmp &= ~X86_EFL_STATUS_BITS; \
    134         fEflTmp |= (a_CfExpr) << X86_EFL_CF_BIT; \
    135         fEflTmp |= IEM_EFL_CALC_PARITY(a_uResult); \
    136         fEflTmp |= ((uint32_t)(a_uResult) ^ (uint32_t)(a_uSrc) ^ (uint32_t)(a_uDst)) & X86_EFL_AF; \
    137         fEflTmp |= X86_EFL_CALC_ZF(a_uResult); \
    138         fEflTmp |= X86_EFL_CALC_SF(a_uResult, a_cBitsWidth); \
     132        a_fEFlagsVar &= ~X86_EFL_STATUS_BITS; \
     133        a_fEFlagsVar |= (a_CfExpr) << X86_EFL_CF_BIT; \
     134        a_fEFlagsVar |= IEM_EFL_CALC_PARITY(a_uResult); \
     135        a_fEFlagsVar |= ((uint32_t)(a_uResult) ^ (uint32_t)(a_uSrc) ^ (uint32_t)(a_uDst)) & X86_EFL_AF; \
     136        a_fEFlagsVar |= X86_EFL_CALC_ZF(a_uResult); \
     137        a_fEFlagsVar |= X86_EFL_CALC_SF(a_uResult, a_cBitsWidth); \
    139138        \
    140139        /* Overflow during ADDition happens when both inputs have the same signed \
     
    147146           \
    148147           See also: http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt */ \
    149         fEflTmp |= X86_EFL_GET_OF_ ## a_cBitsWidth(  (  ((uint ## a_cBitsWidth ## _t)~((a_uDst) ^ (a_uSrcOf))) \
    150                                                       & RT_BIT_64(a_cBitsWidth - 1)) \
    151                                                    & ((a_uResult) ^ (a_uDst)) ); \
    152         *(a_pfEFlags) = fEflTmp; \
     148        a_fEFlagsVar |= X86_EFL_GET_OF_ ## a_cBitsWidth(  (  ((uint ## a_cBitsWidth ## _t)~((a_uDst) ^ (a_uSrcOf))) \
     149                                                           & RT_BIT_64(a_cBitsWidth - 1)) \
     150                                                        & ((a_uResult) ^ (a_uDst)) ); \
    153151    } while (0)
    154152
     
    161159 *
    162160 * @returns Status bits.
    163  * @param   a_pfEFlags      Pointer to the 32-bit EFLAGS value to update.
     161 * @param   a_fEFlagsVar    The 32-bit EFLAGS variable to update.
    164162 * @param   a_uResult       Unsigned result value.
    165163 * @param   a_cBitsWidth    The width of the result (8, 16, 32, 64).
    166164 * @param   a_fExtra        Additional bits to set.
    167165 */
    168 #define IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(a_pfEFlags, a_uResult, a_cBitsWidth, a_fExtra) \
     166#define IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(a_fEFlagsVar, a_uResult, a_cBitsWidth, a_fExtra) \
    169167    do { \
    170         uint32_t fEflTmp = *(a_pfEFlags); \
    171         fEflTmp &= ~X86_EFL_STATUS_BITS; \
    172         fEflTmp |= IEM_EFL_CALC_PARITY(a_uResult); \
    173         fEflTmp |= X86_EFL_CALC_ZF(a_uResult); \
    174         fEflTmp |= X86_EFL_CALC_SF(a_uResult, a_cBitsWidth); \
    175         fEflTmp |= (a_fExtra); \
    176         *(a_pfEFlags) = fEflTmp; \
     168        a_fEFlagsVar &= ~X86_EFL_STATUS_BITS; \
     169        a_fEFlagsVar |= IEM_EFL_CALC_PARITY(a_uResult); \
     170        a_fEFlagsVar |= X86_EFL_CALC_ZF(a_uResult); \
     171        a_fEFlagsVar |= X86_EFL_CALC_SF(a_uResult, a_cBitsWidth); \
     172        a_fEFlagsVar |= (a_fExtra); \
    177173    } while (0)
    178174
     
    676672 */
    677673
    678 IEM_DECL_IMPL_DEF(void, iemAImpl_add_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     674IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_add_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
    679675{
    680676    uint64_t uDst    = *puDst;
    681677    uint64_t uResult = uDst + uSrc;
    682678    *puDst = uResult;
    683     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 64, uResult < uDst, uSrc);
     679    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 64, uResult < uDst, uSrc);
     680    return fEFlags;
    684681}
    685682
    686683# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    687684
    688 IEM_DECL_IMPL_DEF(void, iemAImpl_add_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     685IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_add_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
    689686{
    690687    uint32_t uDst    = *puDst;
    691688    uint32_t uResult = uDst + uSrc;
    692689    *puDst = uResult;
    693     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 32, uResult < uDst, uSrc);
    694 }
    695 
    696 
    697 IEM_DECL_IMPL_DEF(void, iemAImpl_add_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     690    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 32, uResult < uDst, uSrc);
     691    return fEFlags;
     692}
     693
     694
     695IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_add_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
    698696{
    699697    uint16_t uDst    = *puDst;
    700698    uint16_t uResult = uDst + uSrc;
    701699    *puDst = uResult;
    702     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 16, uResult < uDst, uSrc);
    703 }
    704 
    705 
    706 IEM_DECL_IMPL_DEF(void, iemAImpl_add_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     700    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 16, uResult < uDst, uSrc);
     701    return fEFlags;
     702}
     703
     704
     705IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_add_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
    707706{
    708707    uint8_t uDst    = *puDst;
    709708    uint8_t uResult = uDst + uSrc;
    710709    *puDst = uResult;
    711     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 8, uResult < uDst, uSrc);
     710    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 8, uResult < uDst, uSrc);
     711    return fEFlags;
    712712}
    713713
     
    718718 */
    719719
    720 IEM_DECL_IMPL_DEF(void, iemAImpl_adc_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
    721 {
    722     if (!(*pfEFlags & X86_EFL_CF))
    723         iemAImpl_add_u64(puDst, uSrc, pfEFlags);
     720IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_adc_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
     721{
     722    if (!(fEFlags & X86_EFL_CF))
     723        fEFlags = iemAImpl_add_u64(fEFlags, puDst, uSrc);
    724724    else
    725725    {
     
    727727        uint64_t uResult = uDst + uSrc + 1;
    728728        *puDst = uResult;
    729         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 64, uResult <= uDst, uSrc);
    730     }
     729        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 64, uResult <= uDst, uSrc);
     730    }
     731    return fEFlags;
    731732}
    732733
    733734# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    734735
    735 IEM_DECL_IMPL_DEF(void, iemAImpl_adc_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
    736 {
    737     if (!(*pfEFlags & X86_EFL_CF))
    738         iemAImpl_add_u32(puDst, uSrc, pfEFlags);
     736IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_adc_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
     737{
     738    if (!(fEFlags & X86_EFL_CF))
     739        fEFlags = iemAImpl_add_u32(fEFlags, puDst, uSrc);
    739740    else
    740741    {
     
    742743        uint32_t uResult = uDst + uSrc + 1;
    743744        *puDst = uResult;
    744         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 32, uResult <= uDst, uSrc);
    745     }
    746 }
    747 
    748 
    749 IEM_DECL_IMPL_DEF(void, iemAImpl_adc_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
    750 {
    751     if (!(*pfEFlags & X86_EFL_CF))
    752         iemAImpl_add_u16(puDst, uSrc, pfEFlags);
     745        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 32, uResult <= uDst, uSrc);
     746    }
     747    return fEFlags;
     748}
     749
     750
     751IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_adc_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
     752{
     753    if (!(fEFlags & X86_EFL_CF))
     754        fEFlags = iemAImpl_add_u16(fEFlags, puDst, uSrc);
    753755    else
    754756    {
     
    756758        uint16_t uResult = uDst + uSrc + 1;
    757759        *puDst = uResult;
    758         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 16, uResult <= uDst, uSrc);
    759     }
    760 }
    761 
    762 
    763 IEM_DECL_IMPL_DEF(void, iemAImpl_adc_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
    764 {
    765     if (!(*pfEFlags & X86_EFL_CF))
    766         iemAImpl_add_u8(puDst, uSrc, pfEFlags);
     760        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 16, uResult <= uDst, uSrc);
     761    }
     762    return fEFlags;
     763}
     764
     765
     766IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_adc_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
     767{
     768    if (!(fEFlags & X86_EFL_CF))
     769        fEFlags = iemAImpl_add_u8(fEFlags, puDst, uSrc);
    767770    else
    768771    {
     
    770773        uint8_t uResult = uDst + uSrc + 1;
    771774        *puDst = uResult;
    772         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 8, uResult <= uDst, uSrc);
    773     }
     775        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 8, uResult <= uDst, uSrc);
     776    }
     777    return fEFlags;
    774778}
    775779
     
    781785# if !defined(RT_ARCH_ARM64)
    782786
    783 IEM_DECL_IMPL_DEF(void, iemAImpl_sub_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     787IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sub_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
    784788{
    785789    uint64_t uDst    = *puDst;
    786790    uint64_t uResult = uDst - uSrc;
    787791    *puDst = uResult;
    788     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 64, uDst < uSrc, uSrc ^ RT_BIT_64(63));
     792    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 64, uDst < uSrc, uSrc ^ RT_BIT_64(63));
     793    return fEFlags;
    789794}
    790795
    791796#  if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    792797
    793 IEM_DECL_IMPL_DEF(void, iemAImpl_sub_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     798IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sub_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
    794799{
    795800    uint32_t uDst    = *puDst;
    796801    uint32_t uResult = uDst - uSrc;
    797802    *puDst = uResult;
    798     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 32, uDst < uSrc, uSrc ^ RT_BIT_32(31));
    799 }
    800 
    801 
    802 IEM_DECL_IMPL_DEF(void, iemAImpl_sub_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     803    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 32, uDst < uSrc, uSrc ^ RT_BIT_32(31));
     804    return fEFlags;
     805}
     806
     807
     808IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sub_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
    803809{
    804810    uint16_t uDst    = *puDst;
    805811    uint16_t uResult = uDst - uSrc;
    806812    *puDst = uResult;
    807     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 16, uDst < uSrc, uSrc ^ (uint16_t)0x8000);
    808 }
    809 
    810 
    811 IEM_DECL_IMPL_DEF(void, iemAImpl_sub_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     813    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 16, uDst < uSrc, uSrc ^ (uint16_t)0x8000);
     814    return fEFlags;
     815}
     816
     817
     818IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sub_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
    812819{
    813820    uint8_t uDst    = *puDst;
    814821    uint8_t uResult = uDst - uSrc;
    815822    *puDst = uResult;
    816     IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 8, uDst < uSrc, uSrc ^ (uint8_t)0x80);
     823    IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 8, uDst < uSrc, uSrc ^ (uint8_t)0x80);
     824    return fEFlags;
    817825}
    818826
     
    824832 */
    825833
    826 IEM_DECL_IMPL_DEF(void, iemAImpl_sbb_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
    827 {
    828     if (!(*pfEFlags & X86_EFL_CF))
    829         iemAImpl_sub_u64(puDst, uSrc, pfEFlags);
     834IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sbb_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
     835{
     836    if (!(fEFlags & X86_EFL_CF))
     837        fEFlags = iemAImpl_sub_u64(fEFlags, puDst, uSrc);
    830838    else
    831839    {
     
    833841        uint64_t uResult = uDst - uSrc - 1;
    834842        *puDst = uResult;
    835         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 64, uDst <= uSrc, uSrc ^ RT_BIT_64(63));
    836     }
     843        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 64, uDst <= uSrc, uSrc ^ RT_BIT_64(63));
     844    }
     845    return fEFlags;
    837846}
    838847
    839848# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    840849
    841 IEM_DECL_IMPL_DEF(void, iemAImpl_sbb_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
    842 {
    843     if (!(*pfEFlags & X86_EFL_CF))
    844         iemAImpl_sub_u32(puDst, uSrc, pfEFlags);
     850IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sbb_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
     851{
     852    if (!(fEFlags & X86_EFL_CF))
     853        fEFlags = iemAImpl_sub_u32(fEFlags, puDst, uSrc);
    845854    else
    846855    {
     
    848857        uint32_t uResult = uDst - uSrc - 1;
    849858        *puDst = uResult;
    850         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 32, uDst <= uSrc, uSrc ^ RT_BIT_32(31));
    851     }
    852 }
    853 
    854 
    855 IEM_DECL_IMPL_DEF(void, iemAImpl_sbb_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
    856 {
    857     if (!(*pfEFlags & X86_EFL_CF))
    858         iemAImpl_sub_u16(puDst, uSrc, pfEFlags);
     859        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 32, uDst <= uSrc, uSrc ^ RT_BIT_32(31));
     860    }
     861    return fEFlags;
     862}
     863
     864
     865IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sbb_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
     866{
     867    if (!(fEFlags & X86_EFL_CF))
     868        fEFlags = iemAImpl_sub_u16(fEFlags, puDst, uSrc);
    859869    else
    860870    {
     
    862872        uint16_t uResult = uDst - uSrc - 1;
    863873        *puDst = uResult;
    864         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 16, uDst <= uSrc, uSrc ^ (uint16_t)0x8000);
    865     }
    866 }
    867 
    868 
    869 IEM_DECL_IMPL_DEF(void, iemAImpl_sbb_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
    870 {
    871     if (!(*pfEFlags & X86_EFL_CF))
    872         iemAImpl_sub_u8(puDst, uSrc, pfEFlags);
     874        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 16, uDst <= uSrc, uSrc ^ (uint16_t)0x8000);
     875    }
     876    return fEFlags;
     877}
     878
     879
     880IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sbb_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
     881{
     882    if (!(fEFlags & X86_EFL_CF))
     883        fEFlags = iemAImpl_sub_u8(fEFlags, puDst, uSrc);
    873884    else
    874885    {
     
    876887        uint8_t uResult = uDst - uSrc - 1;
    877888        *puDst = uResult;
    878         IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(pfEFlags, uResult, uDst, uSrc, 8, uDst <= uSrc, uSrc ^ (uint8_t)0x80);
    879     }
     889        IEM_EFL_UPDATE_STATUS_BITS_FOR_ARITHMETIC(fEFlags, uResult, uDst, uSrc, 8, uDst <= uSrc, uSrc ^ (uint8_t)0x80);
     890    }
     891    return fEFlags;
    880892}
    881893
     
    887899 */
    888900
    889 IEM_DECL_IMPL_DEF(void, iemAImpl_or_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     901IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_or_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
    890902{
    891903    uint64_t uResult = *puDst | uSrc;
    892904    *puDst = uResult;
    893     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 64, 0);
     905    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 64, 0);
     906    return fEFlags;
    894907}
    895908
    896909# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    897910
    898 IEM_DECL_IMPL_DEF(void, iemAImpl_or_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     911IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_or_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
    899912{
    900913    uint32_t uResult = *puDst | uSrc;
    901914    *puDst = uResult;
    902     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 32, 0);
    903 }
    904 
    905 
    906 IEM_DECL_IMPL_DEF(void, iemAImpl_or_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     915    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 32, 0);
     916    return fEFlags;
     917}
     918
     919
     920IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_or_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
    907921{
    908922    uint16_t uResult = *puDst | uSrc;
    909923    *puDst = uResult;
    910     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 16, 0);
    911 }
    912 
    913 
    914 IEM_DECL_IMPL_DEF(void, iemAImpl_or_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     924    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 16, 0);
     925    return fEFlags;
     926}
     927
     928
     929IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_or_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
    915930{
    916931    uint8_t uResult = *puDst | uSrc;
    917932    *puDst = uResult;
    918     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 8, 0);
     933    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 8, 0);
     934    return fEFlags;
    919935}
    920936
     
    925941 */
    926942
    927 IEM_DECL_IMPL_DEF(void, iemAImpl_xor_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     943IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_xor_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
    928944{
    929945    uint64_t uResult = *puDst ^ uSrc;
    930946    *puDst = uResult;
    931     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 64, 0);
     947    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 64, 0);
     948    return fEFlags;
    932949}
    933950
    934951# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    935952
    936 IEM_DECL_IMPL_DEF(void, iemAImpl_xor_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     953IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_xor_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
    937954{
    938955    uint32_t uResult = *puDst ^ uSrc;
    939956    *puDst = uResult;
    940     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 32, 0);
    941 }
    942 
    943 
    944 IEM_DECL_IMPL_DEF(void, iemAImpl_xor_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     957    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 32, 0);
     958    return fEFlags;
     959}
     960
     961
     962IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_xor_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
    945963{
    946964    uint16_t uResult = *puDst ^ uSrc;
    947965    *puDst = uResult;
    948     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 16, 0);
    949 }
    950 
    951 
    952 IEM_DECL_IMPL_DEF(void, iemAImpl_xor_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     966    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 16, 0);
     967    return fEFlags;
     968}
     969
     970
     971IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_xor_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
    953972{
    954973    uint8_t uResult = *puDst ^ uSrc;
    955974    *puDst = uResult;
    956     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 8, 0);
     975    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 8, 0);
     976    return fEFlags;
    957977}
    958978
     
    963983 */
    964984
    965 IEM_DECL_IMPL_DEF(void, iemAImpl_and_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     985IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_and_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc))
    966986{
    967987    uint64_t const uResult = *puDst & uSrc;
    968988    *puDst = uResult;
    969     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 64, 0);
     989    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 64, 0);
     990    return fEFlags;
    970991}
    971992
    972993# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    973994
    974 IEM_DECL_IMPL_DEF(void, iemAImpl_and_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     995IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_and_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc))
    975996{
    976997    uint32_t const uResult = *puDst & uSrc;
    977998    *puDst = uResult;
    978     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 32, 0);
    979 }
    980 
    981 
    982 IEM_DECL_IMPL_DEF(void, iemAImpl_and_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     999    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 32, 0);
     1000    return fEFlags;
     1001}
     1002
     1003
     1004IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_and_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc))
    9831005{
    9841006    uint16_t const uResult = *puDst & uSrc;
    9851007    *puDst = uResult;
    986     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 16, 0);
    987 }
    988 
    989 
    990 IEM_DECL_IMPL_DEF(void, iemAImpl_and_u8,(uint8_t *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     1008    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 16, 0);
     1009    return fEFlags;
     1010}
     1011
     1012
     1013IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_and_u8,(uint32_t fEFlags, uint8_t *puDst, uint8_t uSrc))
    9911014{
    9921015    uint8_t const uResult = *puDst & uSrc;
    9931016    *puDst = uResult;
    994     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 8, 0);
     1017    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 8, 0);
     1018    return fEFlags;
    9951019}
    9961020
     
    10061030    uint64_t const uResult = ~uSrc1 & uSrc2;
    10071031    *puDst = uResult;
    1008     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 64, 0);
     1032    uint32_t fEFlags = *pfEFlags;
     1033    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 64, 0);
     1034    *pfEFlags = fEFlags;
    10091035}
    10101036
     
    10141040    uint32_t const uResult = ~uSrc1 & uSrc2;
    10151041    *puDst = uResult;
    1016     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 32, 0);
     1042    uint32_t fEFlags = *pfEFlags;
     1043    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 32, 0);
     1044    *pfEFlags = fEFlags;
    10171045}
    10181046
     
    10391067 */
    10401068
    1041 IEM_DECL_IMPL_DEF(void, iemAImpl_cmp_u64,(uint64_t const *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     1069IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cmp_u64,(uint32_t fEFlags, uint64_t const *puDst, uint64_t uSrc))
    10421070{
    10431071    uint64_t uDstTmp = *puDst;
    1044     iemAImpl_sub_u64(&uDstTmp, uSrc, pfEFlags);
     1072    return iemAImpl_sub_u64(fEFlags, &uDstTmp, uSrc);
    10451073}
    10461074
    10471075# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    10481076
    1049 IEM_DECL_IMPL_DEF(void, iemAImpl_cmp_u32,(uint32_t const *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     1077IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cmp_u32,(uint32_t fEFlags, uint32_t const *puDst, uint32_t uSrc))
    10501078{
    10511079    uint32_t uDstTmp = *puDst;
    1052     iemAImpl_sub_u32(&uDstTmp, uSrc, pfEFlags);
    1053 }
    1054 
    1055 
    1056 IEM_DECL_IMPL_DEF(void, iemAImpl_cmp_u16,(uint16_t const *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     1080    return iemAImpl_sub_u32(fEFlags, &uDstTmp, uSrc);
     1081}
     1082
     1083
     1084IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cmp_u16,(uint32_t fEFlags, uint16_t const *puDst, uint16_t uSrc))
    10571085{
    10581086    uint16_t uDstTmp = *puDst;
    1059     iemAImpl_sub_u16(&uDstTmp, uSrc, pfEFlags);
    1060 }
    1061 
    1062 
    1063 IEM_DECL_IMPL_DEF(void, iemAImpl_cmp_u8,(uint8_t const *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     1087    return iemAImpl_sub_u16(fEFlags, &uDstTmp, uSrc);
     1088}
     1089
     1090
     1091IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cmp_u8,(uint32_t fEFlags, uint8_t const *puDst, uint8_t uSrc))
    10641092{
    10651093    uint8_t uDstTmp = *puDst;
    1066     iemAImpl_sub_u8(&uDstTmp, uSrc, pfEFlags);
     1094    return iemAImpl_sub_u8(fEFlags, &uDstTmp, uSrc);
    10671095}
    10681096
     
    10731101 */
    10741102
    1075 IEM_DECL_IMPL_DEF(void, iemAImpl_test_u64,(uint64_t const *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     1103IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_test_u64,(uint32_t fEFlags, uint64_t const *puDst, uint64_t uSrc))
    10761104{
    10771105    uint64_t uResult = *puDst & uSrc;
    1078     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 64, 0);
     1106    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 64, 0);
     1107    return fEFlags;
    10791108}
    10801109
    10811110# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    10821111
    1083 IEM_DECL_IMPL_DEF(void, iemAImpl_test_u32,(uint32_t const *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     1112IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_test_u32,(uint32_t fEFlags, uint32_t const *puDst, uint32_t uSrc))
    10841113{
    10851114    uint32_t uResult = *puDst & uSrc;
    1086     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 32, 0);
    1087 }
    1088 
    1089 
    1090 IEM_DECL_IMPL_DEF(void, iemAImpl_test_u16,(uint16_t const *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     1115    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 32, 0);
     1116    return fEFlags;
     1117}
     1118
     1119
     1120IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_test_u16,(uint32_t fEFlags, uint16_t const *puDst, uint16_t uSrc))
    10911121{
    10921122    uint16_t uResult = *puDst & uSrc;
    1093     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 16, 0);
    1094 }
    1095 
    1096 
    1097 IEM_DECL_IMPL_DEF(void, iemAImpl_test_u8,(uint8_t const *puDst, uint8_t uSrc, uint32_t *pfEFlags))
     1123    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 16, 0);
     1124    return fEFlags;
     1125}
     1126
     1127
     1128IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_test_u8,(uint32_t fEFlags, uint8_t const *puDst, uint8_t uSrc))
    10981129{
    10991130    uint8_t uResult = *puDst & uSrc;
    1100     IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(pfEFlags, uResult, 8, 0);
     1131    IEM_EFL_UPDATE_STATUS_BITS_FOR_LOGICAL(fEFlags, uResult, 8, 0);
     1132    return fEFlags;
    11011133}
    11021134
     
    11171149        { \
    11181150            uTmp = uOld; \
    1119             fEflTmp = *pfEFlags; \
    1120             iemAImpl_ ## a_Mnemonic ## _u ## a_cBitsWidth(&uTmp, uSrc, &fEflTmp); \
     1151            fEflTmp = iemAImpl_ ## a_Mnemonic ## _u ## a_cBitsWidth(fEFlagsIn, &uTmp, uSrc); \
    11211152        } while (!ASMAtomicCmpXchgExU ## a_cBitsWidth(puDst, uTmp, uOld, &uOld)); \
    1122         *pfEFlags = fEflTmp; \
     1153        return fEflTmp; \
    11231154    } while (0)
    11241155
    11251156
    11261157#define EMIT_LOCKED_BIN_OP(a_Mnemonic, a_cBitsWidth) \
    1127     IEM_DECL_IMPL_DEF(void, iemAImpl_ ## a_Mnemonic ## _u ## a_cBitsWidth ##  _locked,(uint ## a_cBitsWidth ## _t *puDst, \
    1128                                                                                        uint ## a_cBitsWidth ## _t uSrc, \
    1129                                                                                        uint32_t *pfEFlags)) \
     1158    IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_ ## a_Mnemonic ## _u ## a_cBitsWidth ##  _locked,(uint32_t fEFlagsIn, \
     1159                                                                                           uint ## a_cBitsWidth ## _t *puDst, \
     1160                                                                                           uint ## a_cBitsWidth ## _t uSrc)) \
    11301161    { \
    11311162        DO_LOCKED_BIN_OP(a_Mnemonic, a_cBitsWidth); \
     
    14071438
    14081439
    1409 EMIT_LOCKED_BIN_OP(btc, 64)
    1410 EMIT_LOCKED_BIN_OP(btr, 64)
    1411 EMIT_LOCKED_BIN_OP(bts, 64)
     1440/** 64-bit locked binary operand operation. */
     1441# define DO_LOCKED_BIN_TODO_OP(a_Mnemonic, a_cBitsWidth) \
     1442    do { \
     1443        uint ## a_cBitsWidth ## _t uOld = ASMAtomicUoReadU ## a_cBitsWidth(puDst); \
     1444        uint ## a_cBitsWidth ## _t uTmp; \
     1445        uint32_t fEflTmp; \
     1446        do \
     1447        { \
     1448            uTmp = uOld; \
     1449            fEflTmp = *pfEFlags; \
     1450            iemAImpl_ ## a_Mnemonic ## _u ## a_cBitsWidth(&uTmp, uSrc, &fEflTmp); \
     1451        } while (!ASMAtomicCmpXchgExU ## a_cBitsWidth(puDst, uTmp, uOld, &uOld)); \
     1452        *pfEFlags = fEflTmp; \
     1453    } while (0)
     1454
     1455
     1456#define EMIT_LOCKED_BIN_TODO_OP(a_Mnemonic, a_cBitsWidth) \
     1457    IEM_DECL_IMPL_DEF(void, iemAImpl_ ## a_Mnemonic ## _u ## a_cBitsWidth ##  _locked,(uint ## a_cBitsWidth ## _t *puDst, \
     1458                                                                                       uint ## a_cBitsWidth ## _t uSrc, \
     1459                                                                                       uint32_t *pfEFlags)) \
     1460    { \
     1461        DO_LOCKED_BIN_TODO_OP(a_Mnemonic, a_cBitsWidth); \
     1462    }
     1463
     1464
     1465EMIT_LOCKED_BIN_TODO_OP(btc, 64)
     1466EMIT_LOCKED_BIN_TODO_OP(btr, 64)
     1467EMIT_LOCKED_BIN_TODO_OP(bts, 64)
    14121468# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    1413 EMIT_LOCKED_BIN_OP(btc, 32)
    1414 EMIT_LOCKED_BIN_OP(btr, 32)
    1415 EMIT_LOCKED_BIN_OP(bts, 32)
    1416 
    1417 EMIT_LOCKED_BIN_OP(btc, 16)
    1418 EMIT_LOCKED_BIN_OP(btr, 16)
    1419 EMIT_LOCKED_BIN_OP(bts, 16)
     1469EMIT_LOCKED_BIN_TODO_OP(btc, 32)
     1470EMIT_LOCKED_BIN_TODO_OP(btr, 32)
     1471EMIT_LOCKED_BIN_TODO_OP(bts, 32)
     1472
     1473EMIT_LOCKED_BIN_TODO_OP(btc, 16)
     1474EMIT_LOCKED_BIN_TODO_OP(btr, 16)
     1475EMIT_LOCKED_BIN_TODO_OP(bts, 16)
    14201476# endif /* !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY) */
    14211477
     
    17571813    uint32_t fEfl2 = fEfl1; \
    17581814    *puDst = uSrc; \
    1759     iemAImpl_sub_u ## a_cBits(&uSrc, 1, &fEfl1); \
    1760     iemAImpl_and_u ## a_cBits(puDst, uSrc, &fEfl2); \
     1815    fEfl1 = iemAImpl_sub_u ## a_cBits(fEfl1, &uSrc, 1); \
     1816    fEfl2 = iemAImpl_and_u ## a_cBits(fEfl2, puDst, uSrc); \
    17611817    \
    17621818    /* AMD: The carry flag is from the SUB operation. */ \
     
    17851841    uint32_t fEfl2 = fEfl1; \
    17861842    *puDst = uSrc; \
    1787     iemAImpl_sub_u ## a_cBits(&uSrc, 1, &fEfl1); \
    1788     iemAImpl_xor_u ## a_cBits(puDst, uSrc, &fEfl2); \
     1843    fEfl1 = iemAImpl_sub_u ## a_cBits(fEfl1, &uSrc, 1); \
     1844    fEfl2 = iemAImpl_xor_u ## a_cBits(fEfl2, puDst, uSrc); \
    17891845    \
    17901846    /* AMD: The carry flag is from the SUB operation. */ \
     
    18141870    *puDst = uSrc; \
    18151871    iemAImpl_neg_u ## a_cBits(&uSrc, &fEfl1); \
    1816     iemAImpl_and_u ## a_cBits(puDst, uSrc, &fEfl2); \
     1872    fEfl2 = iemAImpl_and_u ## a_cBits(fEfl2, puDst, uSrc); \
    18171873    \
    18181874    /* AMD: The carry flag is from the SUB operation. */ \
     
    20232079    a_Type uDst    = *puDst; \
    20242080    a_Type uResult = uDst; \
    2025     iemAImpl_add_u ## a_cBitsWidth(&uResult, *puReg, pfEFlags); \
     2081    *pfEFlags = iemAImpl_add_u ## a_cBitsWidth(*pfEFlags, &uResult, *puReg); \
    20262082    *puDst = uResult; \
    20272083    *puReg = uDst; \
     
    20362092    { \
    20372093        uResult = uOld; \
    2038         fEflTmp = *pfEFlags; \
    2039         iemAImpl_add_u ## a_cBitsWidth(&uResult, *puReg, &fEflTmp); \
     2094        fEflTmp = iemAImpl_add_u ## a_cBitsWidth(*pfEFlags, &uResult, *puReg); \
    20402095    } while (!ASMAtomicCmpXchgExU ## a_cBitsWidth(puDst, uResult, uOld, &uOld)); \
    20412096    *puReg    = uOld; \
     
    20642119    if (ASMAtomicCmpXchgExU8(pu8Dst, uSrcReg, uOld, puAl))
    20652120        Assert(*puAl == uOld);
    2066     iemAImpl_cmp_u8(&uOld, *puAl, pEFlags);
     2121    *pEFlags = iemAImpl_cmp_u8(*pEFlags, &uOld, *puAl);
    20672122}
    20682123
     
    20732128    if (ASMAtomicCmpXchgExU16(pu16Dst, uSrcReg, uOld, puAx))
    20742129        Assert(*puAx == uOld);
    2075     iemAImpl_cmp_u16(&uOld, *puAx, pEFlags);
     2130    *pEFlags = iemAImpl_cmp_u16(*pEFlags, &uOld, *puAx);
    20762131}
    20772132
     
    20822137    if (ASMAtomicCmpXchgExU32(pu32Dst, uSrcReg, uOld, puEax))
    20832138        Assert(*puEax == uOld);
    2084     iemAImpl_cmp_u32(&uOld, *puEax, pEFlags);
     2139    *pEFlags = iemAImpl_cmp_u32(*pEFlags, &uOld, *puEax);
    20852140}
    20862141
     
    20982153    if (ASMAtomicCmpXchgExU64(pu64Dst, uSrcReg, uOld, puRax))
    20992154        Assert(*puRax == uOld);
    2100     iemAImpl_cmp_u64(&uOld, *puRax, pEFlags);
     2155    *pEFlags = iemAImpl_cmp_u64(*pEFlags, &uOld, *puRax);
    21012156}
    21022157
     
    21852240        {
    21862241            *pu16Dst = uSrcReg;
    2187             iemAImpl_cmp_u16(&uOld, uOld, pEFlags);
     2242            *pEFlags = iemAImpl_cmp_u16(*pEFlags, &uOld, uOld);
    21882243        }
    21892244        else
    21902245        {
    21912246            *puAx = uDst;
    2192             iemAImpl_cmp_u16(&uOld, uDst, pEFlags);
     2247            *pEFlags = iemAImpl_cmp_u16(*pEFlags, &uOld, uDst);
    21932248        }
    21942249    }
     
    22112266        {
    22122267            *pu32Dst = uSrcReg;
    2213             iemAImpl_cmp_u32(&uOld, uOld, pEFlags);
     2268            *pEFlags = iemAImpl_cmp_u32(*pEFlags, &uOld, uOld);
    22142269        }
    22152270        else
    22162271        {
    22172272            *puEax = uDst;
    2218             iemAImpl_cmp_u32(&uOld, uDst, pEFlags);
     2273            *pEFlags = iemAImpl_cmp_u32(*pEFlags, &uOld, uDst);
    22192274        }
    22202275    }
     
    22392294        {
    22402295            *pu64Dst = uSrc;
    2241             iemAImpl_cmp_u64(&uOld, uOld, pEFlags);
     2296            *pEFlags = iemAImpl_cmp_u64(*pEFlags, &uOld, uOld);
    22422297        }
    22432298        else
    22442299        {
    22452300            *puRax = uDst;
    2246             iemAImpl_cmp_u64(&uOld, uDst, pEFlags);
     2301            *pEFlags = iemAImpl_cmp_u64(*pEFlags, &uOld, uDst);
    22472302        }
    22482303    }
     
    22642319        {
    22652320            *pu64Dst = uSrcReg;
    2266             iemAImpl_cmp_u64(&uOld, uOld, pEFlags);
     2321            *pEFlags = iemAImpl_cmp_u64(*pEFlags, &uOld, uOld);
    22672322        }
    22682323        else
    22692324        {
    22702325            *puRax = uDst;
    2271             iemAImpl_cmp_u64(&uOld, uDst, pEFlags);
     2326            *pEFlags = iemAImpl_cmp_u64(*pEFlags, &uOld, uDst);
    22722327        }
    22732328    }
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp

    r103734 r104195  
    255255static void iemHlpUpdateArithEFlagsU8(PVMCPUCC pVCpu, uint8_t u8Result, uint32_t fToUpdate, uint32_t fUndefined)
    256256{
    257     uint32_t fEFlags = pVCpu->cpum.GstCtx.eflags.u;
    258     iemAImpl_test_u8(&u8Result, u8Result, &fEFlags);
     257    uint32_t fEFlags = iemAImpl_test_u8(pVCpu->cpum.GstCtx.eflags.u, &u8Result, u8Result);
    259258    pVCpu->cpum.GstCtx.eflags.u &= ~(fToUpdate | fUndefined);
    260259    pVCpu->cpum.GstCtx.eflags.u |= (fToUpdate | fUndefined) & fEFlags;
     
    272271static void iemHlpUpdateArithEFlagsU16(PVMCPUCC pVCpu, uint16_t u16Result, uint32_t fToUpdate, uint32_t fUndefined)
    273272{
    274     uint32_t fEFlags = pVCpu->cpum.GstCtx.eflags.u;
    275     iemAImpl_test_u16(&u16Result, u16Result, &fEFlags);
     273    uint32_t fEFlags = iemAImpl_test_u16(pVCpu->cpum.GstCtx.eflags.u, &u16Result, u16Result);
    276274    pVCpu->cpum.GstCtx.eflags.u &= ~(fToUpdate | fUndefined);
    277275    pVCpu->cpum.GstCtx.eflags.u |= (fToUpdate | fUndefined) & fEFlags;
     
    84308428            || (pVCpu->cpum.GstCtx.ax & 0xf) >= 10)
    84318429        {
    8432             iemAImpl_add_u16(&pVCpu->cpum.GstCtx.ax, 0x106, &pVCpu->cpum.GstCtx.eflags.uBoth);
     8430            pVCpu->cpum.GstCtx.eflags.uBoth = iemAImpl_add_u16(pVCpu->cpum.GstCtx.eflags.uBoth, &pVCpu->cpum.GstCtx.ax, 0x106);
    84338431            pVCpu->cpum.GstCtx.eflags.Bits.u1AF = 1;
    84348432            pVCpu->cpum.GstCtx.eflags.Bits.u1CF = 1;
     
    84748472            || (pVCpu->cpum.GstCtx.ax & 0xf) >= 10)
    84758473        {
    8476             iemAImpl_sub_u16(&pVCpu->cpum.GstCtx.ax, 0x106, &pVCpu->cpum.GstCtx.eflags.uBoth);
     8474            pVCpu->cpum.GstCtx.eflags.uBoth = iemAImpl_sub_u16(pVCpu->cpum.GstCtx.eflags.uBoth, &pVCpu->cpum.GstCtx.ax, 0x106);
    84778475            pVCpu->cpum.GstCtx.eflags.Bits.u1AF = 1;
    84788476            pVCpu->cpum.GstCtx.eflags.Bits.u1CF = 1;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r102430 r104195  
    221221                    {
    222222                        /* All matches, only compare the last itme to get the right eflags. */
    223                         RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&puSrc1Mem[cLeftPage-1], puSrc2Mem[cLeftPage-1], &uEFlags);
     223                        uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&puSrc1Mem[cLeftPage-1], puSrc2Mem[cLeftPage-1]);
    224224                        uSrc1AddrReg += cLeftPage * cbIncr;
    225225                        uSrc2AddrReg += cLeftPage * cbIncr;
     
    233233                        do
    234234                        {
    235                             RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&puSrc1Mem[off], puSrc2Mem[off], &uEFlags);
     235                            uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&puSrc1Mem[off], puSrc2Mem[off]);
    236236                            off++;
    237237                        } while (   off < cLeftPage
     
    275275            if (rcStrict != VINF_SUCCESS)
    276276                return rcStrict;
    277             RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(&uValue1, uValue2, &uEFlags);
     277            uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, &uValue1, uValue2);
    278278
    279279            pVCpu->cpum.GstCtx.ADDR_rSI = uSrc1AddrReg += cbIncr;
     
    387387                    {
    388388                        /* All matches, only compare the last item to get the right eflags. */
    389                         RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&puSrc1Mem[cLeftPage-1], puSrc2Mem[cLeftPage-1], &uEFlags);
     389                        uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&puSrc1Mem[cLeftPage-1], puSrc2Mem[cLeftPage-1]);
    390390                        uSrc1AddrReg += cLeftPage * cbIncr;
    391391                        uSrc2AddrReg += cLeftPage * cbIncr;
     
    399399                        do
    400400                        {
    401                             RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&puSrc1Mem[off], puSrc2Mem[off], &uEFlags);
     401                            uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&puSrc1Mem[off], puSrc2Mem[off]);
    402402                            off++;
    403403                        } while (   off < cLeftPage
     
    441441            if (rcStrict != VINF_SUCCESS)
    442442                return rcStrict;
    443             RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(&uValue1, uValue2, &uEFlags);
     443            uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, &uValue1, uValue2);
    444444
    445445            pVCpu->cpum.GstCtx.ADDR_rSI = uSrc1AddrReg += cbIncr;
     
    538538
    539539                /* Update the regs. */
    540                 RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
     540                uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&uValueReg, uTmpValue);
    541541                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= i;
    542542                pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg    += i * cbIncr;
     
    570570            if (rcStrict != VINF_SUCCESS)
    571571                return rcStrict;
    572             RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
     572            uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&uValueReg, uTmpValue);
    573573
    574574            pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg += cbIncr;
     
    666666
    667667                /* Update the regs. */
    668                 RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
     668                uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&uValueReg, uTmpValue);
    669669                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= i;
    670670                pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg    += i * cbIncr;
     
    698698            if (rcStrict != VINF_SUCCESS)
    699699                return rcStrict;
    700             RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
     700            uEFlags = RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(uEFlags, (OP_TYPE *)&uValueReg, uTmpValue);
    701701            pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg += cbIncr;
    702702            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstCommon.cpp.h

    r104132 r104195  
    4646
    4747/** Function table for the BSF instruction. */
    48 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf =
     48IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_bsf =
    4949{
    5050    NULL,  NULL,
     
    5555
    5656/** Function table for the BSF instruction, AMD EFLAGS variant. */
    57 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf_amd =
     57IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_bsf_amd =
    5858{
    5959    NULL,  NULL,
     
    6464
    6565/** Function table for the BSF instruction, Intel EFLAGS variant. */
    66 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf_intel =
     66IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_bsf_intel =
    6767{
    6868    NULL,  NULL,
     
    7373
    7474/** EFLAGS variation selection table for the BSF instruction. */
    75 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_bsf_eflags[] =
     75IEM_STATIC const IEMOPBINTODOSIZES * const g_iemAImpl_bsf_eflags[] =
    7676{
    7777    &g_iemAImpl_bsf,
     
    8282
    8383/** Function table for the BSR instruction. */
    84 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr =
     84IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_bsr =
    8585{
    8686    NULL,  NULL,
     
    9191
    9292/** Function table for the BSR instruction, AMD EFLAGS variant. */
    93 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr_amd =
     93IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_bsr_amd =
    9494{
    9595    NULL,  NULL,
     
    100100
    101101/** Function table for the BSR instruction, Intel EFLAGS variant. */
    102 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr_intel =
     102IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_bsr_intel =
    103103{
    104104    NULL,  NULL,
     
    109109
    110110/** EFLAGS variation selection table for the BSR instruction. */
    111 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_bsr_eflags[] =
     111IEM_STATIC const IEMOPBINTODOSIZES * const g_iemAImpl_bsr_eflags[] =
    112112{
    113113    &g_iemAImpl_bsr,
     
    118118
    119119/** Function table for the IMUL instruction. */
    120 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two =
     120IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_imul_two =
    121121{
    122122    NULL,  NULL,
     
    127127
    128128/** Function table for the IMUL instruction, AMD EFLAGS variant. */
    129 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two_amd =
     129IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_imul_two_amd =
    130130{
    131131    NULL,  NULL,
     
    136136
    137137/** Function table for the IMUL instruction, Intel EFLAGS variant. */
    138 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two_intel =
     138IEM_STATIC const IEMOPBINTODOSIZES g_iemAImpl_imul_two_intel =
    139139{
    140140    NULL,  NULL,
     
    145145
    146146/** EFLAGS variation selection table for the IMUL instruction. */
    147 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_imul_two_eflags[] =
     147IEM_STATIC const IEMOPBINTODOSIZES * const g_iemAImpl_imul_two_eflags[] =
    148148{
    149149    &g_iemAImpl_imul_two,
     
    154154
    155155/** EFLAGS variation selection table for the 16-bit IMUL instruction. */
    156 IEM_STATIC PFNIEMAIMPLBINU16 const g_iemAImpl_imul_two_u16_eflags[] =
     156IEM_STATIC PFNIEMAIMPLBINTODOU16 const g_iemAImpl_imul_two_u16_eflags[] =
    157157{
    158158    iemAImpl_imul_two_u16,
     
    163163
    164164/** EFLAGS variation selection table for the 32-bit IMUL instruction. */
    165 IEM_STATIC PFNIEMAIMPLBINU32 const g_iemAImpl_imul_two_u32_eflags[] =
     165IEM_STATIC PFNIEMAIMPLBINTODOU32 const g_iemAImpl_imul_two_u32_eflags[] =
    166166{
    167167    iemAImpl_imul_two_u32,
     
    172172
    173173/** EFLAGS variation selection table for the 64-bit IMUL instruction. */
    174 IEM_STATIC PFNIEMAIMPLBINU64 const g_iemAImpl_imul_two_u64_eflags[] =
     174IEM_STATIC PFNIEMAIMPLBINTODOU64 const g_iemAImpl_imul_two_u64_eflags[] =
    175175{
    176176    iemAImpl_imul_two_u64,
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstCommonBodyMacros.h

    r104018 r104195  
    3232 */
    3333
    34 
    35 /**
    36  * Special case body for word/dword/qword instruction like SUB and XOR that can
    37  * be used to zero a register.
    38  *
    39  * This can be used both for the rv_rm and rm_rv forms since it's working on the
    40  * same register.
    41  */
    42 #define IEMOP_BODY_BINARY_rv_SAME_REG_ZERO(a_bRm) \
    43     if (   (a_bRm >> X86_MODRM_REG_SHIFT) == ((a_bRm & X86_MODRM_RM_MASK) | (X86_MOD_REG << X86_MODRM_REG_SHIFT)) \
    44         && pVCpu->iem.s.uRexReg == pVCpu->iem.s.uRexB) \
    45     { \
    46         switch (pVCpu->iem.s.enmEffOpSize) \
    47         { \
    48             case IEMMODE_16BIT: \
    49                 IEM_MC_BEGIN(0, 0); \
    50                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    51                 IEM_MC_STORE_GREG_U16_CONST(IEM_GET_MODRM_RM(pVCpu, a_bRm), 0); \
    52                 IEM_MC_LOCAL_EFLAGS(fEFlags); \
    53                 IEM_MC_AND_LOCAL_U32(fEFlags, ~(uint32_t)X86_EFL_STATUS_BITS); \
    54                 IEM_MC_OR_LOCAL_U32(fEFlags, X86_EFL_PF | X86_EFL_ZF); \
    55                 IEM_MC_COMMIT_EFLAGS(fEFlags); \
    56                 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    57                 IEM_MC_END(); \
    58                 break; \
    59                 \
    60             case IEMMODE_32BIT: \
    61                 IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    62                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    63                 IEM_MC_STORE_GREG_U32_CONST(IEM_GET_MODRM_RM(pVCpu, a_bRm), 0); \
    64                 IEM_MC_LOCAL_EFLAGS(fEFlags); \
    65                 IEM_MC_AND_LOCAL_U32(fEFlags, ~(uint32_t)X86_EFL_STATUS_BITS); \
    66                 IEM_MC_OR_LOCAL_U32(fEFlags, X86_EFL_PF | X86_EFL_ZF); \
    67                 IEM_MC_COMMIT_EFLAGS(fEFlags); \
    68                 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    69                 IEM_MC_END(); \
    70                 break; \
    71                 \
    72             case IEMMODE_64BIT: \
    73                 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    74                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    75                 IEM_MC_STORE_GREG_U64_CONST(IEM_GET_MODRM_RM(pVCpu, a_bRm), 0); \
    76                 IEM_MC_LOCAL_EFLAGS(fEFlags); \
    77                 IEM_MC_AND_LOCAL_U32(fEFlags, ~(uint32_t)X86_EFL_STATUS_BITS); \
    78                 IEM_MC_OR_LOCAL_U32(fEFlags, X86_EFL_PF | X86_EFL_ZF); \
    79                 IEM_MC_COMMIT_EFLAGS(fEFlags); \
    80                 IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    81                 IEM_MC_END(); \
    82                 break; \
    83                 \
    84             IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
    85         } \
    86     } ((void)0)
    8734
    8835/**
     
    10350                IEM_MC_BEGIN(a_f16BitMcFlag, 0); \
    10451                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    105                 IEM_MC_ARG(uint16_t,        u16Src,  1); \
     52                IEM_MC_ARG(uint16_t,        u16Src,     2); \
    10653                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    10754                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    11360                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    11461                } IEM_MC_NATIVE_ELSE() { \
    115                     IEM_MC_ARG(uint16_t *,  pu16Dst, 0); \
     62                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    11663                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    117                     IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    118                     IEM_MC_REF_EFLAGS(pEFlags); \
    119                     IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
     64                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     65                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU16, fEFlagsIn, pu16Dst, u16Src); \
     66                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    12067                } IEM_MC_NATIVE_ENDIF(); \
    12168                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    12673                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    12774                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    128                 IEM_MC_ARG(uint32_t,        u32Src,  1); \
     75                IEM_MC_ARG(uint32_t,        u32Src,     2); \
    12976                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    13077                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    13683                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    13784                } IEM_MC_NATIVE_ELSE() { \
    138                     IEM_MC_ARG(uint32_t *,  pu32Dst, 0); \
     85                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
    13986                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    140                     IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    141                     IEM_MC_REF_EFLAGS(pEFlags); \
    142                     IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     87                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     88                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU32, fEFlagsIn, pu32Dst, u32Src); \
    14389                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     90                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    14491                } IEM_MC_NATIVE_ENDIF(); \
    14592                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    15097                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    15198                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    152                 IEM_MC_ARG(uint64_t,        u64Src,  1); \
     99                IEM_MC_ARG(uint64_t,        u64Src,     2); \
    153100                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    154101                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    160107                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    161108                } IEM_MC_NATIVE_ELSE() { \
    162                     IEM_MC_ARG(uint64_t *,  pu64Dst, 0); \
     109                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    163110                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    164                     IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    165                     IEM_MC_REF_EFLAGS(pEFlags); \
    166                     IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
     111                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     112                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU64, fEFlagsIn, pu64Dst, u64Src); \
     113                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    167114                } IEM_MC_NATIVE_ENDIF(); \
    168115                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    185132                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    186133                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    187                 IEM_MC_ARG(uint16_t,   u16Src,  1); \
     134                IEM_MC_ARG(uint16_t,        u16Src,     2); \
    188135                IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    189136                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    195142                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    196143                } IEM_MC_NATIVE_ELSE() { \
    197                     IEM_MC_ARG(uint16_t *, pu16Dst, 0); \
     144                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    198145                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    199                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    200                     IEM_MC_REF_EFLAGS(pEFlags); \
    201                     IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
     146                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     147                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU16, fEFlagsIn, pu16Dst, u16Src); \
     148                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    202149                } IEM_MC_NATIVE_ENDIF(); \
    203150                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    210157                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    211158                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    212                 IEM_MC_ARG(uint32_t,   u32Src,  1); \
     159                IEM_MC_ARG(uint32_t,        u32Src,     2); \
    213160                IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    214161                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    220167                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    221168                } IEM_MC_NATIVE_ELSE() { \
    222                     IEM_MC_ARG(uint32_t *, pu32Dst, 0); \
    223                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
     169                    IEM_MC_ARG(uint32_t *, pu32Dst,     1); \
    224170                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    225                     IEM_MC_REF_EFLAGS(pEFlags); \
    226                     IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     171                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     172                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU32, fEFlagsIn, pu32Dst, u32Src); \
    227173                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     174                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    228175                } IEM_MC_NATIVE_ENDIF(); \
    229176                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    236183                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    237184                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    238                 IEM_MC_ARG(uint64_t,   u64Src,  1); \
     185                IEM_MC_ARG(uint64_t,        u64Src,  2); \
    239186                IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    240187                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    246193                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    247194                } IEM_MC_NATIVE_ELSE() { \
    248                     IEM_MC_ARG(uint64_t *, pu64Dst, 0); \
    249                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
     195                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    250196                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    251                     IEM_MC_REF_EFLAGS(pEFlags); \
    252                     IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
     197                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     198                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU64, fEFlagsIn, pu64Dst, u64Src); \
     199                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    253200                } IEM_MC_NATIVE_ENDIF(); \
    254201                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    261208    (void)0
    262209
     210
    263211/**
    264  * Body for word/dword/qword the instruction CMP, ++ with a register as the
    265  * destination.
     212 * Body for word/dword/qword instructions like ADD, AND, OR, ++ with a register
     213 * as the destination.
    266214 *
    267215 * @note Used both in OneByte and TwoByte0f.
    268216 */
    269 #define IEMOP_BODY_BINARY_rv_rm_RO(a_bRm, a_InsNm, a_fNativeArchs) \
     217#define IEMOP_BODY_BINARY_TODO_rv_rm(a_bRm, a_fnNormalU16, a_fnNormalU32, a_fnNormalU64, a_f16BitMcFlag, a_EmitterBasename, a_fNativeArchs) \
    270218    /* \
    271219     * If rm is denoting a register, no more instruction bytes. \
     
    276224        { \
    277225            case IEMMODE_16BIT: \
    278                 IEM_MC_BEGIN(0, 0); \
     226                IEM_MC_BEGIN(a_f16BitMcFlag, 0); \
    279227                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    280228                IEM_MC_ARG(uint16_t,        u16Src,  1); \
     
    284232                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    285233                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
    286                     IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     234                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     235                    IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); \
    287236                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    288237                } IEM_MC_NATIVE_ELSE() { \
     
    291240                    IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    292241                    IEM_MC_REF_EFLAGS(pEFlags); \
    293                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     242                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
    294243                } IEM_MC_NATIVE_ENDIF(); \
    295244                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    306255                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    307256                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
    308                     IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     257                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     258                    IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Dst); \
    309259                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    310260                } IEM_MC_NATIVE_ELSE() { \
     
    313263                    IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    314264                    IEM_MC_REF_EFLAGS(pEFlags); \
    315                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     265                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     266                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    316267                } IEM_MC_NATIVE_ENDIF(); \
    317268                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    328279                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    329280                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
    330                     IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     281                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     282                    IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst); \
    331283                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    332284                } IEM_MC_NATIVE_ELSE() { \
     
    335287                    IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    336288                    IEM_MC_REF_EFLAGS(pEFlags); \
    337                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     289                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
    338290                } IEM_MC_NATIVE_ENDIF(); \
    339291                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    352304        { \
    353305            case IEMMODE_16BIT: \
    354                 IEM_MC_BEGIN(0, 0); \
     306                IEM_MC_BEGIN(a_f16BitMcFlag, 0); \
    355307                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
    356308                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     
    362314                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    363315                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
    364                     IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     316                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     317                    IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); \
    365318                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    366319                } IEM_MC_NATIVE_ELSE() { \
     
    369322                    IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    370323                    IEM_MC_REF_EFLAGS(pEFlags); \
    371                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     324                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
    372325                } IEM_MC_NATIVE_ENDIF(); \
    373326                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    386339                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    387340                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
    388                     IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     341                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     342                    IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Dst); \
    389343                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    390344                } IEM_MC_NATIVE_ELSE() { \
     
    393347                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    394348                    IEM_MC_REF_EFLAGS(pEFlags); \
    395                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     349                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     350                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    396351                } IEM_MC_NATIVE_ENDIF(); \
    397352                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    410365                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    411366                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
    412                     IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     367                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     368                    IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst); \
    413369                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    414370                } IEM_MC_NATIVE_ELSE() { \
     
    417373                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    418374                    IEM_MC_REF_EFLAGS(pEFlags); \
    419                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     375                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
    420376                } IEM_MC_NATIVE_ENDIF(); \
    421377                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h

    r104117 r104195  
    9191        IEM_MC_BEGIN(0, 0); \
    9292        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    93         IEM_MC_ARG(uint8_t,         u8Src,   1); \
     93        IEM_MC_ARG(uint8_t,         u8Src,   2); \
    9494        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    9595        IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \
     
    101101            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    102102        } IEM_MC_NATIVE_ELSE() { \
    103             IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     103            IEM_MC_ARG(uint8_t *,   pu8Dst,  1); \
    104104            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    105             IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    106             IEM_MC_REF_EFLAGS(pEFlags); \
    107             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     105            IEM_MC_ARG_EFLAGS(      fEFlags, 0); \
     106            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlags, pu8Dst, u8Src); \
     107            IEM_MC_COMMIT_EFLAGS_OPT(fEFlagsRet); \
    108108        } IEM_MC_NATIVE_ENDIF(); \
    109109        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    114114        /* \
    115115         * We're accessing memory. \
    116          * Note! We're putting the eflags on the stack here so we can commit them \
    117          *       after the memory. \
    118116         */ \
    119117        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK)) \
    120118        { \
    121119            IEM_MC_BEGIN(0, 0); \
    122             IEM_MC_ARG(uint8_t *,  pu8Dst,           0); \
    123             IEM_MC_ARG(uint8_t,    u8Src,            1); \
    124             IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    125             IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    126             \
     120            IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
    127121            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    128122            IEMOP_HLP_DONE_DECODING(); \
     123            \
     124            IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     125            IEM_MC_ARG(uint8_t *,   pu8Dst,         1); \
    129126            IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     127            IEM_MC_ARG(uint8_t,     u8Src,          2); \
    130128            IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    131             IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    132             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     129            IEM_MC_ARG_EFLAGS(      fEFlags,        0); \
     130            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlags, pu8Dst, u8Src); \
    133131            \
    134132            IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    135             IEM_MC_COMMIT_EFLAGS(EFlags); \
     133            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    136134            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    137135            IEM_MC_END(); \
     
    140138        { \
    141139            IEM_MC_BEGIN(0, 0); \
    142             IEM_MC_ARG(uint8_t *,  pu8Dst,           0); \
    143             IEM_MC_ARG(uint8_t,    u8Src,            1); \
    144140            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    145             IEM_MC_LOCAL(uint8_t, bMapInfoDst); \
    146             \
    147141            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    148142            IEMOP_HLP_DONE_DECODING(); \
     143            \
     144            IEM_MC_LOCAL(uint8_t,   bMapInfoDst); \
     145            IEM_MC_ARG(uint8_t *,   pu8Dst,         1); \
    149146            IEM_MC_MEM_MAP_U8_ATOMIC(pu8Dst, bMapInfoDst, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     147            IEM_MC_ARG(uint8_t,     u8Src,          2); \
    150148            IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    151             IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    152             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8_locked), pu8Dst, u8Src, pEFlags); \
     149            IEM_MC_ARG_EFLAGS(      fEFlagsIn,      0); \
     150            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8_locked), fEFlagsIn, pu8Dst, u8Src); \
    153151            \
    154152            IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bMapInfoDst); \
    155             IEM_MC_COMMIT_EFLAGS(EFlags); \
     153            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    156154            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    157155            IEM_MC_END(); \
     
    172170        IEM_MC_BEGIN(0, 0); \
    173171        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    174         IEM_MC_ARG(uint8_t,         u8Src,   1); \
     172        IEM_MC_ARG(uint8_t,         u8Src,      2); \
    175173        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    176174        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    181179            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    182180        } IEM_MC_NATIVE_ELSE() { \
    183             IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     181            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
    184182            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    185             IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    186             IEM_MC_REF_EFLAGS(pEFlags); \
    187             IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     183            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     184            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU8, fEFlagsIn, pu8Dst, u8Src); \
     185            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    188186        } IEM_MC_NATIVE_ENDIF(); \
    189187        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    194192        /* \
    195193         * We're accessing memory. \
    196          * Note! We're putting the eflags on the stack here so we can commit them \
    197          *       after the memory. \
    198194         */ \
    199195        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \
     
    213209            } IEM_MC_NATIVE_ELSE() { \
    214210                IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    215                 IEM_MC_ARG(uint8_t const *, pu8Dst,          0); \
     211                IEM_MC_ARG(uint8_t const *, pu8Dst,     1); \
    216212                IEM_MC_MEM_MAP_U8_RO(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    217                 IEM_MC_ARG(uint8_t,         u8Src,           1); \
     213                IEM_MC_ARG(uint8_t,         u8Src,      2); \
    218214                IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    219                 IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags, 2); \
    220                 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     215                IEM_MC_ARG_EFLAGS(          fEFlagsIn,  0); \
     216                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, a_fnNormalU8, fEFlagsIn, pu8Dst, u8Src); \
    221217                IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    222                 IEM_MC_COMMIT_EFLAGS(EFlags); \
     218                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    223219            } IEM_MC_NATIVE_ENDIF(); \
    224220            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    246242        IEM_MC_BEGIN(0, 0); \
    247243        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    248         IEM_MC_ARG(uint8_t,         u8Src,   1); \
     244        IEM_MC_ARG(uint8_t,         u8Src,      2); \
    249245        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    250246        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    256252            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    257253        } IEM_MC_NATIVE_ELSE() { \
    258             IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     254            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
    259255            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    260             IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    261             IEM_MC_REF_EFLAGS(pEFlags); \
    262             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     256            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     257            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     258            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    263259        } IEM_MC_NATIVE_ENDIF(); \
    264260        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    274270        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    275271        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    276         IEM_MC_ARG(uint8_t,         u8Src,   1); \
     272        IEM_MC_ARG(uint8_t,         u8Src,      2); \
    277273        IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    278274        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    284280            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    285281        } IEM_MC_NATIVE_ELSE() { \
    286             IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     282            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
    287283            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    288             IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    289             IEM_MC_REF_EFLAGS(pEFlags); \
    290             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     284            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     285            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     286            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    291287        } IEM_MC_NATIVE_ENDIF(); \
    292288        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    306302        IEM_MC_BEGIN(0, 0); \
    307303        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    308         IEM_MC_ARG(uint8_t,         u8Src,   1); \
     304        IEM_MC_ARG(uint8_t,         u8Src,      2); \
    309305        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    310306        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    315311            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    316312        } IEM_MC_NATIVE_ELSE() { \
    317             IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     313            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
    318314            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    319             IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    320             IEM_MC_REF_EFLAGS(pEFlags); \
    321             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     315            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     316            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     317            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    322318        } IEM_MC_NATIVE_ENDIF(); \
    323319        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    333329        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    334330        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    335         IEM_MC_ARG(uint8_t,         u8Src,   1); \
     331        IEM_MC_ARG(uint8_t,         u8Src,      2); \
    336332        IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    337333        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    342338            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    343339        } IEM_MC_NATIVE_ELSE() { \
    344             IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     340            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
    345341            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    346             IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    347             IEM_MC_REF_EFLAGS(pEFlags); \
    348             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     342            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     343            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     344            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    349345        } IEM_MC_NATIVE_ENDIF(); \
    350346        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    369365                IEM_MC_BEGIN(0, 0); \
    370366                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    371                 IEM_MC_ARG(uint16_t,   u16Src,  1); \
     367                IEM_MC_ARG(uint16_t,        u16Src,     2); \
    372368                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    373369                IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \
    374                     IEM_MC_LOCAL(uint16_t,   u16Dst); \
     370                    IEM_MC_LOCAL(uint16_t,  u16Dst); \
    375371                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    376372                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     
    379375                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    380376                } IEM_MC_NATIVE_ELSE() { \
    381                     IEM_MC_ARG(uint16_t *, pu16Dst, 0); \
     377                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    382378                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    383                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    384                     IEM_MC_REF_EFLAGS(pEFlags); \
    385                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     379                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     380                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     381                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    386382                } IEM_MC_NATIVE_ENDIF(); \
    387383                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    392388                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    393389                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    394                 IEM_MC_ARG(uint32_t,   u32Src,  1); \
     390                IEM_MC_ARG(uint32_t,        u32Src,  2); \
    395391                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    396392                IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \
    397                     IEM_MC_LOCAL(uint32_t,   u32Dst); \
     393                    IEM_MC_LOCAL(uint32_t,  u32Dst); \
    398394                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    399395                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     
    402398                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    403399                } IEM_MC_NATIVE_ELSE() { \
    404                     IEM_MC_ARG(uint32_t *, pu32Dst, 0); \
     400                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
    405401                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    406                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    407                     IEM_MC_REF_EFLAGS(pEFlags); \
    408                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     402                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     403                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    409404                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
     405                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    410406                } IEM_MC_NATIVE_ENDIF(); \
    411407                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    416412                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    417413                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    418                 IEM_MC_ARG(uint64_t,        u64Src,  1); \
     414                IEM_MC_ARG(uint64_t,        u64Src,  2); \
    419415                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    420416                IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \
     
    426422                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    427423                } IEM_MC_NATIVE_ELSE() { \
    428                     IEM_MC_ARG(uint64_t *,  pu64Dst, 0); \
     424                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    429425                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    430                     IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    431                     IEM_MC_REF_EFLAGS(pEFlags); \
    432                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     426                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     427                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     428                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    433429                } IEM_MC_NATIVE_ENDIF(); \
    434430                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    443439        /* \
    444440         * We're accessing memory. \
    445          * Note! We're putting the eflags on the stack here so we can commit them \
    446          *       after the memory. \
    447441         */ \
    448442        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK)) \
     
    452446                case IEMMODE_16BIT: \
    453447                    IEM_MC_BEGIN(0, 0); \
    454                     IEM_MC_ARG(uint16_t *, pu16Dst,          0); \
    455                     IEM_MC_ARG(uint16_t,   u16Src,           1); \
    456448                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    457                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    458                     \
    459449                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    460450                    IEMOP_HLP_DONE_DECODING(); \
     451                    \
     452                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     453                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    461454                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     455                    IEM_MC_ARG(uint16_t,    u16Src,     2); \
    462456                    IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    463                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    464                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     457                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     458                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
    465459                    \
    466460                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    467                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     461                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    468462                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    469463                    IEM_MC_END(); \
     
    472466                case IEMMODE_32BIT: \
    473467                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    474                     IEM_MC_ARG(uint32_t *, pu32Dst,          0); \
    475                     IEM_MC_ARG(uint32_t,   u32Src,           1); \
    476468                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    477                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    478                     \
    479469                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    480470                    IEMOP_HLP_DONE_DECODING(); \
     471                    \
     472                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     473                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
    481474                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     475                    IEM_MC_ARG(uint32_t,    u32Src,     2); \
    482476                    IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    483                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    484                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     477                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     478                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    485479                    \
    486480                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    487                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     481                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    488482                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    489483                    IEM_MC_END(); \
     
    492486                case IEMMODE_64BIT: \
    493487                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    494                     IEM_MC_ARG(uint64_t *, pu64Dst,          0); \
    495                     IEM_MC_ARG(uint64_t,   u64Src,           1); \
    496488                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    497                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    498                     \
    499489                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    500490                    IEMOP_HLP_DONE_DECODING(); \
     491                    \
     492                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     493                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    501494                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     495                    IEM_MC_ARG(uint64_t,    u64Src,     2); \
    502496                    IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    503                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    504                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     497                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     498                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
    505499                    \
    506500                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    507                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     501                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    508502                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    509503                    IEM_MC_END(); \
     
    522516                case IEMMODE_16BIT: \
    523517                    IEM_MC_BEGIN(0, 0); \
    524                     IEM_MC_ARG(uint16_t *, pu16Dst,          0); \
    525                     IEM_MC_ARG(uint16_t,   u16Src,           1); \
    526518                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    527                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    528                     \
    529519                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    530520                    IEMOP_HLP_DONE_DECODING(); \
     521                    \
     522                    IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
     523                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    531524                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     525                    IEM_MC_ARG(uint16_t,    u16Src,     2); \
    532526                    IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    533                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    534                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16_locked), pu16Dst, u16Src, pEFlags); \
     527                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     528                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16_locked), fEFlagsIn, pu16Dst, u16Src); \
    535529                    \
    536530                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    537                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     531                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    538532                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    539533                    IEM_MC_END(); \
     
    542536                case IEMMODE_32BIT: \
    543537                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    544                     IEM_MC_ARG(uint32_t *, pu32Dst,          0); \
    545                     IEM_MC_ARG(uint32_t,   u32Src,           1); \
    546538                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    547                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    548                     \
    549539                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    550540                    IEMOP_HLP_DONE_DECODING(); \
     541                    \
     542                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     543                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
    551544                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     545                    IEM_MC_ARG(uint32_t,    u32Src,     2); \
    552546                    IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    553                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    554                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32_locked), pu32Dst, u32Src, pEFlags); \
     547                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     548                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32_locked), fEFlagsIn, pu32Dst, u32Src); \
    555549                    \
    556550                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo /* CMP,TEST */); \
    557                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     551                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    558552                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    559553                    IEM_MC_END(); \
     
    562556                case IEMMODE_64BIT: \
    563557                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    564                     IEM_MC_ARG(uint64_t *, pu64Dst,          0); \
    565                     IEM_MC_ARG(uint64_t,   u64Src,           1); \
    566558                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    567                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    568                     \
    569559                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    570560                    IEMOP_HLP_DONE_DECODING(); \
     561                    \
     562                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     563                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    571564                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     565                    IEM_MC_ARG(uint64_t,    u64Src,     2); \
    572566                    IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    573                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    574                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64_locked), pu64Dst, u64Src, pEFlags); \
     567                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     568                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64_locked), fEFlagsIn, pu64Dst, u64Src); \
    575569                    \
    576570                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    577                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     571                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    578572                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    579573                    IEM_MC_END(); \
     
    601595                IEM_MC_BEGIN(0, 0); \
    602596                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    603                 IEM_MC_ARG(uint16_t,   u16Src,  1); \
     597                IEM_MC_ARG(uint16_t,        u16Src,     2); \
    604598                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    605599                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
    606                     IEM_MC_LOCAL(uint16_t,   u16Dst); \
     600                    IEM_MC_LOCAL(uint16_t,  u16Dst); \
    607601                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    608602                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     
    610604                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    611605                } IEM_MC_NATIVE_ELSE() { \
    612                     IEM_MC_ARG(uint16_t *, pu16Dst, 0); \
     606                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    613607                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    614                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    615                     IEM_MC_REF_EFLAGS(pEFlags); \
    616                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     608                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     609                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     610                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    617611                } IEM_MC_NATIVE_ENDIF(); \
    618612                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    623617                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    624618                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    625                 IEM_MC_ARG(uint32_t,   u32Src,  1); \
     619                IEM_MC_ARG(uint32_t,        u32Src,     2); \
    626620                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    627621                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
    628                     IEM_MC_LOCAL(uint32_t,   u32Dst); \
     622                    IEM_MC_LOCAL(uint32_t,  u32Dst); \
    629623                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    630624                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     
    632626                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    633627                } IEM_MC_NATIVE_ELSE() { \
    634                     IEM_MC_ARG(uint32_t *, pu32Dst, 0); \
     628                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
    635629                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    636                     IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    637                     IEM_MC_REF_EFLAGS(pEFlags); \
    638                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     630                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     631                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
     632                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    639633                } IEM_MC_NATIVE_ENDIF(); \
    640634                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    645639                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    646640                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    647                 IEM_MC_ARG(uint64_t,        u64Src,  1); \
     641                IEM_MC_ARG(uint64_t,        u64Src,     2); \
    648642                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    649643                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     
    654648                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    655649                } IEM_MC_NATIVE_ELSE() { \
    656                     IEM_MC_ARG(uint64_t *,  pu64Dst, 0); \
     650                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    657651                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
    658                     IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
    659                     IEM_MC_REF_EFLAGS(pEFlags); \
    660                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     652                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     653                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     654                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    661655                } IEM_MC_NATIVE_ENDIF(); \
    662656                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    671665        /* \
    672666         * We're accessing memory. \
    673          * Note! We're putting the eflags on the stack here so we can commit them \
    674          *       after the memory. \
    675667         */ \
    676668        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK)) \
     
    692684                        IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    693685                    } IEM_MC_NATIVE_ELSE() { \
    694                         IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    695                         IEM_MC_ARG(uint16_t const *, pu16Dst,         0); \
     686                        IEM_MC_LOCAL(uint8_t,         bUnmapInfo); \
     687                        IEM_MC_ARG(uint16_t const *,  pu16Dst,      1); \
    696688                        IEM_MC_MEM_MAP_U16_RO(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    697                         IEM_MC_ARG(uint16_t,         u16Src,          1); \
     689                        IEM_MC_ARG(uint16_t,          u16Src,       2); \
    698690                        IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    699                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags, 2); \
    700                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     691                        IEM_MC_ARG_EFLAGS(            fEFlagsIn,    0); \
     692                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
    701693                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    702                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     694                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    703695                    } IEM_MC_NATIVE_ENDIF(); \
    704696                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    720712                        IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    721713                    } IEM_MC_NATIVE_ELSE() { \
    722                         IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    723                         IEM_MC_ARG(uint32_t const *, pu32Dst,         0); \
     714                        IEM_MC_LOCAL(uint8_t,         bUnmapInfo); \
     715                        IEM_MC_ARG(uint32_t const *,  pu32Dst,      1); \
    724716                        IEM_MC_MEM_MAP_U32_RO(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    725                         IEM_MC_ARG(uint32_t,         u32Src,          1); \
     717                        IEM_MC_ARG(uint32_t,          u32Src,       2); \
    726718                        IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    727                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags, 2); \
    728                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     719                        IEM_MC_ARG_EFLAGS(            fEFlagsIn,    0); \
     720                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    729721                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    730                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     722                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    731723                    } IEM_MC_NATIVE_ENDIF(); \
    732724                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    748740                        IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    749741                    } IEM_MC_NATIVE_ELSE() { \
    750                         IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    751                         IEM_MC_ARG(uint64_t const *, pu64Dst,         0); \
     742                        IEM_MC_LOCAL(uint8_t,         bUnmapInfo); \
     743                        IEM_MC_ARG(uint64_t const *,  pu64Dst,      1); \
    752744                        IEM_MC_MEM_MAP_U64_RO(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    753                         IEM_MC_ARG(uint64_t,         u64Src,          1); \
     745                        IEM_MC_ARG(uint64_t,          u64Src,       2); \
    754746                        IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    755                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags, 2); \
    756                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     747                        IEM_MC_ARG_EFLAGS(            fEFlagsIn,    0); \
     748                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
    757749                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    758                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     750                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    759751                    } IEM_MC_NATIVE_ENDIF(); \
    760752                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    791783        IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    792784    } IEM_MC_NATIVE_ELSE() { \
    793         IEM_MC_ARG_CONST(uint8_t,   u8Src,/*=*/ u8Imm,  1); \
    794         IEM_MC_ARG(uint8_t *,       pu8Dst,             0); \
     785        IEM_MC_ARG(uint8_t *,       pu8Dst,             1); \
    795786        IEM_MC_REF_GREG_U8(pu8Dst, X86_GREG_xAX); \
    796         IEM_MC_ARG(uint32_t *,      pEFlags,            2); \
    797         IEM_MC_REF_EFLAGS(pEFlags); \
    798         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     787        IEM_MC_ARG_EFLAGS(          fEFlagsIn,          0); \
     788        IEM_MC_ARG_CONST(uint8_t,   u8Src,/*=*/ u8Imm,  2); \
     789        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     790        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    799791    } IEM_MC_NATIVE_ENDIF(); \
    800792    IEM_MC_ADVANCE_RIP_AND_FINISH();  \
     
    822814                IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    823815            } IEM_MC_NATIVE_ELSE() { \
    824                 IEM_MC_ARG_CONST(uint16_t,  u16Src,/*=*/ u16Imm,    1); \
    825                 IEM_MC_ARG(uint16_t *,      pu16Dst,                0); \
     816                IEM_MC_ARG_CONST(uint16_t,  u16Src,/*=*/ u16Imm,    2); \
     817                IEM_MC_ARG(uint16_t *,      pu16Dst,                1); \
    826818                IEM_MC_REF_GREG_U16(pu16Dst, X86_GREG_xAX); \
    827                 IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    828                 IEM_MC_REF_EFLAGS(pEFlags); \
    829                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     819                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     820                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     821                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    830822            } IEM_MC_NATIVE_ENDIF(); \
    831823            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    847839                IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    848840            } IEM_MC_NATIVE_ELSE() { \
    849                 IEM_MC_ARG_CONST(uint32_t,  u32Src,/*=*/ u32Imm,    1); \
    850                 IEM_MC_ARG(uint32_t *,      pu32Dst,                0); \
     841                IEM_MC_ARG_CONST(uint32_t,  u32Src,/*=*/ u32Imm,    2); \
     842                IEM_MC_ARG(uint32_t *,      pu32Dst,                1); \
    851843                IEM_MC_REF_GREG_U32(pu32Dst, X86_GREG_xAX); \
    852                 IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    853                 IEM_MC_REF_EFLAGS(pEFlags); \
    854                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     844                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     845                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    855846                IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
     847                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    856848            } IEM_MC_NATIVE_ENDIF(); \
    857849            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    873865                IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    874866            } IEM_MC_NATIVE_ELSE() { \
    875                 IEM_MC_ARG_CONST(uint64_t,  u64Src,/*=*/ u64Imm,    1); \
    876                 IEM_MC_ARG(uint64_t *,      pu64Dst,                0); \
     867                IEM_MC_ARG_CONST(uint64_t,  u64Src,/*=*/ u64Imm,    2); \
     868                IEM_MC_ARG(uint64_t *,      pu64Dst,                1); \
    877869                IEM_MC_REF_GREG_U64(pu64Dst, X86_GREG_xAX); \
    878                 IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    879                 IEM_MC_REF_EFLAGS(pEFlags); \
    880                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     870                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     871                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     872                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    881873            } IEM_MC_NATIVE_ENDIF(); \
    882874            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    908900                IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    909901            } IEM_MC_NATIVE_ELSE() { \
    910                 IEM_MC_ARG_CONST(uint16_t,  u16Src,/*=*/ u16Imm,    1); \
    911                 IEM_MC_ARG(uint16_t const *,pu16Dst,                0); \
     902                IEM_MC_ARG_CONST(uint16_t,  u16Src,/*=*/ u16Imm,    2); \
     903                IEM_MC_ARG(uint16_t const *,pu16Dst,                1); \
    912904                IEM_MC_REF_GREG_U16_CONST(pu16Dst, X86_GREG_xAX); \
    913                 IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    914                 IEM_MC_REF_EFLAGS(pEFlags); \
    915                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     905                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     906                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     907                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    916908            } IEM_MC_NATIVE_ENDIF(); \
    917909            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    932924                IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    933925            } IEM_MC_NATIVE_ELSE() { \
    934                 IEM_MC_ARG_CONST(uint32_t,  u32Src,/*=*/ u32Imm,    1); \
    935                 IEM_MC_ARG(uint32_t const *,pu32Dst,                0); \
     926                IEM_MC_ARG_CONST(uint32_t,  u32Src,/*=*/ u32Imm,    2); \
     927                IEM_MC_ARG(uint32_t const *,pu32Dst,                1); \
    936928                IEM_MC_REF_GREG_U32_CONST(pu32Dst, X86_GREG_xAX); \
    937                 IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    938                 IEM_MC_REF_EFLAGS(pEFlags); \
    939                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     929                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     930                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
     931                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    940932            } IEM_MC_NATIVE_ENDIF(); \
    941933            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    956948                IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    957949            } IEM_MC_NATIVE_ELSE() { \
    958                 IEM_MC_ARG_CONST(uint64_t,  u64Src,/*=*/ u64Imm,    1); \
    959                 IEM_MC_ARG(uint64_t const *,pu64Dst,                0); \
     950                IEM_MC_ARG_CONST(uint64_t,  u64Src,/*=*/ u64Imm,    2); \
     951                IEM_MC_ARG(uint64_t const *,pu64Dst,                1); \
    960952                IEM_MC_REF_GREG_U64_CONST(pu64Dst, X86_GREG_xAX); \
    961                 IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    962                 IEM_MC_REF_EFLAGS(pEFlags); \
    963                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     953                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     954                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     955                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    964956            } IEM_MC_NATIVE_ENDIF(); \
    965957            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    16121604    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_daa);
    16131605}
     1606
     1607
     1608/**
     1609 * Special case body for word/dword/qword instruction like SUB and XOR that can
     1610 * be used to zero a register.
     1611 *
     1612 * This can be used both for the rv_rm and rm_rv forms since it's working on the
     1613 * same register.
     1614 */
     1615#define IEMOP_BODY_BINARY_rv_SAME_REG_ZERO(a_bRm) \
     1616    if (   (a_bRm >> X86_MODRM_REG_SHIFT) == ((a_bRm & X86_MODRM_RM_MASK) | (X86_MOD_REG << X86_MODRM_REG_SHIFT)) \
     1617        && pVCpu->iem.s.uRexReg == pVCpu->iem.s.uRexB) \
     1618    { \
     1619        switch (pVCpu->iem.s.enmEffOpSize) \
     1620        { \
     1621            case IEMMODE_16BIT: \
     1622                IEM_MC_BEGIN(0, 0); \
     1623                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     1624                IEM_MC_STORE_GREG_U16_CONST(IEM_GET_MODRM_RM(pVCpu, a_bRm), 0); \
     1625                IEM_MC_LOCAL_EFLAGS(fEFlags); \
     1626                IEM_MC_AND_LOCAL_U32(fEFlags, ~(uint32_t)X86_EFL_STATUS_BITS); \
     1627                IEM_MC_OR_LOCAL_U32(fEFlags, X86_EFL_PF | X86_EFL_ZF); \
     1628                IEM_MC_COMMIT_EFLAGS(fEFlags); \
     1629                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     1630                IEM_MC_END(); \
     1631                break; \
     1632                \
     1633            case IEMMODE_32BIT: \
     1634                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
     1635                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     1636                IEM_MC_STORE_GREG_U32_CONST(IEM_GET_MODRM_RM(pVCpu, a_bRm), 0); \
     1637                IEM_MC_LOCAL_EFLAGS(fEFlags); \
     1638                IEM_MC_AND_LOCAL_U32(fEFlags, ~(uint32_t)X86_EFL_STATUS_BITS); \
     1639                IEM_MC_OR_LOCAL_U32(fEFlags, X86_EFL_PF | X86_EFL_ZF); \
     1640                IEM_MC_COMMIT_EFLAGS(fEFlags); \
     1641                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     1642                IEM_MC_END(); \
     1643                break; \
     1644                \
     1645            case IEMMODE_64BIT: \
     1646                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
     1647                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     1648                IEM_MC_STORE_GREG_U64_CONST(IEM_GET_MODRM_RM(pVCpu, a_bRm), 0); \
     1649                IEM_MC_LOCAL_EFLAGS(fEFlags); \
     1650                IEM_MC_AND_LOCAL_U32(fEFlags, ~(uint32_t)X86_EFL_STATUS_BITS); \
     1651                IEM_MC_OR_LOCAL_U32(fEFlags, X86_EFL_PF | X86_EFL_ZF); \
     1652                IEM_MC_COMMIT_EFLAGS(fEFlags); \
     1653                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     1654                IEM_MC_END(); \
     1655                break; \
     1656                \
     1657            IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
     1658        } \
     1659    } ((void)0)
    16141660
    16151661
     
    18851931    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_aaa);
    18861932}
     1933
     1934
     1935/**
     1936 * Body for word/dword/qword the instruction CMP, ++ with a register as the
     1937 * destination.
     1938 *
     1939 * @note Used both in OneByte and TwoByte0f.
     1940 */
     1941#define IEMOP_BODY_BINARY_rv_rm_RO(a_bRm, a_InsNm, a_fNativeArchs) \
     1942    /* \
     1943     * If rm is denoting a register, no more instruction bytes. \
     1944     */ \
     1945    if (IEM_IS_MODRM_REG_MODE(a_bRm)) \
     1946    { \
     1947        switch (pVCpu->iem.s.enmEffOpSize) \
     1948        { \
     1949            case IEMMODE_16BIT: \
     1950                IEM_MC_BEGIN(0, 0); \
     1951                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     1952                IEM_MC_ARG(uint16_t,        u16Src,     2); \
     1953                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
     1954                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     1955                    IEM_MC_LOCAL(uint16_t,  u16Dst); \
     1956                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     1957                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     1958                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     1959                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
     1960                } IEM_MC_NATIVE_ELSE() { \
     1961                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
     1962                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     1963                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     1964                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     1965                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     1966                } IEM_MC_NATIVE_ENDIF(); \
     1967                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     1968                IEM_MC_END(); \
     1969                break; \
     1970            \
     1971            case IEMMODE_32BIT: \
     1972                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
     1973                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     1974                IEM_MC_ARG(uint32_t,        u32Src,     2); \
     1975                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
     1976                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     1977                    IEM_MC_LOCAL(uint32_t,  u32Dst); \
     1978                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     1979                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     1980                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     1981                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
     1982                } IEM_MC_NATIVE_ELSE() { \
     1983                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
     1984                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     1985                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     1986                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
     1987                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     1988                } IEM_MC_NATIVE_ENDIF(); \
     1989                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     1990                IEM_MC_END(); \
     1991                break; \
     1992            \
     1993            case IEMMODE_64BIT: \
     1994                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
     1995                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     1996                IEM_MC_ARG(uint64_t,        u64Src,     2); \
     1997                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
     1998                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     1999                    IEM_MC_LOCAL(uint64_t,  u64Dst); \
     2000                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     2001                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     2002                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     2003                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
     2004                } IEM_MC_NATIVE_ELSE() { \
     2005                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
     2006                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     2007                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     2008                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     2009                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     2010                } IEM_MC_NATIVE_ENDIF(); \
     2011                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     2012                IEM_MC_END(); \
     2013                break; \
     2014            \
     2015            IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
     2016        } \
     2017    } \
     2018    else \
     2019    { \
     2020        /* \
     2021         * We're accessing memory. \
     2022         */ \
     2023        switch (pVCpu->iem.s.enmEffOpSize) \
     2024        { \
     2025            case IEMMODE_16BIT: \
     2026                IEM_MC_BEGIN(0, 0); \
     2027                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     2028                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     2029                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     2030                IEM_MC_ARG(uint16_t,        u16Src,     2); \
     2031                IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     2032                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     2033                    IEM_MC_LOCAL(uint16_t,  u16Dst); \
     2034                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     2035                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     2036                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     2037                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
     2038                } IEM_MC_NATIVE_ELSE() { \
     2039                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
     2040                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     2041                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     2042                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     2043                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     2044                } IEM_MC_NATIVE_ENDIF(); \
     2045                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     2046                IEM_MC_END(); \
     2047                break; \
     2048            \
     2049            case IEMMODE_32BIT: \
     2050                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
     2051                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     2052                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     2053                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     2054                IEM_MC_ARG(uint32_t,        u32Src,  2); \
     2055                IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     2056                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     2057                    IEM_MC_LOCAL(uint32_t,  u32Dst); \
     2058                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     2059                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     2060                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     2061                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
     2062                } IEM_MC_NATIVE_ELSE() { \
     2063                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
     2064                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     2065                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     2066                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
     2067                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     2068                } IEM_MC_NATIVE_ENDIF(); \
     2069                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     2070                IEM_MC_END(); \
     2071                break; \
     2072            \
     2073            case IEMMODE_64BIT: \
     2074                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
     2075                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     2076                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     2077                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     2078                IEM_MC_ARG(uint64_t,        u64Src,     2); \
     2079                IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     2080                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     2081                    IEM_MC_LOCAL(uint64_t,  u64Dst); \
     2082                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     2083                    IEM_MC_LOCAL_EFLAGS(uEFlags); \
     2084                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     2085                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
     2086                } IEM_MC_NATIVE_ELSE() { \
     2087                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
     2088                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     2089                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     2090                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     2091                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
     2092                } IEM_MC_NATIVE_ENDIF(); \
     2093                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     2094                IEM_MC_END(); \
     2095                break; \
     2096            \
     2097            IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
     2098        } \
     2099    } \
     2100    (void)0
    18872101
    18882102
     
    31723386        case IEMMODE_16BIT:
    31733387        {
    3174             PFNIEMAIMPLBINU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);
     3388            PFNIEMAIMPLBINTODOU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);
    31753389            if (IEM_IS_MODRM_REG_MODE(bRm))
    31763390            {
     
    32193433        case IEMMODE_32BIT:
    32203434        {
    3221             PFNIEMAIMPLBINU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);
     3435            PFNIEMAIMPLBINTODOU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);
    32223436            if (IEM_IS_MODRM_REG_MODE(bRm))
    32233437            {
     
    32673481        case IEMMODE_64BIT:
    32683482        {
    3269             PFNIEMAIMPLBINU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);
     3483            PFNIEMAIMPLBINTODOU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);
    32703484            if (IEM_IS_MODRM_REG_MODE(bRm))
    32713485            {
     
    33743588        case IEMMODE_16BIT:
    33753589        {
    3376             PFNIEMAIMPLBINU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);
     3590            PFNIEMAIMPLBINTODOU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);
    33773591            if (IEM_IS_MODRM_REG_MODE(bRm))
    33783592            {
     
    34243638        case IEMMODE_32BIT:
    34253639        {
    3426             PFNIEMAIMPLBINU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);
     3640            PFNIEMAIMPLBINTODOU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);
    34273641            if (IEM_IS_MODRM_REG_MODE(bRm))
    34283642            {
     
    34723686        case IEMMODE_64BIT:
    34733687        {
    3474             PFNIEMAIMPLBINU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);
     3688            PFNIEMAIMPLBINTODOU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);
    34753689            if (IEM_IS_MODRM_REG_MODE(bRm))
    34763690            {
     
    41994413            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    42004414        } IEM_MC_NATIVE_ELSE() { \
    4201             IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     1); \
    4202             IEM_MC_ARG(uint8_t *,       pu8Dst,                 0); \
     4415            IEM_MC_ARG(uint8_t *,       pu8Dst,                 1); \
    42034416            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4204             IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4205             IEM_MC_REF_EFLAGS(pEFlags); \
    4206             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     4417            IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     2); \
     4418            IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4419            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     4420            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    42074421        } IEM_MC_NATIVE_ENDIF(); \
    42084422        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    42174431            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    42184432            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \
    4219             \
    42204433            uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm); \
    4221             IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     1); \
    42224434            IEMOP_HLP_DONE_DECODING(); \
    42234435            \
    42244436            IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4225             IEM_MC_ARG(uint8_t *,       pu8Dst,                 0); \
     4437            IEM_MC_ARG(uint8_t *,       pu8Dst,                 1); \
    42264438            IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    4227             IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4228             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     4439            IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     2); \
     4440            IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4441            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
    42294442            \
    42304443            IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    4231             IEM_MC_COMMIT_EFLAGS(EFlags); \
     4444            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    42324445            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    42334446            IEM_MC_END(); \
     
    42364449        { \
    42374450            IEM_MC_BEGIN(0, 0); \
    4238             IEM_MC_ARG(uint8_t *,       pu8Dst,                 0); \
    42394451            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    4240             IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    4241             \
    42424452            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \
    42434453            uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm); \
    4244             IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     1); \
    42454454            IEMOP_HLP_DONE_DECODING(); \
    42464455            \
     4456            IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
     4457            IEM_MC_ARG(uint8_t *,       pu8Dst,                 1); \
    42474458            IEM_MC_MEM_MAP_U8_ATOMIC(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    4248             IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4249             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8_locked), pu8Dst, u8Src, pEFlags); \
     4459            IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     2); \
     4460            IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4461            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8_locked), fEFlagsIn, pu8Dst, u8Src); \
    42504462            \
    42514463            IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    4252             IEM_MC_COMMIT_EFLAGS(EFlags); \
     4464            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    42534465            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    42544466            IEM_MC_END(); \
     
    42714483            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    42724484        } IEM_MC_NATIVE_ELSE() { \
    4273             IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     1); \
    4274             IEM_MC_ARG(uint8_t const *, pu8Dst,                 0); \
     4485            IEM_MC_ARG(uint8_t const *, pu8Dst,                 1); \
    42754486            IEM_MC_REF_GREG_U8_CONST(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4276             IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4277             IEM_MC_REF_EFLAGS(pEFlags); \
    4278             IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     4487            IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4488            IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     2); \
     4489            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
     4490            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    42794491        } IEM_MC_NATIVE_ENDIF(); \
    42804492        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    42994511            } IEM_MC_NATIVE_ELSE() { \
    43004512                IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4301                 IEM_MC_ARG(uint8_t const *, pu8Dst,                 0); \
     4513                IEM_MC_ARG(uint8_t const *, pu8Dst,                 1); \
    43024514                IEM_MC_MEM_MAP_U8_RO(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    4303                 IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4304                 IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     1); \
    4305                 IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     4515                IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4516                IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     2); \
     4517                IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u8), fEFlagsIn, pu8Dst, u8Src); \
    43064518                IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    4307                 IEM_MC_COMMIT_EFLAGS(EFlags); \
     4519                IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    43084520            } IEM_MC_NATIVE_ENDIF(); \
    43094521            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    44604672                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    44614673                } IEM_MC_NATIVE_ELSE() { \
    4462                     IEM_MC_ARG(uint16_t *,      pu16Dst,                0); \
     4674                    IEM_MC_ARG(uint16_t *,      pu16Dst,                1); \
    44634675                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4464                     IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4465                     IEM_MC_REF_EFLAGS(pEFlags); \
    4466                     IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ u16Imm,   1); \
    4467                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     4676                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4677                    IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ u16Imm,   2); \
     4678                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     4679                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    44684680                } IEM_MC_NATIVE_ENDIF(); \
    44694681                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    44864698                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    44874699                } IEM_MC_NATIVE_ELSE() { \
    4488                     IEM_MC_ARG(uint32_t *,      pu32Dst,                0); \
     4700                    IEM_MC_ARG(uint32_t *,      pu32Dst,                1); \
    44894701                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4490                     IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4491                     IEM_MC_REF_EFLAGS(pEFlags); \
    4492                     IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ u32Imm,   1); \
    4493                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     4702                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4703                    IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ u32Imm,   2); \
     4704                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    44944705                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \
     4706                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    44954707                } IEM_MC_NATIVE_ENDIF(); \
    44964708                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    45134725                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    45144726                } IEM_MC_NATIVE_ELSE() { \
    4515                     IEM_MC_ARG(uint64_t *,      pu64Dst,                0); \
     4727                    IEM_MC_ARG(uint64_t *,      pu64Dst,                1); \
    45164728                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4517                     IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4518                     IEM_MC_REF_EFLAGS(pEFlags); \
    4519                     IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ u64Imm,   1); \
    4520                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     4729                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4730                    IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ u64Imm,   2); \
     4731                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     4732                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    45214733                } IEM_MC_NATIVE_ENDIF(); \
    45224734                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    45454757                    \
    45464758                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4547                     IEM_MC_ARG(uint16_t *,      pu16Dst,                0); \
     4759                    IEM_MC_ARG(uint16_t *,      pu16Dst,                1); \
    45484760                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    45494761                    \
    4550                     IEM_MC_ARG_CONST(uint16_t,  u16Src,  u16Imm,        1); \
    4551                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4552                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     4762                    IEM_MC_ARG_CONST(uint16_t,  u16Src,  u16Imm,        2); \
     4763                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4764                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
    45534765                    \
    45544766                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    4555                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     4767                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    45564768                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    45574769                    IEM_MC_END(); \
     
    45694781                    \
    45704782                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4571                     IEM_MC_ARG(uint32_t *,      pu32Dst,                0); \
     4783                    IEM_MC_ARG(uint32_t *,      pu32Dst,                1); \
    45724784                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    45734785                    \
    4574                     IEM_MC_ARG_CONST(uint32_t,  u32Src,     u32Imm,     1); \
    4575                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags,    EFlags,     2); \
    4576                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     4786                    IEM_MC_ARG_CONST(uint32_t,  u32Src,     u32Imm,     2); \
     4787                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4788                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    45774789                    \
    45784790                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    4579                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     4791                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    45804792                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    45814793                    IEM_MC_END(); \
     
    45944806                    \
    45954807                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4596                     IEM_MC_ARG(uint64_t *,      pu64Dst,                0); \
     4808                    IEM_MC_ARG(uint64_t *,      pu64Dst,                1); \
    45974809                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    45984810                    \
    4599                     IEM_MC_ARG_CONST(uint64_t,  u64Src,  u64Imm,        1); \
    4600                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4601                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     4811                    IEM_MC_ARG_CONST(uint64_t,  u64Src,  u64Imm,        2); \
     4812                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4813                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
    46024814                    \
    46034815                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    4604                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     4816                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    46054817                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    46064818                    IEM_MC_END(); \
     
    46254837                    \
    46264838                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4627                     IEM_MC_ARG(uint16_t *,      pu16Dst,                0); \
     4839                    IEM_MC_ARG(uint16_t *,      pu16Dst,                1); \
    46284840                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    46294841                    \
    4630                     IEM_MC_ARG_CONST(uint16_t,  u16Src,  u16Imm,        1); \
    4631                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4632                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16_locked), pu16Dst, u16Src, pEFlags); \
     4842                    IEM_MC_ARG_CONST(uint16_t,  u16Src,  u16Imm,        2); \
     4843                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4844                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16_locked), fEFlagsIn, pu16Dst, u16Src); \
    46334845                    \
    46344846                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    4635                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     4847                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    46364848                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    46374849                    IEM_MC_END(); \
     
    46494861                    \
    46504862                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4651                     IEM_MC_ARG(uint32_t *,      pu32Dst,                0); \
     4863                    IEM_MC_ARG(uint32_t *,      pu32Dst,                1); \
    46524864                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    46534865                    \
    4654                     IEM_MC_ARG_CONST(uint32_t,  u32Src,  u32Imm,        1); \
    4655                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4656                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32_locked), pu32Dst, u32Src, pEFlags); \
     4866                    IEM_MC_ARG_CONST(uint32_t,  u32Src,  u32Imm,        2); \
     4867                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4868                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32_locked), fEFlagsIn, pu32Dst, u32Src); \
    46574869                    \
    46584870                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    4659                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     4871                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    46604872                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    46614873                    IEM_MC_END(); \
     
    46734885                    \
    46744886                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    4675                     IEM_MC_ARG(uint64_t *,      pu64Dst,                0); \
     4887                    IEM_MC_ARG(uint64_t *,      pu64Dst,                1); \
    46764888                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    46774889                    \
    4678                     IEM_MC_ARG_CONST(uint64_t,  u64Src,  u64Imm,        1); \
    4679                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,        2); \
    4680                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64_locked), pu64Dst, u64Src, pEFlags); \
     4890                    IEM_MC_ARG_CONST(uint64_t,  u64Src,  u64Imm,        2); \
     4891                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4892                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64_locked), fEFlagsIn, pu64Dst, u64Src); \
    46814893                    \
    46824894                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    4683                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     4895                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    46844896                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    46854897                    IEM_MC_END(); \
     
    47134925                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    47144926                } IEM_MC_NATIVE_ELSE() { \
    4715                     IEM_MC_ARG(uint16_t const *,pu16Dst,                0); \
     4927                    IEM_MC_ARG(uint16_t const *,pu16Dst,                1); \
    47164928                    IEM_MC_REF_GREG_U16_CONST(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4717                     IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4718                     IEM_MC_REF_EFLAGS(pEFlags); \
    4719                     IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ u16Imm,   1); \
    4720                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     4929                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4930                    IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ u16Imm,   2); \
     4931                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     4932                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    47214933                } IEM_MC_NATIVE_ENDIF(); \
    47224934                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    47384950                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    47394951                } IEM_MC_NATIVE_ELSE() { \
    4740                     IEM_MC_ARG(uint32_t const *,pu32Dst,                0); \
     4952                    IEM_MC_ARG(uint32_t const *,pu32Dst,                1); \
    47414953                    IEM_MC_REF_GREG_U32_CONST (pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4742                     IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4743                     IEM_MC_REF_EFLAGS(pEFlags); \
    4744                     IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ u32Imm,   1); \
    4745                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     4954                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4955                    IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ u32Imm,   2); \
     4956                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
     4957                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    47464958                } IEM_MC_NATIVE_ENDIF(); \
    47474959                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    47634975                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    47644976                } IEM_MC_NATIVE_ELSE() { \
    4765                     IEM_MC_ARG(uint64_t const *,pu64Dst,                0); \
     4977                    IEM_MC_ARG(uint64_t const *,pu64Dst,                1); \
    47664978                    IEM_MC_REF_GREG_U64_CONST(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    4767                     IEM_MC_ARG(uint32_t *,      pEFlags,                2); \
    4768                     IEM_MC_REF_EFLAGS(pEFlags); \
    4769                     IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ u64Imm,   1); \
    4770                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     4979                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,              0); \
     4980                    IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ u64Imm,   2); \
     4981                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     4982                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    47714983                } IEM_MC_NATIVE_ENDIF(); \
    47724984                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    48005012                    } IEM_MC_NATIVE_ELSE() { \
    48015013                        IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    4802                         IEM_MC_ARG(uint16_t const *, pu16Dst,               0); \
     5014                        IEM_MC_ARG(uint16_t const *, pu16Dst,               1); \
    48035015                        IEM_MC_MEM_MAP_U16_RO(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    4804                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags,       2); \
    4805                         IEM_MC_ARG_CONST(uint16_t,   u16Src,  u16Imm,       1); \
    4806                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     5016                        IEM_MC_ARG_EFLAGS(           fEFlagsIn,             0); \
     5017                        IEM_MC_ARG_CONST(uint16_t,   u16Src,  u16Imm,       2); \
     5018                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
    48075019                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    4808                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     5020                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    48095021                    } IEM_MC_NATIVE_ENDIF(); \
    48105022                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    48285040                    } IEM_MC_NATIVE_ELSE() { \
    48295041                        IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    4830                         IEM_MC_ARG(uint32_t const *, pu32Dst,               0); \
     5042                        IEM_MC_ARG(uint32_t const *, pu32Dst,               1); \
    48315043                        IEM_MC_MEM_MAP_U32_RO(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    4832                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags,       2); \
    4833                         IEM_MC_ARG_CONST(uint32_t,   u32Src,  u32Imm,       1); \
    4834                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     5044                        IEM_MC_ARG_EFLAGS(           fEFlagsIn,             0); \
     5045                        IEM_MC_ARG_CONST(uint32_t,   u32Src,  u32Imm,       2); \
     5046                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    48355047                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    4836                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     5048                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    48375049                    } IEM_MC_NATIVE_ENDIF(); \
    48385050                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    48565068                    } IEM_MC_NATIVE_ELSE() { \
    48575069                        IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    4858                         IEM_MC_ARG(uint64_t const *, pu64Dst,               0); \
     5070                        IEM_MC_ARG(uint64_t const *, pu64Dst,               1); \
    48595071                        IEM_MC_MEM_MAP_U64_RO(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    4860                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags,       2); \
    4861                         IEM_MC_ARG_CONST(uint64_t,   u64Src,  u64Imm,       1); \
    4862                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     5072                        IEM_MC_ARG_EFLAGS(           fEFlagsIn,             0); \
     5073                        IEM_MC_ARG_CONST(uint64_t,   u64Src,  u64Imm,       2); \
     5074                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
    48635075                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    4864                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     5076                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    48655077                    } IEM_MC_NATIVE_ENDIF(); \
    48665078                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    50355247                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    50365248                } IEM_MC_NATIVE_ELSE() { \
    5037                     IEM_MC_ARG(uint16_t *,      pu16Dst,                                        0); \
     5249                    IEM_MC_ARG(uint16_t *,      pu16Dst,                                        1); \
    50385250                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5039                     IEM_MC_ARG(uint32_t *,      pEFlags,                                        2); \
    5040                     IEM_MC_REF_EFLAGS(pEFlags); \
    5041                     IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ (uint16_t)(int16_t)(int8_t)u8Imm, 1); \
    5042                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     5251                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                      0); \
     5252                    IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ (uint16_t)(int16_t)(int8_t)u8Imm, 2); \
     5253                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     5254                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    50435255                } IEM_MC_NATIVE_ENDIF(); \
    50445256                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    50585270                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    50595271                } IEM_MC_NATIVE_ELSE() { \
    5060                     IEM_MC_ARG(uint32_t *,      pu32Dst,                                        0); \
     5272                    IEM_MC_ARG(uint32_t *,      pu32Dst,                                        1); \
    50615273                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5062                     IEM_MC_ARG(uint32_t *,      pEFlags,                                        2); \
    5063                     IEM_MC_REF_EFLAGS(pEFlags); \
    5064                     IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ (uint32_t)(int32_t)(int8_t)u8Imm, 1); \
    5065                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     5274                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                      0); \
     5275                    IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ (uint32_t)(int32_t)(int8_t)u8Imm, 2); \
     5276                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    50665277                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \
     5278                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    50675279                } IEM_MC_NATIVE_ENDIF(); \
    50685280                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    50825294                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    50835295                } IEM_MC_NATIVE_ELSE() { \
    5084                     IEM_MC_ARG(uint64_t *,      pu64Dst,                                        0); \
     5296                    IEM_MC_ARG(uint64_t *,      pu64Dst,                                        1); \
    50855297                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5086                     IEM_MC_ARG(uint32_t *,      pEFlags,                                        2); \
    5087                     IEM_MC_REF_EFLAGS(pEFlags); \
    5088                     IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ (uint64_t)(int64_t)(int8_t)u8Imm, 1); \
    5089                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     5298                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                      0); \
     5299                    IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ (uint64_t)(int64_t)(int8_t)u8Imm, 2); \
     5300                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     5301                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    50905302                } IEM_MC_NATIVE_ENDIF(); \
    50915303                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    51145326                    \
    51155327                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    5116                     IEM_MC_ARG(uint16_t *,      pu16Dst,                                    0); \
     5328                    IEM_MC_ARG(uint16_t *,      pu16Dst,                                    1); \
    51175329                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    51185330                    \
    5119                     IEM_MC_ARG_CONST(uint16_t,  u16Src,  (uint16_t)(int16_t)(int8_t)u8Imm,  1); \
    5120                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,                            2); \
    5121                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     5331                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                  0); \
     5332                    IEM_MC_ARG_CONST(uint16_t,  u16Src,  (uint16_t)(int16_t)(int8_t)u8Imm,  2); \
     5333                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
    51225334                    \
    51235335                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    5124                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     5336                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    51255337                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    51265338                    IEM_MC_END(); \
     
    51365348                    \
    51375349                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    5138                     IEM_MC_ARG(uint32_t *,      pu32Dst,                                    0); \
     5350                    IEM_MC_ARG(uint32_t *,      pu32Dst,                                    1); \
    51395351                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    51405352                    \
    5141                     IEM_MC_ARG_CONST(uint32_t,  u32Src,  (uint32_t)(int32_t)(int8_t)u8Imm,  1); \
    5142                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,                            2); \
    5143                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     5353                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                  0); \
     5354                    IEM_MC_ARG_CONST(uint32_t,  u32Src,  (uint32_t)(int32_t)(int8_t)u8Imm,  2); \
     5355                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    51445356                    \
    51455357                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    5146                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     5358                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    51475359                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    51485360                    IEM_MC_END(); \
     
    51585370                    \
    51595371                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    5160                     IEM_MC_ARG(uint64_t *,      pu64Dst,                                    0); \
     5372                    IEM_MC_ARG(uint64_t *,      pu64Dst,                                    1); \
    51615373                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    51625374                    \
    5163                     IEM_MC_ARG_CONST(uint64_t,  u64Src,  (uint64_t)(int64_t)(int8_t)u8Imm,  1); \
    5164                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,                            2); \
    5165                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     5375                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                  0); \
     5376                    IEM_MC_ARG_CONST(uint64_t,  u64Src,  (uint64_t)(int64_t)(int8_t)u8Imm,  2); \
     5377                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
    51665378                    \
    51675379                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    5168                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     5380                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    51695381                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    51705382                    IEM_MC_END(); \
     
    51875399                    \
    51885400                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    5189                     IEM_MC_ARG(uint16_t *,      pu16Dst,                                    0); \
     5401                    IEM_MC_ARG(uint16_t *,      pu16Dst,                                    1); \
    51905402                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    51915403                    \
    5192                     IEM_MC_ARG_CONST(uint16_t,  u16Src,  (uint16_t)(int16_t)(int8_t)u8Imm,  1); \
    5193                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,                            2); \
    5194                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16_locked), pu16Dst, u16Src, pEFlags); \
     5404                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                  0); \
     5405                    IEM_MC_ARG_CONST(uint16_t,  u16Src,  (uint16_t)(int16_t)(int8_t)u8Imm,  2); \
     5406                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16_locked), fEFlagsIn, pu16Dst, u16Src); \
    51955407                    \
    51965408                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    5197                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     5409                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    51985410                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    51995411                    IEM_MC_END(); \
     
    52095421                    \
    52105422                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    5211                     IEM_MC_ARG(uint32_t *,      pu32Dst,                                    0); \
     5423                    IEM_MC_ARG(uint32_t *,      pu32Dst,                                    1); \
    52125424                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    52135425                    \
    5214                     IEM_MC_ARG_CONST(uint32_t,  u32Src,  (uint32_t)(int32_t)(int8_t)u8Imm,  1); \
    5215                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,                            2); \
    5216                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32_locked), pu32Dst, u32Src, pEFlags); \
     5426                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                  0); \
     5427                    IEM_MC_ARG_CONST(uint32_t,  u32Src,  (uint32_t)(int32_t)(int8_t)u8Imm,  2); \
     5428                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32_locked), fEFlagsIn, pu32Dst, u32Src); \
    52175429                    \
    52185430                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    5219                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     5431                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    52205432                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    52215433                    IEM_MC_END(); \
     
    52315443                    \
    52325444                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    5233                     IEM_MC_ARG(uint64_t *,      pu64Dst,                                    0); \
     5445                    IEM_MC_ARG(uint64_t *,      pu64Dst,                                    1); \
    52345446                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    52355447                    \
    5236                     IEM_MC_ARG_CONST(uint64_t,  u64Src, (uint64_t)(int64_t)(int8_t)u8Imm,   1); \
    5237                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags,                            2); \
    5238                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64_locked), pu64Dst, u64Src, pEFlags); \
     5448                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                  0); \
     5449                    IEM_MC_ARG_CONST(uint64_t,  u64Src, (uint64_t)(int64_t)(int8_t)u8Imm,   2); \
     5450                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64_locked), fEFlagsIn, pu64Dst, u64Src); \
    52395451                    \
    52405452                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    5241                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     5453                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    52425454                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    52435455                    IEM_MC_END(); \
     
    52665478                    IEM_MC_LOCAL(uint16_t,      u16Dst); \
    52675479                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5268                     IEM_MC_LOCAL(uint32_t,      uEFlags); \
    5269                     IEM_MC_FETCH_EFLAGS(uEFlags); \
     5480                    IEM_MC_LOCAL_EFLAGS(        uEFlags); \
    52705481                    IEM_MC_NATIVE_EMIT_5(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_i_efl), u16Dst, (uint16_t)(int16_t)(int8_t)u8Imm, uEFlags, 16, 8); \
    52715482                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    52725483                } IEM_MC_NATIVE_ELSE() { \
    5273                     IEM_MC_ARG(uint16_t const *,    pu16Dst,                                        0); \
     5484                    IEM_MC_ARG(uint16_t const *,pu16Dst,                                        1); \
    52745485                    IEM_MC_REF_GREG_U16_CONST(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5275                     IEM_MC_ARG(uint32_t *,          pEFlags,                                        2); \
    5276                     IEM_MC_ARG_CONST(uint16_t,      u16Src, /*=*/ (uint16_t)(int16_t)(int8_t)u8Imm, 1); \
    5277                     IEM_MC_REF_EFLAGS(pEFlags); \
    5278                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     5486                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                      0); \
     5487                    IEM_MC_ARG_CONST(uint16_t,  u16Src, /*=*/ (uint16_t)(int16_t)(int8_t)u8Imm, 2); \
     5488                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
     5489                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    52795490                } IEM_MC_NATIVE_ENDIF(); \
    52805491                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    52885499                    IEM_MC_LOCAL(uint32_t,      u32Dst); \
    52895500                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5290                     IEM_MC_LOCAL(uint32_t,      uEFlags); \
    5291                     IEM_MC_FETCH_EFLAGS(uEFlags); \
     5501                    IEM_MC_LOCAL_EFLAGS(        uEFlags); \
    52925502                    IEM_MC_NATIVE_EMIT_5(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_i_efl), u32Dst, (uint32_t)(int32_t)(int8_t)u8Imm, uEFlags, 32, 8); \
    52935503                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    52945504                } IEM_MC_NATIVE_ELSE() { \
    5295                     IEM_MC_ARG(uint32_t const *,    pu32Dst,                                        0); \
     5505                    IEM_MC_ARG(uint32_t const *,pu32Dst,                                        1); \
    52965506                    IEM_MC_REF_GREG_U32_CONST(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5297                     IEM_MC_ARG(uint32_t *,          pEFlags,                                        2); \
    5298                     IEM_MC_REF_EFLAGS(pEFlags); \
    5299                     IEM_MC_ARG_CONST(uint32_t,      u32Src, /*=*/ (uint32_t)(int32_t)(int8_t)u8Imm, 1); \
    5300                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     5507                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                      0); \
     5508                    IEM_MC_ARG_CONST(uint32_t,  u32Src, /*=*/ (uint32_t)(int32_t)(int8_t)u8Imm, 2); \
     5509                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
     5510                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    53015511                } IEM_MC_NATIVE_ENDIF(); \
    53025512                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    53105520                    IEM_MC_LOCAL(uint64_t,      u64Dst); \
    53115521                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5312                     IEM_MC_LOCAL(uint32_t,      uEFlags); \
    5313                     IEM_MC_FETCH_EFLAGS(uEFlags); \
     5522                    IEM_MC_LOCAL_EFLAGS(        uEFlags); \
    53145523                    IEM_MC_NATIVE_EMIT_5(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_i_efl), u64Dst, (uint64_t)(int64_t)(int8_t)u8Imm, uEFlags, 64, 8); \
    53155524                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags); \
    53165525                } IEM_MC_NATIVE_ELSE() { \
    5317                     IEM_MC_ARG(uint64_t const *,    pu64Dst,                                        0); \
     5526                    IEM_MC_ARG(uint64_t const *,pu64Dst,                                        1); \
    53185527                    IEM_MC_REF_GREG_U64_CONST(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    5319                     IEM_MC_ARG(uint32_t *,          pEFlags,                                        2); \
    5320                     IEM_MC_REF_EFLAGS(pEFlags); \
    5321                     IEM_MC_ARG_CONST(uint64_t,      u64Src, /*=*/ (uint64_t)(int64_t)(int8_t)u8Imm, 1); \
    5322                     IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     5528                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                                      0); \
     5529                    IEM_MC_ARG_CONST(uint64_t,  u64Src, /*=*/ (uint64_t)(int64_t)(int8_t)u8Imm, 2); \
     5530                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
     5531                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    53235532                } IEM_MC_NATIVE_ENDIF(); \
    53245533                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    53525561                    } IEM_MC_NATIVE_ELSE() { \
    53535562                        IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    5354                         IEM_MC_ARG(uint16_t const *, pu16Dst,                                   0); \
     5563                        IEM_MC_ARG(uint16_t const *, pu16Dst,                                   1); \
    53555564                        IEM_MC_MEM_MAP_U16_RO(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    5356                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags,                           2); \
    5357                         IEM_MC_ARG_CONST(uint16_t,   u16Src, (uint16_t)(int16_t)(int8_t)u8Imm,  1); \
    5358                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u16), pu16Dst, u16Src, pEFlags); \
     5565                        IEM_MC_ARG_EFLAGS(           fEFlagsIn,                                 0); \
     5566                        IEM_MC_ARG_CONST(uint16_t,   u16Src, (uint16_t)(int16_t)(int8_t)u8Imm,  2); \
     5567                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u16), fEFlagsIn, pu16Dst, u16Src); \
    53595568                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    5360                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     5569                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    53615570                    } IEM_MC_NATIVE_ENDIF(); \
    53625571                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    53785587                    } IEM_MC_NATIVE_ELSE() { \
    53795588                        IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    5380                         IEM_MC_ARG(uint32_t const *, pu32Dst,                                   0); \
     5589                        IEM_MC_ARG(uint32_t const *, pu32Dst,                                   1); \
    53815590                        IEM_MC_MEM_MAP_U32_RO(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    5382                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags,                           2); \
    5383                         IEM_MC_ARG_CONST(uint32_t,   u32Src, (uint32_t)(int32_t)(int8_t)u8Imm,  1); \
    5384                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u32), pu32Dst, u32Src, pEFlags); \
     5591                        IEM_MC_ARG_EFLAGS(           fEFlagsIn,                                 0); \
     5592                        IEM_MC_ARG_CONST(uint32_t,   u32Src, (uint32_t)(int32_t)(int8_t)u8Imm,  2); \
     5593                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u32), fEFlagsIn, pu32Dst, u32Src); \
    53855594                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    5386                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     5595                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    53875596                    } IEM_MC_NATIVE_ENDIF(); \
    53885597                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    54045613                    } IEM_MC_NATIVE_ELSE() { \
    54055614                        IEM_MC_LOCAL(uint8_t,        bUnmapInfo); \
    5406                         IEM_MC_ARG(uint64_t const *, pu64Dst,                                   0); \
     5615                        IEM_MC_ARG(uint64_t const *, pu64Dst,                                   1); \
    54075616                        IEM_MC_MEM_MAP_U64_RO(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    5408                         IEM_MC_ARG_LOCAL_EFLAGS(     pEFlags, EFlags,                           2); \
    5409                         IEM_MC_ARG_CONST(uint64_t,  u64Src, (uint64_t)(int64_t)(int8_t)u8Imm,   1); \
    5410                         IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u64), pu64Dst, u64Src, pEFlags); \
     5617                        IEM_MC_ARG_EFLAGS(           fEFlagsIn,                                 0); \
     5618                        IEM_MC_ARG_CONST(uint64_t,  u64Src, (uint64_t)(int64_t)(int8_t)u8Imm,   2); \
     5619                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, RT_CONCAT3(iemAImpl_,a_InsNm,_u64), fEFlagsIn, pu64Dst, u64Src); \
    54115620                        IEM_MC_MEM_COMMIT_AND_UNMAP_RO(bUnmapInfo); \
    5412                         IEM_MC_COMMIT_EFLAGS(EFlags); \
     5621                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    54135622                    } IEM_MC_NATIVE_ENDIF(); \
    54145623                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    55675776        IEM_MC_BEGIN(0, 0);
    55685777        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5569         IEM_MC_ARG(uint8_t,         u8Src,   1);
     5778        IEM_MC_ARG(uint8_t,         u8Src,      2);
    55705779        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm));
    55715780        IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     
    55745783            IEM_MC_COMMIT_EFLAGS_OPT(uEFlags);
    55755784        } IEM_MC_NATIVE_ELSE() {
    5576             IEM_MC_ARG(uint8_t *,   pu8Dst,  0);
     5785            IEM_MC_ARG(uint8_t *,   pu8Dst,     1);
    55775786            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); /* == IEM_GET_MODRM_RM(pVCpu, bRm) */
    5578             IEM_MC_ARG(uint32_t *,  pEFlags, 2);
    5579             IEM_MC_REF_EFLAGS(pEFlags);
    5580             IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u8, pu8Dst, u8Src, pEFlags);
     5787            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0);
     5788            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, iemAImpl_test_u8, fEFlagsIn, pu8Dst, u8Src);
     5789            IEM_MC_COMMIT_EFLAGS(fEFlagsRet);
    55815790        } IEM_MC_NATIVE_ENDIF();
    55825791        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    56115820                IEM_MC_BEGIN(0, 0);
    56125821                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5613                 IEM_MC_ARG(uint16_t,   u16Src,  1);
     5822                IEM_MC_ARG(uint16_t,        u16Src,     2);
    56145823                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm));
    56155824                IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     
    56185827                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags);
    56195828                } IEM_MC_NATIVE_ELSE() {
    5620                     IEM_MC_ARG(uint16_t *, pu16Dst, 0);
     5829                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1);
    56215830                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); /* == IEM_GET_MODRM_RM(pVCpu, bRm) */
    5622                     IEM_MC_ARG(uint32_t *, pEFlags, 2);
    5623                     IEM_MC_REF_EFLAGS(pEFlags);
    5624                     IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u16, pu16Dst, u16Src, pEFlags);
     5831                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0);
     5832                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, iemAImpl_test_u16, fEFlagsIn, pu16Dst, u16Src);
     5833                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet);
    56255834                } IEM_MC_NATIVE_ENDIF();
    56265835                IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    56315840                IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0);
    56325841                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5633                 IEM_MC_ARG(uint32_t,   u32Src,  1);
     5842                IEM_MC_ARG(uint32_t,        u32Src,     2);
    56345843                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm));
    56355844                IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     
    56385847                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags);
    56395848                } IEM_MC_NATIVE_ELSE() {
    5640                     IEM_MC_ARG(uint32_t *, pu32Dst, 0);
     5849                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1);
    56415850                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); /* == IEM_GET_MODRM_RM(pVCpu, bRm) */
    5642                     IEM_MC_ARG(uint32_t *, pEFlags, 2);
    5643                     IEM_MC_REF_EFLAGS(pEFlags);
    5644                     IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u32, pu32Dst, u32Src, pEFlags);
     5851                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0);
     5852                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, iemAImpl_test_u32, fEFlagsIn, pu32Dst, u32Src);
     5853                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet);
    56455854                } IEM_MC_NATIVE_ENDIF();
    56465855                IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    56515860                IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    56525861                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5653                 IEM_MC_ARG(uint64_t,        u64Src,  1);
     5862                IEM_MC_ARG(uint64_t,        u64Src,     2);
    56545863                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
    56555864                IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     
    56585867                    IEM_MC_COMMIT_EFLAGS_OPT(uEFlags);
    56595868                } IEM_MC_NATIVE_ELSE() {
    5660                     IEM_MC_ARG(uint64_t *,  pu64Dst, 0);
     5869                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1);
    56615870                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); /* == IEM_GET_MODRM_RM(pVCpu, bRm) */
    5662                     IEM_MC_ARG(uint32_t *,  pEFlags, 2);
    5663                     IEM_MC_REF_EFLAGS(pEFlags);
    5664                     IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u64, pu64Dst, u64Src, pEFlags);
     5871                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0);
     5872                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, iemAImpl_test_u64, fEFlagsIn, pu64Dst, u64Src);
     5873                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet);
    56655874                } IEM_MC_NATIVE_ENDIF();
    56665875                IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    73957604        IEM_MC_LOCAL(RTGCPTR,           uAddr2); \
    73967605        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr2, X86_GREG_xDI); \
    7397         IEM_MC_ARG(uint##ValBits##_t,               uValue2,            1); \
     7606        IEM_MC_ARG(uint##ValBits##_t,               uValue2,            2); \
    73987607        IEM_MC_FETCH_MEM_U##ValBits(uValue2, X86_SREG_ES, uAddr2); \
    73997608        \
    7400         IEM_MC_ARG(uint32_t *,                      pEFlags,            2); \
    7401         IEM_MC_REF_EFLAGS(pEFlags); \
    7402         IEM_MC_ARG_LOCAL_REF(uint##ValBits##_t *,   puValue1, uValue1,  0); \
    7403         IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cmp_u##ValBits, puValue1, uValue2, pEFlags); \
     7609        IEM_MC_ARG_LOCAL_REF(uint##ValBits##_t *,   puValue1, uValue1,  1); \
     7610        IEM_MC_ARG_EFLAGS(                          fEFlagsIn,          0); \
     7611        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, iemAImpl_cmp_u##ValBits, fEFlagsIn, puValue1, uValue2); \
    74047612        \
     7613        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    74057614        IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
    74067615            IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
     
    80988307        IEM_MC_BEGIN(a_fMcFlags, 0); \
    80998308        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    8100         IEM_MC_ARG(uint##ValBits##_t *, puRax,   0); \
    8101         IEM_MC_ARG(uint##ValBits##_t,   uValue,  1); \
    8102         IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
     8309        \
    81038310        IEM_MC_LOCAL(RTGCPTR,           uAddr); \
     8311        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
    81048312        \
    8105         IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
     8313        IEM_MC_ARG(uint##ValBits##_t,   uValue,     2); \
    81068314        IEM_MC_FETCH_MEM_U##ValBits(uValue, X86_SREG_ES, uAddr); \
     8315        IEM_MC_ARG(uint##ValBits##_t *, puRax,      1); \
    81078316        IEM_MC_REF_GREG_U##ValBits(puRax, X86_GREG_xAX); \
    8108         IEM_MC_REF_EFLAGS(pEFlags); \
    8109         IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cmp_u##ValBits, puRax, uValue, pEFlags); \
     8317        IEM_MC_ARG_EFLAGS(              fEFlagsIn,  0); \
     8318        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, iemAImpl_cmp_u##ValBits, fEFlagsIn, puRax, uValue); \
    81108319        \
     8320        IEM_MC_COMMIT_EFLAGS(fEFlagsRet);\
    81118321        IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
    81128322            IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
     
    1435814568        IEM_MC_ARG(uint8_t,         u8Value,    1); \
    1435914569        IEM_MC_ARG(uint32_t *,      pEFlags,    2); \
    14360         IEM_MC_LOCAL(int32_t,       rc); \
    1436114570        \
    1436214571        IEM_MC_FETCH_GREG_U8(u8Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    1436314572        IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
    1436414573        IEM_MC_REF_EFLAGS(pEFlags); \
    14365         IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags); \
     14574        IEM_MC_CALL_AIMPL_3(int32_t, rc, pfnU8, pu16AX, u8Value, pEFlags); \
    1436614575        IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1436714576            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1438014589        IEM_MC_ARG(uint32_t *,      pEFlags,    2); \
    1438114590        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14382         IEM_MC_LOCAL(int32_t,       rc); \
    1438314591        \
    1438414592        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    1438714595        IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \
    1438814596        IEM_MC_REF_EFLAGS(pEFlags); \
    14389         IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags); \
     14597        IEM_MC_CALL_AIMPL_3(int32_t, rc, pfnU8, pu16AX, u8Value, pEFlags); \
    1439014598        IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1439114599            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1441314621                IEM_MC_ARG(uint16_t,        u16Value,   2); \
    1441414622                IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    14415                 IEM_MC_LOCAL(int32_t,       rc); \
    1441614623                \
    1441714624                IEM_MC_FETCH_GREG_U16(u16Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     
    1441914626                IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \
    1442014627                IEM_MC_REF_EFLAGS(pEFlags); \
    14421                 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \
     14628                IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \
    1442214629                IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1442314630                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1443614643                IEM_MC_ARG(uint32_t,        u32Value,   2); \
    1443714644                IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    14438                 IEM_MC_LOCAL(int32_t,       rc); \
    1443914645                \
    1444014646                IEM_MC_FETCH_GREG_U32(u32Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     
    1444214648                IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \
    1444314649                IEM_MC_REF_EFLAGS(pEFlags); \
    14444                 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \
     14650                IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \
    1444514651                IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1444614652                    IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
     
    1446114667                IEM_MC_ARG(uint64_t,        u64Value,   2); \
    1446214668                IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    14463                 IEM_MC_LOCAL(int32_t,       rc); \
    1446414669                \
    1446514670                IEM_MC_FETCH_GREG_U64(u64Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     
    1446714672                IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \
    1446814673                IEM_MC_REF_EFLAGS(pEFlags); \
    14469                 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \
     14674                IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \
    1447014675                IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1447114676                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1449214697                IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    1449314698                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14494                 IEM_MC_LOCAL(int32_t,       rc); \
    1449514699                \
    1449614700                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    1450014704                IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \
    1450114705                IEM_MC_REF_EFLAGS(pEFlags); \
    14502                 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \
     14706                IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \
    1450314707                IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1450414708                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1451714721                IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    1451814722                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14519                 IEM_MC_LOCAL(int32_t,       rc); \
    1452014723                \
    1452114724                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    1452514728                IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \
    1452614729                IEM_MC_REF_EFLAGS(pEFlags); \
    14527                 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \
     14730                IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \
    1452814731                IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1452914732                    IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \
     
    1454414747                IEM_MC_ARG(uint32_t *,      pEFlags,    3); \
    1454514748                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    14546                 IEM_MC_LOCAL(int32_t,       rc); \
    1454714749                \
    1454814750                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    1455214754                IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \
    1455314755                IEM_MC_REF_EFLAGS(pEFlags); \
    14554                 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \
     14756                IEM_MC_CALL_AIMPL_4(int32_t, rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \
    1455514757                IEM_MC_IF_LOCAL_IS_Z(rc) { \
    1455614758                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r104183 r104195  
    22642264
    22652265    @staticmethod
     2266    def parseMcArgEFlags(oSelf, sName, asParams):
     2267        """ IEM_MC_ARG_EFLAGS """
     2268        oSelf.checkStmtParamCount(sName, asParams, 2);
     2269        # Note! We split this one up into IEM_MC_ARG and IEM_MC_FETCH_EFLAGS.
     2270        oStmtArg   = McStmtArg('IEM_MC_ARG', ['uint32_t', asParams[0], asParams[1]], 'uint32_t', asParams[0], int(asParams[1]));
     2271        oSelf.aoArgs.append(oStmtArg);
     2272        oStmtFetch = McStmt('IEM_MC_FETCH_EFLAGS', [asParams[0]]);
     2273        return (oStmtArg, oStmtFetch,);
     2274
     2275    @staticmethod
    22662276    def parseMcArgLocalEFlags(oSelf, sName, asParams):
    22672277        """ IEM_MC_ARG_LOCAL_EFLAGS """
     
    23142324        """ IEM_MC_CALL_AIMPL_3|4 """
    23152325        cArgs = int(sName[-1]);
    2316         oSelf.checkStmtParamCount(sName, asParams, 2 + cArgs);
    2317         return McStmtCall(sName, asParams, 1, 0);
     2326        oSelf.checkStmtParamCount(sName, asParams, 3 + cArgs);
     2327        oSelf.aoLocals.append(McStmtVar('IEM_MC_LOCAL', [asParams[0], asParams[1]], asParams[0], asParams[1]));
     2328        return McStmtCall(sName, asParams, 2, 1);
    23182329
    23192330    @staticmethod
     
    29742985    'IEM_MC_ARG':                                                (McBlock.parseMcArg,               False, False, True,  ),
    29752986    'IEM_MC_ARG_CONST':                                          (McBlock.parseMcArgConst,          False, False, True,  ),
     2987    'IEM_MC_ARG_EFLAGS':                                         (McBlock.parseMcArgEFlags,         False, False, True,  ),
    29762988    'IEM_MC_ARG_LOCAL_EFLAGS':                                   (McBlock.parseMcArgLocalEFlags,    False, False, True,  ),
    29772989    'IEM_MC_ARG_LOCAL_REF':                                      (McBlock.parseMcArgLocalRef,       False, False, True,  ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r104185 r104195  
    1000410004    IEMOP_HLP_MIN_386();
    1000510005    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
    10006     const IEMOPBINSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_eflags);
     10006    const IEMOPBINTODOSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_eflags);
    1000710007    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    10008     IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_MIN_386, imul, 0);
     10008    IEMOP_BODY_BINARY_TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_MIN_386, imul, 0);
    1000910009}
    1001010010
     
    1050110501#ifndef TST_IEM_CHECK_MC
    1050210502# if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY)
    10503     static const IEMOPBINSIZES s_Native =
     10503    static const IEMOPBINTODOSIZES s_Native =
    1050410504    {   NULL, NULL, iemAImpl_popcnt_u16, NULL, iemAImpl_popcnt_u32, NULL, iemAImpl_popcnt_u64, NULL };
    1050510505# endif
    10506     static const IEMOPBINSIZES s_Fallback =
     10506    static const IEMOPBINTODOSIZES s_Fallback =
    1050710507    {   NULL, NULL, iemAImpl_popcnt_u16_fallback, NULL, iemAImpl_popcnt_u32_fallback, NULL, iemAImpl_popcnt_u64_fallback, NULL };
    1050810508#endif
    10509     const IEMOPBINSIZES * const pImpl = IEM_SELECT_HOST_OR_FALLBACK(fPopCnt, &s_Native, &s_Fallback);
     10509    const IEMOPBINTODOSIZES * const pImpl = IEM_SELECT_HOST_OR_FALLBACK(fPopCnt, &s_Native, &s_Fallback);
    1051010510    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    10511     IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, popcnt, 0);
     10511    IEMOP_BODY_BINARY_TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, popcnt, 0);
    1051210512}
    1051310513
     
    1113811138    IEMOP_HLP_MIN_386();
    1113911139    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
    11140     PCIEMOPBINSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsf_eflags);
     11140    PCIEMOPBINTODOSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsf_eflags);
    1114111141    IEMOP_BODY_BIT_SCAN_OPERATOR_RV_RM(pImpl);
    1114211142}
     
    1115911159
    1116011160#ifndef TST_IEM_CHECK_MC
    11161     static const IEMOPBINSIZES s_iemAImpl_tzcnt =
     11161    static const IEMOPBINTODOSIZES s_iemAImpl_tzcnt =
    1116211162    {   NULL, NULL,     iemAImpl_tzcnt_u16, NULL,       iemAImpl_tzcnt_u32, NULL,       iemAImpl_tzcnt_u64, NULL };
    11163     static const IEMOPBINSIZES s_iemAImpl_tzcnt_amd =
     11163    static const IEMOPBINTODOSIZES s_iemAImpl_tzcnt_amd =
    1116411164    {   NULL, NULL,     iemAImpl_tzcnt_u16_amd, NULL,   iemAImpl_tzcnt_u32_amd, NULL,   iemAImpl_tzcnt_u64_amd, NULL };
    11165     static const IEMOPBINSIZES s_iemAImpl_tzcnt_intel =
     11165    static const IEMOPBINTODOSIZES s_iemAImpl_tzcnt_intel =
    1116611166    {   NULL, NULL,     iemAImpl_tzcnt_u16_intel, NULL, iemAImpl_tzcnt_u32_intel, NULL, iemAImpl_tzcnt_u64_intel, NULL };
    11167     static const IEMOPBINSIZES * const s_iemAImpl_tzcnt_eflags[2][4] =
     11167    static const IEMOPBINTODOSIZES * const s_iemAImpl_tzcnt_eflags[2][4] =
    1116811168    {
    1116911169        { &s_iemAImpl_tzcnt_intel, &s_iemAImpl_tzcnt_intel, &s_iemAImpl_tzcnt_amd, &s_iemAImpl_tzcnt_intel },
     
    1117211172#endif
    1117311173    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF);
    11174     const IEMOPBINSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_tzcnt_eflags,
     11174    const IEMOPBINTODOSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_tzcnt_eflags,
    1117511175                                                                            IEM_GET_HOST_CPU_FEATURES(pVCpu)->fBmi1);
    1117611176    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    11177     IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, tzcnt, 0);
     11177    IEMOP_BODY_BINARY_TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, tzcnt, 0);
    1117811178}
    1117911179
     
    1119311193    IEMOP_HLP_MIN_386();
    1119411194    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
    11195     PCIEMOPBINSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsr_eflags);
     11195    PCIEMOPBINTODOSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsr_eflags);
    1119611196    IEMOP_BODY_BIT_SCAN_OPERATOR_RV_RM(pImpl);
    1119711197}
     
    1121411214
    1121511215#ifndef TST_IEM_CHECK_MC
    11216     static const IEMOPBINSIZES s_iemAImpl_lzcnt =
     11216    static const IEMOPBINTODOSIZES s_iemAImpl_lzcnt =
    1121711217    {   NULL, NULL,     iemAImpl_lzcnt_u16, NULL,       iemAImpl_lzcnt_u32, NULL,       iemAImpl_lzcnt_u64, NULL };
    11218     static const IEMOPBINSIZES s_iemAImpl_lzcnt_amd =
     11218    static const IEMOPBINTODOSIZES s_iemAImpl_lzcnt_amd =
    1121911219    {   NULL,  NULL,    iemAImpl_lzcnt_u16_amd, NULL,   iemAImpl_lzcnt_u32_amd, NULL,   iemAImpl_lzcnt_u64_amd, NULL };
    11220     static const IEMOPBINSIZES s_iemAImpl_lzcnt_intel =
     11220    static const IEMOPBINTODOSIZES s_iemAImpl_lzcnt_intel =
    1122111221    {   NULL,  NULL,    iemAImpl_lzcnt_u16_intel, NULL, iemAImpl_lzcnt_u32_intel, NULL, iemAImpl_lzcnt_u64_intel, NULL };
    11222     static const IEMOPBINSIZES * const s_iemAImpl_lzcnt_eflags[2][4] =
     11222    static const IEMOPBINTODOSIZES * const s_iemAImpl_lzcnt_eflags[2][4] =
    1122311223    {
    1122411224        { &s_iemAImpl_lzcnt_intel, &s_iemAImpl_lzcnt_intel, &s_iemAImpl_lzcnt_amd, &s_iemAImpl_lzcnt_intel },
     
    1122711227#endif
    1122811228    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF);
    11229     const IEMOPBINSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_lzcnt_eflags,
     11229    const IEMOPBINTODOSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_lzcnt_eflags,
    1123011230                                                                            IEM_GET_HOST_CPU_FEATURES(pVCpu)->fBmi1);
    1123111231    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    11232     IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, lzcnt, 0);
     11232    IEMOP_BODY_BINARY_TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, lzcnt, 0);
    1123311233}
    1123411234
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp

    r104183 r104195  
    10381038#define IEM_MC_CALL_VOID_AIMPL_3(a_pfn, a0, a1, a2)                                             NOP()
    10391039#define IEM_MC_CALL_VOID_AIMPL_4(a_pfn, a0, a1, a2, a3)                                         NOP()
    1040 #define IEM_MC_CALL_AIMPL_3(a_rc, a_pfn, a0, a1, a2)                                            NOP()
    1041 #define IEM_MC_CALL_AIMPL_4(a_rc, a_pfn, a0, a1, a2, a3)                                        NOP()
     1040#define IEM_MC_CALL_AIMPL_3(a_rcType, a_rc, a_pfn, a0, a1, a2)                                  NOP()
     1041#define IEM_MC_CALL_AIMPL_4(a_rcType, a_rc, a_pfn, a0, a1, a2, a3)                              NOP()
    10421042
    10431043#define IEM_MC_CALL_FPU_AIMPL_1(a_pfnAImpl, a0)                                                 NOP()
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py

    r104150 r104195  
    285285        asVarsInScope = [];
    286286        for oStmt in aoStmts:
     287            if isinstance(oStmt, iai.McStmtCall) and oStmt.sName.startswith('IEM_MC_CALL_AIMPL_'):
     288                oStmt = iai.McStmtVar(oStmt.sName, oStmt.asParams[0:2], oStmt.asParams[0], oStmt.asParams[1]);
     289
    287290            if isinstance(oStmt, iai.McStmtVar):
    288291                if oStmt.sVarName in dVars:
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r104183 r104195  
    24822482    off = iemNativeEmitCallAImpl3(pReNative, off, UINT8_MAX /*idxVarRc*/, (uintptr_t)(a_pfn), a0, a1, a2)
    24832483
    2484 #define IEM_MC_CALL_AIMPL_3(a_rc, a_pfn, a0, a1, a2) \
     2484#define IEM_MC_CALL_AIMPL_3(a_rcType, a_rc, a_pfn, a0, a1, a2) \
     2485    IEM_MC_LOCAL(a_rcType, a_rc); \
    24852486    off = iemNativeEmitCallAImpl3(pReNative, off, a_rc,                   (uintptr_t)(a_pfn), a0, a1, a2)
    24862487
     
    25002501    off = iemNativeEmitCallAImpl4(pReNative, off, UINT8_MAX /*idxVarRc*/, (uintptr_t)(a_pfn), a0, a1, a2, a3)
    25012502
    2502 #define IEM_MC_CALL_AIMPL_4(a_rc, a_pfn, a0, a1, a2, a3) \
     2503#define IEM_MC_CALL_AIMPL_4(a_rcType, a_rc, a_pfn, a0, a1, a2, a3) \
     2504    IEM_MC_LOCAL(a_rcType, a_rc); \
    25032505    off = iemNativeEmitCallAImpl4(pReNative, off, a_rc,                   (uintptr_t)(a_pfn), a0, a1, a2, a3)
    25042506
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r104135 r104195  
    771771            offBits   = sMember.rfind('U') + 1;
    772772            if sBaseType == 'PCIEMOPBINSIZES':          return 'PFNIEMAIMPLBINU'        + sMember[offBits:];
     773            if sBaseType == 'PCIEMOPBINTODOSIZES':      return 'PFNIEMAIMPLBINTODOU'    + sMember[offBits:];
    773774            if sBaseType == 'PCIEMOPUNARYSIZES':        return 'PFNIEMAIMPLUNARYU'      + sMember[offBits:];
    774775            if sBaseType == 'PCIEMOPSHIFTSIZES':        return 'PFNIEMAIMPLSHIFTU'      + sMember[offBits:];
     
    19391940                    raise Exception('Variable %s is defined more than once!' % (oStmt.sVarName,));
    19401941                self.dVariables[oStmt.sVarName] = oStmt.sVarName;
     1942            elif isinstance(oStmt, iai.McStmtCall) and oStmt.sName.startswith('IEM_MC_CALL_AIMPL_'):
     1943                if oStmt.asParams[1] in self.dVariables:
     1944                    raise Exception('Variable %s is defined more than once!' % (oStmt.asParams[1],));
     1945                self.dVariables[oStmt.asParams[1]] = iai.McStmtVar('IEM_MC_LOCAL', oStmt.asParams[0:2],
     1946                                                                   oStmt.asParams[0], oStmt.asParams[1]);
    19411947
    19421948            # There shouldn't be any variables or arguments declared inside if/
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104188 r104195  
    25922592/** @name Arithmetic assignment operations on bytes (binary).
    25932593 * @{ */
    2594 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINU8,  (uint8_t  *pu8Dst,  uint8_t  u8Src,  uint32_t *pEFlags));
     2594typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINU8, (uint32_t fEFlagsIn, uint8_t  *pu8Dst,  uint8_t  u8Src));
    25952595typedef FNIEMAIMPLBINU8  *PFNIEMAIMPLBINU8;
    25962596FNIEMAIMPLBINU8 iemAImpl_add_u8, iemAImpl_add_u8_locked;
     
    26012601FNIEMAIMPLBINU8 iemAImpl_xor_u8, iemAImpl_xor_u8_locked;
    26022602FNIEMAIMPLBINU8 iemAImpl_and_u8, iemAImpl_and_u8_locked;
     2603
     2604typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU8, (uint8_t *pu8Dst, uint8_t u8Src, uint32_t *pEFlags));
     2605typedef FNIEMAIMPLBINTODOU8 *PFNIEMAIMPLBINTODOU8;
    26032606/** @} */
    26042607
    26052608/** @name Arithmetic assignment operations on words (binary).
    26062609 * @{ */
    2607 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINU16,  (uint16_t *pu16Dst, uint16_t u16Src, uint32_t *pEFlags));
     2610typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINU16, (uint32_t fEFlagsIn, uint16_t *pu16Dst, uint16_t u16Src));
    26082611typedef FNIEMAIMPLBINU16  *PFNIEMAIMPLBINU16;
    26092612FNIEMAIMPLBINU16 iemAImpl_add_u16, iemAImpl_add_u16_locked;
     
    26142617FNIEMAIMPLBINU16 iemAImpl_xor_u16, iemAImpl_xor_u16_locked;
    26152618FNIEMAIMPLBINU16 iemAImpl_and_u16, iemAImpl_and_u16_locked;
     2619
     2620typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU16, (uint16_t *pu16Dst, uint16_t u16Src, uint32_t *pEFlags));
     2621typedef FNIEMAIMPLBINTODOU16 *PFNIEMAIMPLBINTODOU16;
    26162622/** @}  */
    26172623
     2624
    26182625/** @name Arithmetic assignment operations on double words (binary).
    26192626 * @{ */
    2620 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINU32, (uint32_t *pu32Dst, uint32_t u32Src, uint32_t *pEFlags));
     2627typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINU32, (uint32_t fEFlagsIn, uint32_t *pu32Dst, uint32_t u32Src));
    26212628typedef FNIEMAIMPLBINU32 *PFNIEMAIMPLBINU32;
    26222629FNIEMAIMPLBINU32 iemAImpl_add_u32, iemAImpl_add_u32_locked;
     
    26272634FNIEMAIMPLBINU32 iemAImpl_xor_u32, iemAImpl_xor_u32_locked;
    26282635FNIEMAIMPLBINU32 iemAImpl_and_u32, iemAImpl_and_u32_locked;
    2629 FNIEMAIMPLBINU32 iemAImpl_blsi_u32, iemAImpl_blsi_u32_fallback;
    2630 FNIEMAIMPLBINU32 iemAImpl_blsr_u32, iemAImpl_blsr_u32_fallback;
    2631 FNIEMAIMPLBINU32 iemAImpl_blsmsk_u32, iemAImpl_blsmsk_u32_fallback;
     2636
     2637typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU32, (uint32_t *pu32Dst, uint32_t u32Src, uint32_t *pEFlags));
     2638typedef FNIEMAIMPLBINTODOU32 *PFNIEMAIMPLBINTODOU32;
     2639FNIEMAIMPLBINTODOU32 iemAImpl_blsi_u32, iemAImpl_blsi_u32_fallback;
     2640FNIEMAIMPLBINTODOU32 iemAImpl_blsr_u32, iemAImpl_blsr_u32_fallback;
     2641FNIEMAIMPLBINTODOU32 iemAImpl_blsmsk_u32, iemAImpl_blsmsk_u32_fallback;
    26322642/** @}  */
    26332643
    26342644/** @name Arithmetic assignment operations on quad words (binary).
    26352645 * @{ */
    2636 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINU64, (uint64_t *pu64Dst, uint64_t u64Src, uint32_t *pEFlags));
     2646typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINU64, (uint32_t fEFlagsIn, uint64_t *pu64Dst, uint64_t u64Src));
    26372647typedef FNIEMAIMPLBINU64 *PFNIEMAIMPLBINU64;
    26382648FNIEMAIMPLBINU64 iemAImpl_add_u64, iemAImpl_add_u64_locked;
     
    26432653FNIEMAIMPLBINU64 iemAImpl_xor_u64, iemAImpl_xor_u64_locked;
    26442654FNIEMAIMPLBINU64 iemAImpl_and_u64, iemAImpl_and_u64_locked;
    2645 FNIEMAIMPLBINU64 iemAImpl_blsi_u64, iemAImpl_blsi_u64_fallback;
    2646 FNIEMAIMPLBINU64 iemAImpl_blsr_u64, iemAImpl_blsr_u64_fallback;
    2647 FNIEMAIMPLBINU64 iemAImpl_blsmsk_u64, iemAImpl_blsmsk_u64_fallback;
     2655
     2656typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU64, (uint64_t *pu64Dst, uint64_t u64Src, uint32_t *pEFlags));
     2657typedef FNIEMAIMPLBINTODOU64 *PFNIEMAIMPLBINTODOU64;
     2658FNIEMAIMPLBINTODOU64 iemAImpl_blsi_u64, iemAImpl_blsi_u64_fallback;
     2659FNIEMAIMPLBINTODOU64 iemAImpl_blsr_u64, iemAImpl_blsr_u64_fallback;
     2660FNIEMAIMPLBINTODOU64 iemAImpl_blsmsk_u64, iemAImpl_blsmsk_u64_fallback;
    26482661/** @}  */
    26492662
    2650 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINROU8,(uint8_t const *pu8Dst, uint8_t u8Src, uint32_t *pEFlags));
     2663typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINROU8, (uint32_t fEFlagsIn, uint8_t const *pu8Dst, uint8_t u8Src));
    26512664typedef FNIEMAIMPLBINROU8 *PFNIEMAIMPLBINROU8;
    2652 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINROU16,(uint16_t const *pu16Dst, uint16_t u16Src, uint32_t *pEFlags));
     2665typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINROU16,(uint32_t fEFlagsIn, uint16_t const *pu16Dst, uint16_t u16Src));
    26532666typedef FNIEMAIMPLBINROU16 *PFNIEMAIMPLBINROU16;
    2654 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINROU32,(uint32_t const *pu32Dst, uint32_t u32Src, uint32_t *pEFlags));
     2667typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINROU32,(uint32_t fEFlagsIn, uint32_t const *pu32Dst, uint32_t u32Src));
    26552668typedef FNIEMAIMPLBINROU32 *PFNIEMAIMPLBINROU32;
    2656 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINROU64,(uint64_t const *pu64Dst, uint64_t u64Src, uint32_t *pEFlags));
     2669typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLBINROU64,(uint32_t fEFlagsIn, uint64_t const *pu64Dst, uint64_t u64Src));
    26572670typedef FNIEMAIMPLBINROU64 *PFNIEMAIMPLBINROU64;
    26582671
     
    26732686/** @}  */
    26742687
     2688typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOROU16,(uint16_t const *pu16Dst, uint16_t u16Src, uint32_t *pEFlags));
     2689typedef FNIEMAIMPLBINTODOROU16 *PFNIEMAIMPLBINTODOROU16;
     2690typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOROU32,(uint32_t const *pu32Dst, uint32_t u32Src, uint32_t *pEFlags));
     2691typedef FNIEMAIMPLBINTODOROU32 *PFNIEMAIMPLBINTODOROU32;
     2692typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOROU64,(uint64_t const *pu64Dst, uint64_t u64Src, uint32_t *pEFlags));
     2693typedef FNIEMAIMPLBINTODOROU64 *PFNIEMAIMPLBINTODOROU64;
     2694
    26752695/** @name Bit operations operations (thrown in with the binary ops).
    26762696 * @{ */
    2677 FNIEMAIMPLBINROU16 iemAImpl_bt_u16;
    2678 FNIEMAIMPLBINROU32 iemAImpl_bt_u32;
    2679 FNIEMAIMPLBINROU64 iemAImpl_bt_u64;
    2680 FNIEMAIMPLBINU16 iemAImpl_btc_u16, iemAImpl_btc_u16_locked;
    2681 FNIEMAIMPLBINU32 iemAImpl_btc_u32, iemAImpl_btc_u32_locked;
    2682 FNIEMAIMPLBINU64 iemAImpl_btc_u64, iemAImpl_btc_u64_locked;
    2683 FNIEMAIMPLBINU16 iemAImpl_btr_u16, iemAImpl_btr_u16_locked;
    2684 FNIEMAIMPLBINU32 iemAImpl_btr_u32, iemAImpl_btr_u32_locked;
    2685 FNIEMAIMPLBINU64 iemAImpl_btr_u64, iemAImpl_btr_u64_locked;
    2686 FNIEMAIMPLBINU16 iemAImpl_bts_u16, iemAImpl_bts_u16_locked;
    2687 FNIEMAIMPLBINU32 iemAImpl_bts_u32, iemAImpl_bts_u32_locked;
    2688 FNIEMAIMPLBINU64 iemAImpl_bts_u64, iemAImpl_bts_u64_locked;
     2697FNIEMAIMPLBINTODOROU16 iemAImpl_bt_u16;
     2698FNIEMAIMPLBINTODOROU32 iemAImpl_bt_u32;
     2699FNIEMAIMPLBINTODOROU64 iemAImpl_bt_u64;
     2700FNIEMAIMPLBINTODOU16 iemAImpl_btc_u16, iemAImpl_btc_u16_locked;
     2701FNIEMAIMPLBINTODOU32 iemAImpl_btc_u32, iemAImpl_btc_u32_locked;
     2702FNIEMAIMPLBINTODOU64 iemAImpl_btc_u64, iemAImpl_btc_u64_locked;
     2703FNIEMAIMPLBINTODOU16 iemAImpl_btr_u16, iemAImpl_btr_u16_locked;
     2704FNIEMAIMPLBINTODOU32 iemAImpl_btr_u32, iemAImpl_btr_u32_locked;
     2705FNIEMAIMPLBINTODOU64 iemAImpl_btr_u64, iemAImpl_btr_u64_locked;
     2706FNIEMAIMPLBINTODOU16 iemAImpl_bts_u16, iemAImpl_bts_u16_locked;
     2707FNIEMAIMPLBINTODOU32 iemAImpl_bts_u32, iemAImpl_bts_u32_locked;
     2708FNIEMAIMPLBINTODOU64 iemAImpl_bts_u64, iemAImpl_bts_u64_locked;
    26892709/** @}  */
    26902710
     
    28272847/** @name Bit search operations (thrown in with the binary ops).
    28282848 * @{ */
    2829 FNIEMAIMPLBINU16 iemAImpl_bsf_u16, iemAImpl_bsf_u16_amd, iemAImpl_bsf_u16_intel;
    2830 FNIEMAIMPLBINU32 iemAImpl_bsf_u32, iemAImpl_bsf_u32_amd, iemAImpl_bsf_u32_intel;
    2831 FNIEMAIMPLBINU64 iemAImpl_bsf_u64, iemAImpl_bsf_u64_amd, iemAImpl_bsf_u64_intel;
    2832 FNIEMAIMPLBINU16 iemAImpl_bsr_u16, iemAImpl_bsr_u16_amd, iemAImpl_bsr_u16_intel;
    2833 FNIEMAIMPLBINU32 iemAImpl_bsr_u32, iemAImpl_bsr_u32_amd, iemAImpl_bsr_u32_intel;
    2834 FNIEMAIMPLBINU64 iemAImpl_bsr_u64, iemAImpl_bsr_u64_amd, iemAImpl_bsr_u64_intel;
    2835 FNIEMAIMPLBINU16 iemAImpl_lzcnt_u16, iemAImpl_lzcnt_u16_amd, iemAImpl_lzcnt_u16_intel;
    2836 FNIEMAIMPLBINU32 iemAImpl_lzcnt_u32, iemAImpl_lzcnt_u32_amd, iemAImpl_lzcnt_u32_intel;
    2837 FNIEMAIMPLBINU64 iemAImpl_lzcnt_u64, iemAImpl_lzcnt_u64_amd, iemAImpl_lzcnt_u64_intel;
    2838 FNIEMAIMPLBINU16 iemAImpl_tzcnt_u16, iemAImpl_tzcnt_u16_amd, iemAImpl_tzcnt_u16_intel;
    2839 FNIEMAIMPLBINU32 iemAImpl_tzcnt_u32, iemAImpl_tzcnt_u32_amd, iemAImpl_tzcnt_u32_intel;
    2840 FNIEMAIMPLBINU64 iemAImpl_tzcnt_u64, iemAImpl_tzcnt_u64_amd, iemAImpl_tzcnt_u64_intel;
    2841 FNIEMAIMPLBINU16 iemAImpl_popcnt_u16, iemAImpl_popcnt_u16_fallback;
    2842 FNIEMAIMPLBINU32 iemAImpl_popcnt_u32, iemAImpl_popcnt_u32_fallback;
    2843 FNIEMAIMPLBINU64 iemAImpl_popcnt_u64, iemAImpl_popcnt_u64_fallback;
     2849FNIEMAIMPLBINTODOU16 iemAImpl_bsf_u16, iemAImpl_bsf_u16_amd, iemAImpl_bsf_u16_intel;
     2850FNIEMAIMPLBINTODOU32 iemAImpl_bsf_u32, iemAImpl_bsf_u32_amd, iemAImpl_bsf_u32_intel;
     2851FNIEMAIMPLBINTODOU64 iemAImpl_bsf_u64, iemAImpl_bsf_u64_amd, iemAImpl_bsf_u64_intel;
     2852FNIEMAIMPLBINTODOU16 iemAImpl_bsr_u16, iemAImpl_bsr_u16_amd, iemAImpl_bsr_u16_intel;
     2853FNIEMAIMPLBINTODOU32 iemAImpl_bsr_u32, iemAImpl_bsr_u32_amd, iemAImpl_bsr_u32_intel;
     2854FNIEMAIMPLBINTODOU64 iemAImpl_bsr_u64, iemAImpl_bsr_u64_amd, iemAImpl_bsr_u64_intel;
     2855FNIEMAIMPLBINTODOU16 iemAImpl_lzcnt_u16, iemAImpl_lzcnt_u16_amd, iemAImpl_lzcnt_u16_intel;
     2856FNIEMAIMPLBINTODOU32 iemAImpl_lzcnt_u32, iemAImpl_lzcnt_u32_amd, iemAImpl_lzcnt_u32_intel;
     2857FNIEMAIMPLBINTODOU64 iemAImpl_lzcnt_u64, iemAImpl_lzcnt_u64_amd, iemAImpl_lzcnt_u64_intel;
     2858FNIEMAIMPLBINTODOU16 iemAImpl_tzcnt_u16, iemAImpl_tzcnt_u16_amd, iemAImpl_tzcnt_u16_intel;
     2859FNIEMAIMPLBINTODOU32 iemAImpl_tzcnt_u32, iemAImpl_tzcnt_u32_amd, iemAImpl_tzcnt_u32_intel;
     2860FNIEMAIMPLBINTODOU64 iemAImpl_tzcnt_u64, iemAImpl_tzcnt_u64_amd, iemAImpl_tzcnt_u64_intel;
     2861FNIEMAIMPLBINTODOU16 iemAImpl_popcnt_u16, iemAImpl_popcnt_u16_fallback;
     2862FNIEMAIMPLBINTODOU32 iemAImpl_popcnt_u32, iemAImpl_popcnt_u32_fallback;
     2863FNIEMAIMPLBINTODOU64 iemAImpl_popcnt_u64, iemAImpl_popcnt_u64_fallback;
    28442864/** @}  */
    28452865
    28462866/** @name Signed multiplication operations (thrown in with the binary ops).
    28472867 * @{ */
    2848 FNIEMAIMPLBINU16 iemAImpl_imul_two_u16, iemAImpl_imul_two_u16_amd, iemAImpl_imul_two_u16_intel;
    2849 FNIEMAIMPLBINU32 iemAImpl_imul_two_u32, iemAImpl_imul_two_u32_amd, iemAImpl_imul_two_u32_intel;
    2850 FNIEMAIMPLBINU64 iemAImpl_imul_two_u64, iemAImpl_imul_two_u64_amd, iemAImpl_imul_two_u64_intel;
     2868FNIEMAIMPLBINTODOU16 iemAImpl_imul_two_u16, iemAImpl_imul_two_u16_amd, iemAImpl_imul_two_u16_intel;
     2869FNIEMAIMPLBINTODOU32 iemAImpl_imul_two_u32, iemAImpl_imul_two_u32_amd, iemAImpl_imul_two_u32_intel;
     2870FNIEMAIMPLBINTODOU64 iemAImpl_imul_two_u64, iemAImpl_imul_two_u64_amd, iemAImpl_imul_two_u64_intel;
    28512871/** @}  */
    28522872
     
    29843004/** @name Misc.
    29853005 * @{ */
    2986 FNIEMAIMPLBINU16 iemAImpl_arpl;
     3006FNIEMAIMPLBINTODOU16 iemAImpl_arpl;
    29873007/** @} */
    29883008
     
    30063026/** @name ADOX and ADCX
    30073027 * @{ */
    3008 FNIEMAIMPLBINU32 iemAImpl_adcx_u32, iemAImpl_adcx_u32_fallback;
    3009 FNIEMAIMPLBINU64 iemAImpl_adcx_u64, iemAImpl_adcx_u64_fallback;
    3010 FNIEMAIMPLBINU32 iemAImpl_adox_u32, iemAImpl_adox_u32_fallback;
    3011 FNIEMAIMPLBINU64 iemAImpl_adox_u64, iemAImpl_adox_u64_fallback;
     3028FNIEMAIMPLBINTODOU32 iemAImpl_adcx_u32, iemAImpl_adcx_u32_fallback;
     3029FNIEMAIMPLBINTODOU64 iemAImpl_adcx_u64, iemAImpl_adcx_u64_fallback;
     3030FNIEMAIMPLBINTODOU32 iemAImpl_adox_u32, iemAImpl_adox_u32_fallback;
     3031FNIEMAIMPLBINTODOU64 iemAImpl_adox_u64, iemAImpl_adox_u64_fallback;
    30123032/** @} */
    30133033
     
    39713991/** Pointer to a binary operator function table. */
    39723992typedef IEMOPBINSIZES const *PCIEMOPBINSIZES;
     3993
     3994
     3995/**
     3996 * Function table for a binary operator providing implementation based on
     3997 * operand size.
     3998 */
     3999typedef struct IEMOPBINTODOSIZES
     4000{
     4001    PFNIEMAIMPLBINTODOU8  pfnNormalU8,    pfnLockedU8;
     4002    PFNIEMAIMPLBINTODOU16 pfnNormalU16,   pfnLockedU16;
     4003    PFNIEMAIMPLBINTODOU32 pfnNormalU32,   pfnLockedU32;
     4004    PFNIEMAIMPLBINTODOU64 pfnNormalU64,   pfnLockedU64;
     4005} IEMOPBINTODOSIZES;
     4006/** Pointer to a binary operator function table. */
     4007typedef IEMOPBINTODOSIZES const *PCIEMOPBINTODOSIZES;
    39734008
    39744009
  • trunk/src/VBox/VMM/include/IEMMc.h

    r104183 r104195  
    197197#define IEM_MC_ARG_CONST(a_Type, a_Name, a_Value, a_iArg)       a_Type const a_Name = (a_Value)
    198198#define IEM_MC_ARG_LOCAL_REF(a_Type, a_Name, a_Local, a_iArg)   a_Type const a_Name = &(a_Local)
     199/** @note IEMAllInstPython.py duplicates the expansion. */
     200#define IEM_MC_ARG_EFLAGS(a_Name, a_iArg)               uint32_t const a_Name = pVCpu->cpum.GstCtx.eflags.u
    199201/** @note IEMAllInstPython.py duplicates the expansion. */
    200202#define IEM_MC_ARG_LOCAL_EFLAGS(a_pName, a_Name, a_iArg) \
     
    26222624#define IEM_MC_CALL_VOID_AIMPL_3(a_pfn, a0, a1, a2)       (a_pfn)((a0), (a1), (a2))
    26232625#define IEM_MC_CALL_VOID_AIMPL_4(a_pfn, a0, a1, a2, a3)   (a_pfn)((a0), (a1), (a2), (a3))
    2624 #define IEM_MC_CALL_AIMPL_3(a_rc, a_pfn, a0, a1, a2)      (a_rc) = (a_pfn)((a0), (a1), (a2))
    2625 #define IEM_MC_CALL_AIMPL_4(a_rc, a_pfn, a0, a1, a2, a3)  (a_rc) = (a_pfn)((a0), (a1), (a2), (a3))
     2626#define IEM_MC_CALL_AIMPL_3(a_rcType, a_rc, a_pfn, a0, a1, a2)      a_rcType const a_rc = (a_pfn)((a0), (a1), (a2))
     2627#define IEM_MC_CALL_AIMPL_4(a_rcType, a_rc, a_pfn, a0, a1, a2, a3)  a_rcType const a_rc = (a_pfn)((a0), (a1), (a2), (a3))
    26262628
    26272629
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r104174 r104195  
    17611761            a_TestType Test; \
    17621762            Test.fEflIn    = RandEFlags(); \
    1763             Test.fEflOut   = Test.fEflIn; \
    17641763            Test.uDstIn    = RandU ## a_cBits ## Dst(iTest); \
    17651764            Test.uDstOut   = Test.uDstIn; \
     
    17681767                Test.uSrcIn &= a_cBits - 1; /* Restrict bit index according to operand width */ \
    17691768            Test.uMisc     = 0; \
    1770             pfn(&Test.uDstOut, Test.uSrcIn, &Test.fEflOut); \
     1769            Test.fEflOut   = pfn(Test.fEflIn, &Test.uDstOut, Test.uSrcIn); \
    17711770            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    17721771        } \
     
    17761775            Test.fEflIn    = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].fEflIn == UINT32_MAX ? RandEFlags() \
    17771776                           : g_aBinU ## a_cBits[iFn].paFixedTests[iTest].fEflIn; \
    1778             Test.fEflOut   = Test.fEflIn; \
    17791777            Test.uDstIn    = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].uDstIn; \
    17801778            Test.uDstOut   = Test.uDstIn; \
    17811779            Test.uSrcIn    = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].uSrcIn; \
    17821780            Test.uMisc     = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].uMisc; \
    1783             pfn(&Test.uDstOut, Test.uSrcIn, &Test.fEflOut); \
     1781            Test.fEflOut   = pfn(Test.fEflIn, &Test.uDstOut, Test.uSrcIn); \
    17841782            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    17851783        } \
     
    18181816    cIterations /= 4; \
    18191817    RTThreadYield(); \
    1820     uint64_t const nsStart     = RTTimeNanoTS(); \
     1818    uint64_t const nsStart = RTTimeNanoTS(); \
    18211819    for (uint32_t i = 0; i < cIterations; i++) \
    18221820    { \
    1823         uint32_t fBenchEfl = fEflIn; \
    1824         a_uType  uBenchDst = uDstIn;  \
    1825         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1821        a_uType uBenchDst = uDstIn;  \
     1822        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18261823        \
    1827         fBenchEfl = fEflIn; \
    18281824        uBenchDst = uDstIn;  \
    1829         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1825        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18301826        \
    1831         fBenchEfl = fEflIn; \
    18321827        uBenchDst = uDstIn;  \
    1833         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1828        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18341829        \
    1835         fBenchEfl = fEflIn; \
    18361830        uBenchDst = uDstIn;  \
    1837         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1831        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18381832    } \
    18391833    return RTTimeNanoTS() - nsStart; \
     
    18551849            for (uint32_t iTest = 0; iTest < cTests; iTest++ ) \
    18561850            { \
    1857                 uint32_t fEfl = paTests[iTest].fEflIn; \
    18581851                a_uType  uDst = paTests[iTest].uDstIn; \
    1859                 pfn(&uDst, paTests[iTest].uSrcIn, &fEfl); \
     1852                uint32_t fEfl = pfn(paTests[iTest].fEflIn, &uDst, paTests[iTest].uSrcIn); \
    18601853                if (   uDst != paTests[iTest].uDstOut \
    1861                     || fEfl != paTests[iTest].fEflOut ) \
     1854                    || fEfl != paTests[iTest].fEflOut) \
    18621855                    RTTestFailed(g_hTest, "#%u%s: efl=%#08x dst=" a_Fmt " src=" a_Fmt " -> efl=%#08x dst=" a_Fmt ", expected %#08x & " a_Fmt "%s - %s\n", \
    18631856                                 iTest, !iVar ? "" : "/n", paTests[iTest].fEflIn, paTests[iTest].uDstIn, paTests[iTest].uSrcIn, \
     
    18681861                { \
    18691862                     *g_pu ## a_cBits  = paTests[iTest].uDstIn; \
    1870                      *g_pfEfl = paTests[iTest].fEflIn; \
    1871                      pfn(g_pu ## a_cBits, paTests[iTest].uSrcIn, g_pfEfl); \
     1863                     fEfl = pfn(paTests[iTest].fEflIn, g_pu ## a_cBits, paTests[iTest].uSrcIn); \
    18721864                     RTTEST_CHECK(g_hTest, *g_pu ## a_cBits  == paTests[iTest].uDstOut); \
    1873                      RTTEST_CHECK(g_hTest, *g_pfEfl == paTests[iTest].fEflOut); \
     1865                     RTTEST_CHECK(g_hTest, fEfl == paTests[iTest].fEflOut); \
    18741866                } \
    18751867            } \
     
    19461938    ENTRY_BIN_PFN_CAST(cmp_u16,   PFNIEMAIMPLBINU16),
    19471939    ENTRY_BIN_PFN_CAST(test_u16,  PFNIEMAIMPLBINU16),
     1940#if 0 /** @todo convert to new eflags format  */
    19481941    ENTRY_BIN_PFN_CAST_EX(bt_u16, PFNIEMAIMPLBINU16, 1),
    19491942    ENTRY_BIN_EX(btc_u16, 1),
     
    19601953    ENTRY_BIN_INTEL(imul_two_u16, X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF),
    19611954    ENTRY_BIN(arpl),
     1955#endif
    19621956};
    19631957TEST_BINARY_OPS(16, uint16_t, "%#06x", BINU16_TEST_T, g_aBinU16)
     
    19921986    ENTRY_BIN_PFN_CAST(cmp_u32,   PFNIEMAIMPLBINU32),
    19931987    ENTRY_BIN_PFN_CAST(test_u32,  PFNIEMAIMPLBINU32),
     1988#if 0 /** @todo convert to new eflags format  */
    19941989    ENTRY_BIN_PFN_CAST_EX(bt_u32, PFNIEMAIMPLBINU32, 1),
    19951990    ENTRY_BIN_EX(btc_u32, 1),
     
    20072002    ENTRY_BIN(adcx_u32),
    20082003    ENTRY_BIN(adox_u32),
     2004#endif
    20092005};
    20102006TEST_BINARY_OPS(32, uint32_t, "%#010RX32", BINU32_TEST_T, g_aBinU32)
     
    20392035    ENTRY_BIN_PFN_CAST(cmp_u64,   PFNIEMAIMPLBINU64),
    20402036    ENTRY_BIN_PFN_CAST(test_u64,  PFNIEMAIMPLBINU64),
     2037#if 0 /** @todo convert to new eflags format  */
    20412038    ENTRY_BIN_PFN_CAST_EX(bt_u64, PFNIEMAIMPLBINU64, 1),
    20422039    ENTRY_BIN_EX(btc_u64, 1),
     
    20542051    ENTRY_BIN(adcx_u64),
    20552052    ENTRY_BIN(adox_u64),
     2053#endif
    20562054};
    20572055TEST_BINARY_OPS(64, uint64_t, "%#018RX64", BINU64_TEST_T, g_aBinU64)
     
    22292227                                 EFlagsDiff(fEfl, paTests[iTest].fEflOut)); \
    22302228                /* positive */ \
    2231                 uint32_t fEflExpect = paTests[iTest].fEflIn; \
    22322229                uA                  = paTests[iTest].uDstIn; \
    2233                 s_aFuncs[iFn].pfnSub(&uA, uA, &fEflExpect); \
     2230                uint32_t fEflExpect = s_aFuncs[iFn].pfnSub(paTests[iTest].fEflIn, &uA, uA); \
    22342231                fEfl                = paTests[iTest].fEflIn; \
    22352232                uA                  = paTests[iTest].uDstIn; \
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104183 r104195  
    662662    uint32_t *a_pName = &a_Name; \
    663663    NOREF(a_pName)
     664#define IEM_MC_ARG_EFLAGS(a_Name, a_iArg) IEM_MC_ARG(uint32_t, a_Name, a_iArg); IEM_MC_FETCH_EFLAGS(a_Name)
    664665
    665666#define IEM_MC_COMMIT_EFLAGS(a_EFlags)                  do { CHK_TYPE(uint32_t, a_EFlags); (void)fMcBegin; } while (0)
     
    10021003#define IEM_MC_CALL_VOID_AIMPL_4(a_pfn, a0, a1, a2, a3) \
    10031004    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); CHK_CALL_ARG(a3, 3); (void)fMcBegin; } while (0)
    1004 #define IEM_MC_CALL_AIMPL_3(a_rc, a_pfn, a0, a1, a2) \
     1005#define IEM_MC_CALL_AIMPL_3(a_rcType, a_rc, a_pfn, a0, a1, a2) \
     1006    IEM_MC_LOCAL(a_rcType, a_rc); \
    10051007    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2);  (a_rc) = VINF_SUCCESS; (void)fMcBegin; } while (0)
    1006 #define IEM_MC_CALL_AIMPL_4(a_rc, a_pfn, a0, a1, a2, a3) \
     1008#define IEM_MC_CALL_AIMPL_4(a_rcType, a_rc, a_pfn, a0, a1, a2, a3) \
     1009    IEM_MC_LOCAL(a_rcType, a_rc); \
    10071010    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); CHK_CALL_ARG(a3, 3);  (a_rc) = VINF_SUCCESS; (void)fMcBegin; } while (0)
    10081011#define IEM_MC_CALL_CIMPL_0(a_fFlags, a_fGstShwFlush, a_pfnCImpl)                       do { (void)fMcBegin; } while (0)
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette