diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-01-26 06:01:55 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-02-05 01:51:41 -0500 |
commit | e2dd833389cc4069a96b57bdd24227b5f52288f5 (patch) | |
tree | de7d1d70a0ca5377e87dfae3fd2c14d0be7eb657 /arch/s390/include | |
parent | 7041d28115e91f2144f811ffe8a195c696b1e1d0 (diff) |
s390: add optimized array_index_mask_nospec
Add an optimized version of the array_index_mask_nospec function for
s390 based on a compare and a subtract with borrow.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/include')
-rw-r--r-- | arch/s390/include/asm/barrier.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index 10432607a573..f9eddbca79d2 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h | |||
@@ -49,6 +49,30 @@ do { \ | |||
49 | #define __smp_mb__before_atomic() barrier() | 49 | #define __smp_mb__before_atomic() barrier() |
50 | #define __smp_mb__after_atomic() barrier() | 50 | #define __smp_mb__after_atomic() barrier() |
51 | 51 | ||
52 | /** | ||
53 | * array_index_mask_nospec - generate a mask for array_idx() that is | ||
54 | * ~0UL when the bounds check succeeds and 0 otherwise | ||
55 | * @index: array element index | ||
56 | * @size: number of elements in array | ||
57 | */ | ||
58 | #define array_index_mask_nospec array_index_mask_nospec | ||
59 | static inline unsigned long array_index_mask_nospec(unsigned long index, | ||
60 | unsigned long size) | ||
61 | { | ||
62 | unsigned long mask; | ||
63 | |||
64 | if (__builtin_constant_p(size) && size > 0) { | ||
65 | asm(" clgr %2,%1\n" | ||
66 | " slbgr %0,%0\n" | ||
67 | :"=d" (mask) : "d" (size-1), "d" (index) :"cc"); | ||
68 | return mask; | ||
69 | } | ||
70 | asm(" clgr %1,%2\n" | ||
71 | " slbgr %0,%0\n" | ||
72 | :"=d" (mask) : "d" (size), "d" (index) :"cc"); | ||
73 | return ~mask; | ||
74 | } | ||
75 | |||
52 | #include <asm-generic/barrier.h> | 76 | #include <asm-generic/barrier.h> |
53 | 77 | ||
54 | #endif /* __ASM_BARRIER_H */ | 78 | #endif /* __ASM_BARRIER_H */ |