Changeset 58706 in vbox
- Timestamp:
- Nov 16, 2015 4:30:15 PM (9 years ago)
- File:
-
- 1 edited
-
trunk/include/iprt/asm.h (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/asm.h
r57926 r58706 142 142 */ 143 143 #ifndef RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC 144 # if def DOXYGEN_RUNNING144 # if defined(DOXYGEN_RUNNING) || defined(__WATCOMC__) /* Watcom has trouble with the expression below */ 145 145 # define RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC 1 146 146 # else … … 166 166 #elif defined(__GNUC__) || defined(DOXYGEN_RUNNING) 167 167 # define ASMReturnAddress() __builtin_return_address(0) 168 #elif defined(__WATCOMC__) 169 # define ASMReturnAddress() Watcom_does_not_appear_to_have_intrinsic_return_address_function() 168 170 #else 169 171 # error "Unsupported compiler." … … 510 512 DECLINLINE(void *) ASMAtomicXchgPtr(void * volatile *ppv, const void *pv) 511 513 { 512 #if ARCH_BITS == 32 514 #if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 513 515 return (void *)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppv, (uint32_t)pv); 514 516 #elif ARCH_BITS == 64 … … 565 567 DECLINLINE(RTR0PTR) ASMAtomicXchgR0Ptr(RTR0PTR volatile *ppvR0, RTR0PTR pvR0) 566 568 { 567 #if R0_ARCH_BITS == 32 569 #if R0_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 568 570 return (RTR0PTR)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppvR0, (uint32_t)pvR0); 569 571 #elif R0_ARCH_BITS == 64 … … 584 586 DECLINLINE(RTR3PTR) ASMAtomicXchgR3Ptr(RTR3PTR volatile *ppvR3, RTR3PTR pvR3) 585 587 { 586 #if R3_ARCH_BITS == 32 588 #if R3_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 587 589 return (RTR3PTR)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppvR3, (uint32_t)pvR3); 588 590 #elif R3_ARCH_BITS == 64 … … 603 605 * @remarks This doesn't currently work for all handles (like RTFILE). 604 606 */ 605 #if HC_ARCH_BITS == 32 607 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 606 608 # define ASMAtomicXchgHandle(ph, hNew, phRes) \ 607 609 do { \ … … 922 924 DECLINLINE(bool) ASMAtomicCmpXchgPtrVoid(void * volatile *ppv, const void *pvNew, const void *pvOld) 923 925 { 924 #if ARCH_BITS == 32 926 #if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 925 927 return ASMAtomicCmpXchgU32((volatile uint32_t *)(void *)ppv, (uint32_t)pvNew, (uint32_t)pvOld); 926 928 #elif ARCH_BITS == 64 … … 971 973 * @remarks This doesn't currently work for all handles (like RTFILE). 972 974 */ 973 #if HC_ARCH_BITS == 32 975 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 974 976 # define ASMAtomicCmpXchgHandle(ph, hNew, hOld, fRc) \ 975 977 do { \ … … 1220 1222 * @remarks This doesn't currently work for all handles (like RTFILE). 1221 1223 */ 1222 #if HC_ARCH_BITS == 32 1224 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 1223 1225 # define ASMAtomicCmpXchgExHandle(ph, hNew, hOld, fRc, phOldVal) \ 1224 1226 do { \ … … 1278 1280 DECLINLINE(bool) ASMAtomicCmpXchgExPtrVoid(void * volatile *ppv, const void *pvNew, const void *pvOld, void **ppvOld) 1279 1281 { 1280 #if ARCH_BITS == 32 1282 #if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 1281 1283 return ASMAtomicCmpXchgExU32((volatile uint32_t *)(void *)ppv, (uint32_t)pvNew, (uint32_t)pvOld, (uint32_t *)ppvOld); 1282 1284 #elif ARCH_BITS == 64 … … 1756 1758 #elif ARCH_BITS == 32 1757 1759 return ASMAtomicReadU32((uint32_t volatile *)pcb); 1760 #elif ARCH_BITS == 16 1761 AssertCompileSize(size_t, 2); 1762 return ASMAtomicReadU16((uint16_t volatile *)pcb); 1758 1763 #else 1759 1764 # error "Unsupported ARCH_BITS value" … … 1770 1775 DECLINLINE(size_t) ASMAtomicUoReadZ(size_t volatile *pcb) 1771 1776 { 1772 #if ARCH_BITS == 64 1777 #if ARCH_BITS == 64 || (ARCH_BITS == 16 && RT_FAR_DATA) 1773 1778 return ASMAtomicUoReadU64((uint64_t volatile *)pcb); 1774 1779 #elif ARCH_BITS == 32 1775 1780 return ASMAtomicUoReadU32((uint32_t volatile *)pcb); 1781 #elif ARCH_BITS == 16 1782 AssertCompileSize(size_t, 2); 1783 return ASMAtomicUoReadU16((uint16_t volatile *)pcb); 1776 1784 #else 1777 1785 # error "Unsupported ARCH_BITS value" … … 1791 1799 DECLINLINE(void *) ASMAtomicReadPtr(void * volatile *ppv) 1792 1800 { 1793 #if ARCH_BITS == 32 1801 #if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 1794 1802 return (void *)ASMAtomicReadU32((volatile uint32_t *)(void *)ppv); 1795 1803 #elif ARCH_BITS == 64 … … 1832 1840 DECLINLINE(void *) ASMAtomicUoReadPtr(void * volatile *ppv) 1833 1841 { 1834 #if ARCH_BITS == 32 1842 #if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 1835 1843 return (void *)ASMAtomicUoReadU32((volatile uint32_t *)(void *)ppv); 1836 1844 #elif ARCH_BITS == 64 … … 1896 1904 * @remarks This doesn't currently work for all handles (like RTFILE). 1897 1905 */ 1898 #if HC_ARCH_BITS == 32 1906 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 1899 1907 # define ASMAtomicReadHandle(ph, phRes) \ 1900 1908 do { \ … … 1923 1931 * @remarks This doesn't currently work for all handles (like RTFILE). 1924 1932 */ 1925 #if HC_ARCH_BITS == 32 1933 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 1926 1934 # define ASMAtomicUoReadHandle(ph, phRes) \ 1927 1935 do { \ … … 2218 2226 DECLINLINE(void) ASMAtomicWritePtrVoid(void * volatile *ppv, const void *pv) 2219 2227 { 2220 #if ARCH_BITS == 32 2228 #if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 2221 2229 ASMAtomicWriteU32((volatile uint32_t *)(void *)ppv, (uint32_t)pv); 2222 2230 #elif ARCH_BITS == 64 … … 2362 2370 * @remarks This doesn't currently work for all handles (like RTFILE). 2363 2371 */ 2364 #if HC_ARCH_BITS == 32 2372 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 2365 2373 # define ASMAtomicWriteHandle(ph, hNew) \ 2366 2374 do { \ … … 2387 2395 * @remarks This doesn't currently work for all handles (like RTFILE). 2388 2396 */ 2389 #if HC_ARCH_BITS == 32 2397 #if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA) 2390 2398 # define ASMAtomicUoWriteHandle(ph, hNew) \ 2391 2399 do { \ … … 2443 2451 2444 2452 /** 2453 * Atomically exchanges and adds to a 16-bit value, ordered. 2454 * 2455 * @returns The old value. 2456 * @param pu16 Pointer to the value. 2457 * @param u16 Number to add. 2458 * @remarks Currently not implemented, just to make 16-bit code happy. 2459 */ 2460 DECLASM(uint16_t) ASMAtomicAddU16(uint16_t volatile *pu16, uint32_t u16); 2461 2462 2463 /** 2445 2464 * Atomically exchanges and adds to a 32-bit value, ordered. 2446 2465 * … … 2562 2581 { 2563 2582 #if ARCH_BITS == 64 2583 AssertCompileSize(size_t, 8); 2564 2584 return ASMAtomicAddU64((uint64_t volatile *)pcb, cb); 2565 2585 #elif ARCH_BITS == 32 2586 AssertCompileSize(size_t, 4); 2566 2587 return ASMAtomicAddU32((uint32_t volatile *)pcb, cb); 2588 #elif ARCH_BITS == 16 2589 AssertCompileSize(size_t, 2); 2590 return ASMAtomicAddU16((uint16_t volatile *)pcb, cb); 2567 2591 #else 2568 2592 # error "Unsupported ARCH_BITS value" … … 2589 2613 2590 2614 2615 2616 /** 2617 * Atomically exchanges and subtracts to an unsigned 16-bit value, ordered. 2618 * 2619 * @returns The old value. 2620 * @param pu16 Pointer to the value. 2621 * @param u16 Number to subtract. 2622 */ 2623 DECLINLINE(uint16_t) ASMAtomicSubU16(uint16_t volatile *pu16, uint32_t u16) 2624 { 2625 return ASMAtomicAddU16(pu16, (uint16_t)-(int16_t)u16); 2626 } 2627 2628 2629 /** 2630 * Atomically exchanges and subtracts to a signed 16-bit value, ordered. 2631 * 2632 * @returns The old value. 2633 * @param pi16 Pointer to the value. 2634 * @param i16 Number to subtract. 2635 */ 2636 DECLINLINE(int16_t) ASMAtomicSubS16(int16_t volatile *pi16, int16_t i16) 2637 { 2638 return (int16_t)ASMAtomicAddU16((uint16_t volatile *)pi16, (uint16_t)-i16); 2639 } 2640 2641 2591 2642 /** 2592 2643 * Atomically exchanges and subtracts to an unsigned 32-bit value, ordered. … … 2654 2705 #elif ARCH_BITS == 32 2655 2706 return ASMAtomicSubU32((uint32_t volatile *)pcb, cb); 2707 #elif ARCH_BITS == 16 2708 AssertCompileSize(size_t, 2); 2709 return ASMAtomicSubU16((uint16_t volatile *)pcb, cb); 2656 2710 #else 2657 2711 # error "Unsupported ARCH_BITS value" … … 2676 2730 } \ 2677 2731 } while (0) 2732 2733 2734 2735 /** 2736 * Atomically increment a 16-bit value, ordered. 2737 * 2738 * @returns The new value. 2739 * @param pu16 Pointer to the value to increment. 2740 * @remarks Not implemented. Just to make 16-bit code happy. 2741 */ 2742 DECLASM(uint16_t) ASMAtomicIncU16(uint16_t volatile *pu16); 2678 2743 2679 2744 … … 2789 2854 #elif ARCH_BITS == 32 2790 2855 return ASMAtomicIncU32((uint32_t volatile *)pcb); 2856 #elif ARCH_BITS == 16 2857 return ASMAtomicIncU16((uint16_t volatile *)pcb); 2791 2858 #else 2792 2859 # error "Unsupported ARCH_BITS value" 2793 2860 #endif 2794 2861 } 2862 2863 2864 2865 /** 2866 * Atomically decrement an unsigned 32-bit value, ordered. 2867 * 2868 * @returns The new value. 2869 * @param pu32 Pointer to the value to decrement. 2870 * @remarks Not implemented. Just to make 16-bit code happy. 2871 */ 2872 DECLASM(uint32_t) ASMAtomicDecU16(uint16_t volatile *pu16); 2795 2873 2796 2874 … … 2905 2983 #elif ARCH_BITS == 32 2906 2984 return ASMAtomicDecU32((uint32_t volatile *)pcb); 2985 #elif ARCH_BITS == 16 2986 return ASMAtomicDecU16((uint16_t volatile *)pcb); 2907 2987 #else 2908 2988 # error "Unsupported ARCH_BITS value"
Note:
See TracChangeset
for help on using the changeset viewer.

