Index: /trunk/include/iprt/asm.h
===================================================================
--- /trunk/include/iprt/asm.h	(revision 58705)
+++ /trunk/include/iprt/asm.h	(revision 58706)
@@ -142,5 +142,5 @@
  */
 #ifndef RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC
-# ifdef DOXYGEN_RUNNING
+# if defined(DOXYGEN_RUNNING) || defined(__WATCOMC__) /* Watcom has trouble with the expression below */
 #  define RT_INLINE_DONT_MIX_CMPXCHG8B_AND_PIC 1
 # else
@@ -166,4 +166,6 @@
 #elif defined(__GNUC__) || defined(DOXYGEN_RUNNING)
 # define ASMReturnAddress() __builtin_return_address(0)
+#elif defined(__WATCOMC__)
+# define ASMReturnAddress() Watcom_does_not_appear_to_have_intrinsic_return_address_function()
 #else
 # error "Unsupported compiler."
@@ -510,5 +512,5 @@
 DECLINLINE(void *) ASMAtomicXchgPtr(void * volatile *ppv, const void *pv)
 {
-#if ARCH_BITS == 32
+#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return (void *)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppv, (uint32_t)pv);
 #elif ARCH_BITS == 64
@@ -565,5 +567,5 @@
 DECLINLINE(RTR0PTR) ASMAtomicXchgR0Ptr(RTR0PTR volatile *ppvR0, RTR0PTR pvR0)
 {
-#if R0_ARCH_BITS == 32
+#if R0_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return (RTR0PTR)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppvR0, (uint32_t)pvR0);
 #elif R0_ARCH_BITS == 64
@@ -584,5 +586,5 @@
 DECLINLINE(RTR3PTR) ASMAtomicXchgR3Ptr(RTR3PTR volatile *ppvR3, RTR3PTR pvR3)
 {
-#if R3_ARCH_BITS == 32
+#if R3_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return (RTR3PTR)ASMAtomicXchgU32((volatile uint32_t *)(void *)ppvR3, (uint32_t)pvR3);
 #elif R3_ARCH_BITS == 64
@@ -603,5 +605,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicXchgHandle(ph, hNew, phRes) \
    do { \
@@ -922,5 +924,5 @@
 DECLINLINE(bool) ASMAtomicCmpXchgPtrVoid(void * volatile *ppv, const void *pvNew, const void *pvOld)
 {
-#if ARCH_BITS == 32
+#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return ASMAtomicCmpXchgU32((volatile uint32_t *)(void *)ppv, (uint32_t)pvNew, (uint32_t)pvOld);
 #elif ARCH_BITS == 64
@@ -971,5 +973,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicCmpXchgHandle(ph, hNew, hOld, fRc) \
    do { \
@@ -1220,5 +1222,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicCmpXchgExHandle(ph, hNew, hOld, fRc, phOldVal) \
     do { \
@@ -1278,5 +1280,5 @@
 DECLINLINE(bool) ASMAtomicCmpXchgExPtrVoid(void * volatile *ppv, const void *pvNew, const void *pvOld, void **ppvOld)
 {
-#if ARCH_BITS == 32
+#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return ASMAtomicCmpXchgExU32((volatile uint32_t *)(void *)ppv, (uint32_t)pvNew, (uint32_t)pvOld, (uint32_t *)ppvOld);
 #elif ARCH_BITS == 64
@@ -1756,4 +1758,7 @@
 #elif ARCH_BITS == 32
     return ASMAtomicReadU32((uint32_t volatile *)pcb);
+#elif ARCH_BITS == 16
+    AssertCompileSize(size_t, 2);
+    return ASMAtomicReadU16((uint16_t volatile *)pcb);
 #else
 # error "Unsupported ARCH_BITS value"
@@ -1770,8 +1775,11 @@
 DECLINLINE(size_t) ASMAtomicUoReadZ(size_t volatile *pcb)
 {
-#if ARCH_BITS == 64
+#if ARCH_BITS == 64 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return ASMAtomicUoReadU64((uint64_t volatile *)pcb);
 #elif ARCH_BITS == 32
     return ASMAtomicUoReadU32((uint32_t volatile *)pcb);
+#elif ARCH_BITS == 16
+    AssertCompileSize(size_t, 2);
+    return ASMAtomicUoReadU16((uint16_t volatile *)pcb);
 #else
 # error "Unsupported ARCH_BITS value"
@@ -1791,5 +1799,5 @@
 DECLINLINE(void *) ASMAtomicReadPtr(void * volatile *ppv)
 {
-#if ARCH_BITS == 32
+#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return (void *)ASMAtomicReadU32((volatile uint32_t *)(void *)ppv);
 #elif ARCH_BITS == 64
@@ -1832,5 +1840,5 @@
 DECLINLINE(void *) ASMAtomicUoReadPtr(void * volatile *ppv)
 {
-#if ARCH_BITS == 32
+#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     return (void *)ASMAtomicUoReadU32((volatile uint32_t *)(void *)ppv);
 #elif ARCH_BITS == 64
@@ -1896,5 +1904,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicReadHandle(ph, phRes) \
     do { \
@@ -1923,5 +1931,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicUoReadHandle(ph, phRes) \
     do { \
@@ -2218,5 +2226,5 @@
 DECLINLINE(void) ASMAtomicWritePtrVoid(void * volatile *ppv, const void *pv)
 {
-#if ARCH_BITS == 32
+#if ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
     ASMAtomicWriteU32((volatile uint32_t *)(void *)ppv, (uint32_t)pv);
 #elif ARCH_BITS == 64
@@ -2362,5 +2370,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicWriteHandle(ph, hNew) \
     do { \
@@ -2387,5 +2395,5 @@
  * @remarks This doesn't currently work for all handles (like RTFILE).
  */
-#if HC_ARCH_BITS == 32
+#if HC_ARCH_BITS == 32 || (ARCH_BITS == 16 && RT_FAR_DATA)
 # define ASMAtomicUoWriteHandle(ph, hNew) \
     do { \
@@ -2443,4 +2451,15 @@
 
 /**
+ * Atomically exchanges and adds to a 16-bit value, ordered.
+ *
+ * @returns The old value.
+ * @param   pu16        Pointer to the value.
+ * @param   u16         Number to add.
+ * @remarks Currently not implemented, just to make 16-bit code happy.
+ */
+DECLASM(uint16_t) ASMAtomicAddU16(uint16_t volatile *pu16, uint32_t u16);
+
+
+/**
  * Atomically exchanges and adds to a 32-bit value, ordered.
  *
@@ -2562,7 +2581,12 @@
 {
 #if ARCH_BITS == 64
+    AssertCompileSize(size_t, 8);
     return ASMAtomicAddU64((uint64_t volatile *)pcb, cb);
 #elif ARCH_BITS == 32
+    AssertCompileSize(size_t, 4);
     return ASMAtomicAddU32((uint32_t volatile *)pcb, cb);
+#elif ARCH_BITS == 16
+    AssertCompileSize(size_t, 2);
+    return ASMAtomicAddU16((uint16_t volatile *)pcb, cb);
 #else
 # error "Unsupported ARCH_BITS value"
@@ -2589,4 +2613,31 @@
 
 
+
+/**
+ * Atomically exchanges and subtracts to an unsigned 16-bit value, ordered.
+ *
+ * @returns The old value.
+ * @param   pu16        Pointer to the value.
+ * @param   u16         Number to subtract.
+ */
+DECLINLINE(uint16_t) ASMAtomicSubU16(uint16_t volatile *pu16, uint32_t u16)
+{
+    return ASMAtomicAddU16(pu16, (uint16_t)-(int16_t)u16);
+}
+
+
+/**
+ * Atomically exchanges and subtracts to a signed 16-bit value, ordered.
+ *
+ * @returns The old value.
+ * @param   pi16        Pointer to the value.
+ * @param   i16         Number to subtract.
+ */
+DECLINLINE(int16_t) ASMAtomicSubS16(int16_t volatile *pi16, int16_t i16)
+{
+    return (int16_t)ASMAtomicAddU16((uint16_t volatile *)pi16, (uint16_t)-i16);
+}
+
+
 /**
  * Atomically exchanges and subtracts to an unsigned 32-bit value, ordered.
@@ -2654,4 +2705,7 @@
 #elif ARCH_BITS == 32
     return ASMAtomicSubU32((uint32_t volatile *)pcb, cb);
+#elif ARCH_BITS == 16
+    AssertCompileSize(size_t, 2);
+    return ASMAtomicSubU16((uint16_t volatile *)pcb, cb);
 #else
 # error "Unsupported ARCH_BITS value"
@@ -2676,4 +2730,15 @@
         } \
     } while (0)
+
+
+
+/**
+ * Atomically increment a 16-bit value, ordered.
+ *
+ * @returns The new value.
+ * @param   pu16        Pointer to the value to increment.
+ * @remarks Not implemented. Just to make 16-bit code happy.
+ */
+DECLASM(uint16_t) ASMAtomicIncU16(uint16_t volatile *pu16);
 
 
@@ -2789,8 +2854,21 @@
 #elif ARCH_BITS == 32
     return ASMAtomicIncU32((uint32_t volatile *)pcb);
+#elif ARCH_BITS == 16
+    return ASMAtomicIncU16((uint16_t volatile *)pcb);
 #else
 # error "Unsupported ARCH_BITS value"
 #endif
 }
+
+
+
+/**
+ * Atomically decrement an unsigned 32-bit value, ordered.
+ *
+ * @returns The new value.
+ * @param   pu32        Pointer to the value to decrement.
+ * @remarks Not implemented. Just to make 16-bit code happy.
+ */
+DECLASM(uint32_t) ASMAtomicDecU16(uint16_t volatile *pu16);
 
 
@@ -2905,4 +2983,6 @@
 #elif ARCH_BITS == 32
     return ASMAtomicDecU32((uint32_t volatile *)pcb);
+#elif ARCH_BITS == 16
+    return ASMAtomicDecU16((uint16_t volatile *)pcb);
 #else
 # error "Unsupported ARCH_BITS value"
