On 02/12/2015 09:27 AM, Jose Fonseca wrote:
We need to build certain parts of Mesa (namely gallium, llvmpipe, and
therefore util) with Windows SDK 7.0.7600, which includes MSVC 2008.
---
  src/util/u_atomic.h | 32 ++++++++++++++++++++++++++++++--
  1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h
index e123e17..f54def3 100644
--- a/src/util/u_atomic.h
+++ b/src/util/u_atomic.h
@@ -88,7 +88,7 @@

  #if _MSC_VER < 1600

-/* Implement _InterlockedCompareExchange8 in terms of 
InterlockedCompareExchange16 */
+/* Implement _InterlockedCompareExchange8 in terms of 
_InterlockedCompareExchange16 */
  static __inline
  char _InterlockedCompareExchange8(char volatile *Destination8, char 
Exchange8, char Comparand8)

static __inline char
_InterlockedCompareExchange8(...)


  {
@@ -103,7 +103,7 @@ char _InterlockedCompareExchange8(char volatile 
*Destination8, char Exchange8, c
         * neighboring byte untouched */
        short Exchange16 = (Initial16 & ~Mask8) | ((short)Exchange8 << Shift8);
        short Comparand16 = Initial16;
-      short Initial16 = InterlockedCompareExchange16(Destination16, 
Exchange16, Comparand16);
+      short Initial16 = _InterlockedCompareExchange16(Destination16, 
Exchange16, Comparand16);
        if (Initial16 == Comparand16) {
           /* succeeded */
           return Comparand8;
@@ -114,6 +114,34 @@ char _InterlockedCompareExchange8(char volatile 
*Destination8, char Exchange8, c
     return Initial8;
  }

+/* Implement _InterlockedExchangeAdd16 in terms of 
_InterlockedCompareExchange16 */
+static __inline
+short _InterlockedExchangeAdd16(short volatile *Addend, short Value)

same thing.

+{
+   short Initial = *Addend;
+   short Comparand;
+   do {
+      short Exchange = Initial + Value;
+      Comparand = Initial;
+      Initial = _InterlockedCompareExchange16(Addend, Exchange, Comparand);
+   } while(Initial != Comparand);
+   return Comparand;
+}

I had to stare at this for quite a while. It's kind of a mind bender (at least to me). I found it helpful to add a comment:

/* if *Addend==Comparand then *Addend=Exchange, return original *Addend */

before the _InterlockedCompareExchange16() call.


+
+/* Implement _InterlockedExchangeAdd8 in terms of _InterlockedCompareExchange8 
*/
+static __inline
+char _InterlockedExchangeAdd8(char volatile *Addend, char Value)
+{
+   char Initial = *Addend;
+   char Comparand;
+   do {
+      char Exchange = Initial + Value;
+      Comparand = Initial;
+      Initial = _InterlockedCompareExchange8(Addend, Exchange, Comparand);
+   } while(Initial != Comparand);
+   return Comparand;
+}
+
  #endif /* _MSC_VER < 1600 */

  /* MSVC supports decltype keyword, but it's only supported on C++ and doesn't


Why do the local variables start with upper case letters? That's not our usual style.

Anyway,
Reviewed-by: Brian Paul <bri...@vmware.com>

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to