xref: /aosp_15_r20/prebuilts/clang-tools/linux-x86/clang-headers/larchintrin.h (revision bed243d3d9cd544cfb038bfa7be843dedc6e6bf7)
1*bed243d3SAndroid Build Coastguard Worker /*===------------ larchintrin.h - LoongArch intrinsics ---------------------===
2*bed243d3SAndroid Build Coastguard Worker  *
3*bed243d3SAndroid Build Coastguard Worker  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker  * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker  *
7*bed243d3SAndroid Build Coastguard Worker  *===-----------------------------------------------------------------------===
8*bed243d3SAndroid Build Coastguard Worker  */
9*bed243d3SAndroid Build Coastguard Worker 
10*bed243d3SAndroid Build Coastguard Worker #ifndef _LOONGARCH_BASE_INTRIN_H
11*bed243d3SAndroid Build Coastguard Worker #define _LOONGARCH_BASE_INTRIN_H
12*bed243d3SAndroid Build Coastguard Worker 
13*bed243d3SAndroid Build Coastguard Worker #ifdef __cplusplus
14*bed243d3SAndroid Build Coastguard Worker extern "C" {
15*bed243d3SAndroid Build Coastguard Worker #endif
16*bed243d3SAndroid Build Coastguard Worker 
17*bed243d3SAndroid Build Coastguard Worker typedef struct rdtime {
18*bed243d3SAndroid Build Coastguard Worker   unsigned int value;
19*bed243d3SAndroid Build Coastguard Worker   unsigned int timeid;
20*bed243d3SAndroid Build Coastguard Worker } __rdtime_t;
21*bed243d3SAndroid Build Coastguard Worker 
22*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
23*bed243d3SAndroid Build Coastguard Worker typedef struct drdtime {
24*bed243d3SAndroid Build Coastguard Worker   unsigned long dvalue;
25*bed243d3SAndroid Build Coastguard Worker   unsigned long dtimeid;
26*bed243d3SAndroid Build Coastguard Worker } __drdtime_t;
27*bed243d3SAndroid Build Coastguard Worker 
28*bed243d3SAndroid Build Coastguard Worker extern __inline __drdtime_t
29*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__rdtime_d(void)30*bed243d3SAndroid Build Coastguard Worker     __rdtime_d(void) {
31*bed243d3SAndroid Build Coastguard Worker   __drdtime_t __drdtime;
32*bed243d3SAndroid Build Coastguard Worker   __asm__ volatile(
33*bed243d3SAndroid Build Coastguard Worker       "rdtime.d %[val], %[tid]\n\t"
34*bed243d3SAndroid Build Coastguard Worker       : [val] "=&r"(__drdtime.dvalue), [tid] "=&r"(__drdtime.dtimeid));
35*bed243d3SAndroid Build Coastguard Worker   return __drdtime;
36*bed243d3SAndroid Build Coastguard Worker }
37*bed243d3SAndroid Build Coastguard Worker #endif
38*bed243d3SAndroid Build Coastguard Worker 
39*bed243d3SAndroid Build Coastguard Worker extern __inline __rdtime_t
40*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__rdtimeh_w(void)41*bed243d3SAndroid Build Coastguard Worker     __rdtimeh_w(void) {
42*bed243d3SAndroid Build Coastguard Worker   __rdtime_t __rdtime;
43*bed243d3SAndroid Build Coastguard Worker   __asm__ volatile("rdtimeh.w %[val], %[tid]\n\t"
44*bed243d3SAndroid Build Coastguard Worker                    : [val] "=&r"(__rdtime.value), [tid] "=&r"(__rdtime.timeid));
45*bed243d3SAndroid Build Coastguard Worker   return __rdtime;
46*bed243d3SAndroid Build Coastguard Worker }
47*bed243d3SAndroid Build Coastguard Worker 
48*bed243d3SAndroid Build Coastguard Worker extern __inline __rdtime_t
49*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__rdtimel_w(void)50*bed243d3SAndroid Build Coastguard Worker     __rdtimel_w(void) {
51*bed243d3SAndroid Build Coastguard Worker   __rdtime_t __rdtime;
52*bed243d3SAndroid Build Coastguard Worker   __asm__ volatile("rdtimel.w %[val], %[tid]\n\t"
53*bed243d3SAndroid Build Coastguard Worker                    : [val] "=&r"(__rdtime.value), [tid] "=&r"(__rdtime.timeid));
54*bed243d3SAndroid Build Coastguard Worker   return __rdtime;
55*bed243d3SAndroid Build Coastguard Worker }
56*bed243d3SAndroid Build Coastguard Worker 
57*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
58*bed243d3SAndroid Build Coastguard Worker extern __inline int
59*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crc_w_b_w(char _1,int _2)60*bed243d3SAndroid Build Coastguard Worker     __crc_w_b_w(char _1, int _2) {
61*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crc_w_b_w((char)_1, (int)_2);
62*bed243d3SAndroid Build Coastguard Worker }
63*bed243d3SAndroid Build Coastguard Worker 
64*bed243d3SAndroid Build Coastguard Worker extern __inline int
65*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crc_w_h_w(short _1,int _2)66*bed243d3SAndroid Build Coastguard Worker     __crc_w_h_w(short _1, int _2) {
67*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crc_w_h_w((short)_1, (int)_2);
68*bed243d3SAndroid Build Coastguard Worker }
69*bed243d3SAndroid Build Coastguard Worker 
70*bed243d3SAndroid Build Coastguard Worker extern __inline int
71*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crc_w_w_w(int _1,int _2)72*bed243d3SAndroid Build Coastguard Worker     __crc_w_w_w(int _1, int _2) {
73*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crc_w_w_w((int)_1, (int)_2);
74*bed243d3SAndroid Build Coastguard Worker }
75*bed243d3SAndroid Build Coastguard Worker 
76*bed243d3SAndroid Build Coastguard Worker extern __inline int
77*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crc_w_d_w(long int _1,int _2)78*bed243d3SAndroid Build Coastguard Worker     __crc_w_d_w(long int _1, int _2) {
79*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crc_w_d_w((long int)_1, (int)_2);
80*bed243d3SAndroid Build Coastguard Worker }
81*bed243d3SAndroid Build Coastguard Worker 
82*bed243d3SAndroid Build Coastguard Worker extern __inline int
83*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crcc_w_b_w(char _1,int _2)84*bed243d3SAndroid Build Coastguard Worker     __crcc_w_b_w(char _1, int _2) {
85*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crcc_w_b_w((char)_1, (int)_2);
86*bed243d3SAndroid Build Coastguard Worker }
87*bed243d3SAndroid Build Coastguard Worker 
88*bed243d3SAndroid Build Coastguard Worker extern __inline int
89*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crcc_w_h_w(short _1,int _2)90*bed243d3SAndroid Build Coastguard Worker     __crcc_w_h_w(short _1, int _2) {
91*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crcc_w_h_w((short)_1, (int)_2);
92*bed243d3SAndroid Build Coastguard Worker }
93*bed243d3SAndroid Build Coastguard Worker 
94*bed243d3SAndroid Build Coastguard Worker extern __inline int
95*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crcc_w_w_w(int _1,int _2)96*bed243d3SAndroid Build Coastguard Worker     __crcc_w_w_w(int _1, int _2) {
97*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crcc_w_w_w((int)_1, (int)_2);
98*bed243d3SAndroid Build Coastguard Worker }
99*bed243d3SAndroid Build Coastguard Worker 
100*bed243d3SAndroid Build Coastguard Worker extern __inline int
101*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__crcc_w_d_w(long int _1,int _2)102*bed243d3SAndroid Build Coastguard Worker     __crcc_w_d_w(long int _1, int _2) {
103*bed243d3SAndroid Build Coastguard Worker   return (int)__builtin_loongarch_crcc_w_d_w((long int)_1, (int)_2);
104*bed243d3SAndroid Build Coastguard Worker }
105*bed243d3SAndroid Build Coastguard Worker #endif
106*bed243d3SAndroid Build Coastguard Worker 
107*bed243d3SAndroid Build Coastguard Worker #define __break(/*ui15*/ _1) __builtin_loongarch_break((_1))
108*bed243d3SAndroid Build Coastguard Worker 
109*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 32
110*bed243d3SAndroid Build Coastguard Worker #define __cacop_w(/*uimm5*/ _1, /*unsigned int*/ _2, /*simm12*/ _3)            \
111*bed243d3SAndroid Build Coastguard Worker   ((void)__builtin_loongarch_cacop_w((_1), (unsigned int)(_2), (_3)))
112*bed243d3SAndroid Build Coastguard Worker #endif
113*bed243d3SAndroid Build Coastguard Worker 
114*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
115*bed243d3SAndroid Build Coastguard Worker #define __cacop_d(/*uimm5*/ _1, /*unsigned long int*/ _2, /*simm12*/ _3)       \
116*bed243d3SAndroid Build Coastguard Worker   ((void)__builtin_loongarch_cacop_d((_1), (unsigned long int)(_2), (_3)))
117*bed243d3SAndroid Build Coastguard Worker #endif
118*bed243d3SAndroid Build Coastguard Worker 
119*bed243d3SAndroid Build Coastguard Worker #define __dbar(/*ui15*/ _1) __builtin_loongarch_dbar((_1))
120*bed243d3SAndroid Build Coastguard Worker 
121*bed243d3SAndroid Build Coastguard Worker #define __ibar(/*ui15*/ _1) __builtin_loongarch_ibar((_1))
122*bed243d3SAndroid Build Coastguard Worker 
123*bed243d3SAndroid Build Coastguard Worker #define __movfcsr2gr(/*ui5*/ _1) __builtin_loongarch_movfcsr2gr((_1));
124*bed243d3SAndroid Build Coastguard Worker 
125*bed243d3SAndroid Build Coastguard Worker #define __movgr2fcsr(/*ui5*/ _1, _2)                                           \
126*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_movgr2fcsr((_1), (unsigned int)_2);
127*bed243d3SAndroid Build Coastguard Worker 
128*bed243d3SAndroid Build Coastguard Worker #define __syscall(/*ui15*/ _1) __builtin_loongarch_syscall((_1))
129*bed243d3SAndroid Build Coastguard Worker 
130*bed243d3SAndroid Build Coastguard Worker #define __csrrd_w(/*ui14*/ _1) ((unsigned int)__builtin_loongarch_csrrd_w((_1)))
131*bed243d3SAndroid Build Coastguard Worker 
132*bed243d3SAndroid Build Coastguard Worker #define __csrwr_w(/*unsigned int*/ _1, /*ui14*/ _2)                            \
133*bed243d3SAndroid Build Coastguard Worker   ((unsigned int)__builtin_loongarch_csrwr_w((unsigned int)(_1), (_2)))
134*bed243d3SAndroid Build Coastguard Worker 
135*bed243d3SAndroid Build Coastguard Worker #define __csrxchg_w(/*unsigned int*/ _1, /*unsigned int*/ _2, /*ui14*/ _3)     \
136*bed243d3SAndroid Build Coastguard Worker   ((unsigned int)__builtin_loongarch_csrxchg_w((unsigned int)(_1),             \
137*bed243d3SAndroid Build Coastguard Worker                                                (unsigned int)(_2), (_3)))
138*bed243d3SAndroid Build Coastguard Worker 
139*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
140*bed243d3SAndroid Build Coastguard Worker #define __csrrd_d(/*ui14*/ _1)                                                 \
141*bed243d3SAndroid Build Coastguard Worker   ((unsigned long int)__builtin_loongarch_csrrd_d((_1)))
142*bed243d3SAndroid Build Coastguard Worker 
143*bed243d3SAndroid Build Coastguard Worker #define __csrwr_d(/*unsigned long int*/ _1, /*ui14*/ _2)                       \
144*bed243d3SAndroid Build Coastguard Worker   ((unsigned long int)__builtin_loongarch_csrwr_d((unsigned long int)(_1),     \
145*bed243d3SAndroid Build Coastguard Worker                                                   (_2)))
146*bed243d3SAndroid Build Coastguard Worker 
147*bed243d3SAndroid Build Coastguard Worker #define __csrxchg_d(/*unsigned long int*/ _1, /*unsigned long int*/ _2,        \
148*bed243d3SAndroid Build Coastguard Worker                     /*ui14*/ _3)                                               \
149*bed243d3SAndroid Build Coastguard Worker   ((unsigned long int)__builtin_loongarch_csrxchg_d(                           \
150*bed243d3SAndroid Build Coastguard Worker       (unsigned long int)(_1), (unsigned long int)(_2), (_3)))
151*bed243d3SAndroid Build Coastguard Worker #endif
152*bed243d3SAndroid Build Coastguard Worker 
153*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned char
154*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrrd_b(unsigned int _1)155*bed243d3SAndroid Build Coastguard Worker     __iocsrrd_b(unsigned int _1) {
156*bed243d3SAndroid Build Coastguard Worker   return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1);
157*bed243d3SAndroid Build Coastguard Worker }
158*bed243d3SAndroid Build Coastguard Worker 
159*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned short
160*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrrd_h(unsigned int _1)161*bed243d3SAndroid Build Coastguard Worker     __iocsrrd_h(unsigned int _1) {
162*bed243d3SAndroid Build Coastguard Worker   return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1);
163*bed243d3SAndroid Build Coastguard Worker }
164*bed243d3SAndroid Build Coastguard Worker 
165*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned int
166*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrrd_w(unsigned int _1)167*bed243d3SAndroid Build Coastguard Worker     __iocsrrd_w(unsigned int _1) {
168*bed243d3SAndroid Build Coastguard Worker   return (unsigned int)__builtin_loongarch_iocsrrd_w((unsigned int)_1);
169*bed243d3SAndroid Build Coastguard Worker }
170*bed243d3SAndroid Build Coastguard Worker 
171*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
172*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned long int
173*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrrd_d(unsigned int _1)174*bed243d3SAndroid Build Coastguard Worker     __iocsrrd_d(unsigned int _1) {
175*bed243d3SAndroid Build Coastguard Worker   return (unsigned long int)__builtin_loongarch_iocsrrd_d((unsigned int)_1);
176*bed243d3SAndroid Build Coastguard Worker }
177*bed243d3SAndroid Build Coastguard Worker #endif
178*bed243d3SAndroid Build Coastguard Worker 
179*bed243d3SAndroid Build Coastguard Worker extern __inline void
180*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrwr_b(unsigned char _1,unsigned int _2)181*bed243d3SAndroid Build Coastguard Worker     __iocsrwr_b(unsigned char _1, unsigned int _2) {
182*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_iocsrwr_b((unsigned char)_1, (unsigned int)_2);
183*bed243d3SAndroid Build Coastguard Worker }
184*bed243d3SAndroid Build Coastguard Worker 
185*bed243d3SAndroid Build Coastguard Worker extern __inline void
186*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrwr_h(unsigned short _1,unsigned int _2)187*bed243d3SAndroid Build Coastguard Worker     __iocsrwr_h(unsigned short _1, unsigned int _2) {
188*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_iocsrwr_h((unsigned short)_1, (unsigned int)_2);
189*bed243d3SAndroid Build Coastguard Worker }
190*bed243d3SAndroid Build Coastguard Worker 
191*bed243d3SAndroid Build Coastguard Worker extern __inline void
192*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrwr_w(unsigned int _1,unsigned int _2)193*bed243d3SAndroid Build Coastguard Worker     __iocsrwr_w(unsigned int _1, unsigned int _2) {
194*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_iocsrwr_w((unsigned int)_1, (unsigned int)_2);
195*bed243d3SAndroid Build Coastguard Worker }
196*bed243d3SAndroid Build Coastguard Worker 
197*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned int
198*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__cpucfg(unsigned int _1)199*bed243d3SAndroid Build Coastguard Worker     __cpucfg(unsigned int _1) {
200*bed243d3SAndroid Build Coastguard Worker   return (unsigned int)__builtin_loongarch_cpucfg((unsigned int)_1);
201*bed243d3SAndroid Build Coastguard Worker }
202*bed243d3SAndroid Build Coastguard Worker 
203*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
204*bed243d3SAndroid Build Coastguard Worker extern __inline void
205*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__iocsrwr_d(unsigned long int _1,unsigned int _2)206*bed243d3SAndroid Build Coastguard Worker     __iocsrwr_d(unsigned long int _1, unsigned int _2) {
207*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_iocsrwr_d((unsigned long int)_1, (unsigned int)_2);
208*bed243d3SAndroid Build Coastguard Worker }
209*bed243d3SAndroid Build Coastguard Worker 
210*bed243d3SAndroid Build Coastguard Worker extern __inline void
211*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__asrtgt_d(long int _1,long int _2)212*bed243d3SAndroid Build Coastguard Worker     __asrtgt_d(long int _1, long int _2) {
213*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_asrtgt_d((long int)_1, (long int)_2);
214*bed243d3SAndroid Build Coastguard Worker }
215*bed243d3SAndroid Build Coastguard Worker 
216*bed243d3SAndroid Build Coastguard Worker extern __inline void
217*bed243d3SAndroid Build Coastguard Worker     __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__asrtle_d(long int _1,long int _2)218*bed243d3SAndroid Build Coastguard Worker     __asrtle_d(long int _1, long int _2) {
219*bed243d3SAndroid Build Coastguard Worker   __builtin_loongarch_asrtle_d((long int)_1, (long int)_2);
220*bed243d3SAndroid Build Coastguard Worker }
221*bed243d3SAndroid Build Coastguard Worker #endif
222*bed243d3SAndroid Build Coastguard Worker 
223*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64
224*bed243d3SAndroid Build Coastguard Worker #define __lddir_d(/*long int*/ _1, /*ui5*/ _2)                                 \
225*bed243d3SAndroid Build Coastguard Worker   ((long int)__builtin_loongarch_lddir_d((long int)(_1), (_2)))
226*bed243d3SAndroid Build Coastguard Worker 
227*bed243d3SAndroid Build Coastguard Worker #define __ldpte_d(/*long int*/ _1, /*ui5*/ _2)                                 \
228*bed243d3SAndroid Build Coastguard Worker   ((void)__builtin_loongarch_ldpte_d((long int)(_1), (_2)))
229*bed243d3SAndroid Build Coastguard Worker #endif
230*bed243d3SAndroid Build Coastguard Worker 
231*bed243d3SAndroid Build Coastguard Worker #define __frecipe_s(/*float*/ _1)                                              \
232*bed243d3SAndroid Build Coastguard Worker   (float)__builtin_loongarch_frecipe_s((float)_1)
233*bed243d3SAndroid Build Coastguard Worker 
234*bed243d3SAndroid Build Coastguard Worker #define __frecipe_d(/*double*/ _1)                                             \
235*bed243d3SAndroid Build Coastguard Worker   (double)__builtin_loongarch_frecipe_d((double)_1)
236*bed243d3SAndroid Build Coastguard Worker 
237*bed243d3SAndroid Build Coastguard Worker #define __frsqrte_s(/*float*/ _1)                                              \
238*bed243d3SAndroid Build Coastguard Worker   (float)__builtin_loongarch_frsqrte_s((float)_1)
239*bed243d3SAndroid Build Coastguard Worker 
240*bed243d3SAndroid Build Coastguard Worker #define __frsqrte_d(/*double*/ _1)                                             \
241*bed243d3SAndroid Build Coastguard Worker   (double)__builtin_loongarch_frsqrte_d((double)_1)
242*bed243d3SAndroid Build Coastguard Worker 
243*bed243d3SAndroid Build Coastguard Worker #ifdef __cplusplus
244*bed243d3SAndroid Build Coastguard Worker }
245*bed243d3SAndroid Build Coastguard Worker #endif
246*bed243d3SAndroid Build Coastguard Worker #endif /* _LOONGARCH_BASE_INTRIN_H */
247