VirtualBox

Changeset 102961 in vbox for trunk/include


Ignore:
Timestamp:
Jan 18, 2024 9:59:09 PM (16 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
161189
Message:

iprt/asm.h: Working over the ASMAtomic*Inc|Dec|Add|Sub* 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

    r102960 r102961  
    44354435
    44364436# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     4437    /* M1 benchmark: ldaddal=6907 vs dmb+ldadd=2114 vs non-lse=6249 (ps/call)  */
     4438#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     4439    uint32_t u32OldRet;
     4440    __asm__ __volatile__("Lstart_ASMAtomicAddU32_%=:\n\t"
     4441#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     4442                         "ldaddal   %w[uAddend], %w[uOldActual], %[pMem]\n\t"
     4443#   else
     4444                         RTASM_ARM_DMB_SY
     4445                         "ldadd     %w[uAddend], %w[uOldActual], %[pMem]\n\t"
     4446#   endif
     4447                         : [pMem]       "+Q"  (*pu32)
     4448                         , [uOldActual] "=&r" (u32OldRet)
     4449                         : [uAddend]    "r"   (u32)
     4450                         : );
     4451#  else
    44374452    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_32(ASMAtomicAddU32, pu32, DMB_SY,
    44384453                                           "add %w[uNew], %w[uOld], %w[uVal]\n\t",
    44394454                                           "add %[uNew], %[uOld], %[uVal]\n\t",
    44404455                                           [uVal] "r" (u32));
     4456# endif
    44414457    return u32OldRet;
    44424458
     
    44924508
    44934509# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     4510#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     4511    uint64_t u64OldRet;
     4512    __asm__ __volatile__("Lstart_ASMAtomicAddU64_%=:\n\t"
     4513#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     4514                         "ldaddal   %[uAddend], %[uOldActual], %[pMem]\n\t"
     4515#   else
     4516                         RTASM_ARM_DMB_SY
     4517                         "ldadd     %[uAddend], %[uOldActual], %[pMem]\n\t"
     4518#   endif
     4519                         : [pMem]       "+Q"  (*pu64)
     4520                         , [uOldActual] "=&r" (u64OldRet)
     4521                         : [uAddend]    "r"   (u64)
     4522                         : );
     4523#  else
    44944524    RTASM_ARM_LOAD_MODIFY_STORE_RET_OLD_64(ASMAtomicAddU64, pu64, DMB_SY,
    44954525                                           "add %[uNew], %[uOld], %[uVal]\n\t"
     
    44984528                                           "adc %H[uNew], %H[uOld], %H[uVal]\n\t",
    44994529                                           [uVal] "r" (u64));
     4530#  endif
    45004531    return u64OldRet;
    45014532
     
    47664797
    47674798# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     4799    /* M1 benchmark: ldaddal=6887 vs dmb+ldadd=2117 vs non-lse=6247 (ps/call)  */
     4800#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     4801    uint32_t u32NewRet;
     4802    __asm__ __volatile__("Lstart_ASMAtomicIncU32_%=:\n\t"
     4803#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     4804                         "ldaddal   %w[uAddend], %w[uNewRet], %[pMem]\n\t"
     4805#   else
     4806                         RTASM_ARM_DMB_SY
     4807                         "ldadd     %w[uAddend], %w[uNewRet], %[pMem]\n\t"
     4808#   endif
     4809                         "add       %w[uNewRet], %w[uNewRet], #1\n\t"
     4810                         : [pMem]       "+Q"  (*pu32)
     4811                         , [uNewRet]    "=&r" (u32NewRet)
     4812                         : [uAddend]    "r"   ((uint32_t)1)
     4813                         : );
     4814#  else
    47684815    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicIncU32, pu32, DMB_SY,
    47694816                                           "add %w[uNew], %w[uNew], #1\n\t",
    47704817                                           "add %[uNew], %[uNew], #1\n\t" /* arm6 / thumb2+ */,
    47714818                                           "X" (0) /* dummy */);
     4819#  endif
    47724820    return u32NewRet;
    47734821
     
    48214869
    48224870# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     4871#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     4872    uint64_t u64NewRet;
     4873    __asm__ __volatile__("Lstart_ASMAtomicIncU64_%=:\n\t"
     4874#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     4875                         "ldaddal   %[uAddend], %[uNewRet], %[pMem]\n\t"
     4876#   else
     4877                         RTASM_ARM_DMB_SY
     4878                         "ldadd     %[uAddend], %[uNewRet], %[pMem]\n\t"
     4879#   endif
     4880                         "add       %[uNewRet], %[uNewRet], #1\n\t"
     4881                         : [pMem]       "+Q"  (*pu64)
     4882                         , [uNewRet]    "=&r" (u64NewRet)
     4883                         : [uAddend]    "r"   ((uint64_t)1)
     4884                         : );
     4885#  else
    48234886    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_64(ASMAtomicIncU64, pu64, DMB_SY,
    48244887                                           "add %[uNew], %[uNew], #1\n\t"
     
    48274890                                           "adc %H[uNew], %H[uNew], %[uZeroVal]\n\t",
    48284891                                           RTASM_ARM_PICK_6432("X" (0) /* dummy */, [uZeroVal] "r" (0)) );
     4892#  endif
    48294893    return u64NewRet;
    48304894
     
    49304994
    49314995# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     4996    /* M1 benchmark: ldaddal=6887 vs dmb+ldadd=2120 vs non-lse=6260 (ps/call)  */
     4997#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     4998    uint32_t u32NewRet;
     4999    __asm__ __volatile__("Lstart_ASMAtomicDecU32_%=:\n\t"
     5000#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5001                         "ldaddal   %w[uAddend], %w[uNewRet], %[pMem]\n\t"
     5002#   else
     5003                         RTASM_ARM_DMB_SY
     5004                         "ldadd     %w[uAddend], %w[uNewRet], %[pMem]\n\t"
     5005#   endif
     5006                         "sub       %w[uNewRet], %w[uNewRet], #1\n\t"
     5007                         : [pMem]       "+Q"  (*pu32)
     5008                         , [uNewRet]    "=&r" (u32NewRet)
     5009                         : [uAddend]    "r"   (~(uint32_t)0)
     5010                         : );
     5011#  else
    49325012    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicDecU32, pu32, DMB_SY,
    49335013                                           "sub %w[uNew], %w[uNew], #1\n\t",
    49345014                                           "sub %[uNew], %[uNew], #1\n\t" /* arm6 / thumb2+ */,
    49355015                                           "X" (0) /* dummy */);
     5016#  endif
    49365017    return u32NewRet;
    49375018
     
    49855066
    49865067# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5068#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5069    uint64_t u64NewRet;
     5070    __asm__ __volatile__("Lstart_ASMAtomicDecU64_%=:\n\t"
     5071#   if defined(RTASM_ARM64_USE_FEAT_LSE_WITHOUT_DMB)
     5072                         "ldaddal   %[uAddend], %[uNewRet], %[pMem]\n\t"
     5073#   else
     5074                         RTASM_ARM_DMB_SY
     5075                         "ldadd     %[uAddend], %[uNewRet], %[pMem]\n\t"
     5076#   endif
     5077                         "sub       %[uNewRet], %[uNewRet], #1\n\t"
     5078                         : [pMem]       "+Q"  (*pu64)
     5079                         , [uNewRet]    "=&r" (u64NewRet)
     5080                         : [uAddend]    "r"   (~(uint64_t)0)
     5081                         : );
     5082#  else
    49875083    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_64(ASMAtomicDecU64, pu64, DMB_SY,
    49885084                                           "sub %[uNew], %[uNew], #1\n\t"
     
    49915087                                           "sbc %H[uNew], %H[uNew], %[uZeroVal]\n\t",
    49925088                                           RTASM_ARM_PICK_6432("X" (0) /* dummy */, [uZeroVal] "r" (0)) );
     5089# endif
    49935090    return u64NewRet;
    49945091
     
    58355932
    58365933# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     5934    /* M1 benchmark: ldadd=2031 vs non-lse=6301 (ps/call)  */
     5935#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     5936    uint32_t u32NewRet;
     5937    __asm__ __volatile__("Lstart_ASMAtomicUoIncU32_%=:\n\t"
     5938                         "ldadd     %w[uAddend], %w[uNewRet], %[pMem]\n\t"
     5939                         "add       %w[uNewRet], %w[uNewRet], #1\n\t"
     5940                         : [pMem]       "+Q"  (*pu32)
     5941                         , [uNewRet]    "=&r" (u32NewRet)
     5942                         : [uAddend]    "r"   ((uint32_t)1)
     5943                         : );
     5944#  else
    58375945    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoIncU32, pu32, NO_BARRIER,
    58385946                                           "add %w[uNew], %w[uNew], #1\n\t",
    58395947                                           "add %[uNew], %[uNew], #1\n\t" /* arm6 / thumb2+ */,
    58405948                                           "X" (0) /* dummy */);
     5949#  endif
    58415950    return u32NewRet;
    58425951
     
    58895998
    58905999# elif defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)
     6000    /* M1 benchmark: ldadd=2101 vs non-lse=6268 (ps/call)  */
     6001#  if defined(RTASM_ARM64_USE_FEAT_LSE)
     6002    uint32_t u32NewRet;
     6003    __asm__ __volatile__("Lstart_ASMAtomicUoDecU32_%=:\n\t"
     6004                         "ldadd     %w[uAddend], %w[uNewRet], %[pMem]\n\t"
     6005                         "sub       %w[uNewRet], %w[uNewRet], #1\n\t"
     6006                         : [pMem]       "+Q"  (*pu32)
     6007                         , [uNewRet]    "=&r" (u32NewRet)
     6008                         : [uAddend]    "r"   (~(uint32_t)0)
     6009                         : );
     6010#  else
    58916011    RTASM_ARM_LOAD_MODIFY_STORE_RET_NEW_32(ASMAtomicUoDecU32, pu32, NO_BARRIER,
    58926012                                           "sub %w[uNew], %w[uNew], #1\n\t",
    58936013                                           "sub %[uNew], %[uNew], #1\n\t" /* arm6 / thumb2+ */,
    58946014                                           "X" (0) /* dummy */);
     6015#  endif
    58956016    return u32NewRet;
    58966017
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette