VirtualBox

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


Ignore:
Timestamp:
Jan 18, 2024 10:36:04 PM (11 months ago)
Author:
vboxsync
Message:

iprt/asm.h: Working over the ASMAtomic*And|Or|Xor* functions for arm64 again, opting for acquire-lrelase w/o DMB (barrier) as a safer alternative. bugref:9898

File:
1 edited

Legend:

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

    r102961 r102962  
    51715171
    51725172# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5173#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5174#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5175    uint32_t u32Spill;
     5176    __asm__ __volatile__("Lstart_ASMAtomicOrU32_%=:\n\t"
     5177                         "ldsetal   %w[fBitsToSet], %w[uSpill], %[pMem]\n\t"
     5178                         : [pMem]       "+Q"  (*pu32)
     5179                         , [uSpill]     "=&r" (u32Spill)
     5180                         : [fBitsToSet] "r"   (u32)
     5181                         : );
     5182#   else
     5183    __asm__ __volatile__("Lstart_ASMAtomicOrU32_%=:\n\t"
     5184                         RTASM_ARM_DMB_SY
     5185                         "stset     %w[fBitsToSet], %[pMem]\n\t"
     5186                         : [pMem]       "+Q"  (*pu32)
     5187                         : [fBitsToSet] "r"   (u32)
     5188                         : );
     5189#   endif
     5190#  else
    51735191    /* For more on Orr see https://en.wikipedia.org/wiki/Orr_(Catch-22) ;-) */
    51745192    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicOr32, pu32, DMB_SY,
     
    51775195                                           [uVal] "r" (u32));
    51785196
     5197#  endif
    51795198# else
    51805199#  error "Port me"
     
    51955214{
    51965215#if defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5216#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5217    uint32_t u32OldRet;
     5218    __asm__ __volatile__("Lstart_ASMAtomicOrExU32_%=:\n\t"
     5219#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5220                         "ldsetal   %w[fBitsToSet], %w[uOldRet], %[pMem]\n\t"
     5221#   else
     5222                         RTASM_ARM_DMB_SY
     5223                         "ldset     %w[fBitsToSet], %w[uOldRet], %[pMem]\n\t"
     5224#   endif
     5225                         : [pMem]       "+Q"  (*pu32)
     5226                         , [uOldRet]    "=&r" (u32OldRet)
     5227                         : [fBitsToSet] "r"   (u32)
     5228                         : );
     5229#  else
    51975230    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicOrEx32, pu32, DMB_SY,
    51985231                                           "orr %w[uNew], %w[uOld], %w[uVal]\n\t",
    51995232                                           "orr %[uNew], %[uOld], %[uVal]\n\t",
    52005233                                           [uVal] "r" (u32));
     5234#   endif
    52015235    return u32OldRet;
    52025236
     
    52505284
    52515285# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5286#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5287#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5288    uint64_t u64Spill;
     5289    __asm__ __volatile__("Lstart_ASMAtomicOrU64_%=:\n\t"
     5290                         "ldsetal   %[fBitsToSet], %[uSpill], %[pMem]\n\t"
     5291                         : [pMem]       "+Q"  (*pu64)
     5292                         , [uSpill]     "=&r" (u64Spill)
     5293                         : [fBitsToSet] "r"   (u64)
     5294                         : );
     5295#   else
     5296    __asm__ __volatile__("Lstart_ASMAtomicOrU64_%=:\n\t"
     5297                         RTASM_ARM_DMB_SY
     5298                         "stset     %[fBitsToSet], %[pMem]\n\t"
     5299                         : [pMem]       "+Q"  (*pu64)
     5300                         : [fBitsToSet] "r"   (u64)
     5301                         : );
     5302#   endif
     5303#  else
    52525304    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_64(ASMAtomicOrU64, pu64, DMB_SY,
    52535305                                           "orr %[uNew], %[uNew], %[uVal]\n\t"
     
    52565308                                           "orr %H[uNew], %H[uNew], %H[uVal]\n\t",
    52575309                                           [uVal] "r" (u64));
     5310#  endif
    52585311
    52595312# else
     
    53235376
    53245377# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5378#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5379#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5380    uint32_t u32Spill;
     5381    __asm__ __volatile__("Lstart_ASMAtomicAndU32_%=:\n\t"
     5382                         "ldclral   %w[fBitsToClear], %w[uSpill], %[pMem]\n\t"
     5383                         : [pMem]           "+Q"  (*pu32)
     5384                         , [uSpill]         "=&r" (u32Spill)
     5385                         : [fBitsToClear]   "r"   (~u32)
     5386                         : );
     5387#   else
     5388    __asm__ __volatile__("Lstart_ASMAtomicAndU32_%=:\n\t"
     5389                         RTASM_ARM_DMB_SY
     5390                         "stclr     %w[fBitsToClear], %[pMem]\n\t"
     5391                         : [pMem]           "+Q"  (*pu32)
     5392                         : [fBitsToClear]   "r"   (~u32)
     5393                         : );
     5394#   endif
     5395#  else
    53255396    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicAnd32, pu32, DMB_SY,
    53265397                                           "and %w[uNew], %w[uNew], %w[uVal]\n\t",
     
    53285399                                           [uVal] "r" (u32));
    53295400
     5401#  endif
    53305402# else
    53315403#  error "Port me"
     
    53455417{
    53465418#if defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5419# if defined(RTASM_ARM64_USE_FEAT_LSE)
     5420    uint32_t u32OldRet;
     5421    __asm__ __volatile__("Lstart_ASMAtomicAndExU32_%=:\n\t"
     5422#  if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5423                         "ldclral   %w[fBitsToClear], %w[uOldRet], %[pMem]\n\t"
     5424#  else
     5425                         RTASM_ARM_DMB_SY
     5426                         "ldclr     %w[fBitsToClear], %w[uOldRet], %[pMem]\n\t"
     5427#  endif
     5428                         : [pMem]           "+Q"  (*pu32)
     5429                         , [uOldRet]        "=&r" (u32OldRet)
     5430                         : [fBitsToClear]   "r"   (~u32)
     5431                         : );
     5432# else
    53475433    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicAndEx32, pu32, DMB_SY,
    53485434                                           "and %w[uNew], %w[uOld], %w[uVal]\n\t",
    53495435                                           "and %[uNew], %[uOld], %[uVal]\n\t",
    53505436                                           [uVal] "r" (u32));
     5437# endif
    53515438    return u32OldRet;
    53525439
     
    54005487
    54015488# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5489#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5490#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5491    uint64_t u64Spill;
     5492    __asm__ __volatile__("Lstart_ASMAtomicAndU64_%=:\n\t"
     5493                         "ldclral   %[fBitsToClear], %[uSpill], %[pMem]\n\t"
     5494                         : [pMem]           "+Q"  (*pu64)
     5495                         , [uSpill]         "=&r" (u64Spill)
     5496                         : [fBitsToClear]   "r"   (~u64)
     5497                         : );
     5498#   else
     5499    __asm__ __volatile__("Lstart_ASMAtomicAndU64_%=:\n\t"
     5500                         RTASM_ARM_DMB_SY
     5501                         "stclr     %[fBitsToClear], %[pMem]\n\t"
     5502                         : [pMem]           "+Q"  (*pu64)
     5503                         : [fBitsToClear]   "r"   (~u64)
     5504                         : );
     5505#   endif
     5506#  else
    54025507    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_64(ASMAtomicAndU64, pu64, DMB_SY,
    54035508                                           "and %[uNew], %[uNew], %[uVal]\n\t"
     
    54065511                                           "and %H[uNew], %H[uNew], %H[uVal]\n\t",
    54075512                                           [uVal] "r" (u64));
     5513#  endif
    54085514
    54095515# else
     
    54735579
    54745580# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5581#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5582#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5583    uint32_t u32Spill;
     5584    __asm__ __volatile__("Lstart_ASMAtomicXorU32_%=:\n\t"
     5585                         "ldeoral   %w[fBitMask], %w[uSpill], %[pMem]\n\t"
     5586                         : [pMem]       "+Q"  (*pu32)
     5587                         , [uSpill]     "=&r" (u32Spill)
     5588                         : [fBitMask]   "r"   (u32)
     5589                         : );
     5590#   else
     5591    __asm__ __volatile__("Lstart_ASMAtomicXorU32_%=:\n\t"
     5592                         RTASM_ARM_DMB_SY
     5593                         "steor     %w[fBitMask], %[pMem]\n\t"
     5594                         : [pMem]       "+Q"  (*pu32)
     5595                         : [fBitMask]   "r"   (u32)
     5596                         : );
     5597#   endif
     5598#  else
    54755599    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicXor32, pu32, DMB_SY,
    54765600                                           "eor %w[uNew], %w[uNew], %w[uVal]\n\t",
    54775601                                           "eor %[uNew], %[uNew], %[uVal]\n\t",
    54785602                                           [uVal] "r" (u32));
     5603#  endif
    54795604
    54805605# else
     
    54965621{
    54975622#if defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5623# if defined(RTASM_ARM64_USE_FEAT_LSE)
     5624    uint32_t u32OldRet;
     5625    __asm__ __volatile__("Lstart_ASMAtomicXorExU32_%=:\n\t"
     5626#  if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5627                         "ldeoral   %w[fBitMask], %w[uOldRet], %[pMem]\n\t"
     5628#  else
     5629                         RTASM_ARM_DMB_SY
     5630                         "ldeor     %w[fBitMask], %w[uOldRet], %[pMem]\n\t"
     5631#  endif
     5632                         : [pMem]       "+Q"  (*pu32)
     5633                         , [uOldRet]    "=&r" (u32OldRet)
     5634                         : [fBitMask]   "r"   (u32)
     5635                         : );
     5636# else
    54985637    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicXorEx32, pu32, DMB_SY,
    54995638                                           "eor %w[uNew], %w[uOld], %w[uVal]\n\t",
    55005639                                           "eor %[uNew], %[uOld], %[uVal]\n\t",
    55015640                                           [uVal] "r" (u32));
     5641# endif
    55025642    return u32OldRet;
    55035643
     
    55625702
    55635703# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5704    /* M1 benchmark: stset=1974  vs non-lse=6271 */
     5705#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5706    __asm__ __volatile__("Lstart_ASMAtomicUoOrU32_%=:\n\t"
     5707                         "stset     %w[fBitsToSet], %[pMem]\n\t"
     5708                         : [pMem]       "+Q"  (*pu32)
     5709                         : [fBitsToSet] "r"   (u32)
     5710                         : );
     5711#  else
    55645712    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoOrU32, pu32, NO_BARRIER,
    55655713                                           "orr %w[uNew], %w[uNew], %w[uVal]\n\t",
    55665714                                           "orr %[uNew], %[uNew], %[uVal]\n\t",
    55675715                                           [uVal] "r" (u32));
     5716#  endif
    55685717
    55695718# else
     
    55855734{
    55865735#if defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5736# if defined(RTASM_ARM64_USE_FEAT_LSE)
     5737    uint32_t u32OldRet;
     5738    __asm__ __volatile__("Lstart_ASMAtomicOrExU32_%=:\n\t"
     5739                         "ldset     %w[fBitsToSet], %w[uOldRet], %[pMem]\n\t"
     5740                         : [pMem]       "+Q"  (*pu32)
     5741                         , [uOldRet]    "=&r" (u32OldRet)
     5742                         : [fBitsToSet] "r"   (u32)
     5743                         : );
     5744# else
    55875745    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicUoOrExU32, pu32, NO_BARRIER,
    55885746                                           "orr %w[uNew], %w[uOld], %w[uVal]\n\t",
    55895747                                           "orr %[uNew], %[uOld], %[uVal]\n\t",
    55905748                                           [uVal] "r" (u32));
     5749# endif
    55915750    return u32OldRet;
    55925751
     
    56325791
    56335792# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5793#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5794    __asm__ __volatile__("Lstart_ASMAtomicUoOrU64_%=:\n\t"
     5795                         "stset     %[fBitsToSet], %[pMem]\n\t"
     5796                         : [pMem]       "+Q"  (*pu64)
     5797                         : [fBitsToSet] "r"   (u64)
     5798                         : );
     5799#  else
    56345800    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_64(ASMAtomicUoOrU64, pu64, NO_BARRIER,
    56355801                                           "orr %[uNew], %[uNew], %[uVal]\n\t"
     
    56385804                                           "orr %H[uNew], %H[uNew], %H[uVal]\n\t",
    56395805                                           [uVal] "r" (u64));
     5806#  endif
    56405807
    56415808# else
     
    57025869
    57035870# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5871    /* M1 benchmark: stclr=1884 vs non-lse=6299 (ps/call) */
     5872#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5873    __asm__ __volatile__("Lstart_ASMAtomicUoAndU32_%=:\n\t"
     5874                         "stclr     %w[fBitsToClear], %[pMem]\n\t"
     5875                         : [pMem]           "+Q"  (*pu32)
     5876                         : [fBitsToClear]   "r"   (~u32)
     5877                         : );
     5878#  else
    57045879    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoAnd32, pu32, NO_BARRIER,
    57055880                                           "and %w[uNew], %w[uNew], %w[uVal]\n\t",
    57065881                                           "and %[uNew], %[uNew], %[uVal]\n\t",
    57075882                                           [uVal] "r" (u32));
     5883#  endif
    57085884
    57095885# else
     
    57255901{
    57265902#if defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5903# if defined(RTASM_ARM64_USE_FEAT_LSE)
     5904    uint32_t u32OldRet;
     5905    __asm__ __volatile__("Lstart_ASMAtomicAndExU32_%=:\n\t"
     5906                         "ldclr     %w[fBitsToClear], %w[uOldRet], %[pMem]\n\t"
     5907                         : [pMem]           "+Q"  (*pu32)
     5908                         , [uOldRet]        "=&r" (u32OldRet)
     5909                         : [fBitsToClear]   "r"   (~u32)
     5910                         : );
     5911# else
    57275912    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicUoAndEx32, pu32, NO_BARRIER,
    57285913                                           "and %w[uNew], %w[uOld], %w[uVal]\n\t",
    57295914                                           "and %[uNew], %[uOld], %[uVal]\n\t",
    57305915                                           [uVal] "r" (u32));
     5916# endif
    57315917    return u32OldRet;
    57325918
     
    57725958
    57735959# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5960#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5961    __asm__ __volatile__("Lstart_ASMAtomicUoAndU64_%=:\n\t"
     5962                         "stclr     %[fBitsToClear], %[pMem]\n\t"
     5963                         : [pMem]           "+Q"  (*pu64)
     5964                         : [fBitsToClear]   "r"   (~u64)
     5965                         : );
     5966#  else
    57745967    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_64(ASMAtomicUoAndU64, pu64, NO_BARRIER,
    57755968                                           "and %[uNew], %[uNew], %[uVal]\n\t"
     
    57785971                                           "and %H[uNew], %H[uNew], %H[uVal]\n\t",
    57795972                                           [uVal] "r" (u64));
     5973#  endif
    57805974
    57815975# else
     
    58426036
    58436037# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     6038#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     6039    __asm__ __volatile__("Lstart_ASMAtomicUoXorU32_%=:\n\t"
     6040                         "steor     %w[fBitMask], %[pMem]\n\t"
     6041                         : [pMem]       "+Q"  (*pu32)
     6042                         : [fBitMask]   "r"   (u32)
     6043                         : );
     6044#  else
    58446045    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoXorU32, pu32, NO_BARRIER,
    58456046                                           "eor %w[uNew], %w[uNew], %w[uVal]\n\t",
    58466047                                           "eor %[uNew], %[uNew], %[uVal]\n\t",
    58476048                                           [uVal] "r" (u32));
     6049#  endif
    58486050
    58496051# else
     
    58656067{
    58666068#if defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     6069# if defined(RTASM_ARM64_USE_FEAT_LSE)
     6070    uint32_t u32OldRet;
     6071    __asm__ __volatile__("Lstart_ASMAtomicUoXorExU32_%=:\n\t"
     6072                         "ldeor     %w[fBitMask], %w[uOldRet], %[pMem]\n\t"
     6073                         : [pMem]       "+Q"  (*pu32)
     6074                         , [uOldRet]    "=&r" (u32OldRet)
     6075                         : [fBitMask]   "r"   (u32)
     6076                         : );
     6077# else
    58676078    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicUoXorExU32, pu32, NO_BARRIER,
    58686079                                           "eor %w[uNew], %w[uOld], %w[uVal]\n\t",
    58696080                                           "eor %[uNew], %[uOld], %[uVal]\n\t",
    58706081                                           [uVal] "r" (u32));
     6082# endif
    58716083    return u32OldRet;
    58726084
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