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