VirtualBox

Changeset 58706 in vbox


Ignore:
Timestamp:
Nov 16, 2015 4:30:15 PM (9 years ago)
Author:
vboxsync
Message:

iprt/asm.h: 16-bit adjustments, watcom adjustments.

File:
1 edited

Legend:

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

    r57926 r58706  
    142142 */
    143143#ifndef RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
    144 # ifdef DOXYGEN_RUNNING
     144# if defined(DOXYGEN_RUNNING) || defined(__WATCOMC__) /* Watcom has trouble with the expression below */
    145145#  define RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC 1
    146146# else
     
    166166#elif defined(__GNUC__) || defined(DOXYGEN_RUNNING)
    167167# define ASMReturnAddress() __builtin_return_address(0)
     168#elif defined(__WATCOMC__)
     169# define ASMReturnAddress() Watcom_does_not_appear_to_have_intrinsic_return_address_function()
    168170#else
    169171# error "Unsupported compiler."
     
    510512DECLINLINE(void *) ASMAtomicXchgPtr(void * volatile *ppv, const void *pv)
    511513{
    512 #if ARCH_BITS == 32
     514#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    513515    return (void *)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppv, (uint32_t)pv);
    514516#elif ARCH_BITS == 64
     
    565567DECLINLINE(RTR0PTR) ASMAtomicXchgR0Ptr(RTR0PTR volatile *ppvR0, RTR0PTR pvR0)
    566568{
    567 #if R0_ARCH_BITS == 32
     569#if R0_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    568570    return (RTR0PTR)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppvR0, (uint32_t)pvR0);
    569571#elif R0_ARCH_BITS == 64
     
    584586DECLINLINE(RTR3PTR) ASMAtomicXchgR3Ptr(RTR3PTR volatile *ppvR3, RTR3PTR pvR3)
    585587{
    586 #if R3_ARCH_BITS == 32
     588#if R3_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    587589    return (RTR3PTR)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppvR3, (uint32_t)pvR3);
    588590#elif R3_ARCH_BITS == 64
     
    603605 * @remarks This doesn't currently work for all handles (like RTFILE).
    604606 */
    605 #if HC_ARCH_BITS == 32
     607#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    606608# define ASMAtomicXchgHandle(ph, hNew, phRes) \
    607609   do { \
     
    922924DECLINLINE(bool) ASMAtomicCmpXchgPtrVoid(void * volatile *ppv, const void *pvNew, const void *pvOld)
    923925{
    924 #if ARCH_BITS == 32
     926#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    925927    return ASMAtomicCmpXchgU32((volatile uint32_t *)(void *)ppv, (uint32_t)pvNew, (uint32_t)pvOld);
    926928#elif ARCH_BITS == 64
     
    971973 * @remarks This doesn't currently work for all handles (like RTFILE).
    972974 */
    973 #if HC_ARCH_BITS == 32
     975#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    974976# define ASMAtomicCmpXchgHandle(ph, hNew, hOld, fRc) \
    975977   do { \
     
    12201222 * @remarks This doesn't currently work for all handles (like RTFILE).
    12211223 */
    1222 #if HC_ARCH_BITS == 32
     1224#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    12231225# define ASMAtomicCmpXchgExHandle(ph, hNew, hOld, fRc, phOldVal) \
    12241226    do { \
     
    12781280DECLINLINE(bool) ASMAtomicCmpXchgExPtrVoid(void * volatile *ppv, const void *pvNew, const void *pvOld, void **ppvOld)
    12791281{
    1280 #if ARCH_BITS == 32
     1282#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    12811283    return ASMAtomicCmpXchgExU32((volatile uint32_t *)(void *)ppv, (uint32_t)pvNew, (uint32_t)pvOld, (uint32_t *)ppvOld);
    12821284#elif ARCH_BITS == 64
     
    17561758#elif ARCH_BITS == 32
    17571759    return ASMAtomicReadU32((uint32_t volatile *)pcb);
     1760#elif ARCH_BITS == 16
     1761    AssertCompileSize(size_t, 2);
     1762    return ASMAtomicReadU16((uint16_t volatile *)pcb);
    17581763#else
    17591764# error "Unsupported ARCH_BITS value"
     
    17701775DECLINLINE(size_t) ASMAtomicUoReadZ(size_t volatile *pcb)
    17711776{
    1772 #if ARCH_BITS == 64
     1777#if ARCH_BITS == 64 || (ARCH_BITS == 16 && RT_FAR_DATA)
    17731778    return ASMAtomicUoReadU64((uint64_t volatile *)pcb);
    17741779#elif ARCH_BITS == 32
    17751780    return ASMAtomicUoReadU32((uint32_t volatile *)pcb);
     1781#elif ARCH_BITS == 16
     1782    AssertCompileSize(size_t, 2);
     1783    return ASMAtomicUoReadU16((uint16_t volatile *)pcb);
    17761784#else
    17771785# error "Unsupported ARCH_BITS value"
     
    17911799DECLINLINE(void *) ASMAtomicReadPtr(void * volatile *ppv)
    17921800{
    1793 #if ARCH_BITS == 32
     1801#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    17941802    return (void *)ASMAtomicReadU32((volatile uint32_t *)(void *)ppv);
    17951803#elif ARCH_BITS == 64
     
    18321840DECLINLINE(void *) ASMAtomicUoReadPtr(void * volatile *ppv)
    18331841{
    1834 #if ARCH_BITS == 32
     1842#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    18351843    return (void *)ASMAtomicUoReadU32((volatile uint32_t *)(void *)ppv);
    18361844#elif ARCH_BITS == 64
     
    18961904 * @remarks This doesn't currently work for all handles (like RTFILE).
    18971905 */
    1898 #if HC_ARCH_BITS == 32
     1906#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    18991907# define ASMAtomicReadHandle(ph, phRes) \
    19001908    do { \
     
    19231931 * @remarks This doesn't currently work for all handles (like RTFILE).
    19241932 */
    1925 #if HC_ARCH_BITS == 32
     1933#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    19261934# define ASMAtomicUoReadHandle(ph, phRes) \
    19271935    do { \
     
    22182226DECLINLINE(void) ASMAtomicWritePtrVoid(void * volatile *ppv, const void *pv)
    22192227{
    2220 #if ARCH_BITS == 32
     2228#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    22212229    ASMAtomicWriteU32((volatile uint32_t *)(void *)ppv, (uint32_t)pv);
    22222230#elif ARCH_BITS == 64
     
    23622370 * @remarks This doesn't currently work for all handles (like RTFILE).
    23632371 */
    2364 #if HC_ARCH_BITS == 32
     2372#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    23652373# define ASMAtomicWriteHandle(ph, hNew) \
    23662374    do { \
     
    23872395 * @remarks This doesn't currently work for all handles (like RTFILE).
    23882396 */
    2389 #if HC_ARCH_BITS == 32
     2397#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
    23902398# define ASMAtomicUoWriteHandle(ph, hNew) \
    23912399    do { \
     
    24432451
    24442452/**
     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 */
     2460DECLASM(uint16_t) ASMAtomicAddU16(uint16_t volatile *pu16, uint32_t u16);
     2461
     2462
     2463/**
    24452464 * Atomically exchanges and adds to a 32-bit value, ordered.
    24462465 *
     
    25622581{
    25632582#if ARCH_BITS == 64
     2583    AssertCompileSize(size_t, 8);
    25642584    return ASMAtomicAddU64((uint64_t volatile *)pcb, cb);
    25652585#elif ARCH_BITS == 32
     2586    AssertCompileSize(size_t, 4);
    25662587    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);
    25672591#else
    25682592# error "Unsupported ARCH_BITS value"
     
    25892613
    25902614
     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 */
     2623DECLINLINE(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 */
     2636DECLINLINE(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
    25912642/**
    25922643 * Atomically exchanges and subtracts to an unsigned 32-bit value, ordered.
     
    26542705#elif ARCH_BITS == 32
    26552706    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);
    26562710#else
    26572711# error "Unsupported ARCH_BITS value"
     
    26762730        } \
    26772731    } 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 */
     2742DECLASM(uint16_t) ASMAtomicIncU16(uint16_t volatile *pu16);
    26782743
    26792744
     
    27892854#elif ARCH_BITS == 32
    27902855    return ASMAtomicIncU32((uint32_t volatile *)pcb);
     2856#elif ARCH_BITS == 16
     2857    return ASMAtomicIncU16((uint16_t volatile *)pcb);
    27912858#else
    27922859# error "Unsupported ARCH_BITS value"
    27932860#endif
    27942861}
     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 */
     2872DECLASM(uint32_t) ASMAtomicDecU16(uint16_t volatile *pu16);
    27952873
    27962874
     
    29052983#elif ARCH_BITS == 32
    29062984    return ASMAtomicDecU32((uint32_t volatile *)pcb);
     2985#elif ARCH_BITS == 16
     2986    return ASMAtomicDecU16((uint16_t volatile *)pcb);
    29072987#else
    29082988# error "Unsupported ARCH_BITS value"
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