VirtualBox

Changeset 87189 in vbox


Ignore:
Timestamp:
Jan 6, 2021 1:19:56 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142120
Message:

iprt/asm.h: More fun. bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/asm.h

    r87188 r87189  
    44194419
    44204420# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
    4421     RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoOr32, pu32, NO_BARRIER,
     4421    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoOrU32, pu32, NO_BARRIER,
    44224422                                           "orr %w[uNew], %w[uNew], %w[uVal]\n\t",
    44234423                                           "orr %[uNew], %[uNew], %[uVal]\n\t",
     
    51865186 *          traps accessing the last bits in the bitmap.
    51875187 */
    5188 #if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
     5188#if RT_INLINE_ASM_EXTERNAL_TMP_ARM && !RT_INLINE_ASM_USES_INTRIN
    51895189RT_ASM_DECL_PRAGMA_WATCOM(void) ASMBitSet(volatile void RT_FAR *pvBitmap, int32_t iBit) RT_NOTHROW_PROTO;
    51905190#else
     
    51945194    _bittestandset((long RT_FAR *)pvBitmap, iBit);
    51955195
    5196 # elif RT_INLINE_ASM_GNU_STYLE
     5196# elif defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
     5197#  if RT_INLINE_ASM_GNU_STYLE
    51975198    __asm__ __volatile__("btsl %1, %0"
    51985199                         : "=m" (*(volatile long RT_FAR *)pvBitmap)
     
    52015202                         : "memory"
    52025203                         , "cc");
    5203 # else
     5204#  else
    52045205    __asm
    52055206    {
    5206 ifdef RT_ARCH_AMD64
     5207 ifdef RT_ARCH_AMD64
    52075208        mov     rax, [pvBitmap]
    52085209        mov     edx, [iBit]
    52095210        bts     [rax], edx
    5210 else
     5211 else
    52115212        mov     eax, [pvBitmap]
    52125213        mov     edx, [iBit]
    52135214        bts     [eax], edx
    5214 endif
     5215 endif
    52155216    }
     5217#  endif
     5218
     5219# else
     5220    int32_t offBitmap = iBit / 32;
     5221    AssertStmt(!((uintptr_t)pvBitmap & 3), offBitmap += (uintptr_t)pvBitmap & 3; iBit += ((uintptr_t)pvBitmap & 3) * 8);
     5222    ASMAtomicUoOrU32(&((uint32_t volatile *)pvBitmap)[offBitmap], RT_BIT_32(iBit & 31));
    52165223# endif
    52175224}
     
    52285235 * @remarks x86: Requires a 386 or later.
    52295236 */
    5230 #if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
     5237#if RT_INLINE_ASM_EXTERNAL_TMP_ARM && !RT_INLINE_ASM_USES_INTRIN
    52315238RT_ASM_DECL_PRAGMA_WATCOM(void) ASMAtomicBitSet(volatile void RT_FAR *pvBitmap, int32_t iBit) RT_NOTHROW_PROTO;
    52325239#else
     
    52365243# if RT_INLINE_ASM_USES_INTRIN
    52375244    _interlockedbittestandset((long RT_FAR *)pvBitmap, iBit);
    5238 # elif RT_INLINE_ASM_GNU_STYLE
     5245# elif defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
     5246#  if RT_INLINE_ASM_GNU_STYLE
    52395247    __asm__ __volatile__("lock; btsl %1, %0"
    52405248                         : "=m" (*(volatile long *)pvBitmap)
     
    52435251                         : "memory"
    52445252                         , "cc");
    5245 # else
     5253#  else
    52465254    __asm
    52475255    {
    5248 ifdef RT_ARCH_AMD64
     5256 ifdef RT_ARCH_AMD64
    52495257        mov     rax, [pvBitmap]
    52505258        mov     edx, [iBit]
    52515259        lock bts [rax], edx
    5252 else
     5260 else
    52535261        mov     eax, [pvBitmap]
    52545262        mov     edx, [iBit]
    52555263        lock bts [eax], edx
    5256 endif
     5264 endif
    52575265    }
     5266#  endif
     5267
     5268# else
     5269    ASMAtomicOrU32(&((uint32_t volatile *)pvBitmap)[iBit / 32], RT_BIT_32(iBit & 31));
    52585270# endif
    52595271}
     
    52715283 *          traps accessing the last bits in the bitmap.
    52725284 */
    5273 #if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN
     5285#if RT_INLINE_ASM_EXTERNAL_TMP_ARM && !RT_INLINE_ASM_USES_INTRIN
    52745286RT_ASM_DECL_PRAGMA_WATCOM(void) ASMBitClear(volatile void RT_FAR *pvBitmap, int32_t iBit) RT_NOTHROW_PROTO;
    52755287#else
     
    52795291    _bittestandreset((long RT_FAR *)pvBitmap, iBit);
    52805292
    5281 # elif RT_INLINE_ASM_GNU_STYLE
     5293# elif defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
     5294#  if RT_INLINE_ASM_GNU_STYLE
    52825295    __asm__ __volatile__("btrl %1, %0"
    52835296                         : "=m" (*(volatile long RT_FAR *)pvBitmap)
     
    52865299                         : "memory"
    52875300                         , "cc");
    5288 # else
     5301#  else
    52895302    __asm
    52905303    {
    5291 ifdef RT_ARCH_AMD64
     5304 ifdef RT_ARCH_AMD64
    52925305        mov     rax, [pvBitmap]
    52935306        mov     edx, [iBit]
    52945307        btr     [rax], edx
    5295 else
     5308 else
    52965309        mov     eax, [pvBitmap]
    52975310        mov     edx, [iBit]
    52985311        btr     [eax], edx
    5299 endif
     5312 endif
    53005313    }
     5314#  endif
     5315
     5316# else
     5317    int32_t offBitmap = iBit / 32;
     5318    AssertStmt(!((uintptr_t)pvBitmap & 3), offBitmap += (uintptr_t)pvBitmap & 3; iBit += ((uintptr_t)pvBitmap & 3) * 8);
     5319    ASMAtomicUoAndU32(&((uint32_t volatile *)pvBitmap)[offBitmap], ~RT_BIT_32(iBit & 31));
    53015320# endif
    53025321}
     
    53145333 * @remarks x86: Requires a 386 or later.
    53155334 */
    5316 #if RT_INLINE_ASM_EXTERNAL
     5335#if RT_INLINE_ASM_EXTERNAL_TMP_ARM
    53175336RT_ASM_DECL_PRAGMA_WATCOM(void) ASMAtomicBitClear(volatile void RT_FAR *pvBitmap, int32_t iBit) RT_NOTHROW_PROTO;
    53185337#else
     
    53205339{
    53215340    AssertMsg(!((uintptr_t)pvBitmap & 3), ("address %p not 32-bit aligned", pvBitmap));
    5322 # if RT_INLINE_ASM_GNU_STYLE
     5341# if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
     5342#  if RT_INLINE_ASM_GNU_STYLE
    53235343    __asm__ __volatile__("lock; btrl %1, %0"
    53245344                         : "=m" (*(volatile long RT_FAR *)pvBitmap)
     
    53275347                         : "memory"
    53285348                         , "cc");
    5329 # else
     5349#  else
    53305350    __asm
    53315351    {
    5332 ifdef RT_ARCH_AMD64
     5352 ifdef RT_ARCH_AMD64
    53335353        mov     rax, [pvBitmap]
    53345354        mov     edx, [iBit]
    53355355        lock btr [rax], edx
    5336 else
     5356 else
    53375357        mov     eax, [pvBitmap]
    53385358        mov     edx, [iBit]
    53395359        lock btr [eax], edx
    5340 endif
     5360 endif
    53415361    }
     5362#  endif
     5363# else
     5364    ASMAtomicAndU32(&((uint32_t volatile *)pvBitmap)[iBit / 32], ~RT_BIT_32(iBit & 31));
    53425365# endif
    53435366}
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