about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2017-02-01 01:30:24 +0100
committerAurelien Jarno <aurelien@aurel32.net>2017-06-17 01:27:09 +0200
commit600b10a8714d334c091afc0deedd35bca7370bfc (patch)
tree1990eb456623abd6129ebefd71abc9c4f772dd79
parent4e291e7c5277af2eec279e2047653f04fad483e1 (diff)
downloadglibc-600b10a8714d334c091afc0deedd35bca7370bfc.tar.gz
glibc-600b10a8714d334c091afc0deedd35bca7370bfc.tar.xz
glibc-600b10a8714d334c091afc0deedd35bca7370bfc.zip
m68k: fix 64bit atomic ops
(cherry picked from commit 64ae9fe45662c8994b0e56ab469b01967408a154)
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/m68k/m680x0/m68020/atomic-machine.h14
2 files changed, 15 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d4f5f8350..1795e284ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-02-01  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* sysdeps/m68k/m680x0/m68020/atomic-machine.h
+	(__arch_compare_and_exchange_val_64_acq, atomic_exchange_acq)
+	(atomic_exchange_and_add, atomic_add): Add casts to 64 bit asm
+	operands.
+
 2017-05-12  Florian Weimer  <fweimer@redhat.com>
 
 	[BZ #21386]
diff --git a/sysdeps/m68k/m680x0/m68020/atomic-machine.h b/sysdeps/m68k/m680x0/m68020/atomic-machine.h
index 24bc5c5ef7..65965cca9e 100644
--- a/sysdeps/m68k/m680x0/m68020/atomic-machine.h
+++ b/sysdeps/m68k/m680x0/m68020/atomic-machine.h
@@ -73,7 +73,7 @@ typedef uintmax_t uatomic_max_t;
      __typeof (mem) __memp = (mem);					      \
      __asm __volatile ("cas2%.l %0:%R0,%1:%R1,(%2):(%3)"		      \
 		       : "=d" (__ret)					      \
-		       : "d" (newval), "r" (__memp),			      \
+		       : "d" ((__typeof (*(mem))) (newval)), "r" (__memp),    \
 			 "r" ((char *) __memp + 4), "0" (oldval)	      \
 		       : "memory");					      \
      __ret; })
@@ -101,8 +101,9 @@ typedef uintmax_t uatomic_max_t;
 	 __asm __volatile ("1: cas2%.l %0:%R0,%1:%R1,(%2):(%3);"	      \
 			   "   jbne 1b"					      \
 			   : "=d" (__result)				      \
-			   : "d" (newvalue), "r" (__memp),		      \
-			     "r" ((char *) __memp + 4), "0" (__result)	      \
+			   : "d" ((__typeof (*(mem))) (newvalue)),	      \
+			     "r" (__memp), "r" ((char *) __memp + 4),	      \
+			     "0" (__result)				      \
 			   : "memory");					      \
        }								      \
      __result; })
@@ -144,7 +145,7 @@ typedef uintmax_t uatomic_max_t;
 			   "   cas2%.l %0:%R0,%1:%R1,(%3):(%4);"	      \
 			   "   jbne 1b"					      \
 			   : "=d" (__result), "=&d" (__temp)		      \
-			   : "d" (value), "r" (__memp),			      \
+			   : "d" ((__typeof (*(mem))) (value)), "r" (__memp), \
 			     "r" ((char *) __memp + 4), "0" (__result)	      \
 			   : "memory");					      \
        }								      \
@@ -175,8 +176,9 @@ typedef uintmax_t uatomic_max_t;
 				  "   cas2%.l %0:%R0,%1:%R1,(%3):(%4);"	      \
 				  "   jbne 1b"				      \
 				  : "=d" (__oldval), "=&d" (__temp)	      \
-				  : "d" (value), "r" (__memp),		      \
-				    "r" ((char *) __memp + 4), "0" (__oldval) \
+				  : "d" ((__typeof (*(mem))) (value)),	      \
+				    "r" (__memp), "r" ((char *) __memp + 4),  \
+				    "0" (__oldval)			      \
 				  : "memory");				      \
 	      }								      \
 	    })