10#ifndef _LOONGARCH_BASE_INTRIN_H
11#define _LOONGARCH_BASE_INTRIN_H
22#if __loongarch_grlen == 64
23typedef struct drdtime {
25 unsigned long dtimeid;
28extern __inline __drdtime_t
29 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
31 __drdtime_t __drdtime;
33 "rdtime.d %[val], %[tid]\n\t"
34 : [val]
"=&r"(__drdtime.dvalue), [tid]
"=&r"(__drdtime.dtimeid));
43 __asm__ volatile(
"rdtimeh.w %[val], %[tid]\n\t"
44 : [val]
"=&r"(__rdtime.
value), [tid]
"=&r"(__rdtime.
timeid));
49 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
52 __asm__ volatile(
"rdtimel.w %[val], %[tid]\n\t"
53 : [val]
"=&r"(__rdtime.
value), [tid]
"=&r"(__rdtime.
timeid));
57#if __loongarch_grlen == 64
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);
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);
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);
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);
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);
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);
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);
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);
107#define __break( _1) __builtin_loongarch_break((_1))
109#if __loongarch_grlen == 32
110#define __cacop_w( _1, _2, _3) \
111 ((void)__builtin_loongarch_cacop_w((_1), (unsigned int)(_2), (_3)))
114#if __loongarch_grlen == 64
115#define __cacop_d( _1, _2, _3) \
116 ((void)__builtin_loongarch_cacop_d((_1), (unsigned long int)(_2), (_3)))
119#define __dbar( _1) __builtin_loongarch_dbar((_1))
121#define __ibar( _1) __builtin_loongarch_ibar((_1))
123#ifdef __loongarch_hard_float
124#define __movfcsr2gr( _1) __builtin_loongarch_movfcsr2gr((_1));
126#define __movgr2fcsr( _1, _2) \
127 __builtin_loongarch_movgr2fcsr((_1), (unsigned int)_2);
130#define __syscall( _1) __builtin_loongarch_syscall((_1))
132#define __csrrd_w( _1) ((unsigned int)__builtin_loongarch_csrrd_w((_1)))
134#define __csrwr_w( _1, _2) \
135 ((unsigned int)__builtin_loongarch_csrwr_w((unsigned int)(_1), (_2)))
137#define __csrxchg_w( _1, _2, _3) \
138 ((unsigned int)__builtin_loongarch_csrxchg_w((unsigned int)(_1), \
139 (unsigned int)(_2), (_3)))
141#if __loongarch_grlen == 64
142#define __csrrd_d( _1) \
143 ((unsigned long int)__builtin_loongarch_csrrd_d((_1)))
145#define __csrwr_d( _1, _2) \
146 ((unsigned long int)__builtin_loongarch_csrwr_d((unsigned long int)(_1), \
149#define __csrxchg_d( _1, _2, \
151 ((unsigned long int)__builtin_loongarch_csrxchg_d( \
152 (unsigned long int)(_1), (unsigned long int)(_2), (_3)))
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);
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);
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);
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);
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);
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);
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);
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);
205#if __loongarch_grlen == 64
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);
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);
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);
225#if __loongarch_grlen == 64
226#define __lddir_d( _1, _2) \
227 ((long int)__builtin_loongarch_lddir_d((long int)(_1), (_2)))
229#define __ldpte_d( _1, _2) \
230 ((void)__builtin_loongarch_ldpte_d((long int)(_1), (_2)))
233#ifdef __loongarch_frecipe
235 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
236 __frecipe_s(
float _1) {
237 return __builtin_loongarch_frecipe_s(_1);
240extern __inline
double
241 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
242 __frecipe_d(
double _1) {
243 return __builtin_loongarch_frecipe_d(_1);
247 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
248 __frsqrte_s(
float _1) {
249 return __builtin_loongarch_frsqrte_s(_1);
252extern __inline
double
253 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
254 __frsqrte_d(
double _1) {
255 return __builtin_loongarch_frsqrte_d(_1);
_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