Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

riscv: bitops: Use riscv_has_extension_likely

Use riscv_has_extension_likely() to check for RISCV_ISA_EXT_ZBB,
replacing the use of asm goto with ALTERNATIVE.

The "likely" variant is used to match the behavior of the original
implementation using ALTERNATIVE("j %l[legacy]", "nop", ...).

Signed-off-by: Vivian Wang <wangruikang@iscas.ac.cn>
Link: https://patch.msgid.link/20251020-riscv-altn-helper-wip-v4-4-ef941c87669a@iscas.ac.cn
Signed-off-by: Paul Walmsley <pjw@kernel.org>

authored by

Vivian Wang and committed by
Paul Walmsley
6b85e9ac 8261a9d1

+8 -24
+8 -24
arch/riscv/include/asm/bitops.h
··· 47 47 48 48 static __always_inline __attribute_const__ unsigned long variable__ffs(unsigned long word) 49 49 { 50 - asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, 51 - RISCV_ISA_EXT_ZBB, 1) 52 - : : : : legacy); 50 + if (!riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) 51 + return generic___ffs(word); 53 52 54 53 asm volatile (".option push\n" 55 54 ".option arch,+zbb\n" ··· 57 58 : "=r" (word) : "r" (word) :); 58 59 59 60 return word; 60 - 61 - legacy: 62 - return generic___ffs(word); 63 61 } 64 62 65 63 /** ··· 72 76 73 77 static __always_inline __attribute_const__ unsigned long variable__fls(unsigned long word) 74 78 { 75 - asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, 76 - RISCV_ISA_EXT_ZBB, 1) 77 - : : : : legacy); 79 + if (!riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) 80 + return generic___fls(word); 78 81 79 82 asm volatile (".option push\n" 80 83 ".option arch,+zbb\n" ··· 82 87 : "=r" (word) : "r" (word) :); 83 88 84 89 return BITS_PER_LONG - 1 - word; 85 - 86 - legacy: 87 - return generic___fls(word); 88 90 } 89 91 90 92 /** ··· 97 105 98 106 static __always_inline __attribute_const__ int variable_ffs(int x) 99 107 { 100 - asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, 101 - RISCV_ISA_EXT_ZBB, 1) 102 - : : : : legacy); 108 + if (!riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) 109 + return generic_ffs(x); 103 110 104 111 if (!x) 105 112 return 0; ··· 110 119 : "=r" (x) : "r" (x) :); 111 120 112 121 return x + 1; 113 - 114 - legacy: 115 - return generic_ffs(x); 116 122 } 117 123 118 124 /** ··· 125 137 126 138 static __always_inline int variable_fls(unsigned int x) 127 139 { 128 - asm goto(ALTERNATIVE("j %l[legacy]", "nop", 0, 129 - RISCV_ISA_EXT_ZBB, 1) 130 - : : : : legacy); 140 + if (!riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) 141 + return generic_fls(x); 131 142 132 143 if (!x) 133 144 return 0; ··· 138 151 : "=r" (x) : "r" (x) :); 139 152 140 153 return 32 - x; 141 - 142 - legacy: 143 - return generic_fls(x); 144 154 } 145 155 146 156 /**