Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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
14
extern "C" {
15
#endif
16
 
17
typedef struct rdtime {
18
  unsigned int value;
19
  unsigned int timeid;
20
} __rdtime_t;
21
 
22
#if __loongarch_grlen == 64
23
typedef struct drdtime {
24
  unsigned long dvalue;
25
  unsigned long dtimeid;
26
} __drdtime_t;
27
 
28
extern __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
 
39
extern __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
 
48
extern __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
58
extern __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
 
64
extern __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
 
70
extern __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
 
76
extern __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
 
82
extern __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
 
88
extern __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
 
94
extern __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
 
100
extern __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
#define __movfcsr2gr(/*ui5*/ _1) __builtin_loongarch_movfcsr2gr((_1));
124
 
125
#define __movgr2fcsr(/*ui5*/ _1, _2)                                           \
126
  __builtin_loongarch_movgr2fcsr((_1), (unsigned int)_2);
127
 
128
#define __syscall(/*ui15*/ _1) __builtin_loongarch_syscall((_1))
129
 
130
#define __csrrd_w(/*ui14*/ _1) ((unsigned int)__builtin_loongarch_csrrd_w((_1)))
131
 
132
#define __csrwr_w(/*unsigned int*/ _1, /*ui14*/ _2)                            \
133
  ((unsigned int)__builtin_loongarch_csrwr_w((unsigned int)(_1), (_2)))
134
 
135
#define __csrxchg_w(/*unsigned int*/ _1, /*unsigned int*/ _2, /*ui14*/ _3)     \
136
  ((unsigned int)__builtin_loongarch_csrxchg_w((unsigned int)(_1),             \
137
                                               (unsigned int)(_2), (_3)))
138
 
139
#if __loongarch_grlen == 64
140
#define __csrrd_d(/*ui14*/ _1)                                                 \
141
  ((unsigned long int)__builtin_loongarch_csrrd_d((_1)))
142
 
143
#define __csrwr_d(/*unsigned long int*/ _1, /*ui14*/ _2)                       \
144
  ((unsigned long int)__builtin_loongarch_csrwr_d((unsigned long int)(_1),     \
145
                                                  (_2)))
146
 
147
#define __csrxchg_d(/*unsigned long int*/ _1, /*unsigned long int*/ _2,        \
148
                    /*ui14*/ _3)                                               \
149
  ((unsigned long int)__builtin_loongarch_csrxchg_d(                           \
150
      (unsigned long int)(_1), (unsigned long int)(_2), (_3)))
151
#endif
152
 
153
extern __inline unsigned char
154
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
155
    __iocsrrd_b(unsigned int _1) {
156
  return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1);
157
}
158
 
159
extern __inline unsigned char
160
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
161
    __iocsrrd_h(unsigned int _1) {
162
  return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1);
163
}
164
 
165
extern __inline unsigned int
166
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
167
    __iocsrrd_w(unsigned int _1) {
168
  return (unsigned int)__builtin_loongarch_iocsrrd_w((unsigned int)_1);
169
}
170
 
171
#if __loongarch_grlen == 64
172
extern __inline unsigned long int
173
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
174
    __iocsrrd_d(unsigned int _1) {
175
  return (unsigned long int)__builtin_loongarch_iocsrrd_d((unsigned int)_1);
176
}
177
#endif
178
 
179
extern __inline void
180
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
181
    __iocsrwr_b(unsigned char _1, unsigned int _2) {
182
  __builtin_loongarch_iocsrwr_b((unsigned char)_1, (unsigned int)_2);
183
}
184
 
185
extern __inline void
186
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
187
    __iocsrwr_h(unsigned short _1, unsigned int _2) {
188
  __builtin_loongarch_iocsrwr_h((unsigned short)_1, (unsigned int)_2);
189
}
190
 
191
extern __inline void
192
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
193
    __iocsrwr_w(unsigned int _1, unsigned int _2) {
194
  __builtin_loongarch_iocsrwr_w((unsigned int)_1, (unsigned int)_2);
195
}
196
 
197
extern __inline unsigned int
198
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
199
    __cpucfg(unsigned int _1) {
200
  return (unsigned int)__builtin_loongarch_cpucfg((unsigned int)_1);
201
}
202
 
203
#if __loongarch_grlen == 64
204
extern __inline void
205
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
206
    __iocsrwr_d(unsigned long int _1, unsigned int _2) {
207
  __builtin_loongarch_iocsrwr_d((unsigned long int)_1, (unsigned int)_2);
208
}
209
 
210
extern __inline void
211
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
212
    __asrtgt_d(long int _1, long int _2) {
213
  __builtin_loongarch_asrtgt_d((long int)_1, (long int)_2);
214
}
215
 
216
extern __inline void
217
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
218
    __asrtle_d(long int _1, long int _2) {
219
  __builtin_loongarch_asrtle_d((long int)_1, (long int)_2);
220
}
221
#endif
222
 
223
#if __loongarch_grlen == 64
224
#define __lddir_d(/*long int*/ _1, /*ui5*/ _2)                                 \
225
  ((long int)__builtin_loongarch_lddir_d((long int)(_1), (_2)))
226
 
227
#define __ldpte_d(/*long int*/ _1, /*ui5*/ _2)                                 \
228
  ((void)__builtin_loongarch_ldpte_d((long int)(_1), (_2)))
229
#endif
230
 
231
#ifdef __cplusplus
232
}
233
#endif
234
#endif /* _LOONGARCH_BASE_INTRIN_H */