Skip to content

Commit 9126738

Browse files
committed
tests/asm: verify LoongArch inline asm register modifiers
Add assembly tests for LoongArch inline asm register modifiers. Verify that the `w` and `u` modifiers correctly select LSX and LASX register views for `freg`, `vreg`, and `xreg` operands and produce the expected register names in the generated assembly.
1 parent 5e50f24 commit 9126738

1 file changed

Lines changed: 225 additions & 0 deletions

File tree

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
//@ add-minicore
2+
//@ revisions: loongarch32 loongarch64
3+
4+
//@ assembly-output: emit-asm
5+
//@ needs-llvm-components: loongarch
6+
7+
//@[loongarch32] compile-flags: --target loongarch32-unknown-none
8+
//@[loongarch32] compile-flags: -Ctarget-feature=+32s,+lasx
9+
10+
//@[loongarch64] compile-flags: --target loongarch64-unknown-none
11+
//@[loongarch64] compile-flags: -Ctarget-feature=+lasx
12+
13+
//@ compile-flags: -Ctarget-feature=+32s
14+
//@ compile-flags: -Zmerge-functions=disabled
15+
16+
#![feature(no_core, repr_simd)]
17+
#![crate_type = "rlib"]
18+
#![no_core]
19+
#![allow(asm_sub_register)]
20+
21+
extern crate minicore;
22+
use minicore::*;
23+
24+
#[repr(simd)]
25+
pub struct i8x16([i8; 16]);
26+
#[repr(simd)]
27+
pub struct i16x8([i16; 8]);
28+
#[repr(simd)]
29+
pub struct i32x4([i32; 4]);
30+
#[repr(simd)]
31+
pub struct i64x2([i64; 2]);
32+
#[repr(simd)]
33+
pub struct f32x4([f32; 4]);
34+
#[repr(simd)]
35+
pub struct f64x2([f64; 2]);
36+
#[repr(simd)]
37+
pub struct i8x32([i8; 32]);
38+
#[repr(simd)]
39+
pub struct i16x16([i16; 16]);
40+
#[repr(simd)]
41+
pub struct i32x8([i32; 8]);
42+
#[repr(simd)]
43+
pub struct i64x4([i64; 4]);
44+
#[repr(simd)]
45+
pub struct f32x8([f32; 8]);
46+
#[repr(simd)]
47+
pub struct f64x4([f64; 4]);
48+
49+
impl Copy for i8x16 {}
50+
impl Copy for i16x8 {}
51+
impl Copy for i32x4 {}
52+
impl Copy for i64x2 {}
53+
impl Copy for f32x4 {}
54+
impl Copy for f64x2 {}
55+
impl Copy for i8x32 {}
56+
impl Copy for i16x16 {}
57+
impl Copy for i32x8 {}
58+
impl Copy for i64x4 {}
59+
impl Copy for f32x8 {}
60+
impl Copy for f64x4 {}
61+
62+
macro_rules! check { ($func:ident, $ty:ty, $class:ident, $code:literal) => {
63+
#[no_mangle]
64+
pub unsafe fn $func(x: $ty) -> $ty {
65+
let y;
66+
asm!($code, out($class) y, in($class) x);
67+
y
68+
}
69+
};}
70+
71+
// CHECK-LABEL: freg_f32_lsx:
72+
// CHECK: #APP
73+
// CHECK: vfadd.s $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
74+
// CHECK: #NO_APP
75+
check!(freg_f32_lsx, f32, freg, "vfadd.s {1:w}, {0:w}, {0:w}");
76+
77+
// CHECK-LABEL: freg_f64_lasx:
78+
// CHECK: #APP
79+
// CHECK: xvfadd.d $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
80+
// CHECK: #NO_APP
81+
check!(freg_f64_lasx, f64, freg, "xvfadd.d {1:u}, {0:u}, {0:u}");
82+
83+
// CHECK-LABEL: vreg_i8x16_lsx:
84+
// CHECK: #APP
85+
// CHECK: vadd.b $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
86+
// CHECK: #NO_APP
87+
check!(vreg_i8x16_lsx, i8x16, vreg, "vadd.b {1}, {0}, {0}");
88+
89+
// CHECK-LABEL: vreg_i8x16_lasx:
90+
// CHECK: #APP
91+
// CHECK: xvadd.b $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
92+
// CHECK: #NO_APP
93+
check!(vreg_i8x16_lasx, i8x16, vreg, "xvadd.b {1:u}, {0:u}, {0:u}");
94+
95+
// CHECK-LABEL: vreg_i16x8_lsx:
96+
// CHECK: #APP
97+
// CHECK: vadd.h $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
98+
// CHECK: #NO_APP
99+
check!(vreg_i16x8_lsx, i16x8, vreg, "vadd.h {1}, {0}, {0}");
100+
101+
// CHECK-LABEL: vreg_i16x8_lasx:
102+
// CHECK: #APP
103+
// CHECK: xvadd.h $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
104+
// CHECK: #NO_APP
105+
check!(vreg_i16x8_lasx, i16x8, vreg, "xvadd.h {1:u}, {0:u}, {0:u}");
106+
107+
// CHECK-LABEL: vreg_i32x4_lsx:
108+
// CHECK: #APP
109+
// CHECK: vadd.w $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
110+
// CHECK: #NO_APP
111+
check!(vreg_i32x4_lsx, i32x4, vreg, "vadd.w {1}, {0}, {0}");
112+
113+
// CHECK-LABEL: vreg_i32x4_lasx:
114+
// CHECK: #APP
115+
// CHECK: xvadd.w $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
116+
// CHECK: #NO_APP
117+
check!(vreg_i32x4_lasx, i32x4, vreg, "xvadd.w {1:u}, {0:u}, {0:u}");
118+
119+
// CHECK-LABEL: vreg_i64x2_lsx:
120+
// CHECK: #APP
121+
// CHECK: vadd.d $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
122+
// CHECK: #NO_APP
123+
check!(vreg_i64x2_lsx, i64x2, vreg, "vadd.d {1}, {0}, {0}");
124+
125+
// CHECK-LABEL: vreg_i64x2_lasx:
126+
// CHECK: #APP
127+
// CHECK: xvadd.d $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
128+
// CHECK: #NO_APP
129+
check!(vreg_i64x2_lasx, i64x2, vreg, "xvadd.d {1:u}, {0:u}, {0:u}");
130+
131+
// CHECK-LABEL: vreg_f32x4_lsx:
132+
// CHECK: #APP
133+
// CHECK: vfadd.s $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
134+
// CHECK: #NO_APP
135+
check!(vreg_f32x4_lsx, f32x4, vreg, "vfadd.s {1}, {0}, {0}");
136+
137+
// CHECK-LABEL: vreg_f32x4_lasx:
138+
// CHECK: #APP
139+
// CHECK: xvfadd.s $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
140+
// CHECK: #NO_APP
141+
check!(vreg_f32x4_lasx, f32x4, vreg, "xvfadd.s {1:u}, {0:u}, {0:u}");
142+
143+
// CHECK-LABEL: vreg_f64x2_lsx:
144+
// CHECK: #APP
145+
// CHECK: vfadd.d $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
146+
// CHECK: #NO_APP
147+
check!(vreg_f64x2_lsx, f64x2, vreg, "vfadd.d {1}, {0}, {0}");
148+
149+
// CHECK-LABEL: vreg_f64x2_lasx:
150+
// CHECK: #APP
151+
// CHECK: xvfadd.d $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
152+
// CHECK: #NO_APP
153+
check!(vreg_f64x2_lasx, f64x2, vreg, "xvfadd.d {1:u}, {0:u}, {0:u}");
154+
155+
// CHECK-LABEL: xreg_i8x32_lasx:
156+
// CHECK: #APP
157+
// CHECK: xvadd.b $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
158+
// CHECK: #NO_APP
159+
check!(xreg_i8x32_lasx, i8x32, xreg, "xvadd.b {1}, {0}, {0}");
160+
161+
// CHECK-LABEL: xreg_i8x32_lsx:
162+
// CHECK: #APP
163+
// CHECK: vadd.b $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
164+
// CHECK: #NO_APP
165+
check!(xreg_i8x32_lsx, i8x32, xreg, "vadd.b {1:w}, {0:w}, {0:w}");
166+
167+
// CHECK-LABEL: xreg_i16x16_lasx:
168+
// CHECK: #APP
169+
// CHECK: xvadd.h $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
170+
// CHECK: #NO_APP
171+
check!(xreg_i16x16_lasx, i16x16, xreg, "xvadd.h {1}, {0}, {0}");
172+
173+
// CHECK-LABEL: xreg_i16x16_lsx:
174+
// CHECK: #APP
175+
// CHECK: vadd.h $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
176+
// CHECK: #NO_APP
177+
check!(xreg_i16x16_lsx, i16x16, xreg, "vadd.h {1:w}, {0:w}, {0:w}");
178+
179+
// CHECK-LABEL: xreg_i32x8_lasx:
180+
// CHECK: #APP
181+
// CHECK: xvadd.w $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
182+
// CHECK: #NO_APP
183+
check!(xreg_i32x8_lasx, i32x8, xreg, "xvadd.w {1}, {0}, {0}");
184+
185+
// CHECK-LABEL: xreg_i32x8_lsx:
186+
// CHECK: #APP
187+
// CHECK: vadd.w $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
188+
// CHECK: #NO_APP
189+
check!(xreg_i32x8_lsx, i32x8, xreg, "vadd.w {1:w}, {0:w}, {0:w}");
190+
191+
// CHECK-LABEL: xreg_i64x4_lasx:
192+
// CHECK: #APP
193+
// CHECK: xvadd.d $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
194+
// CHECK: #NO_APP
195+
check!(xreg_i64x4_lasx, i64x4, xreg, "xvadd.d {1}, {0}, {0}");
196+
197+
// CHECK-LABEL: xreg_i64x4_lsx:
198+
// CHECK: #APP
199+
// CHECK: vadd.d $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
200+
// CHECK: #NO_APP
201+
check!(xreg_i64x4_lsx, i64x4, xreg, "vadd.d {1:w}, {0:w}, {0:w}");
202+
203+
// CHECK-LABEL: xreg_f32x8_lasx:
204+
// CHECK: #APP
205+
// CHECK: xvfadd.s $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
206+
// CHECK: #NO_APP
207+
check!(xreg_f32x8_lasx, f32x8, xreg, "xvfadd.s {1}, {0}, {0}");
208+
209+
// CHECK-LABEL: xreg_f32x8_lsx:
210+
// CHECK: #APP
211+
// CHECK: vfadd.s $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
212+
// CHECK: #NO_APP
213+
check!(xreg_f32x8_lsx, f32x8, xreg, "vfadd.s {1:w}, {0:w}, {0:w}");
214+
215+
// CHECK-LABEL: xreg_f64x4_lasx:
216+
// CHECK: #APP
217+
// CHECK: xvfadd.d $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}, $xr{{[a-z0-9]+}}
218+
// CHECK: #NO_APP
219+
check!(xreg_f64x4_lasx, f64x4, xreg, "xvfadd.d {1}, {0}, {0}");
220+
221+
// CHECK-LABEL: xreg_f64x4_lsx:
222+
// CHECK: #APP
223+
// CHECK: vfadd.d $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}, $vr{{[a-z0-9]+}}
224+
// CHECK: #NO_APP
225+
check!(xreg_f64x4_lsx, f64x4, xreg, "vfadd.d {1:w}, {0:w}, {0:w}");

0 commit comments

Comments
 (0)