Changeset 90648 in vbox
- Timestamp:
- Aug 12, 2021 10:15:31 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 146260
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/asm.h
r90640 r90648 1430 1430 #if defined(RT_ARCH_AMD64) || defined(DOXYGEN_RUNNING) 1431 1431 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 1432 1437 /** 1433 1438 * Atomically compare and write an unsigned 128-bit value, ordered. … … 1443 1448 */ 1444 1449 # 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 1450 DECLASM(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 1453 DECLINLINE(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 1448 1455 { 1449 1456 # if RT_INLINE_ASM_USES_INTRIN 1450 1457 __int64 ai64Cmp[2]; 1451 ai64Cmp[0] = (__int64)u128Old.Lo;1452 ai64Cmp[1] = (__int64)u128Old.Hi;1453 return _InterlockedCompareExchange128((__int64 volatile *)pu128, u 128New.Hi, u128New.Lo, ai64Cmp) != 0;1458 ai64Cmp[0] = u64OldLo; 1459 ai64Cmp[1] = u64OldHi; 1460 return _InterlockedCompareExchange128((__int64 volatile *)pu128, u64NewHi, u64NewLo, ai64Cmp) != 0; 1454 1461 1455 1462 # elif defined(RT_ARCH_AMD64) … … 1463 1470 , "=d" (u64Spill) 1464 1471 , "+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) 1468 1476 : "cc"); 1469 1477 … … 1478 1486 # endif 1479 1487 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 */ 1501 DECLINLINE(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 1483 1511 1484 1512 /** … … 1488 1516 const RTUINT128U u128Old) RT_NOTHROW_DEF 1489 1517 { 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); 1491 1519 } 1492 1520
Note:
See TracChangeset
for help on using the changeset viewer.