Skip to content

Commit 4e47b16

Browse files
heiherAmanieu
authored andcommitted
core_arch: Add LoongArch basic intrinsics
1 parent 54ac7c8 commit 4e47b16

File tree

1 file changed

+365
-0
lines changed
  • crates/core_arch/src/loongarch64

1 file changed

+365
-0
lines changed

Diff for: crates/core_arch/src/loongarch64/mod.rs

+365
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,368 @@ mod lsx;
77
pub use self::lasx::*;
88
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
99
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

Comments
 (0)