Skip to content

Commit 028bfa2

Browse files
authored
[LoongArch][NFC] Add tests for vector fminnum/fmaxnum (llvm#162767)
1 parent 0589409 commit 028bfa2

File tree

2 files changed

+272
-0
lines changed

2 files changed

+272
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
4+
5+
define void @minnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {
6+
; CHECK-LABEL: minnum_v8f32:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: xvld $xr0, $a2, 0
9+
; CHECK-NEXT: xvld $xr1, $a1, 0
10+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 5
11+
; CHECK-NEXT: xvpickve.w $xr3, $xr1, 5
12+
; CHECK-NEXT: fmin.s $fa2, $fa3, $fa2
13+
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 4
14+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 4
15+
; CHECK-NEXT: fmin.s $fa3, $fa4, $fa3
16+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
17+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 6
18+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 6
19+
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
20+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
21+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 7
22+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 7
23+
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
24+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 48
25+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 1
26+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 1
27+
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
28+
; CHECK-NEXT: xvpickve.w $xr4, $xr0, 0
29+
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 0
30+
; CHECK-NEXT: fmin.s $fa4, $fa5, $fa4
31+
; CHECK-NEXT: vextrins.w $vr4, $vr2, 16
32+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 2
33+
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 2
34+
; CHECK-NEXT: fmin.s $fa2, $fa5, $fa2
35+
; CHECK-NEXT: vextrins.w $vr4, $vr2, 32
36+
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
37+
; CHECK-NEXT: xvpickve.w $xr1, $xr1, 3
38+
; CHECK-NEXT: fmin.s $fa0, $fa1, $fa0
39+
; CHECK-NEXT: vextrins.w $vr4, $vr0, 48
40+
; CHECK-NEXT: xvpermi.q $xr4, $xr3, 2
41+
; CHECK-NEXT: xvst $xr4, $a0, 0
42+
; CHECK-NEXT: ret
43+
entry:
44+
%v0 = load <8 x float>, ptr %x
45+
%v1 = load <8 x float>, ptr %y
46+
%r = call <8 x float> @llvm.minnum.v8f32(<8 x float> %v0, <8 x float> %v1)
47+
store <8 x float> %r, ptr %res
48+
ret void
49+
}
50+
51+
define void @minnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {
52+
; CHECK-LABEL: minnum_v4f64:
53+
; CHECK: # %bb.0: # %entry
54+
; CHECK-NEXT: xvld $xr0, $a2, 0
55+
; CHECK-NEXT: xvld $xr1, $a1, 0
56+
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 3
57+
; CHECK-NEXT: xvpickve.d $xr3, $xr1, 3
58+
; CHECK-NEXT: fmin.d $fa2, $fa3, $fa2
59+
; CHECK-NEXT: xvpickve.d $xr3, $xr0, 2
60+
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 2
61+
; CHECK-NEXT: fmin.d $fa3, $fa4, $fa3
62+
; CHECK-NEXT: vextrins.d $vr3, $vr2, 16
63+
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 1
64+
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 1
65+
; CHECK-NEXT: fmin.d $fa2, $fa4, $fa2
66+
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
67+
; CHECK-NEXT: xvpickve.d $xr1, $xr1, 0
68+
; CHECK-NEXT: fmin.d $fa0, $fa1, $fa0
69+
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
70+
; CHECK-NEXT: xvpermi.q $xr0, $xr3, 2
71+
; CHECK-NEXT: xvst $xr0, $a0, 0
72+
; CHECK-NEXT: ret
73+
entry:
74+
%v0 = load <4 x double>, ptr %x
75+
%v1 = load <4 x double>, ptr %y
76+
%r = call <4 x double> @llvm.minnum.v4f64(<4 x double> %v0, <4 x double> %v1)
77+
store <4 x double> %r, ptr %res
78+
ret void
79+
}
80+
81+
define void @maxnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {
82+
; CHECK-LABEL: maxnum_v8f32:
83+
; CHECK: # %bb.0: # %entry
84+
; CHECK-NEXT: xvld $xr0, $a2, 0
85+
; CHECK-NEXT: xvld $xr1, $a1, 0
86+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 5
87+
; CHECK-NEXT: xvpickve.w $xr3, $xr1, 5
88+
; CHECK-NEXT: fmax.s $fa2, $fa3, $fa2
89+
; CHECK-NEXT: xvpickve.w $xr3, $xr0, 4
90+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 4
91+
; CHECK-NEXT: fmax.s $fa3, $fa4, $fa3
92+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
93+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 6
94+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 6
95+
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
96+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
97+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 7
98+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 7
99+
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
100+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 48
101+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 1
102+
; CHECK-NEXT: xvpickve.w $xr4, $xr1, 1
103+
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
104+
; CHECK-NEXT: xvpickve.w $xr4, $xr0, 0
105+
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 0
106+
; CHECK-NEXT: fmax.s $fa4, $fa5, $fa4
107+
; CHECK-NEXT: vextrins.w $vr4, $vr2, 16
108+
; CHECK-NEXT: xvpickve.w $xr2, $xr0, 2
109+
; CHECK-NEXT: xvpickve.w $xr5, $xr1, 2
110+
; CHECK-NEXT: fmax.s $fa2, $fa5, $fa2
111+
; CHECK-NEXT: vextrins.w $vr4, $vr2, 32
112+
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
113+
; CHECK-NEXT: xvpickve.w $xr1, $xr1, 3
114+
; CHECK-NEXT: fmax.s $fa0, $fa1, $fa0
115+
; CHECK-NEXT: vextrins.w $vr4, $vr0, 48
116+
; CHECK-NEXT: xvpermi.q $xr4, $xr3, 2
117+
; CHECK-NEXT: xvst $xr4, $a0, 0
118+
; CHECK-NEXT: ret
119+
entry:
120+
%v0 = load <8 x float>, ptr %x
121+
%v1 = load <8 x float>, ptr %y
122+
%r = call <8 x float> @llvm.maxnum.v8f32(<8 x float> %v0, <8 x float> %v1)
123+
store <8 x float> %r, ptr %res
124+
ret void
125+
}
126+
127+
define void @maxnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {
128+
; CHECK-LABEL: maxnum_v4f64:
129+
; CHECK: # %bb.0: # %entry
130+
; CHECK-NEXT: xvld $xr0, $a2, 0
131+
; CHECK-NEXT: xvld $xr1, $a1, 0
132+
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 3
133+
; CHECK-NEXT: xvpickve.d $xr3, $xr1, 3
134+
; CHECK-NEXT: fmax.d $fa2, $fa3, $fa2
135+
; CHECK-NEXT: xvpickve.d $xr3, $xr0, 2
136+
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 2
137+
; CHECK-NEXT: fmax.d $fa3, $fa4, $fa3
138+
; CHECK-NEXT: vextrins.d $vr3, $vr2, 16
139+
; CHECK-NEXT: xvpickve.d $xr2, $xr0, 1
140+
; CHECK-NEXT: xvpickve.d $xr4, $xr1, 1
141+
; CHECK-NEXT: fmax.d $fa2, $fa4, $fa2
142+
; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
143+
; CHECK-NEXT: xvpickve.d $xr1, $xr1, 0
144+
; CHECK-NEXT: fmax.d $fa0, $fa1, $fa0
145+
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
146+
; CHECK-NEXT: xvpermi.q $xr0, $xr3, 2
147+
; CHECK-NEXT: xvst $xr0, $a0, 0
148+
; CHECK-NEXT: ret
149+
entry:
150+
%v0 = load <4 x double>, ptr %x
151+
%v1 = load <4 x double>, ptr %y
152+
%r = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %v0, <4 x double> %v1)
153+
store <4 x double> %r, ptr %res
154+
ret void
155+
}
156+
157+
declare <8 x float> @llvm.minnum.v8f32(<8 x float>, <8 x float>)
158+
declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)
159+
declare <8 x float> @llvm.maxnum.v8f32(<8 x float>, <8 x float>)
160+
declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
4+
5+
define void @minnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {
6+
; CHECK-LABEL: minnum_v4f32:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: vld $vr0, $a2, 0
9+
; CHECK-NEXT: vld $vr1, $a1, 0
10+
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 1
11+
; CHECK-NEXT: vreplvei.w $vr3, $vr1, 1
12+
; CHECK-NEXT: fmin.s $fa2, $fa3, $fa2
13+
; CHECK-NEXT: vreplvei.w $vr3, $vr0, 0
14+
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 0
15+
; CHECK-NEXT: fmin.s $fa3, $fa4, $fa3
16+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
17+
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 2
18+
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 2
19+
; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
20+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
21+
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 3
22+
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 3
23+
; CHECK-NEXT: fmin.s $fa0, $fa1, $fa0
24+
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
25+
; CHECK-NEXT: vst $vr3, $a0, 0
26+
; CHECK-NEXT: ret
27+
entry:
28+
%v0 = load <4 x float>, ptr %x
29+
%v1 = load <4 x float>, ptr %y
30+
%r = call <4 x float> @llvm.minnum.v4f32(<4 x float> %v0, <4 x float> %v1)
31+
store <4 x float> %r, ptr %res
32+
ret void
33+
}
34+
35+
define void @minnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {
36+
; CHECK-LABEL: minnum_v2f64:
37+
; CHECK: # %bb.0: # %entry
38+
; CHECK-NEXT: vld $vr0, $a2, 0
39+
; CHECK-NEXT: vld $vr1, $a1, 0
40+
; CHECK-NEXT: vreplvei.d $vr2, $vr0, 1
41+
; CHECK-NEXT: vreplvei.d $vr3, $vr1, 1
42+
; CHECK-NEXT: fmin.d $fa2, $fa3, $fa2
43+
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
44+
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
45+
; CHECK-NEXT: fmin.d $fa0, $fa1, $fa0
46+
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
47+
; CHECK-NEXT: vst $vr0, $a0, 0
48+
; CHECK-NEXT: ret
49+
entry:
50+
%v0 = load <2 x double>, ptr %x
51+
%v1 = load <2 x double>, ptr %y
52+
%r = call <2 x double> @llvm.minnum.v2f64(<2 x double> %v0, <2 x double> %v1)
53+
store <2 x double> %r, ptr %res
54+
ret void
55+
}
56+
57+
define void @maxnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {
58+
; CHECK-LABEL: maxnum_v4f32:
59+
; CHECK: # %bb.0: # %entry
60+
; CHECK-NEXT: vld $vr0, $a2, 0
61+
; CHECK-NEXT: vld $vr1, $a1, 0
62+
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 1
63+
; CHECK-NEXT: vreplvei.w $vr3, $vr1, 1
64+
; CHECK-NEXT: fmax.s $fa2, $fa3, $fa2
65+
; CHECK-NEXT: vreplvei.w $vr3, $vr0, 0
66+
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 0
67+
; CHECK-NEXT: fmax.s $fa3, $fa4, $fa3
68+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
69+
; CHECK-NEXT: vreplvei.w $vr2, $vr0, 2
70+
; CHECK-NEXT: vreplvei.w $vr4, $vr1, 2
71+
; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
72+
; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
73+
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 3
74+
; CHECK-NEXT: vreplvei.w $vr1, $vr1, 3
75+
; CHECK-NEXT: fmax.s $fa0, $fa1, $fa0
76+
; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
77+
; CHECK-NEXT: vst $vr3, $a0, 0
78+
; CHECK-NEXT: ret
79+
entry:
80+
%v0 = load <4 x float>, ptr %x
81+
%v1 = load <4 x float>, ptr %y
82+
%r = call <4 x float> @llvm.maxnum.v4f32(<4 x float> %v0, <4 x float> %v1)
83+
store <4 x float> %r, ptr %res
84+
ret void
85+
}
86+
87+
define void @maxnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {
88+
; CHECK-LABEL: maxnum_v2f64:
89+
; CHECK: # %bb.0: # %entry
90+
; CHECK-NEXT: vld $vr0, $a2, 0
91+
; CHECK-NEXT: vld $vr1, $a1, 0
92+
; CHECK-NEXT: vreplvei.d $vr2, $vr0, 1
93+
; CHECK-NEXT: vreplvei.d $vr3, $vr1, 1
94+
; CHECK-NEXT: fmax.d $fa2, $fa3, $fa2
95+
; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
96+
; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
97+
; CHECK-NEXT: fmax.d $fa0, $fa1, $fa0
98+
; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
99+
; CHECK-NEXT: vst $vr0, $a0, 0
100+
; CHECK-NEXT: ret
101+
entry:
102+
%v0 = load <2 x double>, ptr %x
103+
%v1 = load <2 x double>, ptr %y
104+
%r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %v0, <2 x double> %v1)
105+
store <2 x double> %r, ptr %res
106+
ret void
107+
}
108+
109+
declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
110+
declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>)
111+
declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
112+
declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>)

0 commit comments

Comments
 (0)