VirtualBox

Changeset 104239 in vbox


Ignore:
Timestamp:
Apr 8, 2024 9:33:56 PM (10 months ago)
Author:
vboxsync
Message:

VMM/IEM: ARM assembly rendition of ROR. bugref:10376

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r104238 r104239  
    701701sar_64 iemAImpl_sar_u64_amd,   0
    702702
     703
     704/*
     705 * Rotate Left.
     706 */
     707
     708/* uint32_t iemAImpl_rol_u8( uint32_t fEFlagsIn, uint8_t *pu8Dst, uint8_t cShift); */
     709/* uint32_t iemAImpl_rol_u16(uint32_t fEFlagsIn, uint16_t *pu16Dst, uint8_t cShift); */
     710/* uint32_t iemAImpl_rol_u32(uint32_t fEFlagsIn, uint16_t *pu32Dst, uint8_t cShift); */
     711.macro ROL_8_16_32, a_Name, a_cBits, a_fIntelFlags, a_LdStSuff
     712ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
     713BEGINPROC_HIDDEN \a_Name
     714        .cfi_startproc
     715
     716        /* Do we need to rotate anything at all? */
     717        and     w2, w2, #0x1f
     718        cbz     w2, 99f
     719
     720        /*
     721         * Do the shifting
     722         */
     723.ifne \a_cBits < 32
     724        and     w2, w2, #(\a_cBits - 1)
     725        neg     w3, w2
     726        and     w3, w3, #(\a_cBits - 1)
     727        ldr\a_LdStSuff  w8, [x1]
     728        lslv    w9, w8, w2
     729        lsrv    w10, w8, w3
     730        orr     w9, w9, w10
     731        str\a_LdStSuff  w9, [x1]
     732        and     w9, w9, #(RT_BIT_32(\a_cBits) - 1)
     733.else
     734        neg     w3, w2                          /* the count is MODed by the data size, so this is safe. */
     735        ldr\a_LdStSuff  w8, [x1]
     736        rorv    w9, w8, w3
     737        str\a_LdStSuff  w9, [x1]
     738.endif
     739
     740        /*
     741         * Calculate EFLAGS - only CF and OF.
     742         */
     743        bfi     w0, w9, #0, #1                  /* CF = last bit rotated around */
     744
     745.ifne \a_fIntelFlags
     746        /* Intel: OF = first rotate step: fEfl |= X86_EFL_GET_OF_ ## cOpBits(uDst ^ (uDst << 1)); */
     747        eor     w11, w8, w8, LSL #1
     748        lsr     w11, w11, #(\a_cBits - 1)
     749        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     750.else
     751        /* AMD: OF = last rotate step: fEfl |= ((uResult >> (cOpBits - 1)) ^ fCarry) << X86_EFL_OF_BIT;  */
     752        eor     w11, w0, w9, LSR #(\a_cBits - 1)
     753        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     754.endif
     755
     75699:
     757        ret
     758        .cfi_endproc
     759.endm
     760
     761ROL_8_16_32 iemAImpl_rol_u8,         8, 1, b
     762ROL_8_16_32 iemAImpl_rol_u8_intel,   8, 1, b
     763ROL_8_16_32 iemAImpl_rol_u8_amd,     8, 0, b
     764
     765ROL_8_16_32 iemAImpl_rol_u16,       16, 1, h
     766ROL_8_16_32 iemAImpl_rol_u16_intel, 16, 1, h
     767ROL_8_16_32 iemAImpl_rol_u16_amd,   16, 0, h
     768
     769ROL_8_16_32 iemAImpl_rol_u32,       32, 1,
     770ROL_8_16_32 iemAImpl_rol_u32_intel, 32, 1,
     771ROL_8_16_32 iemAImpl_rol_u32_amd,   32, 0,
     772
     773/** @todo this is slightly slower than the C version (release) on an M2. Investigate why. */
     774/* uint32_t iemAImpl_rol_u64(uint32_t fEFlagsIn, uint16_t *pu64Dst, uint8_t cShift); */
     775.macro ROL_64, a_Name, a_fIntelFlags
     776ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT)
     777BEGINPROC_HIDDEN \a_Name
     778        .cfi_startproc
     779
     780        /* Do we need to shift anything at all? */
     781        and     w2, w2, #0x3f
     782        cbz     w2, 99f
     783
     784        /*
     785         * Do the shifting
     786         */
     787        neg     w3, w2
     788        ldr     x8, [x1]
     789        rorv    x9, x8, x3
     790        str     x9, [x1]
     791
     792        /*
     793         * Calculate EFLAGS - only CF and OF.
     794         */
     795        bfi     w0, w9, #0, #1                  /* CF = last bit rotated around */
     796
     797.ifne \a_fIntelFlags
     798        /* Intel: OF = first rotate step: fEfl |= X86_EFL_GET_OF_ ## cOpBits(uDst ^ (uDst << 1)); */
     799        eor     x11, x8, x8, LSL #1
     800        lsr     x11, x11, #(64 - 1)
     801        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     802.else
     803        /* AMD: OF = last rotate step: fEfl |= ((uResult >> (cOpBits - 1)) ^ fCarry) << X86_EFL_OF_BIT;  */
     804        eor     x11, x0, x9, LSR #(64 - 1)
     805        bfi     w0, w11, #X86_EFL_OF_BIT, #1
     806.endif
     807
     80899:
     809        ret
     810        .cfi_endproc
     811.endm
     812
     813ROL_64 iemAImpl_rol_u64,       1
     814ROL_64 iemAImpl_rol_u64_intel, 1
     815ROL_64 iemAImpl_rol_u64_amd,   0
     816
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r104238 r104239  
    31163116}
    31173117
    3118 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY)
     3118#ifndef RT_ARCH_ARM64
     3119
     3120# if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY)
    31193121EMIT_ROL(64, uint64_t, RT_NOTHING, 1, ASMRotateLeftU64)
    3120 #endif
     3122# endif
    31213123EMIT_ROL(64, uint64_t, _intel,     1, ASMRotateLeftU64)
    31223124EMIT_ROL(64, uint64_t, _amd,       0, ASMRotateLeftU64)
    31233125
    3124 #if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)
     3126# if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)
    31253127EMIT_ROL(32, uint32_t, RT_NOTHING, 1, ASMRotateLeftU32)
    3126 #endif
     3128# endif
    31273129EMIT_ROL(32, uint32_t, _intel,     1, ASMRotateLeftU32)
    31283130EMIT_ROL(32, uint32_t, _amd,       0, ASMRotateLeftU32)
     
    31323134    return (uValue << cShift) | (uValue >> (16 - cShift));
    31333135}
    3134 #if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)
     3136# if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)
    31353137EMIT_ROL(16, uint16_t, RT_NOTHING, 1, iemAImpl_rol_u16_hlp)
    3136 #endif
     3138# endif
    31373139EMIT_ROL(16, uint16_t, _intel,     1, iemAImpl_rol_u16_hlp)
    31383140EMIT_ROL(16, uint16_t, _amd,       0, iemAImpl_rol_u16_hlp)
     
    31423144    return (uValue << cShift) | (uValue >> (8 - cShift));
    31433145}
    3144 #if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)
     3146# if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)
    31453147EMIT_ROL(8,  uint8_t,  RT_NOTHING, 1, iemAImpl_rol_u8_hlp)
    3146 #endif
     3148# endif
    31473149EMIT_ROL(8,  uint8_t,  _intel,     1, iemAImpl_rol_u8_hlp)
    31483150EMIT_ROL(8,  uint8_t,  _amd,       0, iemAImpl_rol_u8_hlp)
    31493151
     3152#endif /* !RT_ARCH_ARM64 */
    31503153
    31513154/*
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