1; RUN: llc < %s -mtriple=ve -mattr=+vpu | FileCheck %s
2
3;;; Test vector floating compare and select maximum intrinsic instructions
4;;;
5;;; Note:
6;;;   We test VFMAX*vvl, VFMAX*vvl_v, VFMAX*rvl, VFMAX*rvl_v, VFMAX*vvml_v,
7;;;   VFMAX*rvml_v, PVFMAX*vvl, PVFMAX*vvl_v, PVFMAX*rvl, PVFMAX*rvl_v,
8;;;   PVFMAX*vvml_v, and PVFMAX*rvml_v instructions.
9
10; Function Attrs: nounwind readnone
11define fastcc <256 x double> @vfmaxd_vvvl(<256 x double> %0, <256 x double> %1) {
12; CHECK-LABEL: vfmaxd_vvvl:
13; CHECK:       # %bb.0:
14; CHECK-NEXT:    lea %s0, 256
15; CHECK-NEXT:    lvl %s0
16; CHECK-NEXT:    vfmax.d %v0, %v0, %v1
17; CHECK-NEXT:    b.l.t (, %s10)
18  %3 = tail call fast <256 x double> @llvm.ve.vl.vfmaxd.vvvl(<256 x double> %0, <256 x double> %1, i32 256)
19  ret <256 x double> %3
20}
21
22; Function Attrs: nounwind readnone
23declare <256 x double> @llvm.ve.vl.vfmaxd.vvvl(<256 x double>, <256 x double>, i32)
24
25; Function Attrs: nounwind readnone
26define fastcc <256 x double> @vfmaxd_vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2) {
27; CHECK-LABEL: vfmaxd_vvvvl:
28; CHECK:       # %bb.0:
29; CHECK-NEXT:    lea %s0, 128
30; CHECK-NEXT:    lvl %s0
31; CHECK-NEXT:    vfmax.d %v2, %v0, %v1
32; CHECK-NEXT:    lea %s16, 256
33; CHECK-NEXT:    lvl %s16
34; CHECK-NEXT:    vor %v0, (0)1, %v2
35; CHECK-NEXT:    b.l.t (, %s10)
36  %4 = tail call fast <256 x double> @llvm.ve.vl.vfmaxd.vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2, i32 128)
37  ret <256 x double> %4
38}
39
40; Function Attrs: nounwind readnone
41declare <256 x double> @llvm.ve.vl.vfmaxd.vvvvl(<256 x double>, <256 x double>, <256 x double>, i32)
42
43; Function Attrs: nounwind readnone
44define fastcc <256 x double> @vfmaxd_vsvl(double %0, <256 x double> %1) {
45; CHECK-LABEL: vfmaxd_vsvl:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    lea %s1, 256
48; CHECK-NEXT:    lvl %s1
49; CHECK-NEXT:    vfmax.d %v0, %s0, %v0
50; CHECK-NEXT:    b.l.t (, %s10)
51  %3 = tail call fast <256 x double> @llvm.ve.vl.vfmaxd.vsvl(double %0, <256 x double> %1, i32 256)
52  ret <256 x double> %3
53}
54
55; Function Attrs: nounwind readnone
56declare <256 x double> @llvm.ve.vl.vfmaxd.vsvl(double, <256 x double>, i32)
57
58; Function Attrs: nounwind readnone
59define fastcc <256 x double> @vfmaxd_vsvvl(double %0, <256 x double> %1, <256 x double> %2) {
60; CHECK-LABEL: vfmaxd_vsvvl:
61; CHECK:       # %bb.0:
62; CHECK-NEXT:    lea %s1, 128
63; CHECK-NEXT:    lvl %s1
64; CHECK-NEXT:    vfmax.d %v1, %s0, %v0
65; CHECK-NEXT:    lea %s16, 256
66; CHECK-NEXT:    lvl %s16
67; CHECK-NEXT:    vor %v0, (0)1, %v1
68; CHECK-NEXT:    b.l.t (, %s10)
69  %4 = tail call fast <256 x double> @llvm.ve.vl.vfmaxd.vsvvl(double %0, <256 x double> %1, <256 x double> %2, i32 128)
70  ret <256 x double> %4
71}
72
73; Function Attrs: nounwind readnone
74declare <256 x double> @llvm.ve.vl.vfmaxd.vsvvl(double, <256 x double>, <256 x double>, i32)
75
76; Function Attrs: nounwind readnone
77define fastcc <256 x double> @vfmaxd_vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
78; CHECK-LABEL: vfmaxd_vvvmvl:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    lea %s0, 128
81; CHECK-NEXT:    lvl %s0
82; CHECK-NEXT:    vfmax.d %v2, %v0, %v1, %vm1
83; CHECK-NEXT:    lea %s16, 256
84; CHECK-NEXT:    lvl %s16
85; CHECK-NEXT:    vor %v0, (0)1, %v2
86; CHECK-NEXT:    b.l.t (, %s10)
87  %5 = tail call fast <256 x double> @llvm.ve.vl.vfmaxd.vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
88  ret <256 x double> %5
89}
90
91; Function Attrs: nounwind readnone
92declare <256 x double> @llvm.ve.vl.vfmaxd.vvvmvl(<256 x double>, <256 x double>, <256 x i1>, <256 x double>, i32)
93
94; Function Attrs: nounwind readnone
95define fastcc <256 x double> @vfmaxd_vsvmvl(double %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
96; CHECK-LABEL: vfmaxd_vsvmvl:
97; CHECK:       # %bb.0:
98; CHECK-NEXT:    lea %s1, 128
99; CHECK-NEXT:    lvl %s1
100; CHECK-NEXT:    vfmax.d %v1, %s0, %v0, %vm1
101; CHECK-NEXT:    lea %s16, 256
102; CHECK-NEXT:    lvl %s16
103; CHECK-NEXT:    vor %v0, (0)1, %v1
104; CHECK-NEXT:    b.l.t (, %s10)
105  %5 = tail call fast <256 x double> @llvm.ve.vl.vfmaxd.vsvmvl(double %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
106  ret <256 x double> %5
107}
108
109; Function Attrs: nounwind readnone
110declare <256 x double> @llvm.ve.vl.vfmaxd.vsvmvl(double, <256 x double>, <256 x i1>, <256 x double>, i32)
111
112; Function Attrs: nounwind readnone
113define fastcc <256 x double> @vfmaxs_vvvl(<256 x double> %0, <256 x double> %1) {
114; CHECK-LABEL: vfmaxs_vvvl:
115; CHECK:       # %bb.0:
116; CHECK-NEXT:    lea %s0, 256
117; CHECK-NEXT:    lvl %s0
118; CHECK-NEXT:    vfmax.s %v0, %v0, %v1
119; CHECK-NEXT:    b.l.t (, %s10)
120  %3 = tail call fast <256 x double> @llvm.ve.vl.vfmaxs.vvvl(<256 x double> %0, <256 x double> %1, i32 256)
121  ret <256 x double> %3
122}
123
124; Function Attrs: nounwind readnone
125declare <256 x double> @llvm.ve.vl.vfmaxs.vvvl(<256 x double>, <256 x double>, i32)
126
127; Function Attrs: nounwind readnone
128define fastcc <256 x double> @vfmaxs_vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2) {
129; CHECK-LABEL: vfmaxs_vvvvl:
130; CHECK:       # %bb.0:
131; CHECK-NEXT:    lea %s0, 128
132; CHECK-NEXT:    lvl %s0
133; CHECK-NEXT:    vfmax.s %v2, %v0, %v1
134; CHECK-NEXT:    lea %s16, 256
135; CHECK-NEXT:    lvl %s16
136; CHECK-NEXT:    vor %v0, (0)1, %v2
137; CHECK-NEXT:    b.l.t (, %s10)
138  %4 = tail call fast <256 x double> @llvm.ve.vl.vfmaxs.vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2, i32 128)
139  ret <256 x double> %4
140}
141
142; Function Attrs: nounwind readnone
143declare <256 x double> @llvm.ve.vl.vfmaxs.vvvvl(<256 x double>, <256 x double>, <256 x double>, i32)
144
145; Function Attrs: nounwind readnone
146define fastcc <256 x double> @vfmaxs_vsvl(float %0, <256 x double> %1) {
147; CHECK-LABEL: vfmaxs_vsvl:
148; CHECK:       # %bb.0:
149; CHECK-NEXT:    lea %s1, 256
150; CHECK-NEXT:    lvl %s1
151; CHECK-NEXT:    vfmax.s %v0, %s0, %v0
152; CHECK-NEXT:    b.l.t (, %s10)
153  %3 = tail call fast <256 x double> @llvm.ve.vl.vfmaxs.vsvl(float %0, <256 x double> %1, i32 256)
154  ret <256 x double> %3
155}
156
157; Function Attrs: nounwind readnone
158declare <256 x double> @llvm.ve.vl.vfmaxs.vsvl(float, <256 x double>, i32)
159
160; Function Attrs: nounwind readnone
161define fastcc <256 x double> @vfmaxs_vsvvl(float %0, <256 x double> %1, <256 x double> %2) {
162; CHECK-LABEL: vfmaxs_vsvvl:
163; CHECK:       # %bb.0:
164; CHECK-NEXT:    lea %s1, 128
165; CHECK-NEXT:    lvl %s1
166; CHECK-NEXT:    vfmax.s %v1, %s0, %v0
167; CHECK-NEXT:    lea %s16, 256
168; CHECK-NEXT:    lvl %s16
169; CHECK-NEXT:    vor %v0, (0)1, %v1
170; CHECK-NEXT:    b.l.t (, %s10)
171  %4 = tail call fast <256 x double> @llvm.ve.vl.vfmaxs.vsvvl(float %0, <256 x double> %1, <256 x double> %2, i32 128)
172  ret <256 x double> %4
173}
174
175; Function Attrs: nounwind readnone
176declare <256 x double> @llvm.ve.vl.vfmaxs.vsvvl(float, <256 x double>, <256 x double>, i32)
177
178; Function Attrs: nounwind readnone
179define fastcc <256 x double> @vfmaxs_vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
180; CHECK-LABEL: vfmaxs_vvvmvl:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    lea %s0, 128
183; CHECK-NEXT:    lvl %s0
184; CHECK-NEXT:    vfmax.s %v2, %v0, %v1, %vm1
185; CHECK-NEXT:    lea %s16, 256
186; CHECK-NEXT:    lvl %s16
187; CHECK-NEXT:    vor %v0, (0)1, %v2
188; CHECK-NEXT:    b.l.t (, %s10)
189  %5 = tail call fast <256 x double> @llvm.ve.vl.vfmaxs.vvvmvl(<256 x double> %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
190  ret <256 x double> %5
191}
192
193; Function Attrs: nounwind readnone
194declare <256 x double> @llvm.ve.vl.vfmaxs.vvvmvl(<256 x double>, <256 x double>, <256 x i1>, <256 x double>, i32)
195
196; Function Attrs: nounwind readnone
197define fastcc <256 x double> @vfmaxs_vsvmvl(float %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3) {
198; CHECK-LABEL: vfmaxs_vsvmvl:
199; CHECK:       # %bb.0:
200; CHECK-NEXT:    lea %s1, 128
201; CHECK-NEXT:    lvl %s1
202; CHECK-NEXT:    vfmax.s %v1, %s0, %v0, %vm1
203; CHECK-NEXT:    lea %s16, 256
204; CHECK-NEXT:    lvl %s16
205; CHECK-NEXT:    vor %v0, (0)1, %v1
206; CHECK-NEXT:    b.l.t (, %s10)
207  %5 = tail call fast <256 x double> @llvm.ve.vl.vfmaxs.vsvmvl(float %0, <256 x double> %1, <256 x i1> %2, <256 x double> %3, i32 128)
208  ret <256 x double> %5
209}
210
211; Function Attrs: nounwind readnone
212declare <256 x double> @llvm.ve.vl.vfmaxs.vsvmvl(float, <256 x double>, <256 x i1>, <256 x double>, i32)
213
214; Function Attrs: nounwind readnone
215define fastcc <256 x double> @pvfmax_vvvl(<256 x double> %0, <256 x double> %1) {
216; CHECK-LABEL: pvfmax_vvvl:
217; CHECK:       # %bb.0:
218; CHECK-NEXT:    lea %s0, 256
219; CHECK-NEXT:    lvl %s0
220; CHECK-NEXT:    pvfmax %v0, %v0, %v1
221; CHECK-NEXT:    b.l.t (, %s10)
222  %3 = tail call fast <256 x double> @llvm.ve.vl.pvfmax.vvvl(<256 x double> %0, <256 x double> %1, i32 256)
223  ret <256 x double> %3
224}
225
226; Function Attrs: nounwind readnone
227declare <256 x double> @llvm.ve.vl.pvfmax.vvvl(<256 x double>, <256 x double>, i32)
228
229; Function Attrs: nounwind readnone
230define fastcc <256 x double> @pvfmax_vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2) {
231; CHECK-LABEL: pvfmax_vvvvl:
232; CHECK:       # %bb.0:
233; CHECK-NEXT:    lea %s0, 128
234; CHECK-NEXT:    lvl %s0
235; CHECK-NEXT:    pvfmax %v2, %v0, %v1
236; CHECK-NEXT:    lea %s16, 256
237; CHECK-NEXT:    lvl %s16
238; CHECK-NEXT:    vor %v0, (0)1, %v2
239; CHECK-NEXT:    b.l.t (, %s10)
240  %4 = tail call fast <256 x double> @llvm.ve.vl.pvfmax.vvvvl(<256 x double> %0, <256 x double> %1, <256 x double> %2, i32 128)
241  ret <256 x double> %4
242}
243
244; Function Attrs: nounwind readnone
245declare <256 x double> @llvm.ve.vl.pvfmax.vvvvl(<256 x double>, <256 x double>, <256 x double>, i32)
246
247; Function Attrs: nounwind readnone
248define fastcc <256 x double> @pvfmax_vsvl(i64 %0, <256 x double> %1) {
249; CHECK-LABEL: pvfmax_vsvl:
250; CHECK:       # %bb.0:
251; CHECK-NEXT:    lea %s1, 256
252; CHECK-NEXT:    lvl %s1
253; CHECK-NEXT:    pvfmax %v0, %s0, %v0
254; CHECK-NEXT:    b.l.t (, %s10)
255  %3 = tail call fast <256 x double> @llvm.ve.vl.pvfmax.vsvl(i64 %0, <256 x double> %1, i32 256)
256  ret <256 x double> %3
257}
258
259; Function Attrs: nounwind readnone
260declare <256 x double> @llvm.ve.vl.pvfmax.vsvl(i64, <256 x double>, i32)
261
262; Function Attrs: nounwind readnone
263define fastcc <256 x double> @pvfmax_vsvvl(i64 %0, <256 x double> %1, <256 x double> %2) {
264; CHECK-LABEL: pvfmax_vsvvl:
265; CHECK:       # %bb.0:
266; CHECK-NEXT:    lea %s1, 128
267; CHECK-NEXT:    lvl %s1
268; CHECK-NEXT:    pvfmax %v1, %s0, %v0
269; CHECK-NEXT:    lea %s16, 256
270; CHECK-NEXT:    lvl %s16
271; CHECK-NEXT:    vor %v0, (0)1, %v1
272; CHECK-NEXT:    b.l.t (, %s10)
273  %4 = tail call fast <256 x double> @llvm.ve.vl.pvfmax.vsvvl(i64 %0, <256 x double> %1, <256 x double> %2, i32 128)
274  ret <256 x double> %4
275}
276
277; Function Attrs: nounwind readnone
278declare <256 x double> @llvm.ve.vl.pvfmax.vsvvl(i64, <256 x double>, <256 x double>, i32)
279
280; Function Attrs: nounwind readnone
281define fastcc <256 x double> @pvfmax_vvvMvl(<256 x double> %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3) {
282; CHECK-LABEL: pvfmax_vvvMvl:
283; CHECK:       # %bb.0:
284; CHECK-NEXT:    lea %s0, 128
285; CHECK-NEXT:    lvl %s0
286; CHECK-NEXT:    pvfmax %v2, %v0, %v1, %vm2
287; CHECK-NEXT:    lea %s16, 256
288; CHECK-NEXT:    lvl %s16
289; CHECK-NEXT:    vor %v0, (0)1, %v2
290; CHECK-NEXT:    b.l.t (, %s10)
291  %5 = tail call fast <256 x double> @llvm.ve.vl.pvfmax.vvvMvl(<256 x double> %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3, i32 128)
292  ret <256 x double> %5
293}
294
295; Function Attrs: nounwind readnone
296declare <256 x double> @llvm.ve.vl.pvfmax.vvvMvl(<256 x double>, <256 x double>, <512 x i1>, <256 x double>, i32)
297
298; Function Attrs: nounwind readnone
299define fastcc <256 x double> @pvfmax_vsvMvl(i64 %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3) {
300; CHECK-LABEL: pvfmax_vsvMvl:
301; CHECK:       # %bb.0:
302; CHECK-NEXT:    lea %s1, 128
303; CHECK-NEXT:    lvl %s1
304; CHECK-NEXT:    pvfmax %v1, %s0, %v0, %vm2
305; CHECK-NEXT:    lea %s16, 256
306; CHECK-NEXT:    lvl %s16
307; CHECK-NEXT:    vor %v0, (0)1, %v1
308; CHECK-NEXT:    b.l.t (, %s10)
309  %5 = tail call fast <256 x double> @llvm.ve.vl.pvfmax.vsvMvl(i64 %0, <256 x double> %1, <512 x i1> %2, <256 x double> %3, i32 128)
310  ret <256 x double> %5
311}
312
313; Function Attrs: nounwind readnone
314declare <256 x double> @llvm.ve.vl.pvfmax.vsvMvl(i64, <256 x double>, <512 x i1>, <256 x double>, i32)
315