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 b30606f6d523..2e05972c5085 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
@@ -71,8 +71,6 @@ extern const char _sb_findmap[]; | |||
71 | #define __BITOPS_AND "nr" | 71 | #define __BITOPS_AND "nr" |
72 | #define __BITOPS_XOR "xr" | 72 | #define __BITOPS_XOR "xr" |
73 | 73 | ||
74 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) | ||
75 | |||
76 | #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string) \ | 74 | #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string) \ |
77 | asm volatile( \ | 75 | asm volatile( \ |
78 | " l %0,%2\n" \ | 76 | " l %0,%2\n" \ |
@@ -85,22 +83,6 @@ extern const char _sb_findmap[]; | |||
85 | : "d" (__val), "Q" (*(unsigned long *) __addr) \ | 83 | : "d" (__val), "Q" (*(unsigned long *) __addr) \ |
86 | : "cc"); | 84 | : "cc"); |
87 | 85 | ||
88 | #else /* __GNUC__ */ | ||
89 | |||
90 | #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string) \ | ||
91 | asm volatile( \ | ||
92 | " l %0,0(%4)\n" \ | ||
93 | "0: lr %1,%0\n" \ | ||
94 | __op_string " %1,%3\n" \ | ||
95 | " cs %0,%1,0(%4)\n" \ | ||
96 | " jl 0b" \ | ||
97 | : "=&d" (__old), "=&d" (__new), \ | ||
98 | "=m" (*(unsigned long *) __addr) \ | ||
99 | : "d" (__val), "a" (__addr), \ | ||
100 | "m" (*(unsigned long *) __addr) : "cc"); | ||
101 | |||
102 | #endif /* __GNUC__ */ | ||
103 | |||
104 | #else /* __s390x__ */ | 86 | #else /* __s390x__ */ |
105 | 87 | ||
106 | #define __BITOPS_ALIGN 7 | 88 | #define __BITOPS_ALIGN 7 |
@@ -109,8 +91,6 @@ extern const char _sb_findmap[]; | |||
109 | #define __BITOPS_AND "ngr" | 91 | #define __BITOPS_AND "ngr" |
110 | #define __BITOPS_XOR "xgr" | 92 | #define __BITOPS_XOR "xgr" |
111 | 93 | ||
112 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) | ||
113 | |||
114 | #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string) \ | 94 | #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string) \ |
115 | asm volatile( \ | 95 | asm volatile( \ |
116 | " lg %0,%2\n" \ | 96 | " lg %0,%2\n" \ |
@@ -123,23 +103,6 @@ extern const char _sb_findmap[]; | |||
123 | : "d" (__val), "Q" (*(unsigned long *) __addr) \ | 103 | : "d" (__val), "Q" (*(unsigned long *) __addr) \ |
124 | : "cc"); | 104 | : "cc"); |
125 | 105 | ||
126 | #else /* __GNUC__ */ | ||
127 | |||
128 | #define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string) \ | ||
129 | asm volatile( \ | ||
130 | " lg %0,0(%4)\n" \ | ||
131 | "0: lgr %1,%0\n" \ | ||
132 | __op_string " %1,%3\n" \ | ||
133 | " csg %0,%1,0(%4)\n" \ | ||
134 | " jl 0b" \ | ||
135 | : "=&d" (__old), "=&d" (__new), \ | ||
136 | "=m" (*(unsigned long *) __addr) \ | ||
137 | : "d" (__val), "a" (__addr), \ | ||
138 | "m" (*(unsigned long *) __addr) : "cc"); | ||
139 | |||
140 | |||
141 | #endif /* __GNUC__ */ | ||
142 | |||
143 | #endif /* __s390x__ */ | 106 | #endif /* __s390x__ */ |
144 | 107 | ||
145 | #define __BITOPS_WORDS(bits) (((bits)+__BITOPS_WORDSIZE-1)/__BITOPS_WORDSIZE) | 108 | #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) | |||
261 | 224 | ||
262 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); | 225 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); |
263 | asm volatile( | 226 | asm volatile( |
264 | " oc 0(1,%1),0(%2)" | 227 | " oc %O0(1,%R0),%1" |
265 | : "=m" (*(char *) addr) : "a" (addr), | 228 | : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc" ); |
266 | "a" (_oi_bitmap + (nr & 7)), "m" (*(char *) addr) : "cc" ); | ||
267 | } | 229 | } |
268 | 230 | ||
269 | static inline void | 231 | static inline void |
@@ -290,9 +252,8 @@ __clear_bit(unsigned long nr, volatile unsigned long *ptr) | |||
290 | 252 | ||
291 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); | 253 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); |
292 | asm volatile( | 254 | asm volatile( |
293 | " nc 0(1,%1),0(%2)" | 255 | " nc %O0(1,%R0),%1" |
294 | : "=m" (*(char *) addr) : "a" (addr), | 256 | : "=Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7]) : "cc" ); |
295 | "a" (_ni_bitmap + (nr & 7)), "m" (*(char *) addr) : "cc"); | ||
296 | } | 257 | } |
297 | 258 | ||
298 | static inline void | 259 | static inline void |
@@ -318,9 +279,8 @@ static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr) | |||
318 | 279 | ||
319 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); | 280 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); |
320 | asm volatile( | 281 | asm volatile( |
321 | " xc 0(1,%1),0(%2)" | 282 | " xc %O0(1,%R0),%1" |
322 | : "=m" (*(char *) addr) : "a" (addr), | 283 | : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc" ); |
323 | "a" (_oi_bitmap + (nr & 7)), "m" (*(char *) addr) : "cc" ); | ||
324 | } | 284 | } |
325 | 285 | ||
326 | static inline void | 286 | static inline void |
@@ -349,10 +309,9 @@ test_and_set_bit_simple(unsigned long nr, volatile unsigned long *ptr) | |||
349 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); | 309 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); |
350 | ch = *(unsigned char *) addr; | 310 | ch = *(unsigned char *) addr; |
351 | asm volatile( | 311 | asm volatile( |
352 | " oc 0(1,%1),0(%2)" | 312 | " oc %O0(1,%R0),%1" |
353 | : "=m" (*(char *) addr) | 313 | : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) |
354 | : "a" (addr), "a" (_oi_bitmap + (nr & 7)), | 314 | : "cc", "memory"); |
355 | "m" (*(char *) addr) : "cc", "memory"); | ||
356 | return (ch >> (nr & 7)) & 1; | 315 | return (ch >> (nr & 7)) & 1; |
357 | } | 316 | } |
358 | #define __test_and_set_bit(X,Y) test_and_set_bit_simple(X,Y) | 317 | #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) | |||
369 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); | 328 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); |
370 | ch = *(unsigned char *) addr; | 329 | ch = *(unsigned char *) addr; |
371 | asm volatile( | 330 | asm volatile( |
372 | " nc 0(1,%1),0(%2)" | 331 | " nc %O0(1,%R0),%1" |
373 | : "=m" (*(char *) addr) | 332 | : "=Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7]) |
374 | : "a" (addr), "a" (_ni_bitmap + (nr & 7)), | 333 | : "cc", "memory"); |
375 | "m" (*(char *) addr) : "cc", "memory"); | ||
376 | return (ch >> (nr & 7)) & 1; | 334 | return (ch >> (nr & 7)) & 1; |
377 | } | 335 | } |
378 | #define __test_and_clear_bit(X,Y) test_and_clear_bit_simple(X,Y) | 336 | #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) | |||
389 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); | 347 | addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3); |
390 | ch = *(unsigned char *) addr; | 348 | ch = *(unsigned char *) addr; |
391 | asm volatile( | 349 | asm volatile( |
392 | " xc 0(1,%1),0(%2)" | 350 | " xc %O0(1,%R0),%1" |
393 | : "=m" (*(char *) addr) | 351 | : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) |
394 | : "a" (addr), "a" (_oi_bitmap + (nr & 7)), | 352 | : "cc", "memory"); |
395 | "m" (*(char *) addr) : "cc", "memory"); | ||
396 | return (ch >> (nr & 7)) & 1; | 353 | return (ch >> (nr & 7)) & 1; |
397 | } | 354 | } |
398 | #define __test_and_change_bit(X,Y) test_and_change_bit_simple(X,Y) | 355 | #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, | |||
591 | p = (unsigned long *)((unsigned long) p + offset); | 548 | p = (unsigned long *)((unsigned long) p + offset); |
592 | #ifndef __s390x__ | 549 | #ifndef __s390x__ |
593 | asm volatile( | 550 | asm volatile( |
594 | " ic %0,0(%1)\n" | 551 | " ic %0,%O1(%R1)\n" |
595 | " icm %0,2,1(%1)\n" | 552 | " icm %0,2,%O1+1(%R1)\n" |
596 | " icm %0,4,2(%1)\n" | 553 | " icm %0,4,%O1+2(%R1)\n" |
597 | " icm %0,8,3(%1)" | 554 | " icm %0,8,%O1+3(%R1)" |
598 | : "=&d" (word) : "a" (p), "m" (*p) : "cc"); | 555 | : "=&d" (word) : "Q" (*p) : "cc"); |
599 | #else | 556 | #else |
600 | asm volatile( | 557 | asm volatile( |
601 | " lrvg %0,%1" | 558 | " lrvg %0,%1" |