VirtualBox

Changeset 90648 in vbox


Ignore:
Timestamp:
Aug 12, 2021 10:15:31 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
146260
Message:

iprt/asm.h: Added another version of ASMAtomicCmpWriteU128 that takes the constants as 64-bit values. bugref:6695

File:
1 edited

Legend:

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

    r90640 r90648  
    14301430#if defined(RT_ARCH_AMD64) || defined(DOXYGEN_RUNNING)
    14311431
     1432/** @def RTASM_HAVE_CMP_WRITE_U128
     1433 * Indicates that we've got ASMAtomicCmpWriteU128() available.  */
     1434# define RTASM_HAVE_CMP_WRITE_U128 1
     1435
     1436
    14321437/**
    14331438 * Atomically compare and write an unsigned 128-bit value, ordered.
     
    14431448 */
    14441449# if (RT_INLINE_ASM_EXTERNAL_TMP_ARM && !RT_INLINE_ASM_USES_INTRIN)
    1445 DECLASM(bool) ASMAtomicCmpWriteU128(volatile uint128_t *pu128, const uint128_t u128New, const uint128_t u128Old) RT_NOTHROW_PROTO;
    1446 # else
    1447 DECLINLINE(bool) ASMAtomicCmpWriteU128(volatile uint128_t *pu128, const uint128_t u128New, const uint128_t u128Old) RT_NOTHROW_DEF
     1450DECLASM(bool) ASMAtomicCmpWriteU128v2(volatile uint128_t *pu128, const uint64_t u64NewHi, const uint64_t u64NewLo,
     1451                                      const uint64_t u64OldHi, const uint64_t u64OldLo) RT_NOTHROW_PROTO;
     1452# else
     1453DECLINLINE(bool) ASMAtomicCmpWriteU128v2(volatile uint128_t *pu128, const uint64_t u64NewHi, const uint64_t u64NewLo,
     1454                                         const uint64_t u64OldHi, const uint64_t u64OldLo) RT_NOTHROW_DEF
    14481455{
    14491456#  if RT_INLINE_ASM_USES_INTRIN
    14501457    __int64 ai64Cmp[2];
    1451     ai64Cmp[0] = (__int64)u128Old.Lo;
    1452     ai64Cmp[1] = (__int64)u128Old.Hi;
    1453     return _InterlockedCompareExchange128((__int64 volatile *)pu128, u128New.Hi, u128New.Lo, ai64Cmp) != 0;
     1458    ai64Cmp[0] = u64OldLo;
     1459    ai64Cmp[1] = u64OldHi;
     1460    return _InterlockedCompareExchange128((__int64 volatile *)pu128, u64NewHi, u64NewLo, ai64Cmp) != 0;
    14541461
    14551462#  elif defined(RT_ARCH_AMD64)
     
    14631470                         , "=d" (u64Spill)
    14641471                         , "+m" (*pu128)
    1465                          : "A" (u128Old)
    1466                          , "b" ((uint64_t)u128New)
    1467                          , "c" ((uint64_t)(u128New >> 64))
     1472                         : "a" (u64OldLo)
     1473                         , "d" (u64OldHi)
     1474                         , "b" (u64NewLo)
     1475                         , "c" (u64NewHi)
    14681476                         : "cc");
    14691477
     
    14781486# endif
    14791487
    1480 /** @def RTASM_HAVE_CMP_WRITE_U128
    1481  * Indicates that we've got ASMAtomicCmpWriteU128() available.  */
    1482 # define RTASM_HAVE_CMP_WRITE_U128 1
     1488
     1489/**
     1490 * Atomically compare and write an unsigned 128-bit value, ordered.
     1491 *
     1492 * @returns true if write was done.
     1493 * @returns false if write wasn't done.
     1494 *
     1495 * @param   pu128       Pointer to the 128-bit variable to update.
     1496 * @param   u128New     The 128-bit value to assign to *pu128.
     1497 * @param   u128Old     The value to compare with.
     1498 *
     1499 * @remarks AMD64: Not present in the earliest CPUs, so check CPUID.
     1500 */
     1501DECLINLINE(bool) ASMAtomicCmpWriteU128(volatile uint128_t *pu128, const uint128_t u128New, const uint128_t u128Old) RT_NOTHROW_DEF
     1502{
     1503# ifdef RT_COMPILER_WITH_128BIT_INT_TYPES
     1504    return ASMAtomicCmpWriteU128v2(pu128, (uint64_t)(u128New >> 64), (uint64_t)u128New,
     1505                                   (uint64_t)(u128Old >> 64), (uint64_t)u128Old);
     1506# else
     1507    return ASMAtomicCmpWriteU128v2(pu128, u128New.Hi, u128New.Lo, u128Old.Hi, u128Old.Lo);
     1508# endif
     1509}
     1510
    14831511
    14841512/**
     
    14881516                                        const RTUINT128U u128Old) RT_NOTHROW_DEF
    14891517{
    1490     return ASMAtomicCmpWriteU128(&pu128->u, u128New.u, u128Old.u);
     1518    return ASMAtomicCmpWriteU128v2(&pu128->u, u128New.s.Hi, u128New.s.Lo, u128Old.s.Hi, u128Old.s.Lo);
    14911519}
    14921520
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