Skip to content

Commit b2bc1b1

Browse files
hcahcaAlexander Gordeev
authored andcommitted
s390/bitops: Provide optimized arch_test_bit()
Provide an optimized arch_test_bit() implementation which makes use of flag output constraint. This generates slightly better code: bloat-o-meter: add/remove: 51/19 grow/shrink: 450/2444 up/down: 25198/-49136 (-23938) Acked-by: Alexander Gordeev <[email protected]> Signed-off-by: Heiko Carstens <[email protected]> Signed-off-by: Alexander Gordeev <[email protected]>
1 parent 8cae8e0 commit b2bc1b1

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

arch/s390/include/asm/bitops.h

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,40 @@
3636
#include <linux/typecheck.h>
3737
#include <linux/compiler.h>
3838
#include <linux/types.h>
39+
#include <asm/asm.h>
40+
41+
#define arch___set_bit generic___set_bit
42+
#define arch___clear_bit generic___clear_bit
43+
#define arch___change_bit generic___change_bit
44+
#define arch___test_and_set_bit generic___test_and_set_bit
45+
#define arch___test_and_clear_bit generic___test_and_clear_bit
46+
#define arch___test_and_change_bit generic___test_and_change_bit
47+
#define arch_test_bit_acquire generic_test_bit_acquire
48+
49+
static __always_inline bool arch_test_bit(unsigned long nr, const volatile unsigned long *ptr)
50+
{
51+
#ifdef __HAVE_ASM_FLAG_OUTPUTS__
52+
const volatile unsigned char *addr;
53+
unsigned long mask;
54+
int cc;
55+
56+
if (__builtin_constant_p(nr)) {
57+
addr = (const volatile unsigned char *)ptr;
58+
addr += (nr ^ (BITS_PER_LONG - BITS_PER_BYTE)) / BITS_PER_BYTE;
59+
mask = 1UL << (nr & (BITS_PER_BYTE - 1));
60+
asm volatile(
61+
" tm %[addr],%[mask]\n"
62+
: "=@cc" (cc)
63+
: [addr] "R" (*addr), [mask] "I" (mask)
64+
);
65+
return cc == 3;
66+
}
67+
#endif
68+
return generic_test_bit(nr, ptr);
69+
}
70+
3971
#include <asm-generic/bitops/atomic.h>
40-
#include <asm-generic/bitops/non-atomic.h>
72+
#include <asm-generic/bitops/non-instrumented-non-atomic.h>
4173
#include <asm-generic/bitops/lock.h>
4274

4375
/*

0 commit comments

Comments
 (0)