RISC-V: Improve use of isa2hwcap[]
authorAndrew Jones <ajones@ventanamicro.com>
Tue, 29 Nov 2022 14:34:45 +0000 (15:34 +0100)
committerPalmer Dabbelt <palmer@rivosinc.com>
Sat, 10 Dec 2022 03:09:08 +0000 (19:09 -0800)
Improve isa2hwcap[] by removing it from static storage, as
riscv_fill_hwcap() is only called once, and by reducing its size
from 256 bytes to 26. The latter improvement is possible because
isa2hwcap[] will never be indexed with capital letters and we can
precompute the offsets from 'a'.

No functional change intended.

Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20221129143447.49714-2-ajones@ventanamicro.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/cpufeature.c

index 694267d..4677320 100644 (file)
@@ -74,15 +74,15 @@ void __init riscv_fill_hwcap(void)
        const char *isa;
        char print_str[NUM_ALPHA_EXTS + 1];
        int i, j, rc;
-       static unsigned long isa2hwcap[256] = {0};
+       unsigned long isa2hwcap[26] = {0};
        unsigned long hartid;
 
-       isa2hwcap['i'] = isa2hwcap['I'] = COMPAT_HWCAP_ISA_I;
-       isa2hwcap['m'] = isa2hwcap['M'] = COMPAT_HWCAP_ISA_M;
-       isa2hwcap['a'] = isa2hwcap['A'] = COMPAT_HWCAP_ISA_A;
-       isa2hwcap['f'] = isa2hwcap['F'] = COMPAT_HWCAP_ISA_F;
-       isa2hwcap['d'] = isa2hwcap['D'] = COMPAT_HWCAP_ISA_D;
-       isa2hwcap['c'] = isa2hwcap['C'] = COMPAT_HWCAP_ISA_C;
+       isa2hwcap['i' - 'a'] = COMPAT_HWCAP_ISA_I;
+       isa2hwcap['m' - 'a'] = COMPAT_HWCAP_ISA_M;
+       isa2hwcap['a' - 'a'] = COMPAT_HWCAP_ISA_A;
+       isa2hwcap['f' - 'a'] = COMPAT_HWCAP_ISA_F;
+       isa2hwcap['d' - 'a'] = COMPAT_HWCAP_ISA_D;
+       isa2hwcap['c' - 'a'] = COMPAT_HWCAP_ISA_C;
 
        elf_hwcap = 0;
 
@@ -196,8 +196,10 @@ void __init riscv_fill_hwcap(void)
                        if (unlikely(ext_err))
                                continue;
                        if (!ext_long) {
-                               this_hwcap |= isa2hwcap[(unsigned char)(*ext)];
-                               set_bit(*ext - 'a', this_isa);
+                               int nr = *ext - 'a';
+
+                               this_hwcap |= isa2hwcap[nr];
+                               set_bit(nr, this_isa);
                        } else {
                                SET_ISA_EXT_MAP("sscofpmf", RISCV_ISA_EXT_SSCOFPMF);
                                SET_ISA_EXT_MAP("svpbmt", RISCV_ISA_EXT_SVPBMT);