VirtualBox

Changeset 102938 in vbox for trunk/include/iprt/asm.h


Ignore:
Timestamp:
Jan 17, 2024 7:39:48 PM (13 months ago)
Author:
vboxsync
Message:

iprt/asm.h: Added a CLREX instruction to the cmpxchg sequences on arm64, so we don't keep the CPU in the locked state unnecessarily long. This speeds up the negative (test fail) benchmarks of the ASMAtomicCmpXchg* functions. bugref:9898

File:
1 edited

Legend:

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

    r101609 r102938  
    304304#   define RTASM_ARM_DMB_LD             RTASM_ARM_DMB_SY
    305305#   define RTASM_ARM_DMB_LD_IN_REG      RTASM_ARM_DMB_SY_IN_REG
     306
    306307#  elif RT_ARCH_ARM32 >= 4
    307308#   warning armv5 or older
     
    10941095                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgU8_%=\n\t"
    10951096                         "mov       %w[fXchg], #1\n\t"
     1097                         "1:\n\t"
     1098                         "clrex\n\t"
    10961099#  else
    10971100                         "ldrexb    %[uOld], %[pMem]\n\t"
     
    11021105                         "bne       Ltry_again_ASMAtomicCmpXchgU8_%=\n\t"
    11031106                         "mov       %[fXchg], #1\n\t"
    1104 #  endif
    11051107                         "1:\n\t"
     1108                         /** @todo clrexne on armv7? */
     1109#  endif
    11061110                         : [pMem]   "+Q"  (*pu8)
    11071111                         , [uOld]   "=&r" (u32Spill)
     
    12311235                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgU32_%=\n\t"
    12321236                         "mov       %w[fXchg], #1\n\t"
     1237                         "1:\n\t"
     1238                         "clrex\n\t"
    12331239#  else
    12341240                         "ldrex     %[uOld], %[pMem]\n\t"
     
    12391245                         "bne       Ltry_again_ASMAtomicCmpXchgU32_%=\n\t"
    12401246                         "mov       %[fXchg], #1\n\t"
    1241 #  endif
    12421247                         "1:\n\t"
     1248                         /** @todo clrexne on armv7? */
     1249#  endif
    12431250                         : [pMem]   "+Q"  (*pu32)
    12441251                         , [uOld]   "=&r" (u32Spill)
     
    13931400                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgU64_%=\n\t"
    13941401                         "mov       %w[fXchg], #1\n\t"
     1402                         "1:\n\t"
     1403                         "clrex\n\t"
    13951404#  else
    13961405                         "ldrexd    %[uOld], %H[uOld], %[pMem]\n\t"
     
    14021411                         "bne       Ltry_again_ASMAtomicCmpXchgU64_%=\n\t"
    14031412                         "mov       %[fXchg], #1\n\t"
    1404 #  endif
    14051413                         "1:\n\t"
     1414                         /** @todo clrexne on armv7? */
     1415#  endif
    14061416                         : [pMem]   "+Q"  (*pu64)
    14071417                         , [uOld]   "=&r" (u64Spill)
     
    17381748                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgExU8_%=\n\t"
    17391749                         "mov       %w[fXchg], #1\n\t"
     1750                         "1:\n\t"
     1751                         "clrex\n\t"
    17401752#  else
    17411753                         "ldrexb     %[uOld], %[pMem]\n\t"
     
    17461758                         "bne       Ltry_again_ASMAtomicCmpXchgExU8_%=\n\t"
    17471759                         "mov       %[fXchg], #1\n\t"
    1748 #  endif
    17491760                         "1:\n\t"
     1761                         /** @todo clrexne on armv7? */
     1762#  endif
    17501763                         : [pMem]   "+Q"  (*pu8)
    17511764                         , [uOld]   "=&r" (u8ActualOld)
     
    18631876                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgExU16_%=\n\t"
    18641877                         "mov       %w[fXchg], #1\n\t"
     1878                         "1:\n\t"
     1879                         "clrex\n\t"
    18651880#  else
    18661881                         "ldrexh     %[uOld], %[pMem]\n\t"
     
    18711886                         "bne       Ltry_again_ASMAtomicCmpXchgExU16_%=\n\t"
    18721887                         "mov       %[fXchg], #1\n\t"
    1873 #  endif
    18741888                         "1:\n\t"
     1889                         /** @todo clrexne on armv7? */
     1890#  endif
    18751891                         : [pMem]   "+Q"  (*pu16)
    18761892                         , [uOld]   "=&r" (u16ActualOld)
     
    19882004                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgExU32_%=\n\t"
    19892005                         "mov       %w[fXchg], #1\n\t"
     2006                         "1:\n\t"
     2007                         "clrex\n\t"
    19902008#  else
    19912009                         "ldrex     %[uOld], %[pMem]\n\t"
     
    19962014                         "bne       Ltry_again_ASMAtomicCmpXchgExU32_%=\n\t"
    19972015                         "mov       %[fXchg], #1\n\t"
    1998 #  endif
    19992016                         "1:\n\t"
     2017                         /** @todo clrexne on armv7? */
     2018#  endif
    20002019                         : [pMem]   "+Q"  (*pu32)
    20012020                         , [uOld]   "=&r" (u32ActualOld)
     
    21582177                         "cbnz      %w[rc], Ltry_again_ASMAtomicCmpXchgU64_%=\n\t"
    21592178                         "mov       %w[fXchg], #1\n\t"
     2179                         "1:\n\t"
     2180                         "clrex\n\t"
    21602181#  else
    21612182                         "ldrexd    %[uOld], %H[uOld], %[pMem]\n\t"
     
    21672188                         "bne       Ltry_again_ASMAtomicCmpXchgU64_%=\n\t"
    21682189                         "mov       %[fXchg], #1\n\t"
    2169 #  endif
    21702190                         "1:\n\t"
     2191                         /** @todo clrexne on armv7? */
     2192#  endif
    21712193                         : [pMem]   "+Q"  (*pu64)
    21722194                         , [uOld]   "=&r" (u64ActualOld)
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