VirtualBox

Changeset 104238 in vbox


Ignore:
Timestamp:
Apr 8, 2024 8:15:10 PM (8 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) - sixth chunk: SHL,SHR,SAR,ROL,ROR,RCL,RCR. bugref:10376

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/asmdefs-arm.h

    r104230 r104238  
    4040#endif
    4141
     42#include <iprt/cdefs.h>
     43
     44
    4245#if !defined(RT_ARCH_ARM64) && !defined(RT_ARCH_ARM32)
    4346# error "Not on ARM64 or ARM32"
     
    4851 * @{
    4952 */
     53
     54/**
     55 * Align code, pad with BRK. */
     56#define ALIGNCODE(alignment)    .balignl alignment, 0xd42000cc
     57
     58/**
     59 * Align data, pad with ZEROs. */
     60#define ALIGNDATA(alignment)    .balign alignment
     61
     62/**
     63 * Align BSS, pad with ZEROs. */
     64#define ALIGNBSS(alignment)     .balign alignment
     65
    5066
    5167/** Marks the beginning of a code section. */
     
    172188 */
    173189.macro BEGINPROC, a_Name
    174     .p2align 2
    175     .globl          NAME(\a_Name)
    176190NAME(\a_Name):
    177191.endm
     
    184198 */
    185199.macro BEGINPROC_HIDDEN, a_Name
    186     .p2align 2
    187200#ifndef ASM_FORMAT_ELF
    188     .private_extern NAME(\a_Name)
    189 #else
    190     .hidden         NAME(\a_Name)
    191 #endif
    192     .globl          NAME(\a_Name)
     201        .private_extern NAME(\a_Name)
     202#else
     203        .hidden         NAME(\a_Name)
     204#endif
     205        .globl          NAME(\a_Name)
    193206NAME(\a_Name):
    194207.endm
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl-arm64.S

    r104231 r104238  
    3232#include <iprt/asmdefs-arm.h>
    3333#include <iprt/x86.h>
     34
     35#define IEM_AIMPL_FUNCTION_ALIGNMENT    0x20
    3436
    3537
     
    149151BEGINCODE
    150152
    151 BEGINPROC_HIDDEN iemAImpl_placeholder
    152         brk #1
    153         ret
     153
    154154
    155155/* Some sketches.
     
    182182
    183183/* uint32_t iemAImpl_cmp_u8(uint32_t fEFlags, uint8_t const *puDst, uint8_t uSrc); */
     184ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    184185BEGINPROC_HIDDEN iemAImpl_sub_u8
    185186        .cfi_startproc
     
    208209
    209210/* uint32_t iemAImpl_cmp_u16(uint32_t fEFlags, uint16_t const *puDst, uint16_t uSrc); */
     211ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    210212BEGINPROC_HIDDEN iemAImpl_sub_u16
    211213        .cfi_startproc
     
    234236
    235237/* uint32_t iemAImpl_cmp_u32(uint32_t fEFlags, uint32_t const *puDst, uint32_t uSrc); */
     238ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    236239BEGINPROC_HIDDEN iemAImpl_sub_u32
    237240        .cfi_startproc
     
    295298
    296299/* uint32_t iemAImpl_cmp_u64(uint32_t fEFlags, uint64_t const *puDst, uint64_t uSrc); */
     300ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    297301BEGINPROC_HIDDEN iemAImpl_sub_u64
    298302        .cfi_startproc
     
    314318 */
    315319
    316 /* void iemAImpl_shl_u8(uint8_t *pu8Dst, uint8_t cShift, uint32_t *pEFlags); */
    317 /* void iemAImpl_shl_u16(uint16_t *pu16Dst, uint8_t cShift, uint32_t *pEFlags); */
    318 /* void iemAImpl_shl_u32(uint16_t *pu32Dst, uint8_t cShift, uint32_t *pEFlags); */
     320/* uint32_t iemAImpl_shl_u8( uint32_t fEFlagsIn, uint8_t *pu8Dst, uint8_t cShift); */
     321/* uint32_t iemAImpl_shl_u16(uint32_t fEFlagsIn, uint16_t *pu16Dst, uint8_t cShift); */
     322/* uint32_t iemAImpl_shl_u32(uint32_t fEFlagsIn, uint16_t *pu32Dst, uint8_t cShift); */
    319323.macro SHL_8_16_32, a_Name, a_cBits, a_fIntelFlags, a_LdStSuff
     324ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    320325BEGINPROC_HIDDEN \a_Name
    321326        .cfi_startproc
    322327
    323328        /* Do we need to shift anything at all? */
    324         and     w1, w1, #0x1f
    325         cbz     w1, 99f
     329        and     w2, w2, #0x1f
     330        cbz     w2, 99f
    326331
    327332        /*
    328333         * Do the shifting
    329334         */
    330         ldr\a_LdStSuff  w8, [x0]
     335        ldr\a_LdStSuff  w8, [x1]
    331336.ifne \a_cBits < 32
    332         lslv    w9, w8, w1
    333 .else
    334         lslv    x9, x8, x1                      /* use 64-bit registers here so we get CF for free. We know x1 != 0. */
    335 .endif
    336         str\a_LdStSuff  w9, [x0]
     337        lslv    w9, w8, w2
     338.else
     339        lslv    x9, x8, x2                      /* use 64-bit registers here so we get CF for free. We know x1 != 0. */
     340.endif
     341        str\a_LdStSuff  w9, [x1]
    337342
    338343        /*
    339344         * Calculate EFLAGS.
    340345         */
    341         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
    342 
    343         CALC_EFLAGS_PARITY w10, w9, w12
     346        CALC_EFLAGS_PARITY w0, w9, w12
    344347
    345348.ifne \a_cBits < 32
     
    351354        mrs     x11, NZCV
    352355        lsr     w11, w11, #30                   /* N=1; Z=0 */
    353         bfi     w10, w11, X86_EFL_ZF_BIT, 2     /* EFLAGS.ZF and EFLAGS.SF */
     356        bfi     w0, w11, X86_EFL_ZF_BIT, 2      /* EFLAGS.ZF and EFLAGS.SF */
    354357#else
    355358        cset    x11, eq
    356         bfi     w10, w11, X86_EFL_ZF_BIT, 1
     359        bfi     w0, w11, X86_EFL_ZF_BIT, 1
    357360        cset    x12, pl
    358         bfi     w10, w12, X86_EFL_SF_BIT, 1
     361        bfi     w0, w12, X86_EFL_SF_BIT, 1
    359362#endif
    360363
    361364.ifne \a_cBits < 32
    362         bfxil   w10, w9, #\a_cBits, #1          /* w9 bit 8/16 contains carry. (X86_EFL_CF_BIT == 0) */
    363 .else
    364         bfxil   x10, x9, #\a_cBits, #1          /* x9 bit 32 contains carry. (X86_EFL_CF_BIT == 0) */
     365        bfxil   w0, w9, #\a_cBits, #1           /* w9 bit 8/16 contains carry. (X86_EFL_CF_BIT == 0) */
     366.else
     367        bfxil   x0, x9, #\a_cBits, #1           /* x9 bit 32 contains carry. (X86_EFL_CF_BIT == 0) */
    365368.endif
    366369
     
    369372        eor     w11, w8, w8, LSL #1
    370373        lsr     w11, w11, #(\a_cBits - 1)
    371         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    372 
    373         and     w10, w10, ~X86_EFL_AF           /* AF is cleared */
     374        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     375
     376        and     w0, w0, ~X86_EFL_AF            /* AF is cleared */
    374377.else
    375378        /* AMD: OF = last bit shifted: fEfl |= ((uResult >> (cOpBits - 1)) ^ fCarry) << X86_EFL_OF_BIT;  */
     
    381384        lsr     x11, x11, #(\a_cBits - 1)
    382385 .endif
    383         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    384 
    385         orr     w10, w10, X86_EFL_AF           /* AF is set  */
    386 .endif
    387 
    388         str     w10, [x2]
     386        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     387
     388        orr     w0, w0, X86_EFL_AF             /* AF is set  */
     389.endif
     390
    38939199:
    390392        ret
     
    405407
    406408/** @todo this is slightly slower than the C version (release) on an M2. Investigate why. */
    407 /* void iemAImpl_shl_u64(uint16_t *pu64Dst, uint8_t cShift, uint32_t *pEFlags); */
     409/* uint32_t iemAImpl_shl_u64(uint32_t fEFlagsIn, uint16_t *pu64Dst, uint8_t cShift); */
    408410.macro SHL_64, a_Name, a_fIntelFlags
     411ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    409412BEGINPROC_HIDDEN \a_Name
    410413        .cfi_startproc
    411414
    412415        /* Do we need to shift anything at all? */
    413         and     w1, w1, #0x3f
    414         cbz     w1, 99f
     416        and     w2, w2, #0x3f
     417        cbz     w2, 99f
    415418
    416419        /*
    417420         * Do the shifting
    418421         */
    419         ldr     x8, [x0]
    420         lslv    x9, x8, x1
    421         str     x9, [x0]
     422        ldr     x8, [x1]
     423        lslv    x9, x8, x2
     424        str     x9, [x1]
    422425
    423426        /*
    424427         * Calculate EFLAGS.
    425428         */
    426         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
    427 
    428         CALC_EFLAGS_PARITY w10, w9, w11
     429        CALC_EFLAGS_PARITY w0, w9, w11
    429430
    430431        ands    xzr, x9, x9                     /* Sets NZ */
    431432        mrs     x11, NZCV
    432433        lsr     w11, w11, #30                   /* N=1; Z=0 */
    433         bfi     w10, w11, X86_EFL_ZF_BIT, 2     /* EFLAGS.ZF and EFLAGS.SF */
    434 
    435         neg     w11, w1                         /* the shift count is MODed by the data size, so this is safe. */
     434        bfi     w0, w11, X86_EFL_ZF_BIT, 2      /* EFLAGS.ZF and EFLAGS.SF */
     435
     436        neg     w11, w2                         /* the shift count is MODed by the data size, so this is safe. */
    436437        lsrv    x11, x8, x11
    437         bfi     w10, w11, X86_EFL_CF_BIT, 1
     438        bfi     w0, w11, X86_EFL_CF_BIT, 1
    438439
    439440.ifne \a_fIntelFlags
     
    441442        eor     x11, x8, x8, LSL #1
    442443        lsr     x11, x11, #63
    443         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    444 
    445         and     w10, w10, ~X86_EFL_AF           /* AF is cleared */
     444        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     445
     446        and     w0, w0, ~X86_EFL_AF             /* AF is cleared */
    446447.else
    447448        /* AMD: OF = last bit shifted: fEfl |= ((uResult >> (cOpBits - 1)) ^ fCarry) << X86_EFL_OF_BIT;  */
    448449        eor     x11, x11, x9, LSR #63           /* w11[0]=CF from above */
    449         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    450 
    451         orr     w10, w10, X86_EFL_AF           /* AF is set  */
    452 .endif
    453         str     w10, [x2]
     450        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     451
     452        orr     w0, w0, X86_EFL_AF              /* AF is set  */
     453.endif
    45445499:
    455455        ret
     
    466466 */
    467467
    468 /* void iemAImpl_shr_u8(uint8_t *pu8Dst, uint8_t cShift, uint32_t *pEFlags); */
    469 /* void iemAImpl_shr_u16(uint16_t *pu16Dst, uint8_t cShift, uint32_t *pEFlags); */
    470 /* void iemAImpl_shr_u32(uint16_t *pu32Dst, uint8_t cShift, uint32_t *pEFlags); */
     468/* uint32_t iemAImpl_shr_u8( uint32_t fEFlagsIn, uint8_t *pu8Dst, uint8_t cShift); */
     469/* uint32_t iemAImpl_shr_u16(uint32_t fEFlagsIn, uint16_t *pu16Dst, uint8_t cShift); */
     470/* uint32_t iemAImpl_shr_u32(uint32_t fEFlagsIn, uint16_t *pu32Dst, uint8_t cShift); */
    471471.macro shr_8_16_32, a_Name, a_cBits, a_fIntelFlags, a_LdStSuff
     472ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    472473BEGINPROC_HIDDEN \a_Name
    473474        .cfi_startproc
    474475
    475476        /* Do we need to shift anything at all? */
    476         and     w1, w1, #0x1f
    477         cbz     w1, 99f
    478 
    479         /* Load EFLAGS before we start the calculation. */
    480         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
     477        and     w2, w2, #0x1f
     478        cbz     w2, 99f
    481479
    482480        /*
    483481         * Do the shifting.
    484482         */
    485         ldr\a_LdStSuff  w8, [x0]
    486         lsrv    w9, w8, w1
    487         str\a_LdStSuff  w9, [x0]
     483        ldr\a_LdStSuff  w8, [x1]
     484        lsrv    w9, w8, w2
     485        str\a_LdStSuff  w9, [x1]
    488486
    489487        /*
    490488         * Calculate EFLAGS.
    491489         */
    492         sub     w11, w1, #1
     490        sub     w11, w2, #1
    493491        lsrv    w11, w8, w11
    494         bfxil   w10, w11, #X86_EFL_CF_BIT, #1
     492        bfxil   w0, w11, #X86_EFL_CF_BIT, #1
    495493
    496494.ifne \a_fIntelFlags
    497         and     w10, w10, ~X86_EFL_AF           /* AF is cleared */
     495        and     w0, w0, ~X86_EFL_AF             /* AF is cleared */
    498496        /* Intel: OF = one bit shift: fEfl |= X86_EFL_GET_OF_ ## cOpBits(uDstIn); */
    499497        lsr     w11, w8, #(\a_cBits - 1)
    500         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    501 .else
    502         orr     w10, w10, X86_EFL_AF            /* AF is set  */
     498        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     499.else
     500        orr     w0, w0, X86_EFL_AF              /* AF is set  */
    503501        /* AMD: OF = last bits shifted: fEfl |= (uResult >> (cOpBits - 2)) << X86_EFL_OF_BIT;  */
    504502        lsr     w11, w9, #(\a_cBits - 2)
    505         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    506 .endif
    507 
    508         CALC_EFLAGS_PARITY w10, w9, w11
     503        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     504.endif
     505
     506        CALC_EFLAGS_PARITY w0, w9, w11
    509507
    510508.ifne \a_cBits < 32
     
    515513        mrs     x11, NZCV
    516514        lsr     w11, w11, #30                   /* N=1; Z=0 */
    517         bfi     w10, w11, X86_EFL_ZF_BIT, 2     /* EFLAGS.ZF and EFLAGS.SF */
    518 
    519         str     w10, [x2]
     515        bfi     w0, w11, X86_EFL_ZF_BIT, 2      /* EFLAGS.ZF and EFLAGS.SF */
     516
    52051799:
    521518        ret
     
    538535/* void iemAImpl_shr_u64(uint16_t *pu64Dst, uint8_t cShift, uint32_t *pEFlags); */
    539536.macro shr_64, a_Name, a_fIntelFlags
     537ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    540538BEGINPROC_HIDDEN \a_Name
    541539        .cfi_startproc
    542540
    543541        /* Do we need to shift anything at all? */
    544         ands    w1, w1, #0x3f
     542        ands    w2, w2, #0x3f
    545543        b.eq    99f
    546544
    547         /* Load EFLAGS before we start the calculation. */
    548         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
    549 
    550545        /*
    551546         * Do the shifting
    552547         */
    553         ldr     x8, [x0]
    554         lsrv    x9, x8, x1
    555         str     x9, [x0]
     548        ldr     x8, [x1]
     549        lsrv    x9, x8, x2
     550        str     x9, [x1]
    556551
    557552        /*
    558553         * Calculate EFLAGS.
    559554         */
    560         sub     w11, w1, #1
     555        sub     w11, w2, #1
    561556        lsrv    x11, x8, x11
    562         bfxil   w10, w11, #X86_EFL_CF_BIT, #1
     557        bfxil   w0, w11, #X86_EFL_CF_BIT, #1
    563558
    564559.ifne \a_fIntelFlags
    565         and     w10, w10, ~X86_EFL_AF           /* AF is cleared */
     560        and     w0, w0, ~X86_EFL_AF             /* AF is cleared */
    566561        /* Intel: OF = one bit shift: fEfl |= X86_EFL_GET_OF_ ## cOpBits(uDstIn); */
    567562        lsr     x11, x8, #63
    568         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    569 .else
    570         orr     w10, w10, X86_EFL_AF            /* AF is set  */
     563        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     564.else
     565        orr     w0, w0, X86_EFL_AF              /* AF is set  */
    571566        /* AMD: OF = last bits shifted: fEfl |= (uResult >> (cOpBits - 2)) << X86_EFL_OF_BIT;  */
    572567        lsr     x11, x9, #62
    573         bfi     w10, w11, #X86_EFL_OF_BIT, #1
    574 .endif
    575 
    576         CALC_EFLAGS_PARITY w10, w9, w11
     568        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     569.endif
     570
     571        CALC_EFLAGS_PARITY w0, w9, w11
    577572
    578573        ands    xzr, x9, x9                     /* Sets NZ */
    579574        mrs     x11, NZCV
    580575        lsr     w11, w11, #30                   /* N=1; Z=0 */
    581         bfi     w10, w11, X86_EFL_ZF_BIT, 2     /* EFLAGS.ZF and EFLAGS.SF */
    582 
    583         str     w10, [x2]
     576        bfi     w0, w11, X86_EFL_ZF_BIT, 2      /* EFLAGS.ZF and EFLAGS.SF */
     577
    58457899:
    585579        ret
     
    596590 */
    597591
    598 /* void iemAImpl_sar_u8(uint8_t *pu8Dst, uint8_t cShift, uint32_t *pEFlags); */
    599 /* void iemAImpl_sar_u16(uint16_t *pu16Dst, uint8_t cShift, uint32_t *pEFlags); */
    600 /* void iemAImpl_sar_u32(uint16_t *pu32Dst, uint8_t cShift, uint32_t *pEFlags); */
     592/* uint32_t iemAImpl_sar_u8( uint32_t fEFlagsIn, uint8_t *pu8Dst, uint8_t cShift); */
     593/* uint32_t iemAImpl_sar_u16(uint32_t fEFlagsIn, uint16_t *pu16Dst, uint8_t cShift); */
     594/* uint32_t iemAImpl_sar_u32(uint32_t fEFlagsIn, uint16_t *pu32Dst, uint8_t cShift); */
    601595.macro sar_8_16_32, a_Name, a_cBits, a_fIntelFlags, a_LdSuff, a_StSuff
     596ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    602597BEGINPROC_HIDDEN \a_Name
    603598        .cfi_startproc
    604599
    605600        /* Do we need to shift anything at all? */
    606         and     w1, w1, #0x1f
    607         cbz     w1, 99f
    608 
    609         /* Load EFLAGS before we start the calculation. */
    610         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
     601        and     w2, w2, #0x1f
     602        cbz     w2, 99f
    611603
    612604        /*
    613605         * Do the shifting.
    614606         */
    615         ldr\a_LdSuff  w8, [x0]                  /* Sign-extending for 8 and 16 bits! */
    616         asrv    w9, w8, w1
    617         str\a_StSuff  w9, [x0]
     607        ldr\a_LdSuff  w8, [x1]                  /* Sign-extending for 8 and 16 bits! */
     608        asrv    w9, w8, w2
     609        str\a_StSuff  w9, [x1]
    618610
    619611        /*
    620612         * Calculate EFLAGS.
    621613         */
    622         sub     w11, w1, #1
     614        sub     w11, w2, #1
    623615        lsrv    w11, w8, w11
    624         bfxil   w10, w11, #X86_EFL_CF_BIT, #1
     616        bfxil   w0, w11, #X86_EFL_CF_BIT, #1
    625617
    626618.ifne \a_fIntelFlags
    627619        mov     w11, ~(X86_EFL_AF | X86_EFL_OF)
    628         and     w10, w10, w11                   /* AF and OF are cleared */
    629 .else
    630         orr     w10, w10, X86_EFL_AF            /* AF is set  */
    631         and     w10, w10, ~X86_EFL_OF           /* OF is cleared */
    632 .endif
    633 
    634         CALC_EFLAGS_PARITY w10, w9, w11
     620        and     w0, w0, w11                     /* AF and OF are cleared */
     621.else
     622        orr     w0, w0, X86_EFL_AF              /* AF is set  */
     623        and     w0, w0, ~X86_EFL_OF             /* OF is cleared */
     624.endif
     625
     626        CALC_EFLAGS_PARITY w0, w9, w11
    635627
    636628.ifne \a_cBits < 32
     
    641633        mrs     x11, NZCV
    642634        lsr     w11, w11, #30                   /* N=1; Z=0 */
    643         bfi     w10, w11, X86_EFL_ZF_BIT, 2     /* EFLAGS.ZF and EFLAGS.SF */
    644 
    645         str     w10, [x2]
     635        bfi     w0, w11, X86_EFL_ZF_BIT, 2      /* EFLAGS.ZF and EFLAGS.SF */
     636
    64663799:
    647638        ret
     
    662653
    663654/** @todo this is slightly slower than the C version (release) on an M2. Investigate why. */
    664 /* void iemAImpl_sar_u64(uint16_t *pu64Dst, uint8_t cShift, uint32_t *pEFlags); */
     655/* uint32_t iemAImpl_sar_u64(uint32_t fEFlagsIn, uint16_t *pu64Dst, uint8_t cShift); */
    665656.macro sar_64, a_Name, a_fIntelFlags
     657ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
    666658BEGINPROC_HIDDEN \a_Name
    667659        .cfi_startproc
    668660
    669661        /* Do we need to shift anything at all? */
    670         ands    w1, w1, #0x3f
     662        ands    w2, w2, #0x3f
    671663        b.eq    99f
    672664
    673         /* Load EFLAGS before we start the calculation. */
    674         ldr     w10, [x2]                       /* w10 = eflags; CF=0 PF=2 AF=4 ZF=6 SF=7 OF=11 */
    675 
    676665        /*
    677666         * Do the shifting
    678667         */
    679         ldr     x8, [x0]
    680         asrv    x9, x8, x1
    681         str     x9, [x0]
     668        ldr     x8, [x1]
     669        asrv    x9, x8, x2
     670        str     x9, [x1]
    682671
    683672        /*
    684673         * Calculate EFLAGS.
    685674         */
    686         sub     w11, w1, #1
     675        sub     w11, w2, #1
    687676        lsrv    x11, x8, x11
    688         bfxil   w10, w11, #X86_EFL_CF_BIT, #1
     677        bfxil   w0, w11, #X86_EFL_CF_BIT, #1
    689678
    690679.ifne \a_fIntelFlags
    691680        mov     w11, ~(X86_EFL_AF | X86_EFL_OF)
    692         and     w10, w10, w11                   /* AF and OF are cleared */
    693 .else
    694         orr     w10, w10, X86_EFL_AF            /* AF is set  */
    695         and     w10, w10, ~X86_EFL_OF           /* OF is cleared */
    696 .endif
    697 
    698         CALC_EFLAGS_PARITY w10, w9, w11
     681        and     w0, w0, w11                     /* AF and OF are cleared */
     682.else
     683        orr     w0, w0, X86_EFL_AF              /* AF is set  */
     684        and     w0, w0, ~X86_EFL_OF             /* OF is cleared */
     685.endif
     686
     687        CALC_EFLAGS_PARITY w0, w9, w11
    699688
    700689        ands    xzr, x9, x9                     /* Sets NZ */
    701690        mrs     x11, NZCV
    702691        lsr     w11, w11, #30                   /* N=1; Z=0 */
    703         bfi     w10, w11, X86_EFL_ZF_BIT, 2     /* EFLAGS.ZF and EFLAGS.SF */
    704 
    705         str     w10, [x2]
     692        bfi     w0, w11, X86_EFL_ZF_BIT, 2      /* EFLAGS.ZF and EFLAGS.SF */
     693
    70669499:
    707695        ret
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r104209 r104238  
    23612361; @param        4       Force load flags.
    23622362;
    2363 ; Makes ASSUMPTIONS about A0, A1 and A2 assignments.
     2363; Makes ASSUMPTIONS about A0, A1 and A2 assignments.  Specifically, that with
     2364; GCC/64 we're free to use RCX/CL as it isn't used for any arguments.  While
     2365; MSC/64 & 32-bit fastcall are using ECX for the first argument (fEFlagsIn),
     2366; so we have to switch it around with the shift count parameter registers.
    23642367;
    23652368; @note the _intel and _amd variants are implemented in C.
     
    23692372BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
    23702373        PROLOGUE_3_ARGS
    2371         IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    23722374 %ifdef ASM_CALL64_GCC
    2373         mov     cl, A1_8
    2374         %1      byte [A0], cl
     2375        IEM_MAYBE_LOAD_FLAGS     A0_32, %2, %3, %4
     2376        mov     cl, A2_8
     2377        %1      byte [A1], cl
     2378        IEM_SAVE_FLAGS_RETVAL    A0_32, %2, %3, 0
    23752379 %else
    2376         xchg    A1, A0
     2380        xchg    A2, A0
     2381        IEM_MAYBE_LOAD_FLAGS     A2_32, %2, %3, %4
    23772382        %1      byte [A1], cl
     2383        IEM_SAVE_FLAGS_RETVAL    A2_32, %2, %3, 0
    23782384 %endif
    2379         IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    23802385.zero_shift:
    23812386        EPILOGUE_3_ARGS
     
    23842389BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
    23852390        PROLOGUE_3_ARGS
    2386         IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    23872391 %ifdef ASM_CALL64_GCC
    2388         mov     cl, A1_8
    2389         %1      word [A0], cl
     2392        IEM_MAYBE_LOAD_FLAGS     A0_32, %2, %3, %4
     2393        mov     cl, A2_8
     2394        %1      word [A1], cl
     2395        IEM_SAVE_FLAGS_RETVAL    A0_32, %2, %3, 0
    23902396 %else
    2391         xchg    A1, A0
     2397        xchg    A2, A0
     2398        IEM_MAYBE_LOAD_FLAGS     A2_32, %2, %3, %4
    23922399        %1      word [A1], cl
     2400        IEM_SAVE_FLAGS_RETVAL    A2_32, %2, %3, 0
    23932401 %endif
    2394         IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    23952402        EPILOGUE_3_ARGS
    23962403ENDPROC iemAImpl_ %+ %1 %+ _u16
     
    23982405BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    23992406        PROLOGUE_3_ARGS
    2400         IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    24012407 %ifdef ASM_CALL64_GCC
    2402         mov     cl, A1_8
    2403         %1      dword [A0], cl
     2408        IEM_MAYBE_LOAD_FLAGS     A0_32, %2, %3, %4
     2409        mov     cl, A2_8
     2410        %1      dword [A1], cl
     2411        IEM_SAVE_FLAGS_RETVAL    A0_32, %2, %3, 0
    24042412 %else
    2405         xchg    A1, A0
     2413        xchg    A2, A0
     2414        IEM_MAYBE_LOAD_FLAGS     A2_32, %2, %3, %4
    24062415        %1      dword [A1], cl
     2416        IEM_SAVE_FLAGS_RETVAL    A2_32, %2, %3, 0
    24072417 %endif
    2408         IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    24092418        EPILOGUE_3_ARGS
    24102419ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    24132422BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
    24142423        PROLOGUE_3_ARGS
    2415         IEM_MAYBE_LOAD_FLAGS_OLD A2, %2, %3, %4
    24162424  %ifdef ASM_CALL64_GCC
    2417         mov     cl, A1_8
    2418         %1      qword [A0], cl
     2425        IEM_MAYBE_LOAD_FLAGS     A0_32, %2, %3, %4
     2426        mov     cl, A2_8
     2427        %1      qword [A1], cl
     2428        IEM_SAVE_FLAGS_RETVAL    A0_32, %2, %3, 0
    24192429  %else
    2420         xchg    A1, A0
     2430        xchg    A2, A0
     2431        IEM_MAYBE_LOAD_FLAGS     A2_32, %2, %3, %4
    24212432        %1      qword [A1], cl
     2433        IEM_SAVE_FLAGS_RETVAL    A2_32, %2, %3, 0
    24222434  %endif
    2423         IEM_SAVE_FLAGS_OLD       A2, %2, %3, 0
    24242435        EPILOGUE_3_ARGS
    24252436ENDPROC iemAImpl_ %+ %1 %+ _u64
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r104209 r104238  
    30913091 */
    30923092#define EMIT_ROL(a_cBitsWidth, a_uType, a_Suffix, a_fIntelFlags, a_fnHlp) \
    3093 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_rol_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3093IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_rol_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    30943094{ \
    30953095    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    31053105           it the same way as for 1 bit shifts. */ \
    31063106        AssertCompile(X86_EFL_CF_BIT == 0); \
    3107         uint32_t fEfl = *pfEFlags; \
    3108         fEfl &= ~(X86_EFL_CF | X86_EFL_OF); \
     3107        fEFlags &= ~(X86_EFL_CF | X86_EFL_OF); \
    31093108        uint32_t const fCarry = (uResult & X86_EFL_CF); \
    3110         fEfl |= fCarry; \
     3109        fEFlags |= fCarry; \
    31113110        if (!a_fIntelFlags) /* AMD 3990X: According to the last sub-shift: */ \
    3112             fEfl |= ((uResult >> (a_cBitsWidth - 1)) ^ fCarry) << X86_EFL_OF_BIT; \
     3111            fEFlags |= ((uResult >> (a_cBitsWidth - 1)) ^ fCarry) << X86_EFL_OF_BIT; \
    31133112        else                /* Intel 10980XE: According to the first sub-shift: */ \
    3114             fEfl |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << 1)); \
    3115         *pfEFlags = fEfl; \
     3113            fEFlags |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << 1)); \
    31163114    } \
     3115    return fEFlags; \
    31173116}
    31183117
     
    31543153 */
    31553154#define EMIT_ROR(a_cBitsWidth, a_uType, a_Suffix, a_fIntelFlags, a_fnHlp) \
    3156 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_ror_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3155IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_ror_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    31573156{ \
    31583157    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    31673166        /* Calc EFLAGS:  */ \
    31683167        AssertCompile(X86_EFL_CF_BIT == 0); \
    3169         uint32_t fEfl = *pfEFlags; \
    3170         fEfl &= ~(X86_EFL_CF | X86_EFL_OF); \
     3168        fEFlags &= ~(X86_EFL_CF | X86_EFL_OF); \
    31713169        uint32_t const fCarry = (uResult >> ((a_cBitsWidth) - 1)) & X86_EFL_CF; \
    3172         fEfl |= fCarry; \
     3170        fEFlags |= fCarry; \
    31733171        if (!a_fIntelFlags) /* AMD 3990X: According to the last sub-shift: */ \
    3174             fEfl |= (((uResult >> ((a_cBitsWidth) - 2)) ^ fCarry) & 1) << X86_EFL_OF_BIT; \
     3172            fEFlags |= (((uResult >> ((a_cBitsWidth) - 2)) ^ fCarry) & 1) << X86_EFL_OF_BIT; \
    31753173        else                /* Intel 10980XE: According to the first sub-shift: */ \
    3176             fEfl |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << (a_cBitsWidth - 1))); \
    3177         *pfEFlags = fEfl; \
     3174            fEFlags |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << (a_cBitsWidth - 1))); \
    31783175    } \
     3176    return fEFlags; \
    31793177}
    31803178
     
    32163214 */
    32173215#define EMIT_RCL(a_cBitsWidth, a_uType, a_Suffix, a_fIntelFlags) \
    3218 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_rcl_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3216IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_rcl_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    32193217{ \
    32203218    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    32313229        \
    32323230        AssertCompile(X86_EFL_CF_BIT == 0); \
    3233         uint32_t fEfl     = *pfEFlags; \
    3234         uint32_t fInCarry = fEfl & X86_EFL_CF; \
     3231        uint32_t fInCarry = fEFlags & X86_EFL_CF; \
    32353232        uResult |= (a_uType)fInCarry << (cShift - 1); \
    32363233        \
     
    32383235        \
    32393236        /* Calc EFLAGS. */ \
    3240         fEfl &= ~(X86_EFL_CF | X86_EFL_OF); \
     3237        fEFlags &= ~(X86_EFL_CF | X86_EFL_OF); \
    32413238        uint32_t const fOutCarry = a_cBitsWidth >= 32 || a_fIntelFlags || cShift \
    32423239                                 ? (uDst >> (a_cBitsWidth - cShift)) & X86_EFL_CF : fInCarry; \
    3243         fEfl |= fOutCarry; \
     3240        fEFlags |= fOutCarry; \
    32443241        if (!a_fIntelFlags) /* AMD 3990X: According to the last sub-shift: */ \
    3245             fEfl |= ((uResult >> (a_cBitsWidth - 1)) ^ fOutCarry) << X86_EFL_OF_BIT; \
     3242            fEFlags |= ((uResult >> (a_cBitsWidth - 1)) ^ fOutCarry) << X86_EFL_OF_BIT; \
    32463243        else                /* Intel 10980XE: According to the first sub-shift: */ \
    3247             fEfl |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << 1)); \
    3248         *pfEFlags = fEfl; \
     3244            fEFlags |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << 1)); \
    32493245    } \
     3246    return fEFlags; \
    32503247}
    32513248
     
    32793276 */
    32803277#define EMIT_RCR(a_cBitsWidth, a_uType, a_Suffix, a_fIntelFlags) \
    3281 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_rcr_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3278IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_rcr_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    32823279{ \
    32833280    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    32943291        \
    32953292        AssertCompile(X86_EFL_CF_BIT == 0); \
    3296         uint32_t fEfl     = *pfEFlags; \
    3297         uint32_t fInCarry = fEfl & X86_EFL_CF; \
     3293        uint32_t fInCarry = fEFlags & X86_EFL_CF; \
    32983294        uResult |= (a_uType)fInCarry << (a_cBitsWidth - cShift); \
    32993295        *puDst = uResult; \
     
    33013297        /* Calc EFLAGS.  The OF bit is undefined if cShift > 1, we implement \
    33023298           it the same way as for 1 bit shifts. */ \
    3303         fEfl &= ~(X86_EFL_CF | X86_EFL_OF); \
     3299        fEFlags &= ~(X86_EFL_CF | X86_EFL_OF); \
    33043300        uint32_t const fOutCarry = a_cBitsWidth >= 32 || a_fIntelFlags || cShift \
    33053301                                 ? (uDst >> (cShift - 1)) & X86_EFL_CF : fInCarry; \
    3306         fEfl |= fOutCarry; \
     3302        fEFlags |= fOutCarry; \
    33073303        if (!a_fIntelFlags) /* AMD 3990X: XOR two most signficant bits of the result: */ \
    3308             fEfl |= X86_EFL_GET_OF_ ## a_cBitsWidth(uResult ^ (uResult << 1));  \
     3304            fEFlags |= X86_EFL_GET_OF_ ## a_cBitsWidth(uResult ^ (uResult << 1));  \
    33093305        else                /* Intel 10980XE: same as AMD, but only for the first sub-shift: */ \
    3310             fEfl |= (fInCarry ^ (uint32_t)(uDst >> (a_cBitsWidth - 1))) << X86_EFL_OF_BIT; \
    3311         *pfEFlags = fEfl; \
     3306            fEFlags |= (fInCarry ^ (uint32_t)(uDst >> (a_cBitsWidth - 1))) << X86_EFL_OF_BIT; \
    33123307    } \
     3308    return fEFlags; \
    33133309}
    33143310
     
    33423338 */
    33433339#define EMIT_SHL(a_cBitsWidth, a_uType, a_Suffix, a_fIntelFlags) \
    3344 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_shl_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3340IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_shl_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    33453341{ \
    33463342    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    33533349        /* Calc EFLAGS. */ \
    33543350        AssertCompile(X86_EFL_CF_BIT == 0); \
    3355         uint32_t fEfl = *pfEFlags & ~X86_EFL_STATUS_BITS; \
    3356         uint32_t fCarry = (uDst >> (a_cBitsWidth - cShift)) & X86_EFL_CF; \
    3357         fEfl |= fCarry; \
     3351        fEFlags &= ~X86_EFL_STATUS_BITS; \
     3352        uint32_t const fCarry = (uDst >> (a_cBitsWidth - cShift)) & X86_EFL_CF; \
     3353        fEFlags |= fCarry; \
    33583354        if (!a_fIntelFlags) \
    3359             fEfl |= ((uResult >> (a_cBitsWidth - 1)) ^ fCarry) << X86_EFL_OF_BIT; /* AMD 3990X: Last shift result. */ \
     3355            fEFlags |= ((uResult >> (a_cBitsWidth - 1)) ^ fCarry) << X86_EFL_OF_BIT; /* AMD 3990X: Last shift result. */ \
    33603356        else \
    3361             fEfl |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << 1)); /* Intel 10980XE: First shift result. */ \
    3362         fEfl |= X86_EFL_CALC_SF(uResult, a_cBitsWidth); \
    3363         fEfl |= X86_EFL_CALC_ZF(uResult); \
    3364         fEfl |= IEM_EFL_CALC_PARITY(uResult); \
     3357            fEFlags |= X86_EFL_GET_OF_ ## a_cBitsWidth(uDst ^ (uDst << 1)); /* Intel 10980XE: First shift result. */ \
     3358        fEFlags |= X86_EFL_CALC_SF(uResult, a_cBitsWidth); \
     3359        fEFlags |= X86_EFL_CALC_ZF(uResult); \
     3360        fEFlags |= IEM_EFL_CALC_PARITY(uResult); \
    33653361        if (!a_fIntelFlags) \
    3366             fEfl |= X86_EFL_AF; /* AMD 3990x sets it unconditionally, Intel 10980XE does the oposite */ \
    3367         *pfEFlags = fEfl; \
     3362            fEFlags |= X86_EFL_AF; /* AMD 3990x sets it unconditionally, Intel 10980XE does the oposite */ \
    33683363    } \
     3364    return fEFlags; \
    33693365}
    33703366
     
    34023398 */
    34033399#define EMIT_SHR(a_cBitsWidth, a_uType, a_Suffix, a_fIntelFlags) \
    3404 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_shr_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3400IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_shr_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    34053401{ \
    34063402    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    34133409        /* Calc EFLAGS. */ \
    34143410        AssertCompile(X86_EFL_CF_BIT == 0); \
    3415         uint32_t fEfl = *pfEFlags & ~X86_EFL_STATUS_BITS; \
    3416         fEfl |= (uDst >> (cShift - 1)) & X86_EFL_CF; \
     3411        fEFlags &= ~X86_EFL_STATUS_BITS; \
     3412        fEFlags |= (uDst >> (cShift - 1)) & X86_EFL_CF; \
    34173413        if (a_fIntelFlags || cShift == 1) /* AMD 3990x does what intel documents; Intel 10980XE does this for all shift counts. */ \
    3418             fEfl |= (uDst >> (a_cBitsWidth - 1)) << X86_EFL_OF_BIT; \
    3419         fEfl |= X86_EFL_CALC_SF(uResult, a_cBitsWidth); \
    3420         fEfl |= X86_EFL_CALC_ZF(uResult); \
    3421         fEfl |= IEM_EFL_CALC_PARITY(uResult); \
     3414            fEFlags |= (uDst >> (a_cBitsWidth - 1)) << X86_EFL_OF_BIT; \
     3415        fEFlags |= X86_EFL_CALC_SF(uResult, a_cBitsWidth); \
     3416        fEFlags |= X86_EFL_CALC_ZF(uResult); \
     3417        fEFlags |= IEM_EFL_CALC_PARITY(uResult); \
    34223418        if (!a_fIntelFlags) \
    3423             fEfl |= X86_EFL_AF; /* AMD 3990x sets it unconditionally, Intel 10980XE does the oposite */ \
    3424         *pfEFlags = fEfl; \
     3419            fEFlags |= X86_EFL_AF; /* AMD 3990x sets it unconditionally, Intel 10980XE does the oposite */ \
    34253420    } \
     3421    return fEFlags; \
    34263422}
    34273423
     
    34593455 */
    34603456#define EMIT_SAR(a_cBitsWidth, a_uType, a_iType, a_Suffix, a_fIntelFlags) \
    3461 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_sar_u,a_cBitsWidth,a_Suffix),(a_uType *puDst, uint8_t cShift, uint32_t *pfEFlags)) \
     3457IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_sar_u,a_cBitsWidth,a_Suffix),(uint32_t fEFlags, a_uType *puDst, uint8_t cShift)) \
    34623458{ \
    34633459    cShift &= a_cBitsWidth >= 32 ? a_cBitsWidth - 1 : 31; \
     
    34713467           Note! The OF flag is always zero because the result never differs from the input. */ \
    34723468        AssertCompile(X86_EFL_CF_BIT == 0); \
    3473         uint32_t fEfl = *pfEFlags & ~X86_EFL_STATUS_BITS; \
    3474         fEfl |= (iDst >> (cShift - 1)) & X86_EFL_CF; \
    3475         fEfl |= X86_EFL_CALC_SF(uResult, a_cBitsWidth); \
    3476         fEfl |= X86_EFL_CALC_ZF(uResult); \
    3477         fEfl |= IEM_EFL_CALC_PARITY(uResult); \
     3469        fEFlags &= ~X86_EFL_STATUS_BITS; \
     3470        fEFlags |= (iDst >> (cShift - 1)) & X86_EFL_CF; \
     3471        fEFlags |= X86_EFL_CALC_SF(uResult, a_cBitsWidth); \
     3472        fEFlags |= X86_EFL_CALC_ZF(uResult); \
     3473        fEFlags |= IEM_EFL_CALC_PARITY(uResult); \
    34783474        if (!a_fIntelFlags) \
    3479             fEfl |= X86_EFL_AF; /* AMD 3990x sets it unconditionally, Intel 10980XE does the oposite */ \
    3480         *pfEFlags = fEfl; \
     3475            fEFlags |= X86_EFL_AF; /* AMD 3990x sets it unconditionally, Intel 10980XE does the oposite */ \
    34813476    } \
     3477    return fEFlags; \
    34823478}
    34833479
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h

    r104208 r104238  
    88158815            IEM_MC_BEGIN(IEM_MC_F_MIN_186, 0); \
    88168816            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    8817             IEM_MC_ARG(uint8_t *,       pu8Dst,            0); \
    8818             IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1); \
    8819             IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     8817            IEM_MC_ARG(uint8_t *,       pu8Dst,                     1); \
    88208818            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    8821             IEM_MC_REF_EFLAGS(pEFlags); \
    8822             IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags); \
     8819            IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     8820            IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     8821            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU8, fEFlagsIn, pu8Dst, cShiftArg); \
     8822            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    88238823            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    88248824            IEM_MC_END(); \
     
    88348834            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    88358835            \
    8836             IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
    8837             IEM_MC_ARG(uint8_t *,   pu8Dst,    0); \
     8836            IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
     8837            IEM_MC_ARG(uint8_t *,       pu8Dst,                     1); \
    88388838            IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    88398839            \
    8840             IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1); \
    8841             IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags,   EFlags, 2); \
    8842             IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags); \
     8840            IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     8841            IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     8842            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU8, fEFlagsIn, pu8Dst, cShiftArg); \
    88438843            \
    88448844            IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    8845             IEM_MC_COMMIT_EFLAGS(EFlags); \
     8845            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    88468846            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    88478847            IEM_MC_END(); \
     
    89638963                    IEM_MC_BEGIN(IEM_MC_F_MIN_186, 0); \
    89648964                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    8965                     IEM_MC_ARG(uint16_t *,      pu16Dst,           0); \
    8966                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1); \
    8967                     IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     8965                    IEM_MC_ARG(uint16_t *,      pu16Dst,                    1); \
    89688966                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    8969                     IEM_MC_REF_EFLAGS(pEFlags); \
    8970                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags); \
     8967                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     8968                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     8969                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, cShiftArg); \
     8970                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    89718971                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    89728972                    IEM_MC_END(); \
     
    89768976                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    89778977                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    8978                     IEM_MC_ARG(uint32_t *,      pu32Dst,           0); \
    8979                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1); \
    8980                     IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     8978                    IEM_MC_ARG(uint32_t *,      pu32Dst,                    1); \
    89818979                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    8982                     IEM_MC_REF_EFLAGS(pEFlags); \
    8983                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags); \
     8980                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     8981                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     8982                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, cShiftArg); \
    89848983                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \
     8984                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    89858985                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    89868986                    IEM_MC_END(); \
     
    89908990                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    89918991                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    8992                     IEM_MC_ARG(uint64_t *,      pu64Dst,           0); \
    8993                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1); \
    8994                     IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     8992                    IEM_MC_ARG(uint64_t *,      pu64Dst,                    1); \
    89958993                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    8996                     IEM_MC_REF_EFLAGS(pEFlags); \
    8997                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags); \
     8994                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     8995                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     8996                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, cShiftArg); \
     8997                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    89988998                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    89998999                    IEM_MC_END(); \
     
    90179017                    \
    90189018                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    9019                     IEM_MC_ARG(uint16_t *,      pu16Dst,            0); \
     9019                    IEM_MC_ARG(uint16_t *,      pu16Dst,                    1); \
    90209020                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    90219021                    \
    9022                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,  cShift, 1); \
    9023                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags,    EFlags, 2); \
    9024                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags); \
     9022                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     9023                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     9024                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, cShiftArg); \
    90259025                    \
    90269026                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9027                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     9027                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    90289028                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    90299029                    IEM_MC_END(); \
     
    90399039                    \
    90409040                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    9041                     IEM_MC_ARG(uint32_t *,      pu32Dst,            0); \
     9041                    IEM_MC_ARG(uint32_t *,      pu32Dst,                    1); \
    90429042                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    90439043                    \
    9044                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,  cShift, 1); \
    9045                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags,    EFlags, 2); \
    9046                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags); \
     9044                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     9045                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     9046                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, cShiftArg); \
    90479047                    \
    90489048                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9049                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     9049                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    90509050                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    90519051                    IEM_MC_END(); \
     
    90619061                    \
    90629062                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    9063                     IEM_MC_ARG(uint64_t *,      pu64Dst,            0); \
     9063                    IEM_MC_ARG(uint64_t *,      pu64Dst,                    1); \
    90649064                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    90659065                    \
    9066                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,  cShift, 1); \
    9067                     IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags,    EFlags, 2); \
    9068                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags); \
     9066                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,                  0); \
     9067                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg, /*=*/ cShift,    2); \
     9068                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, cShiftArg); \
    90699069                    \
    90709070                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9071                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     9071                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    90729072                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    90739073                    IEM_MC_END(); \
     
    96939693            IEM_MC_BEGIN(0, 0); \
    96949694            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    9695             IEM_MC_ARG(uint8_t *,       pu8Dst,             0); \
    9696             IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/1,   1); \
    9697             IEM_MC_ARG(uint32_t *,      pEFlags,            2); \
     9695            IEM_MC_ARG(uint8_t *,       pu8Dst,             1); \
    96989696            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    9699             IEM_MC_REF_EFLAGS(pEFlags); \
    9700             IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags); \
     9697            IEM_MC_ARG_EFLAGS(          fEFlagsIn,          0); \
     9698            IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/1,   2); \
     9699            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU8, fEFlagsIn, pu8Dst, cShiftArg); \
     9700            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    97019701            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    97029702            IEM_MC_END(); \
     
    97069706            /* memory */ \
    97079707            IEM_MC_BEGIN(0, 0); \
    9708             IEM_MC_ARG(uint8_t *,       pu8Dst,             0); \
    9709             IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/1,   1); \
    9710             IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    9711             IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    9712             \
     9708            IEM_MC_LOCAL(RTGCPTR,       GCPtrEffDst); \
    97139709            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    97149710            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9711            \
     9712            IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
     9713            IEM_MC_ARG(uint8_t *,       pu8Dst,             1); \
    97159714            IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    9716             IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags,        2); \
    9717             IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags); \
     9715            \
     9716            IEM_MC_ARG_EFLAGS(          fEFlagsIn,          0); \
     9717            IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/1,   2); \
     9718            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU8, fEFlagsIn, pu8Dst, cShiftArg); \
    97189719            \
    97199720            IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9720             IEM_MC_COMMIT_EFLAGS(EFlags); \
     9721            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    97219722            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    97229723            IEM_MC_END(); \
     
    98299830                    IEM_MC_BEGIN(0, 0); \
    98309831                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    9831                     IEM_MC_ARG(uint16_t *,      pu16Dst,           0); \
    9832                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1, 1); \
    9833                     IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     9832                    IEM_MC_ARG(uint16_t *,      pu16Dst,           1); \
    98349833                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    9835                     IEM_MC_REF_EFLAGS(pEFlags); \
    9836                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags); \
     9834                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,         0); \
     9835                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/ 1, 2); \
     9836                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, cShiftArg); \
     9837                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    98379838                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    98389839                    IEM_MC_END(); \
     
    98429843                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    98439844                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    9844                     IEM_MC_ARG(uint32_t *,      pu32Dst,           0); \
    9845                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1, 1); \
    9846                     IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     9845                    IEM_MC_ARG(uint32_t *,      pu32Dst,           1); \
    98479846                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    9848                     IEM_MC_REF_EFLAGS(pEFlags); \
    9849                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags); \
     9847                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,         0); \
     9848                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/ 1, 2); \
     9849                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, cShiftArg); \
    98509850                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \
     9851                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    98519852                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    98529853                    IEM_MC_END(); \
     
    98569857                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    98579858                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    9858                     IEM_MC_ARG(uint64_t *,      pu64Dst,           0); \
    9859                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1, 1); \
    9860                     IEM_MC_ARG(uint32_t *,      pEFlags,           2); \
     9859                    IEM_MC_ARG(uint64_t *,      pu64Dst,           1); \
    98619860                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    9862                     IEM_MC_REF_EFLAGS(pEFlags); \
    9863                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags); \
     9861                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,         0); \
     9862                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/ 1, 2); \
     9863                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, cShiftArg); \
     9864                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    98649865                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    98659866                    IEM_MC_END(); \
     
    98769877                case IEMMODE_16BIT: \
    98779878                    IEM_MC_BEGIN(0, 0); \
    9878                     IEM_MC_ARG(uint16_t *,      pu16Dst,            0); \
    9879                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1,  1); \
    9880                     IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    9881                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    9882                     \
     9879                    IEM_MC_LOCAL(RTGCPTR,       GCPtrEffDst); \
    98839880                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    98849881                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9882                    \
     9883                    IEM_MC_ARG(uint16_t *,      pu16Dst,            1); \
     9884                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    98859885                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    9886                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags,        2); \
    9887                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags); \
     9886                    \
     9887                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,          0); \
     9888                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/ 1,  2); \
     9889                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, cShiftArg); \
    98889890                    \
    98899891                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9890                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     9892                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    98919893                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    98929894                    IEM_MC_END(); \
     
    98959897                case IEMMODE_32BIT: \
    98969898                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    9897                     IEM_MC_ARG(uint32_t *,      pu32Dst,            0); \
    9898                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1,  1); \
    9899                     IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    9900                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    9901                     \
     9899                    IEM_MC_LOCAL(RTGCPTR,       GCPtrEffDst); \
    99029900                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    99039901                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9902                    \
     9903                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
     9904                    IEM_MC_ARG(uint32_t *,      pu32Dst,            1); \
    99049905                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    9905                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags,        2); \
    9906                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags); \
     9906                    \
     9907                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,          0); \
     9908                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/ 1,  2); \
     9909                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, cShiftArg); \
    99079910                    \
    99089911                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9909                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     9912                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    99109913                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    99119914                    IEM_MC_END(); \
     
    99149917                case IEMMODE_64BIT: \
    99159918                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    9916                     IEM_MC_ARG(uint64_t *,      pu64Dst,            0); \
    9917                     IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1,  1); \
    9918                     IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    9919                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    9920                     \
     9919                    IEM_MC_LOCAL(RTGCPTR,       GCPtrEffDst); \
    99219920                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    99229921                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9922                    \
     9923                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
     9924                    IEM_MC_ARG(uint64_t *,      pu64Dst,            1); \
    99239925                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    9924                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags,        2); \
    9925                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags); \
     9926                    \
     9927                    IEM_MC_ARG_EFLAGS(          fEFlagsIn,          0); \
     9928                    IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/ 1,  2); \
     9929                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, cShiftArg); \
    99269930                    \
    99279931                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    9928                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     9932                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    99299933                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    99309934                    IEM_MC_END(); \
     
    1005710061            IEM_MC_BEGIN(0, 0); \
    1005810062            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    10059             IEM_MC_ARG(uint8_t *,   pu8Dst,     0); \
    10060             IEM_MC_ARG(uint8_t,     cShiftArg,  1); \
    10061             IEM_MC_ARG(uint32_t *,  pEFlags,    2); \
     10063            IEM_MC_ARG(uint8_t,     cShiftArg,  2); \
    1006210064            IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
     10065            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
    1006310066            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    10064             IEM_MC_REF_EFLAGS(pEFlags); \
    10065             IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags); \
     10067            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10068            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU8, fEFlagsIn, pu8Dst, cShiftArg); \
     10069            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1006610070            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1006710071            IEM_MC_END(); \
     
    1007110075            /* memory */ \
    1007210076            IEM_MC_BEGIN(0, 0); \
    10073             IEM_MC_ARG(uint8_t *,   pu8Dst,          0); \
    10074             IEM_MC_ARG(uint8_t,     cShiftArg,       1); \
    1007510077            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    10076             IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    10077             \
    1007810078            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1007910079            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     10080            \
     10081            IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     10082            IEM_MC_ARG(uint8_t *,   pu8Dst,     1); \
     10083            IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10084            \
     10085            IEM_MC_ARG(uint8_t,     cShiftArg,  2); \
    1008010086            IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10081             IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    10082             IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    10083             IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags); \
     10087            \
     10088            IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10089            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU8, fEFlagsIn, pu8Dst, cShiftArg); \
    1008410090            \
    1008510091            IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    10086             IEM_MC_COMMIT_EFLAGS(EFlags); \
     10092            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1008710093            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1008810094            IEM_MC_END(); \
     
    1019510201                    IEM_MC_BEGIN(0, 0); \
    1019610202                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    10197                     IEM_MC_ARG(uint8_t,         cShiftArg,  1); \
     10203                    IEM_MC_ARG(uint8_t,         cShiftArg,  2); \
    1019810204                    IEM_MC_NATIVE_IF(a_fRegNativeArchs) { \
    1019910205                        IEM_MC_NATIVE_SET_AMD64_HOST_REG_FOR_LOCAL(cShiftArg, X86_GREG_xCX); \
     
    1020710213                    } IEM_MC_NATIVE_ELSE() { \
    1020810214                        IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10209                         IEM_MC_ARG(uint16_t *,  pu16Dst,    0); \
     10215                        IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
    1021010216                        IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    10211                         IEM_MC_ARG(uint32_t *,  pEFlags,    2); \
    10212                         IEM_MC_REF_EFLAGS(pEFlags); \
    10213                         IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags); \
     10217                        IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10218                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, cShiftArg); \
     10219                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1021410220                    } IEM_MC_NATIVE_ENDIF(); \
    1021510221                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1022010226                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    1022110227                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    10222                     IEM_MC_ARG(uint8_t,         cShiftArg,  1); \
     10228                    IEM_MC_ARG(uint8_t,         cShiftArg,  2); \
    1022310229                    IEM_MC_NATIVE_IF(a_fRegNativeArchs) { \
    1022410230                        IEM_MC_NATIVE_SET_AMD64_HOST_REG_FOR_LOCAL(cShiftArg, X86_GREG_xCX); \
     
    1023210238                    } IEM_MC_NATIVE_ELSE() { \
    1023310239                        IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10234                         IEM_MC_ARG(uint32_t *,  pu32Dst,    0); \
     10240                        IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
    1023510241                        IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    10236                         IEM_MC_ARG(uint32_t *,  pEFlags,    2); \
    10237                         IEM_MC_REF_EFLAGS(pEFlags); \
    10238                         IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags); \
     10242                        IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10243                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, cShiftArg); \
    1023910244                        IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \
     10245                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1024010246                    } IEM_MC_NATIVE_ENDIF(); \
    1024110247                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1024610252                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    1024710253                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    10248                     IEM_MC_ARG(uint8_t,         cShiftArg,  1); \
     10254                    IEM_MC_ARG(uint8_t,         cShiftArg,  2); \
    1024910255                    IEM_MC_NATIVE_IF(a_fRegNativeArchs) { \
    1025010256                        IEM_MC_NATIVE_SET_AMD64_HOST_REG_FOR_LOCAL(cShiftArg, X86_GREG_xCX); \
     
    1025810264                    } IEM_MC_NATIVE_ELSE() { \
    1025910265                        IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10260                         IEM_MC_ARG(uint64_t *,  pu64Dst,    0); \
     10266                        IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
    1026110267                        IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    10262                         IEM_MC_ARG(uint32_t *,  pEFlags,    2); \
    10263                         IEM_MC_REF_EFLAGS(pEFlags); \
    10264                         IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags); \
     10268                        IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10269                        IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, cShiftArg); \
     10270                        IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1026510271                    } IEM_MC_NATIVE_ENDIF(); \
    1026610272                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1027810284                case IEMMODE_16BIT: \
    1027910285                    IEM_MC_BEGIN(0, 0); \
    10280                     IEM_MC_ARG(uint16_t *,  pu16Dst,    0); \
    10281                     IEM_MC_ARG(uint8_t,     cShiftArg,  1); \
    10282                     IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    10283                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    10284                     \
     10286                    IEM_MC_LOCAL(RTGCPTR,   GCPtrEffDst); \
    1028510287                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1028610288                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     10289                    \
     10290                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     10291                    IEM_MC_ARG(uint16_t *,  pu16Dst,    1); \
     10292                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10293                    \
     10294                    IEM_MC_ARG(uint8_t,     cShiftArg,  2); \
    1028710295                    IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10288                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    10289                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    10290                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags); \
     10296                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10297                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, cShiftArg); \
    1029110298                    \
    1029210299                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    10293                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     10300                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1029410301                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1029510302                    IEM_MC_END(); \
     
    1029810305                case IEMMODE_32BIT: \
    1029910306                    IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \
    10300                     IEM_MC_ARG(uint32_t *,  pu32Dst,    0); \
    10301                     IEM_MC_ARG(uint8_t,     cShiftArg,  1); \
    10302                     IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    10303                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    10304                     \
     10307                    IEM_MC_LOCAL(RTGCPTR,   GCPtrEffDst); \
    1030510308                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1030610309                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     10310                    \
     10311                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     10312                    IEM_MC_ARG(uint32_t *,  pu32Dst,    1); \
     10313                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10314                    \
     10315                    IEM_MC_ARG(uint8_t,     cShiftArg,  2); \
    1030710316                    IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10308                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    10309                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    10310                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags); \
     10317                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10318                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, cShiftArg); \
    1031110319                    \
    1031210320                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    10313                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     10321                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1031410322                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1031510323                    IEM_MC_END(); \
     
    1031810326                case IEMMODE_64BIT: \
    1031910327                    IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    10320                     IEM_MC_ARG(uint64_t *,  pu64Dst,    0); \
    10321                     IEM_MC_ARG(uint8_t,     cShiftArg,  1); \
    1032210328                    IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    10323                     IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    10324                     \
    1032510329                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1032610330                    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     10331                    \
     10332                    IEM_MC_LOCAL(uint8_t,   bUnmapInfo); \
     10333                    IEM_MC_ARG(uint64_t *,  pu64Dst,    1); \
     10334                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10335                    \
     10336                    IEM_MC_ARG(uint8_t,     cShiftArg,  2); \
    1032710337                    IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX); \
    10328                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    10329                     IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    10330                     IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags); \
     10338                    IEM_MC_ARG_EFLAGS(      fEFlagsIn,  0); \
     10339                    IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, cShiftArg); \
    1033110340                    \
    1033210341                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
    10333                     IEM_MC_COMMIT_EFLAGS(EFlags); \
     10342                    IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    1033410343                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    1033510344                    IEM_MC_END(); \
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104209 r104238  
    28952895/** @name Shift operations on bytes (Group 2).
    28962896 * @{ */
    2897 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSHIFTU8,(uint8_t *pu8Dst, uint8_t cShift, uint32_t *pEFlags));
     2897typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSHIFTU8,(uint32_t fEFlagsIn, uint8_t *pu8Dst, uint8_t cShift));
    28982898typedef FNIEMAIMPLSHIFTU8  *PFNIEMAIMPLSHIFTU8;
    28992899FNIEMAIMPLSHIFTU8 iemAImpl_rol_u8, iemAImpl_rol_u8_amd, iemAImpl_rol_u8_intel;
     
    29082908/** @name Shift operations on words (Group 2).
    29092909 * @{ */
    2910 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSHIFTU16,(uint16_t *pu16Dst, uint8_t cShift, uint32_t *pEFlags));
     2910typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSHIFTU16,(uint32_t fEFlagsIn, uint16_t *pu16Dst, uint8_t cShift));
    29112911typedef FNIEMAIMPLSHIFTU16  *PFNIEMAIMPLSHIFTU16;
    29122912FNIEMAIMPLSHIFTU16 iemAImpl_rol_u16, iemAImpl_rol_u16_amd, iemAImpl_rol_u16_intel;
     
    29212921/** @name Shift operations on double words (Group 2).
    29222922 * @{ */
    2923 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSHIFTU32,(uint32_t *pu32Dst, uint8_t cShift, uint32_t *pEFlags));
     2923typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSHIFTU32,(uint32_t fEFlagsIn, uint32_t *pu32Dst, uint8_t cShift));
    29242924typedef FNIEMAIMPLSHIFTU32  *PFNIEMAIMPLSHIFTU32;
    29252925FNIEMAIMPLSHIFTU32 iemAImpl_rol_u32, iemAImpl_rol_u32_amd, iemAImpl_rol_u32_intel;
     
    29342934/** @name Shift operations on words (Group 2).
    29352935 * @{ */
    2936 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSHIFTU64,(uint64_t *pu64Dst, uint8_t cShift, uint32_t *pEFlags));
     2936typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSHIFTU64,(uint32_t fEFlagsIn, uint64_t *pu64Dst, uint8_t cShift));
    29372937typedef FNIEMAIMPLSHIFTU64  *PFNIEMAIMPLSHIFTU64;
    29382938FNIEMAIMPLSHIFTU64 iemAImpl_rol_u64, iemAImpl_rol_u64_amd, iemAImpl_rol_u64_intel;
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r104208 r104238  
    27832783            a_TestType Test; \
    27842784            Test.fEflIn    = RandEFlags(); \
    2785             Test.fEflOut   = Test.fEflIn; \
    27862785            Test.uDstIn    = RandU ## a_cBits ## Dst(iTest); \
    27872786            Test.uDstOut   = Test.uDstIn; \
    27882787            Test.uSrcIn    = 0; \
    27892788            Test.uMisc     = RandU8() & (a_cBits * 4 - 1); /* need to go way beyond the a_cBits limit */ \
    2790             a_aSubTests[iFn].pfnNative(&Test.uDstOut, Test.uMisc, &Test.fEflOut); \
     2789            Test.fEflOut   = a_aSubTests[iFn].pfnNative(Test.fEflIn, &Test.uDstOut, Test.uMisc); \
    27912790            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    27922791            \
    27932792            Test.fEflIn    = (~Test.fEflIn & X86_EFL_LIVE_MASK) | X86_EFL_RA1_MASK; \
    2794             Test.fEflOut   = Test.fEflIn; \
    27952793            Test.uDstOut   = Test.uDstIn; \
    2796             a_aSubTests[iFn].pfnNative(&Test.uDstOut, Test.uMisc, &Test.fEflOut); \
     2794            Test.fEflOut   = a_aSubTests[iFn].pfnNative(Test.fEflIn, &Test.uDstOut, Test.uMisc); \
    27972795            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    27982796        } \
     
    28382836    for (uint32_t i = 0; i < cIterations; i++) \
    28392837    { \
    2840         uint32_t fBenchEfl = fEflIn; \
    28412838        a_uType  uBenchDst = uDstIn;  \
    2842         pfn(&uBenchDst, cShift, &fBenchEfl); \
     2839        pfn(fEflIn, &uBenchDst, cShift); \
    28432840        \
    2844         fBenchEfl = fEflIn; \
    28452841        uBenchDst = uDstIn;  \
    2846         pfn(&uBenchDst, cShift, &fBenchEfl); \
     2842        pfn(fEflIn, &uBenchDst, cShift); \
    28472843        \
    2848         fBenchEfl = fEflIn; \
    28492844        uBenchDst = uDstIn;  \
    2850         pfn(&uBenchDst, cShift, &fBenchEfl); \
     2845        pfn(fEflIn, &uBenchDst, cShift); \
    28512846        \
    2852         fBenchEfl = fEflIn; \
    28532847        uBenchDst = uDstIn;  \
    2854         pfn(&uBenchDst, cShift, &fBenchEfl); \
     2848        pfn(fEflIn, &uBenchDst, cShift); \
    28552849    } \
    28562850    return RTTimeNanoTS() - nsStart; \
     
    28722866            for (uint32_t iTest = 0; iTest < cTests; iTest++ ) \
    28732867            { \
    2874                 uint32_t fEfl = paTests[iTest].fEflIn; \
    2875                 a_uType  uDst = paTests[iTest].uDstIn; \
    2876                 pfn(&uDst, paTests[iTest].uMisc, &fEfl); \
    2877                 if (   uDst != paTests[iTest].uDstOut \
    2878                     || fEfl != paTests[iTest].fEflOut ) \
     2868                a_uType  uDst    = paTests[iTest].uDstIn; \
     2869                uint32_t fEflOut = pfn(paTests[iTest].fEflIn, &uDst, paTests[iTest].uMisc); \
     2870                if (   uDst    != paTests[iTest].uDstOut \
     2871                    || fEflOut != paTests[iTest].fEflOut ) \
    28792872                    RTTestFailed(g_hTest, "#%u%s: efl=%#08x dst=" a_Fmt " shift=%2u -> efl=%#08x dst=" a_Fmt ", expected %#08x & " a_Fmt "%s\n", \
    28802873                                 iTest, iVar == 0 ? "" : "/n", \
    28812874                                 paTests[iTest].fEflIn, paTests[iTest].uDstIn, paTests[iTest].uMisc, \
    2882                                  fEfl, uDst, paTests[iTest].fEflOut, paTests[iTest].uDstOut, \
    2883                                  EFlagsDiff(fEfl, paTests[iTest].fEflOut)); \
     2875                                 fEflOut, uDst, paTests[iTest].fEflOut, paTests[iTest].uDstOut, \
     2876                                 EFlagsDiff(fEflOut, paTests[iTest].fEflOut)); \
    28842877                else \
    28852878                { \
    28862879                     *g_pu ## a_cBits  = paTests[iTest].uDstIn; \
    2887                      *g_pfEfl          = paTests[iTest].fEflIn; \
    2888                      pfn(g_pu ## a_cBits, paTests[iTest].uMisc, g_pfEfl); \
     2880                     fEflOut = pfn(paTests[iTest].fEflIn, g_pu ## a_cBits, paTests[iTest].uMisc); \
    28892881                     RTTEST_CHECK(g_hTest, *g_pu ## a_cBits == paTests[iTest].uDstOut); \
    2890                      RTTEST_CHECK(g_hTest, *g_pfEfl == paTests[iTest].fEflOut); \
     2882                     RTTEST_CHECK(g_hTest, fEflOut == paTests[iTest].fEflOut); \
    28912883                } \
    28922884            } \
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