@@ -7,3 +7,368 @@ mod lsx;
7
7
pub use self :: lasx:: * ;
8
8
#[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
9
9
pub use self :: lsx:: * ;
10
+
11
+ use crate :: arch:: asm;
12
+
13
+ /// Reads the 64-bit stable counter value and the counter ID
14
+ #[ inline]
15
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
16
+ pub unsafe fn rdtime_d ( ) -> ( i64 , isize ) {
17
+ let val: i64 ;
18
+ let tid: isize ;
19
+ asm ! ( "rdtime.d {}, {}" , out( reg) val, out( reg) tid, options( readonly, nostack) ) ;
20
+ ( val, tid)
21
+ }
22
+
23
+ /// Reads the lower 32-bit stable counter value and the counter ID
24
+ #[ inline]
25
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
26
+ pub unsafe fn rdtimel_w ( ) -> ( i32 , isize ) {
27
+ let val: i32 ;
28
+ let tid: isize ;
29
+ asm ! ( "rdtimel.w {}, {}" , out( reg) val, out( reg) tid, options( readonly, nostack) ) ;
30
+ ( val, tid)
31
+ }
32
+
33
+ /// Reads the upper 32-bit stable counter value and the counter ID
34
+ #[ inline]
35
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
36
+ pub unsafe fn rdtimeh_w ( ) -> ( i32 , isize ) {
37
+ let val: i32 ;
38
+ let tid: isize ;
39
+ asm ! ( "rdtimeh.w {}, {}" , out( reg) val, out( reg) tid, options( readonly, nostack) ) ;
40
+ ( val, tid)
41
+ }
42
+
43
+ #[ allow( improper_ctypes) ]
44
+ extern "unadjusted" {
45
+ #[ link_name = "llvm.loongarch.crc.w.b.w" ]
46
+ fn __crc_w_b_w ( a : i32 , b : i32 ) -> i32 ;
47
+ #[ link_name = "llvm.loongarch.crc.w.h.w" ]
48
+ fn __crc_w_h_w ( a : i32 , b : i32 ) -> i32 ;
49
+ #[ link_name = "llvm.loongarch.crc.w.w.w" ]
50
+ fn __crc_w_w_w ( a : i32 , b : i32 ) -> i32 ;
51
+ #[ link_name = "llvm.loongarch.crc.w.d.w" ]
52
+ fn __crc_w_d_w ( a : i64 , b : i32 ) -> i32 ;
53
+ #[ link_name = "llvm.loongarch.crcc.w.b.w" ]
54
+ fn __crcc_w_b_w ( a : i32 , b : i32 ) -> i32 ;
55
+ #[ link_name = "llvm.loongarch.crcc.w.h.w" ]
56
+ fn __crcc_w_h_w ( a : i32 , b : i32 ) -> i32 ;
57
+ #[ link_name = "llvm.loongarch.crcc.w.w.w" ]
58
+ fn __crcc_w_w_w ( a : i32 , b : i32 ) -> i32 ;
59
+ #[ link_name = "llvm.loongarch.crcc.w.d.w" ]
60
+ fn __crcc_w_d_w ( a : i64 , b : i32 ) -> i32 ;
61
+ #[ link_name = "llvm.loongarch.cacop.d" ]
62
+ fn __cacop ( a : i64 , b : i64 , c : i64 ) ;
63
+ #[ link_name = "llvm.loongarch.dbar" ]
64
+ fn __dbar ( a : i32 ) ;
65
+ #[ link_name = "llvm.loongarch.ibar" ]
66
+ fn __ibar ( a : i32 ) ;
67
+ #[ link_name = "llvm.loongarch.movgr2fcsr" ]
68
+ fn __movgr2fcsr ( a : i32 , b : i32 ) ;
69
+ #[ link_name = "llvm.loongarch.movfcsr2gr" ]
70
+ fn __movfcsr2gr ( a : i32 ) -> i32 ;
71
+ #[ link_name = "llvm.loongarch.csrrd.d" ]
72
+ fn __csrrd ( a : i32 ) -> i64 ;
73
+ #[ link_name = "llvm.loongarch.csrwr.d" ]
74
+ fn __csrwr ( a : i64 , b : i32 ) -> i64 ;
75
+ #[ link_name = "llvm.loongarch.csrxchg.d" ]
76
+ fn __csrxchg ( a : i64 , b : i64 , c : i32 ) -> i64 ;
77
+ #[ link_name = "llvm.loongarch.iocsrrd.b" ]
78
+ fn __iocsrrd_b ( a : i32 ) -> i32 ;
79
+ #[ link_name = "llvm.loongarch.iocsrrd.h" ]
80
+ fn __iocsrrd_h ( a : i32 ) -> i32 ;
81
+ #[ link_name = "llvm.loongarch.iocsrrd.w" ]
82
+ fn __iocsrrd_w ( a : i32 ) -> i32 ;
83
+ #[ link_name = "llvm.loongarch.iocsrrd.d" ]
84
+ fn __iocsrrd_d ( a : i32 ) -> i64 ;
85
+ #[ link_name = "llvm.loongarch.iocsrwr.b" ]
86
+ fn __iocsrwr_b ( a : i32 , b : i32 ) ;
87
+ #[ link_name = "llvm.loongarch.iocsrwr.h" ]
88
+ fn __iocsrwr_h ( a : i32 , b : i32 ) ;
89
+ #[ link_name = "llvm.loongarch.iocsrwr.w" ]
90
+ fn __iocsrwr_w ( a : i32 , b : i32 ) ;
91
+ #[ link_name = "llvm.loongarch.iocsrwr.d" ]
92
+ fn __iocsrwr_d ( a : i64 , b : i32 ) ;
93
+ #[ link_name = "llvm.loongarch.break" ]
94
+ fn __break ( a : i32 ) ;
95
+ #[ link_name = "llvm.loongarch.cpucfg" ]
96
+ fn __cpucfg ( a : i32 ) -> i32 ;
97
+ #[ link_name = "llvm.loongarch.syscall" ]
98
+ fn __syscall ( a : i32 ) ;
99
+ #[ link_name = "llvm.loongarch.asrtle.d" ]
100
+ fn __asrtle ( a : i64 , b : i64 ) ;
101
+ #[ link_name = "llvm.loongarch.asrtgt.d" ]
102
+ fn __asrtgt ( a : i64 , b : i64 ) ;
103
+ #[ link_name = "llvm.loongarch.lddir.d" ]
104
+ fn __lddir ( a : i64 , b : i64 ) -> i64 ;
105
+ #[ link_name = "llvm.loongarch.ldpte.d" ]
106
+ fn __ldpte ( a : i64 , b : i64 ) ;
107
+ #[ link_name = "llvm.loongarch.frecipe.s" ]
108
+ fn __frecipe_s ( a : f32 ) -> f32 ;
109
+ #[ link_name = "llvm.loongarch.frecipe.d" ]
110
+ fn __frecipe_d ( a : f64 ) -> f64 ;
111
+ #[ link_name = "llvm.loongarch.frsqrte.s" ]
112
+ fn __frsqrte_s ( a : f32 ) -> f32 ;
113
+ #[ link_name = "llvm.loongarch.frsqrte.d" ]
114
+ fn __frsqrte_d ( a : f64 ) -> f64 ;
115
+ }
116
+
117
+ /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320)
118
+ #[ inline]
119
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
120
+ pub unsafe fn crc_w_b_w ( a : i32 , b : i32 ) -> i32 {
121
+ __crc_w_b_w ( a, b)
122
+ }
123
+
124
+ /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320)
125
+ #[ inline]
126
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
127
+ pub unsafe fn crc_w_h_w ( a : i32 , b : i32 ) -> i32 {
128
+ __crc_w_h_w ( a, b)
129
+ }
130
+
131
+ /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320)
132
+ #[ inline]
133
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
134
+ pub unsafe fn crc_w_w_w ( a : i32 , b : i32 ) -> i32 {
135
+ __crc_w_w_w ( a, b)
136
+ }
137
+
138
+ /// Calculate the CRC value using the IEEE 802.3 polynomial (0xEDB88320)
139
+ #[ inline]
140
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
141
+ pub unsafe fn crc_w_d_w ( a : i64 , b : i32 ) -> i32 {
142
+ __crc_w_d_w ( a, b)
143
+ }
144
+
145
+ /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78)
146
+ #[ inline]
147
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
148
+ pub unsafe fn crcc_w_b_w ( a : i32 , b : i32 ) -> i32 {
149
+ __crcc_w_b_w ( a, b)
150
+ }
151
+
152
+ /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78)
153
+ #[ inline]
154
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
155
+ pub unsafe fn crcc_w_h_w ( a : i32 , b : i32 ) -> i32 {
156
+ __crcc_w_h_w ( a, b)
157
+ }
158
+
159
+ /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78)
160
+ #[ inline]
161
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
162
+ pub unsafe fn crcc_w_w_w ( a : i32 , b : i32 ) -> i32 {
163
+ __crcc_w_w_w ( a, b)
164
+ }
165
+
166
+ /// Calculate the CRC value using the Castagnoli polynomial (0x82F63B78)
167
+ #[ inline]
168
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
169
+ pub unsafe fn crcc_w_d_w ( a : i64 , b : i32 ) -> i32 {
170
+ __crcc_w_d_w ( a, b)
171
+ }
172
+
173
+ /// Generates the cache operation instruction
174
+ #[ inline]
175
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
176
+ pub unsafe fn cacop < const IMM12 : i64 > ( a : i64 , b : i64 ) {
177
+ static_assert_simm_bits ! ( IMM12 , 12 ) ;
178
+ __cacop ( a, b, IMM12 ) ;
179
+ }
180
+
181
+ /// Generates the memory barrier instruction
182
+ #[ inline]
183
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
184
+ pub unsafe fn dbar < const IMM15 : i32 > ( ) {
185
+ static_assert_uimm_bits ! ( IMM15 , 15 ) ;
186
+ __dbar ( IMM15 ) ;
187
+ }
188
+
189
+ /// Generates the instruction-fetch barrier instruction
190
+ #[ inline]
191
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
192
+ pub unsafe fn ibar < const IMM15 : i32 > ( ) {
193
+ static_assert_uimm_bits ! ( IMM15 , 15 ) ;
194
+ __ibar ( IMM15 ) ;
195
+ }
196
+
197
+ /// Moves data from a GPR to the FCSR
198
+ #[ inline]
199
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
200
+ pub unsafe fn movgr2fcsr < const IMM5 : i32 > ( a : i32 ) {
201
+ static_assert_uimm_bits ! ( IMM5 , 5 ) ;
202
+ __movgr2fcsr ( IMM5 , a) ;
203
+ }
204
+
205
+ /// Moves data from a FCSR to the GPR
206
+ #[ inline]
207
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
208
+ pub unsafe fn movfcsr2gr < const IMM5 : i32 > ( ) -> i32 {
209
+ static_assert_uimm_bits ! ( IMM5 , 5 ) ;
210
+ __movfcsr2gr ( IMM5 )
211
+ }
212
+
213
+ /// Reads the CSR
214
+ #[ inline]
215
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
216
+ pub unsafe fn csrrd < const IMM14 : i32 > ( ) -> i64 {
217
+ static_assert_uimm_bits ! ( IMM14 , 14 ) ;
218
+ __csrrd ( IMM14 )
219
+ }
220
+
221
+ /// Writes the CSR
222
+ #[ inline]
223
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
224
+ pub unsafe fn csrwr < const IMM14 : i32 > ( a : i64 ) -> i64 {
225
+ static_assert_uimm_bits ! ( IMM14 , 14 ) ;
226
+ __csrwr ( a, IMM14 )
227
+ }
228
+
229
+ /// Exchanges the CSR
230
+ #[ inline]
231
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
232
+ pub unsafe fn csrxchg < const IMM14 : i32 > ( a : i64 , b : i64 ) -> i64 {
233
+ static_assert_uimm_bits ! ( IMM14 , 14 ) ;
234
+ __csrxchg ( a, b, IMM14 )
235
+ }
236
+
237
+ /// Reads the 8-bit IO-CSR
238
+ #[ inline]
239
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
240
+ pub unsafe fn iocsrrd_b ( a : i32 ) -> i32 {
241
+ __iocsrrd_b ( a)
242
+ }
243
+
244
+ /// Reads the 16-bit IO-CSR
245
+ #[ inline]
246
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
247
+ pub unsafe fn iocsrrd_h ( a : i32 ) -> i32 {
248
+ __iocsrrd_h ( a)
249
+ }
250
+
251
+ /// Reads the 32-bit IO-CSR
252
+ #[ inline]
253
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
254
+ pub unsafe fn iocsrrd_w ( a : i32 ) -> i32 {
255
+ __iocsrrd_w ( a)
256
+ }
257
+
258
+ /// Reads the 64-bit IO-CSR
259
+ #[ inline]
260
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
261
+ pub unsafe fn iocsrrd_d ( a : i32 ) -> i64 {
262
+ __iocsrrd_d ( a)
263
+ }
264
+
265
+ /// Writes the 8-bit IO-CSR
266
+ #[ inline]
267
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
268
+ pub unsafe fn iocsrwr_b ( a : i32 , b : i32 ) {
269
+ __iocsrwr_b ( a, b)
270
+ }
271
+
272
+ /// Writes the 16-bit IO-CSR
273
+ #[ inline]
274
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
275
+ pub unsafe fn iocsrwr_h ( a : i32 , b : i32 ) {
276
+ __iocsrwr_h ( a, b)
277
+ }
278
+
279
+ /// Writes the 32-bit IO-CSR
280
+ #[ inline]
281
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
282
+ pub unsafe fn iocsrwr_w ( a : i32 , b : i32 ) {
283
+ __iocsrwr_w ( a, b)
284
+ }
285
+
286
+ /// Writes the 64-bit IO-CSR
287
+ #[ inline]
288
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
289
+ pub unsafe fn iocsrwr_d ( a : i64 , b : i32 ) {
290
+ __iocsrwr_d ( a, b)
291
+ }
292
+
293
+ /// Generates the breakpoint instruction
294
+ #[ inline]
295
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
296
+ pub unsafe fn brk < const IMM15 : i32 > ( ) {
297
+ static_assert_uimm_bits ! ( IMM15 , 15 ) ;
298
+ __break ( IMM15 ) ;
299
+ }
300
+
301
+ /// Reads the CPU configuration register
302
+ #[ inline]
303
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
304
+ pub unsafe fn cpucfg ( a : i32 ) -> i32 {
305
+ __cpucfg ( a)
306
+ }
307
+
308
+ /// Generates the syscall instruction
309
+ #[ inline]
310
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
311
+ pub unsafe fn syscall < const IMM15 : i32 > ( ) {
312
+ static_assert_uimm_bits ! ( IMM15 , 15 ) ;
313
+ __syscall ( IMM15 ) ;
314
+ }
315
+
316
+ /// Generates the less-than-or-equal asseration instruction
317
+ #[ inline]
318
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
319
+ pub unsafe fn asrtle ( a : i64 , b : i64 ) {
320
+ __asrtle ( a, b) ;
321
+ }
322
+
323
+ /// Generates the greater-than asseration instruction
324
+ #[ inline]
325
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
326
+ pub unsafe fn asrtgt ( a : i64 , b : i64 ) {
327
+ __asrtgt ( a, b) ;
328
+ }
329
+
330
+ /// Loads the page table directory entry
331
+ #[ inline]
332
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
333
+ pub unsafe fn lddir ( a : i64 , b : i64 ) -> i64 {
334
+ __lddir ( a, b)
335
+ }
336
+
337
+ /// Loads the page table entry
338
+ #[ inline]
339
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
340
+ pub unsafe fn ldpte ( a : i64 , b : i64 ) {
341
+ __ldpte ( a, b)
342
+ }
343
+
344
+ /// Calculate the approximate single-precision result of 1.0 divided
345
+ #[ inline]
346
+ #[ target_feature( enable = "frecipe" ) ]
347
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
348
+ pub unsafe fn frecipe_s ( a : f32 ) -> f32 {
349
+ __frecipe_s ( a)
350
+ }
351
+
352
+ /// Calculate the approximate double-precision result of 1.0 divided
353
+ #[ inline]
354
+ #[ target_feature( enable = "frecipe" ) ]
355
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
356
+ pub unsafe fn frecipe_d ( a : f64 ) -> f64 {
357
+ __frecipe_d ( a)
358
+ }
359
+
360
+ /// Calculate the approximate single-precision result of dividing 1.0 by the square root
361
+ #[ inline]
362
+ #[ target_feature( enable = "frecipe" ) ]
363
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
364
+ pub unsafe fn frsqrte_s ( a : f32 ) -> f32 {
365
+ __frsqrte_s ( a)
366
+ }
367
+
368
+ /// Calculate the approximate double-precision result of dividing 1.0 by the square root
369
+ #[ inline]
370
+ #[ target_feature( enable = "frecipe" ) ]
371
+ #[ unstable( feature = "stdarch_loongarch" , issue = "117427" ) ]
372
+ pub unsafe fn frsqrte_d ( a : f64 ) -> f64 {
373
+ __frsqrte_d ( a)
374
+ }
0 commit comments