@@ -42,8 +42,91 @@ extern const size_t riscv_isa_vendor_ext_list_size;
4242#define VENDOR_EXT_ALL_CPUS -1
4343
4444bool __riscv_isa_vendor_extension_available (int cpu , unsigned long vendor , unsigned int bit );
45+ #define riscv_cpu_isa_vendor_extension_available (cpu , vendor , ext ) \
46+ __riscv_isa_vendor_extension_available(cpu, vendor, RISCV_ISA_VENDOR_EXT_##ext)
4547#define riscv_isa_vendor_extension_available (vendor , ext ) \
4648 __riscv_isa_vendor_extension_available(VENDOR_EXT_ALL_CPUS, vendor, \
4749 RISCV_ISA_VENDOR_EXT_##ext)
4850
51+ static __always_inline bool __riscv_has_extension_likely (const unsigned long vendor ,
52+ const unsigned long ext )
53+ {
54+ asm goto(ALTERNATIVE ("j %l[l_no]" , "nop" , %[vendor ], %[ext ], 1 )
55+ :
56+ : [vendor ] "i" (vendor ), [ext ] "i" (ext )
57+ :
58+ : l_no );
59+
60+ return true;
61+ l_no :
62+ return false;
63+ }
64+
65+ static __always_inline bool __riscv_has_extension_unlikely (const unsigned long vendor ,
66+ const unsigned long ext )
67+ {
68+ asm goto(ALTERNATIVE ("nop" , "j %l[l_yes]" , %[vendor ], %[ext ], 1 )
69+ :
70+ : [vendor ] "i" (vendor ), [ext ] "i" (ext )
71+ :
72+ : l_yes );
73+
74+ return false;
75+ l_yes :
76+ return true;
77+ }
78+
79+ static __always_inline bool riscv_has_vendor_extension_likely (const unsigned long vendor ,
80+ const unsigned long ext )
81+ {
82+ if (!IS_ENABLED (CONFIG_RISCV_ISA_VENDOR_EXT ))
83+ return false;
84+
85+ if (IS_ENABLED (CONFIG_RISCV_ALTERNATIVE ))
86+ return __riscv_has_extension_likely (vendor ,
87+ ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE );
88+
89+ return __riscv_isa_vendor_extension_available (VENDOR_EXT_ALL_CPUS , vendor , ext );
90+ }
91+
92+ static __always_inline bool riscv_has_vendor_extension_unlikely (const unsigned long vendor ,
93+ const unsigned long ext )
94+ {
95+ if (!IS_ENABLED (CONFIG_RISCV_ISA_VENDOR_EXT ))
96+ return false;
97+
98+ if (IS_ENABLED (CONFIG_RISCV_ALTERNATIVE ))
99+ return __riscv_has_extension_unlikely (vendor ,
100+ ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE );
101+
102+ return __riscv_isa_vendor_extension_available (VENDOR_EXT_ALL_CPUS , vendor , ext );
103+ }
104+
105+ static __always_inline bool riscv_cpu_has_vendor_extension_likely (const unsigned long vendor ,
106+ int cpu , const unsigned long ext )
107+ {
108+ if (!IS_ENABLED (CONFIG_RISCV_ISA_VENDOR_EXT ))
109+ return false;
110+
111+ if (IS_ENABLED (CONFIG_RISCV_ALTERNATIVE ) &&
112+ __riscv_has_extension_likely (vendor , ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE ))
113+ return true;
114+
115+ return __riscv_isa_vendor_extension_available (cpu , vendor , ext );
116+ }
117+
118+ static __always_inline bool riscv_cpu_has_vendor_extension_unlikely (const unsigned long vendor ,
119+ int cpu ,
120+ const unsigned long ext )
121+ {
122+ if (!IS_ENABLED (CONFIG_RISCV_ISA_VENDOR_EXT ))
123+ return false;
124+
125+ if (IS_ENABLED (CONFIG_RISCV_ALTERNATIVE ) &&
126+ __riscv_has_extension_unlikely (vendor , ext + RISCV_VENDOR_EXT_ALTERNATIVES_BASE ))
127+ return true;
128+
129+ return __riscv_isa_vendor_extension_available (cpu , vendor , ext );
130+ }
131+
49132#endif /* _ASM_VENDOR_EXTENSIONS_H */
0 commit comments