╭ riscv_bitmanip.h ─────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
.. llvm_libc_wrappers/ openmp_wrappers/ ppc_wrappers/ __clang_spirv_builtins.h __float_float.h __float_header_macro.h __float_infinity_nan.h __stdarg___gnuc_va_list.h __stdarg___va_copy.h __stdarg_header_macro.h __stdarg_va_arg.h __stdarg_va_copy.h __stdarg_va_list.h __stddef_header_macro.h __stddef_max_align_t.h __stddef_null.h __stddef_nullptr_t.h __stddef_offsetof.h __stddef_ptrdiff_t.h __stddef_rsize_t.h __stddef_size_t.h __stddef_unreachable.h __stddef_wchar_t.h __stddef_wint_t.h __wmmintrin_aes.h __wmmintrin_pclmul.h adcintrin.h adxintrin.h altivec.h ammintrin.h amo.h amxavx512intrin.h amxcomplexintrin.h amxfp16intrin.h amxfp8intrin.h amxintrin.h amxmovrsintrin.h amxtf32intrin.h andes_vector.h arm64intr.h arm_acle.h arm_bf16.h arm_cde.h arm_cmse.h arm_fp16.h arm_mve.h arm_neon.h arm_neon_sve_bridge.h arm_sme.h arm_sve.h arm_vector_types.h armintr.h avx10_2_512bf16intrin.h avx10_2_512convertintrin.h avx10_2_512minmaxintrin.h avx10_2_512niintrin.h avx10_2_512satcvtdsintrin.h avx10_2_512satcvtintrin.h avx10_2bf16intrin.h avx10_2convertintrin.h avx10_2copyintrin.h avx10_2minmaxintrin.h avx10_2niintrin.h avx10_2satcvtdsintrin.h avx10_2satcvtintrin.h avx2intrin.h avx512bf16intrin.h avx512bitalgintrin.h avx512bwintrin.h avx512cdintrin.h avx512dqintrin.h avx512fintrin.h avx512fp16intrin.h avx512ifmaintrin.h avx512ifmavlintrin.h avx512vbmi2intrin.h avx512vbmiintrin.h avx512vbmivlintrin.h avx512vlbf16intrin.h avx512vlbitalgintrin.h avx512vlbwintrin.h avx512vlcdintrin.h avx512vldqintrin.h avx512vlfp16intrin.h avx512vlintrin.h avx512vlvbmi2intrin.h avx512vlvnniintrin.h avx512vlvp2intersectintrin.h avx512vnniintrin.h avx512vp2intersectintrin.h avx512vpopcntdqintrin.h avx512vpopcntdqvlintrin.h avxifmaintrin.h avxintrin.h avxneconvertintrin.h avxvnniint16intrin.h avxvnniint8intrin.h avxvnniintrin.h bmi2intrin.h bmiintrin.h builtins.h cet.h cetintrin.h cldemoteintrin.h clflushoptintrin.h clwbintrin.h clzerointrin.h cmpccxaddintrin.h cpuid.h crc32intrin.h emmintrin.h enqcmdintrin.h f16cintrin.h float.h fma4intrin.h fmaintrin.h fxsrintrin.h gfniintrin.h hexagon_circ_brev_intrinsics.h hexagon_protos.h hexagon_types.h hresetintrin.h htmintrin.h htmxlintrin.h hvx_hexagon_protos.h ia32intrin.h immintrin.h intrin.h intrin0.h inttypes.h invpcidintrin.h iso646.h keylockerintrin.h larchintrin.h lasxintrin.h limits.h lsxintrin.h lwpintrin.h lzcntintrin.h mm3dnow.h mm_malloc.h mmintrin.h module.modulemap movdirintrin.h movrs_avx10_2_512intrin.h movrs_avx10_2intrin.h movrsintrin.h msa.h mwaitxintrin.h nmmintrin.h pconfigintrin.h pkuintrin.h pmmintrin.h popcntintrin.h prfchiintrin.h prfchwintrin.h ptrauth.h ptwriteintrin.h raointintrin.h rdpruintrin.h rdseedintrin.h ╭─────────────────────────────────╮ │riscv_bitmanip.h │ ╰─────────────────────────────────╯ riscv_corev_alu.h riscv_crypto.h riscv_mips.h riscv_nds.h riscv_ntlh.h riscv_vector.h rtmintrin.h s390intrin.h serializeintrin.h sgxintrin.h sha512intrin.h shaintrin.h sifive_vector.h sm3intrin.h sm4evexintrin.h sm4intrin.h smmintrin.h spirvintrin.h stdalign.h stdarg.h stdatomic.h stdbool.h stdckdint.h stdcountof.h stddef.h stddefer.h stdint.h stdnoreturn.h tbmintrin.h tgmath.h tmmintrin.h tsxldtrkintrin.h uintrintrin.h unwind.h usermsrintrin.h vadefs.h vaesintrin.h varargs.h vecintrin.h velintrin.h velintrin_approx.h velintrin_gen.h vpclmulqdqintrin.h waitpkgintrin.h wasm_simd128.h wbnoinvdintrin.h wmmintrin.h x86gprintrin.h x86intrin.h xmmintrin.h xopintrin.h xsavecintrin.h xsaveintrin.h xsaveoptintrin.h xsavesintrin.h xtestintrin.h yvals_core.h
1 /*===---- riscv_bitmanip.h - RISC-V Zb* intrinsics --------------------------=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===-----------------------------------------------------------------------=== 8 */ 9 10 #ifndef __RISCV_BITMANIP_H 11 #define __RISCV_BITMANIP_H 12 13 #include <stdint.h> 14 15 #if defined(__cplusplus) 16 extern "C" { 17 #endif 18 19 #if defined(__riscv_zbb) 20 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 21 __riscv_orc_b_32(uint32_t __x) { 22 return __builtin_riscv_orc_b_32(__x); 23 } 24 25 static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) 26 __riscv_clz_32(uint32_t __x) { 27 return __builtin_riscv_clz_32(__x); 28 } 29 30 static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) 31 __riscv_ctz_32(uint32_t __x) { 32 return __builtin_riscv_ctz_32(__x); 33 } 34 35 static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) 36 __riscv_cpop_32(uint32_t __x) { 37 return __builtin_popcount(__x); 38 } 39 40 #if __riscv_xlen == 64 41 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 42 __riscv_orc_b_64(uint64_t __x) { 43 return __builtin_riscv_orc_b_64(__x); 44 } 45 46 static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) 47 __riscv_clz_64(uint64_t __x) { 48 return __builtin_riscv_clz_64(__x); 49 } 50 51 static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) 52 __riscv_ctz_64(uint64_t __x) { 53 return __builtin_riscv_ctz_64(__x); 54 } 55 56 static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) 57 __riscv_cpop_64(uint64_t __x) { 58 return __builtin_popcountll(__x); 59 } 60 #endif 61 #endif // defined(__riscv_zbb) 62 63 #if defined(__riscv_zbb) || defined(__riscv_zbkb) 64 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 65 __riscv_rev8_32(uint32_t __x) { 66 return __builtin_bswap32(__x); 67 } 68 69 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 70 __riscv_rol_32(uint32_t __x, uint32_t __y) { 71 return __builtin_rotateleft32(__x, __y); 72 } 73 74 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 75 __riscv_ror_32(uint32_t __x, uint32_t __y) { 76 return __builtin_rotateright32(__x, __y); 77 } 78 79 #if __riscv_xlen == 64 80 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 81 __riscv_rev8_64(uint64_t __x) { 82 return __builtin_bswap64(__x); 83 } 84 85 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 86 __riscv_rol_64(uint64_t __x, uint32_t __y) { 87 return __builtin_rotateleft64(__x, __y); 88 } 89 90 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 91 __riscv_ror_64(uint64_t __x, uint32_t __y) { 92 return __builtin_rotateright64(__x, __y); 93 } 94 #endif 95 #endif // defined(__riscv_zbb) || defined(__riscv_zbkb) 96 97 #if defined(__riscv_zbkb) 98 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 99 __riscv_brev8_32(uint32_t __x) { 100 return __builtin_riscv_brev8_32(__x); 101 } 102 103 #if __riscv_xlen == 64 104 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 105 __riscv_brev8_64(uint64_t __x) { 106 return __builtin_riscv_brev8_64(__x); 107 } 108 #endif 109 110 #if __riscv_xlen == 32 111 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 112 __riscv_unzip_32(uint32_t __x) { 113 return __builtin_riscv_unzip_32(__x); 114 } 115 116 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 117 __riscv_zip_32(uint32_t __x) { 118 return __builtin_riscv_zip_32(__x); 119 } 120 #endif 121 #endif // defined(__riscv_zbkb) 122 123 #if defined(__riscv_zbc) 124 #if __riscv_xlen == 32 125 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 126 __riscv_clmulr_32(uint32_t __x, uint32_t __y) { 127 return __builtin_riscv_clmulr_32(__x, __y); 128 } 129 #endif 130 131 #if __riscv_xlen == 64 132 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 133 __riscv_clmulr_64(uint64_t __x, uint64_t __y) { 134 return __builtin_riscv_clmulr_64(__x, __y); 135 } 136 #endif 137 #endif // defined(__riscv_zbc) 138 139 #if defined(__riscv_zbkc) || defined(__riscv_zbc) 140 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 141 __riscv_clmul_32(uint32_t __x, uint32_t __y) { 142 return __builtin_riscv_clmul_32(__x, __y); 143 } 144 145 #if __riscv_xlen == 32 146 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 147 __riscv_clmulh_32(uint32_t __x, uint32_t __y) { 148 return __builtin_riscv_clmulh_32(__x, __y); 149 } 150 #endif 151 152 #if __riscv_xlen == 64 153 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 154 __riscv_clmul_64(uint64_t __x, uint64_t __y) { 155 return __builtin_riscv_clmul_64(__x, __y); 156 } 157 158 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 159 __riscv_clmulh_64(uint64_t __x, uint64_t __y) { 160 return __builtin_riscv_clmulh_64(__x, __y); 161 } 162 #endif 163 #endif // defined(__riscv_zbkc) || defined(__riscv_zbc) 164 165 #if defined(__riscv_zbkx) 166 #if __riscv_xlen == 32 167 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 168 __riscv_xperm4_32(uint32_t __x, uint32_t __y) { 169 return __builtin_riscv_xperm4_32(__x, __y); 170 } 171 172 static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) 173 __riscv_xperm8_32(uint32_t __x, uint32_t __y) { 174 return __builtin_riscv_xperm8_32(__x, __y); 175 } 176 #endif 177 178 #if __riscv_xlen == 64 179 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 180 __riscv_xperm4_64(uint64_t __x, uint64_t __y) { 181 return __builtin_riscv_xperm4_64(__x, __y); 182 } 183 184 static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) 185 __riscv_xperm8_64(uint64_t __x, uint64_t __y) { 186 return __builtin_riscv_xperm8_64(__x, __y); 187 } 188 #endif 189 #endif // defined(__riscv_zbkx) 190 191 #if defined(__cplusplus) 192 } 193 #endif 194 195 #endif 196