diff mbox

[committed] Remove long long support from linux-atomic.c

Message ID BLU436-SMTP554D8B458E3F2F21560663973E0@phx.gbl
State New
Headers show

Commit Message

John David Anglin Jan. 31, 2015, 8:13 p.m. UTC
The attached patch removes long long support from config/pa/linux-atomic.c and corrects some issues
found in trying to get the long long support working.

There are a number of issues.  On the 4.9 branch, webkitgtk fails to build with the current long long
support because the __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* and __GCC_ATOMIC_*_LOCK_FREE
defines are missing because of the libcall implementation.  These could be provided by defining
HAVE_sync_compare_and_swapqi, etc, but then we std:future builds and we probable need an
ABI bump for libstdc++.  It also turns out we don't initialize the sync builtins for double word size.
The webkitgtk build only conflicts with the long long support.

Secondly, when the HAVE defines and initialization are added, a middle-end wrong code bug is exposed for
the long long case.  I'm still researching this issue.

Finally, atomic long long loads and stores have to be done using the floating-point co-processor in the
32-bit parisc runtime, so maybe we are better off without long long support.

Tested on hppa-unknown-linux-gnu.  Committed to trunk and 4.9.

Dave
--
John David Anglin	dave.anglin@bell.net
2015-01-31  John David Anglin  <danglin@gcc.gnu.org>

	* config/pa/linux-atomic.c (__kernel_cmpxchg2): Change declaration of
	oldval and newval to const void *.  Fix typo.
	(FETCH_AND_OP_2): Use __atomic_load_n to load value.
	(FETCH_AND_OP_WORD): Likewise.
	(OP_AND_FETCH_WORD): Likewise.
	(COMPARE_AND_SWAP_2): Likewise.
	(__sync_val_compare_and_swap_4): Likewise.
	(__sync_lock_test_and_set_4): Likewise.
	(SYNC_LOCK_RELEASE_2): Likewise.
	Remove support for long long atomic operations.
diff mbox

Patch

Index: config/pa/linux-atomic.c
===================================================================
--- config/pa/linux-atomic.c	(revision 220301)
+++ config/pa/linux-atomic.c	(working copy)
@@ -73,7 +73,8 @@ 
 }
 
 static inline long
-__kernel_cmpxchg2 (void * oldval, void * newval, void *mem, int val_size)
+__kernel_cmpxchg2 (const void *oldval, const void *newval, void *mem,
+		   int val_size)
 {
   register unsigned long lws_mem asm("r26") = (unsigned long) (mem);
   register long lws_ret   asm("r28");
@@ -90,7 +91,7 @@ 
   if (__builtin_expect (lws_errno == -EFAULT || lws_errno == -ENOSYS, 0))
     __builtin_trap ();
 
-  /* If the kernel LWS call fails, retrun EBUSY */
+  /* If the kernel LWS call fails, return EBUSY */
   if (!lws_errno && lws_ret)
     lws_errno = -EBUSY;
 
@@ -113,7 +114,7 @@ 
     int failure;							\
 									\
     do {								\
-      tmp = *ptr;							\
+      tmp = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);			\
       newval = PFX_OP (tmp INF_OP val);					\
       failure = __kernel_cmpxchg2 (&tmp, &newval, ptr, INDEX);		\
     } while (failure != 0);						\
@@ -121,13 +122,6 @@ 
     return tmp;								\
   }
 
-FETCH_AND_OP_2 (add,   , +, long long, 8, 3)
-FETCH_AND_OP_2 (sub,   , -, long long, 8, 3)
-FETCH_AND_OP_2 (or,    , |, long long, 8, 3)
-FETCH_AND_OP_2 (and,   , &, long long, 8, 3)
-FETCH_AND_OP_2 (xor,   , ^, long long, 8, 3)
-FETCH_AND_OP_2 (nand, ~, &, long long, 8, 3)
-
 FETCH_AND_OP_2 (add,   , +, short, 2, 1)
 FETCH_AND_OP_2 (sub,   , -, short, 2, 1)
 FETCH_AND_OP_2 (or,    , |, short, 2, 1)
@@ -150,7 +144,7 @@ 
     int failure;							\
 									\
     do {								\
-      tmp = *ptr;							\
+      tmp = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);			\
       newval = PFX_OP (tmp INF_OP val);					\
       failure = __kernel_cmpxchg2 (&tmp, &newval, ptr, INDEX);		\
     } while (failure != 0);						\
@@ -158,13 +152,6 @@ 
     return PFX_OP (tmp INF_OP val);					\
   }
 
-OP_AND_FETCH_2 (add,   , +, long long, 8, 3)
-OP_AND_FETCH_2 (sub,   , -, long long, 8, 3)
-OP_AND_FETCH_2 (or,    , |, long long, 8, 3)
-OP_AND_FETCH_2 (and,   , &, long long, 8, 3)
-OP_AND_FETCH_2 (xor,   , ^, long long, 8, 3)
-OP_AND_FETCH_2 (nand, ~, &, long long, 8, 3)
-
 OP_AND_FETCH_2 (add,   , +, short, 2, 1)
 OP_AND_FETCH_2 (sub,   , -, short, 2, 1)
 OP_AND_FETCH_2 (or,    , |, short, 2, 1)
@@ -186,7 +173,7 @@ 
     int failure, tmp;							\
 									\
     do {								\
-      tmp = *ptr;							\
+      tmp = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);			\
       failure = __kernel_cmpxchg (tmp, PFX_OP (tmp INF_OP val), ptr);	\
     } while (failure != 0);						\
 									\
@@ -207,7 +194,7 @@ 
     int tmp, failure;							\
 									\
     do {								\
-      tmp = *ptr;							\
+      tmp = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);			\
       failure = __kernel_cmpxchg (tmp, PFX_OP (tmp INF_OP val), ptr);	\
     } while (failure != 0);						\
 									\
@@ -233,7 +220,7 @@ 
 									\
     while (1)								\
       {									\
-	actual_oldval = *ptr;						\
+	actual_oldval = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);	\
 									\
 	if (__builtin_expect (oldval != actual_oldval, 0))		\
 	  return actual_oldval;						\
@@ -242,7 +229,7 @@ 
 									\
 	if (__builtin_expect (!fail, 1))				\
 	  return actual_oldval;						\
-    }									\
+      }									\
   }									\
 									\
   bool HIDDEN								\
@@ -253,7 +240,6 @@ 
     return (failure != 0);						\
   }
 
-COMPARE_AND_SWAP_2 (long long, 8, 3)
 COMPARE_AND_SWAP_2 (short, 2, 1)
 COMPARE_AND_SWAP_2 (char, 1, 0)
 
@@ -264,7 +250,7 @@ 
     
   while (1)
     {
-      actual_oldval = *ptr;
+      actual_oldval = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
 
       if (__builtin_expect (oldval != actual_oldval, 0))
 	return actual_oldval;
@@ -291,7 +277,7 @@ 
     int failure;							\
 									\
     do {								\
-      oldval = *ptr;							\
+      oldval = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);			\
       failure = __kernel_cmpxchg2 (&oldval, &val, ptr, INDEX);		\
     } while (failure != 0);						\
 									\
@@ -298,7 +284,6 @@ 
     return oldval;							\
   }
 
-SYNC_LOCK_TEST_AND_SET_2 (long long, 8, 3)
 SYNC_LOCK_TEST_AND_SET_2 (short, 2, 1)
 SYNC_LOCK_TEST_AND_SET_2 (signed char, 1, 0)
 
@@ -308,7 +293,7 @@ 
   int failure, oldval;
 
   do {
-    oldval = *ptr;
+    oldval = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
     failure = __kernel_cmpxchg (oldval, val, ptr);
   } while (failure != 0);
 
@@ -322,12 +307,11 @@ 
     TYPE failure, oldval, zero = 0;				\
 								\
     do {							\
-      oldval = *ptr;						\
+      oldval = __atomic_load_n (ptr, __ATOMIC_SEQ_CST);		\
       failure = __kernel_cmpxchg2 (&oldval, &zero, ptr, INDEX);	\
     } while (failure != 0);					\
   }
 
-SYNC_LOCK_RELEASE_2 (long long, 8, 3)
 SYNC_LOCK_RELEASE_2 (short, 2, 1)
 SYNC_LOCK_RELEASE_2 (signed char, 1, 0)