Skip to content

Commit 29a0f3e

Browse files
authored
[LoongArch] Add some binary IR instructions testcases for LSX (#73929)
The IR instructions include: - Binary Operations: add fadd sub fsub mul fmul udiv sdiv fdiv - Bitwise Binary Operations: shl lshr ashr
1 parent c44dca1 commit 29a0f3e

File tree

12 files changed

+1412
-0
lines changed

12 files changed

+1412
-0
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @add_v16i8(ptr %res, ptr %a0, ptr %a1) nounwind {
5+
; CHECK-LABEL: add_v16i8:
6+
; CHECK: # %bb.0: # %entry
7+
; CHECK-NEXT: vld $vr0, $a2, 0
8+
; CHECK-NEXT: vld $vr1, $a1, 0
9+
; CHECK-NEXT: vadd.b $vr0, $vr1, $vr0
10+
; CHECK-NEXT: vst $vr0, $a0, 0
11+
; CHECK-NEXT: ret
12+
entry:
13+
%v0 = load <16 x i8>, ptr %a0
14+
%v1 = load <16 x i8>, ptr %a1
15+
%v2 = add <16 x i8> %v0, %v1
16+
store <16 x i8> %v2, ptr %res
17+
ret void
18+
}
19+
20+
define void @add_v8i16(ptr %res, ptr %a0, ptr %a1) nounwind {
21+
; CHECK-LABEL: add_v8i16:
22+
; CHECK: # %bb.0: # %entry
23+
; CHECK-NEXT: vld $vr0, $a2, 0
24+
; CHECK-NEXT: vld $vr1, $a1, 0
25+
; CHECK-NEXT: vadd.h $vr0, $vr1, $vr0
26+
; CHECK-NEXT: vst $vr0, $a0, 0
27+
; CHECK-NEXT: ret
28+
entry:
29+
%v0 = load <8 x i16>, ptr %a0
30+
%v1 = load <8 x i16>, ptr %a1
31+
%v2 = add <8 x i16> %v0, %v1
32+
store <8 x i16> %v2, ptr %res
33+
ret void
34+
}
35+
36+
define void @add_v4i32(ptr %res, ptr %a0, ptr %a1) nounwind {
37+
; CHECK-LABEL: add_v4i32:
38+
; CHECK: # %bb.0: # %entry
39+
; CHECK-NEXT: vld $vr0, $a2, 0
40+
; CHECK-NEXT: vld $vr1, $a1, 0
41+
; CHECK-NEXT: vadd.w $vr0, $vr1, $vr0
42+
; CHECK-NEXT: vst $vr0, $a0, 0
43+
; CHECK-NEXT: ret
44+
entry:
45+
%v0 = load <4 x i32>, ptr %a0
46+
%v1 = load <4 x i32>, ptr %a1
47+
%v2 = add <4 x i32> %v0, %v1
48+
store <4 x i32> %v2, ptr %res
49+
ret void
50+
}
51+
52+
define void @add_v2i64(ptr %res, ptr %a0, ptr %a1) nounwind {
53+
; CHECK-LABEL: add_v2i64:
54+
; CHECK: # %bb.0: # %entry
55+
; CHECK-NEXT: vld $vr0, $a2, 0
56+
; CHECK-NEXT: vld $vr1, $a1, 0
57+
; CHECK-NEXT: vadd.d $vr0, $vr1, $vr0
58+
; CHECK-NEXT: vst $vr0, $a0, 0
59+
; CHECK-NEXT: ret
60+
entry:
61+
%v0 = load <2 x i64>, ptr %a0
62+
%v1 = load <2 x i64>, ptr %a1
63+
%v2 = add <2 x i64> %v0, %v1
64+
store <2 x i64> %v2, ptr %res
65+
ret void
66+
}
67+
68+
define void @add_v16i8_31(ptr %res, ptr %a0) nounwind {
69+
; CHECK-LABEL: add_v16i8_31:
70+
; CHECK: # %bb.0: # %entry
71+
; CHECK-NEXT: vld $vr0, $a1, 0
72+
; CHECK-NEXT: vaddi.bu $vr0, $vr0, 31
73+
; CHECK-NEXT: vst $vr0, $a0, 0
74+
; CHECK-NEXT: ret
75+
entry:
76+
%v0 = load <16 x i8>, ptr %a0
77+
%v1 = add <16 x i8> %v0, <i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31>
78+
store <16 x i8> %v1, ptr %res
79+
ret void
80+
}
81+
82+
define void @add_v8i16_31(ptr %res, ptr %a0) nounwind {
83+
; CHECK-LABEL: add_v8i16_31:
84+
; CHECK: # %bb.0: # %entry
85+
; CHECK-NEXT: vld $vr0, $a1, 0
86+
; CHECK-NEXT: vaddi.hu $vr0, $vr0, 31
87+
; CHECK-NEXT: vst $vr0, $a0, 0
88+
; CHECK-NEXT: ret
89+
entry:
90+
%v0 = load <8 x i16>, ptr %a0
91+
%v1 = add <8 x i16> %v0, <i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31>
92+
store <8 x i16> %v1, ptr %res
93+
ret void
94+
}
95+
96+
define void @add_v4i32_31(ptr %res, ptr %a0) nounwind {
97+
; CHECK-LABEL: add_v4i32_31:
98+
; CHECK: # %bb.0: # %entry
99+
; CHECK-NEXT: vld $vr0, $a1, 0
100+
; CHECK-NEXT: vaddi.wu $vr0, $vr0, 31
101+
; CHECK-NEXT: vst $vr0, $a0, 0
102+
; CHECK-NEXT: ret
103+
entry:
104+
%v0 = load <4 x i32>, ptr %a0
105+
%v1 = add <4 x i32> %v0, <i32 31, i32 31, i32 31, i32 31>
106+
store <4 x i32> %v1, ptr %res
107+
ret void
108+
}
109+
110+
define void @add_v2i64_31(ptr %res, ptr %a0) nounwind {
111+
; CHECK-LABEL: add_v2i64_31:
112+
; CHECK: # %bb.0: # %entry
113+
; CHECK-NEXT: vld $vr0, $a1, 0
114+
; CHECK-NEXT: vaddi.du $vr0, $vr0, 31
115+
; CHECK-NEXT: vst $vr0, $a0, 0
116+
; CHECK-NEXT: ret
117+
entry:
118+
%v0 = load <2 x i64>, ptr %a0
119+
%v1 = add <2 x i64> %v0, <i64 31, i64 31>
120+
store <2 x i64> %v1, ptr %res
121+
ret void
122+
}
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @ashr_v16i8(ptr %res, ptr %a0, ptr %a1) nounwind {
5+
; CHECK-LABEL: ashr_v16i8:
6+
; CHECK: # %bb.0: # %entry
7+
; CHECK-NEXT: vld $vr0, $a2, 0
8+
; CHECK-NEXT: vld $vr1, $a1, 0
9+
; CHECK-NEXT: vsra.b $vr0, $vr1, $vr0
10+
; CHECK-NEXT: vst $vr0, $a0, 0
11+
; CHECK-NEXT: ret
12+
entry:
13+
%v0 = load <16 x i8>, ptr %a0
14+
%v1 = load <16 x i8>, ptr %a1
15+
%v2 = ashr <16 x i8> %v0, %v1
16+
store <16 x i8> %v2, ptr %res
17+
ret void
18+
}
19+
20+
define void @ashr_v8i16(ptr %res, ptr %a0, ptr %a1) nounwind {
21+
; CHECK-LABEL: ashr_v8i16:
22+
; CHECK: # %bb.0: # %entry
23+
; CHECK-NEXT: vld $vr0, $a2, 0
24+
; CHECK-NEXT: vld $vr1, $a1, 0
25+
; CHECK-NEXT: vsra.h $vr0, $vr1, $vr0
26+
; CHECK-NEXT: vst $vr0, $a0, 0
27+
; CHECK-NEXT: ret
28+
entry:
29+
%v0 = load <8 x i16>, ptr %a0
30+
%v1 = load <8 x i16>, ptr %a1
31+
%v2 = ashr <8 x i16> %v0, %v1
32+
store <8 x i16> %v2, ptr %res
33+
ret void
34+
}
35+
36+
define void @ashr_v4i32(ptr %res, ptr %a0, ptr %a1) nounwind {
37+
; CHECK-LABEL: ashr_v4i32:
38+
; CHECK: # %bb.0: # %entry
39+
; CHECK-NEXT: vld $vr0, $a2, 0
40+
; CHECK-NEXT: vld $vr1, $a1, 0
41+
; CHECK-NEXT: vsra.w $vr0, $vr1, $vr0
42+
; CHECK-NEXT: vst $vr0, $a0, 0
43+
; CHECK-NEXT: ret
44+
entry:
45+
%v0 = load <4 x i32>, ptr %a0
46+
%v1 = load <4 x i32>, ptr %a1
47+
%v2 = ashr <4 x i32> %v0, %v1
48+
store <4 x i32> %v2, ptr %res
49+
ret void
50+
}
51+
52+
define void @ashr_v2i64(ptr %res, ptr %a0, ptr %a1) nounwind {
53+
; CHECK-LABEL: ashr_v2i64:
54+
; CHECK: # %bb.0: # %entry
55+
; CHECK-NEXT: vld $vr0, $a2, 0
56+
; CHECK-NEXT: vld $vr1, $a1, 0
57+
; CHECK-NEXT: vsra.d $vr0, $vr1, $vr0
58+
; CHECK-NEXT: vst $vr0, $a0, 0
59+
; CHECK-NEXT: ret
60+
entry:
61+
%v0 = load <2 x i64>, ptr %a0
62+
%v1 = load <2 x i64>, ptr %a1
63+
%v2 = ashr <2 x i64> %v0, %v1
64+
store <2 x i64> %v2, ptr %res
65+
ret void
66+
}
67+
68+
define void @ashr_v16i8_1(ptr %res, ptr %a0) nounwind {
69+
; CHECK-LABEL: ashr_v16i8_1:
70+
; CHECK: # %bb.0: # %entry
71+
; CHECK-NEXT: vld $vr0, $a1, 0
72+
; CHECK-NEXT: vsrai.b $vr0, $vr0, 1
73+
; CHECK-NEXT: vst $vr0, $a0, 0
74+
; CHECK-NEXT: ret
75+
entry:
76+
%v0 = load <16 x i8>, ptr %a0
77+
%v1 = ashr <16 x i8> %v0, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
78+
store <16 x i8> %v1, ptr %res
79+
ret void
80+
}
81+
82+
define void @ashr_v16i8_7(ptr %res, ptr %a0) nounwind {
83+
; CHECK-LABEL: ashr_v16i8_7:
84+
; CHECK: # %bb.0: # %entry
85+
; CHECK-NEXT: vld $vr0, $a1, 0
86+
; CHECK-NEXT: vsrai.b $vr0, $vr0, 7
87+
; CHECK-NEXT: vst $vr0, $a0, 0
88+
; CHECK-NEXT: ret
89+
entry:
90+
%v0 = load <16 x i8>, ptr %a0
91+
%v1 = ashr <16 x i8> %v0, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
92+
store <16 x i8> %v1, ptr %res
93+
ret void
94+
}
95+
96+
define void @ashr_v8i16_1(ptr %res, ptr %a0) nounwind {
97+
; CHECK-LABEL: ashr_v8i16_1:
98+
; CHECK: # %bb.0: # %entry
99+
; CHECK-NEXT: vld $vr0, $a1, 0
100+
; CHECK-NEXT: vsrai.h $vr0, $vr0, 1
101+
; CHECK-NEXT: vst $vr0, $a0, 0
102+
; CHECK-NEXT: ret
103+
entry:
104+
%v0 = load <8 x i16>, ptr %a0
105+
%v1 = ashr <8 x i16> %v0, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
106+
store <8 x i16> %v1, ptr %res
107+
ret void
108+
}
109+
110+
define void @ashr_v8i16_15(ptr %res, ptr %a0) nounwind {
111+
; CHECK-LABEL: ashr_v8i16_15:
112+
; CHECK: # %bb.0: # %entry
113+
; CHECK-NEXT: vld $vr0, $a1, 0
114+
; CHECK-NEXT: vsrai.h $vr0, $vr0, 15
115+
; CHECK-NEXT: vst $vr0, $a0, 0
116+
; CHECK-NEXT: ret
117+
entry:
118+
%v0 = load <8 x i16>, ptr %a0
119+
%v1 = ashr <8 x i16> %v0, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
120+
store <8 x i16> %v1, ptr %res
121+
ret void
122+
}
123+
124+
define void @ashr_v4i32_1(ptr %res, ptr %a0) nounwind {
125+
; CHECK-LABEL: ashr_v4i32_1:
126+
; CHECK: # %bb.0: # %entry
127+
; CHECK-NEXT: vld $vr0, $a1, 0
128+
; CHECK-NEXT: vsrai.w $vr0, $vr0, 1
129+
; CHECK-NEXT: vst $vr0, $a0, 0
130+
; CHECK-NEXT: ret
131+
entry:
132+
%v0 = load <4 x i32>, ptr %a0
133+
%v1 = ashr <4 x i32> %v0, <i32 1, i32 1, i32 1, i32 1>
134+
store <4 x i32> %v1, ptr %res
135+
ret void
136+
}
137+
138+
define void @ashr_v4i32_31(ptr %res, ptr %a0) nounwind {
139+
; CHECK-LABEL: ashr_v4i32_31:
140+
; CHECK: # %bb.0: # %entry
141+
; CHECK-NEXT: vld $vr0, $a1, 0
142+
; CHECK-NEXT: vsrai.w $vr0, $vr0, 31
143+
; CHECK-NEXT: vst $vr0, $a0, 0
144+
; CHECK-NEXT: ret
145+
entry:
146+
%v0 = load <4 x i32>, ptr %a0
147+
%v1 = ashr <4 x i32> %v0, <i32 31, i32 31, i32 31, i32 31>
148+
store <4 x i32> %v1, ptr %res
149+
ret void
150+
}
151+
152+
define void @ashr_v2i64_1(ptr %res, ptr %a0) nounwind {
153+
; CHECK-LABEL: ashr_v2i64_1:
154+
; CHECK: # %bb.0: # %entry
155+
; CHECK-NEXT: vld $vr0, $a1, 0
156+
; CHECK-NEXT: vsrai.d $vr0, $vr0, 1
157+
; CHECK-NEXT: vst $vr0, $a0, 0
158+
; CHECK-NEXT: ret
159+
entry:
160+
%v0 = load <2 x i64>, ptr %a0
161+
%v1 = ashr <2 x i64> %v0, <i64 1, i64 1>
162+
store <2 x i64> %v1, ptr %res
163+
ret void
164+
}
165+
166+
define void @ashr_v2i64_63(ptr %res, ptr %a0) nounwind {
167+
; CHECK-LABEL: ashr_v2i64_63:
168+
; CHECK: # %bb.0: # %entry
169+
; CHECK-NEXT: vld $vr0, $a1, 0
170+
; CHECK-NEXT: vsrai.d $vr0, $vr0, 63
171+
; CHECK-NEXT: vst $vr0, $a0, 0
172+
; CHECK-NEXT: ret
173+
entry:
174+
%v0 = load <2 x i64>, ptr %a0
175+
%v1 = ashr <2 x i64> %v0, <i64 63, i64 63>
176+
store <2 x i64> %v1, ptr %res
177+
ret void
178+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @fadd_v4f32(ptr %res, ptr %a0, ptr %a1) nounwind {
5+
; CHECK-LABEL: fadd_v4f32:
6+
; CHECK: # %bb.0: # %entry
7+
; CHECK-NEXT: vld $vr0, $a2, 0
8+
; CHECK-NEXT: vld $vr1, $a1, 0
9+
; CHECK-NEXT: vfadd.s $vr0, $vr1, $vr0
10+
; CHECK-NEXT: vst $vr0, $a0, 0
11+
; CHECK-NEXT: ret
12+
entry:
13+
%v0 = load <4 x float>, ptr %a0
14+
%v1 = load <4 x float>, ptr %a1
15+
%v2 = fadd <4 x float> %v0, %v1
16+
store <4 x float> %v2, ptr %res
17+
ret void
18+
}
19+
20+
define void @fadd_v2f64(ptr %res, ptr %a0, ptr %a1) nounwind {
21+
; CHECK-LABEL: fadd_v2f64:
22+
; CHECK: # %bb.0: # %entry
23+
; CHECK-NEXT: vld $vr0, $a2, 0
24+
; CHECK-NEXT: vld $vr1, $a1, 0
25+
; CHECK-NEXT: vfadd.d $vr0, $vr1, $vr0
26+
; CHECK-NEXT: vst $vr0, $a0, 0
27+
; CHECK-NEXT: ret
28+
entry:
29+
%v0 = load <2 x double>, ptr %a0
30+
%v1 = load <2 x double>, ptr %a1
31+
%v2 = fadd <2 x double> %v0, %v1
32+
store <2 x double> %v2, ptr %res
33+
ret void
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @fdiv_v4f32(ptr %res, ptr %a0, ptr %a1) nounwind {
5+
; CHECK-LABEL: fdiv_v4f32:
6+
; CHECK: # %bb.0: # %entry
7+
; CHECK-NEXT: vld $vr0, $a2, 0
8+
; CHECK-NEXT: vld $vr1, $a1, 0
9+
; CHECK-NEXT: vfdiv.s $vr0, $vr1, $vr0
10+
; CHECK-NEXT: vst $vr0, $a0, 0
11+
; CHECK-NEXT: ret
12+
entry:
13+
%v0 = load <4 x float>, ptr %a0
14+
%v1 = load <4 x float>, ptr %a1
15+
%v2 = fdiv <4 x float> %v0, %v1
16+
store <4 x float> %v2, ptr %res
17+
ret void
18+
}
19+
20+
define void @fdiv_v2f64(ptr %res, ptr %a0, ptr %a1) nounwind {
21+
; CHECK-LABEL: fdiv_v2f64:
22+
; CHECK: # %bb.0: # %entry
23+
; CHECK-NEXT: vld $vr0, $a2, 0
24+
; CHECK-NEXT: vld $vr1, $a1, 0
25+
; CHECK-NEXT: vfdiv.d $vr0, $vr1, $vr0
26+
; CHECK-NEXT: vst $vr0, $a0, 0
27+
; CHECK-NEXT: ret
28+
entry:
29+
%v0 = load <2 x double>, ptr %a0
30+
%v1 = load <2 x double>, ptr %a1
31+
%v2 = fdiv <2 x double> %v0, %v1
32+
store <2 x double> %v2, ptr %res
33+
ret void
34+
}

0 commit comments

Comments
 (0)