diff options
Diffstat (limited to 'arch/s390/include/asm/bitops.h')
| -rw-r--r-- | arch/s390/include/asm/bitops.h | 83 | 
1 files changed, 20 insertions, 63 deletions
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h index b30606f6d52..2e05972c508 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h @@ -71,8 +71,6 @@ extern const char _sb_findmap[];  #define __BITOPS_AND		"nr"  #define __BITOPS_XOR		"xr" -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) -  #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string)	\  	asm volatile(						\  		"	l	%0,%2\n"			\ @@ -85,22 +83,6 @@ extern const char _sb_findmap[];  		: "d" (__val), "Q" (*(unsigned long *) __addr)	\  		: "cc"); -#else /* __GNUC__ */ - -#define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string)	\ -	asm volatile(						\ -		"	l	%0,0(%4)\n"			\ -		"0:	lr	%1,%0\n"			\ -		__op_string "	%1,%3\n"			\ -		"	cs	%0,%1,0(%4)\n"			\ -		"	jl	0b"				\ -		: "=&d" (__old), "=&d" (__new),			\ -		  "=m" (*(unsigned long *) __addr)		\ -		: "d" (__val), "a" (__addr),			\ -		  "m" (*(unsigned long *) __addr) : "cc"); - -#endif /* __GNUC__ */ -  #else /* __s390x__ */  #define __BITOPS_ALIGN		7 @@ -109,8 +91,6 @@ extern const char _sb_findmap[];  #define __BITOPS_AND		"ngr"  #define __BITOPS_XOR		"xgr" -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) -  #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string)	\  	asm volatile(						\  		"	lg	%0,%2\n"			\ @@ -123,23 +103,6 @@ extern const char _sb_findmap[];  		: "d" (__val), "Q" (*(unsigned long *) __addr)	\  		: "cc"); -#else /* __GNUC__ */ - -#define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string)	\ -	asm volatile(						\ -		"	lg	%0,0(%4)\n"			\ -		"0:	lgr	%1,%0\n"			\ -		__op_string "	%1,%3\n"			\ -		"	csg	%0,%1,0(%4)\n"			\ -		"	jl	0b"				\ -		: "=&d" (__old), "=&d" (__new),			\ -		  "=m" (*(unsigned long *) __addr)		\ -		: "d" (__val), "a" (__addr),			\ -		  "m" (*(unsigned long *) __addr) : "cc"); - - -#endif /* __GNUC__ */ -  #endif /* __s390x__ */  #define __BITOPS_WORDS(bits) (((bits)+__BITOPS_WORDSIZE-1)/__BITOPS_WORDSIZE) @@ -261,9 +224,8 @@ static inline void __set_bit(unsigned long nr, volatile unsigned long *ptr)  	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);  	asm volatile( -		"	oc	0(1,%1),0(%2)" -		: "=m" (*(char *) addr) : "a" (addr), -		  "a" (_oi_bitmap + (nr & 7)), "m" (*(char *) addr) : "cc" ); +		"	oc	%O0(1,%R0),%1" +		: "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc" );  }  static inline void  @@ -290,9 +252,8 @@ __clear_bit(unsigned long nr, volatile unsigned long *ptr)  	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);  	asm volatile( -		"	nc	0(1,%1),0(%2)" -		: "=m" (*(char *) addr)	: "a" (addr), -		  "a" (_ni_bitmap + (nr & 7)), "m" (*(char *) addr) : "cc"); +		"	nc	%O0(1,%R0),%1" +		: "=Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7]) : "cc" );  }  static inline void  @@ -318,9 +279,8 @@ static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr)  	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);  	asm volatile( -		"	xc	0(1,%1),0(%2)" -		:  "=m" (*(char *) addr) : "a" (addr), -		   "a" (_oi_bitmap + (nr & 7)), "m" (*(char *) addr) : "cc" ); +		"	xc	%O0(1,%R0),%1" +		: "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc" );  }  static inline void  @@ -349,10 +309,9 @@ test_and_set_bit_simple(unsigned long nr, volatile unsigned long *ptr)  	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);  	ch = *(unsigned char *) addr;  	asm volatile( -		"	oc	0(1,%1),0(%2)" -		: "=m" (*(char *) addr) -		: "a" (addr), "a" (_oi_bitmap + (nr & 7)), -		  "m" (*(char *) addr) : "cc", "memory"); +		"	oc	%O0(1,%R0),%1" +		: "=Q" (*(char *) addr)	: "Q" (_oi_bitmap[nr & 7]) +		: "cc", "memory");  	return (ch >> (nr & 7)) & 1;  }  #define __test_and_set_bit(X,Y)		test_and_set_bit_simple(X,Y) @@ -369,10 +328,9 @@ test_and_clear_bit_simple(unsigned long nr, volatile unsigned long *ptr)  	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);  	ch = *(unsigned char *) addr;  	asm volatile( -		"	nc	0(1,%1),0(%2)" -		: "=m" (*(char *) addr) -		: "a" (addr), "a" (_ni_bitmap + (nr & 7)), -		  "m" (*(char *) addr) : "cc", "memory"); +		"	nc	%O0(1,%R0),%1" +		: "=Q" (*(char *) addr)	: "Q" (_ni_bitmap[nr & 7]) +		: "cc", "memory");  	return (ch >> (nr & 7)) & 1;  }  #define __test_and_clear_bit(X,Y)	test_and_clear_bit_simple(X,Y) @@ -389,10 +347,9 @@ test_and_change_bit_simple(unsigned long nr, volatile unsigned long *ptr)  	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);  	ch = *(unsigned char *) addr;  	asm volatile( -		"	xc	0(1,%1),0(%2)" -		: "=m" (*(char *) addr) -		: "a" (addr), "a" (_oi_bitmap + (nr & 7)), -		  "m" (*(char *) addr) : "cc", "memory"); +		"	xc	%O0(1,%R0),%1" +		: "=Q" (*(char *) addr)	: "Q" (_oi_bitmap[nr & 7]) +		: "cc", "memory");  	return (ch >> (nr & 7)) & 1;  }  #define __test_and_change_bit(X,Y)	test_and_change_bit_simple(X,Y) @@ -591,11 +548,11 @@ static inline unsigned long __load_ulong_le(const unsigned long *p,  	p = (unsigned long *)((unsigned long) p + offset);  #ifndef __s390x__  	asm volatile( -		"	ic	%0,0(%1)\n" -		"	icm	%0,2,1(%1)\n" -		"	icm	%0,4,2(%1)\n" -		"	icm	%0,8,3(%1)" -		: "=&d" (word) : "a" (p), "m" (*p) : "cc"); +		"	ic	%0,%O1(%R1)\n" +		"	icm	%0,2,%O1+1(%R1)\n" +		"	icm	%0,4,%O1+2(%R1)\n" +		"	icm	%0,8,%O1+3(%R1)" +		: "=&d" (word) : "Q" (*p) : "cc");  #else  	asm volatile(  		"	lrvg	%0,%1"  |