1+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
12; Test vector maximum on z14.
23;
34; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
@@ -23,36 +24,40 @@ declare fp128 @llvm.maximum.f128(fp128, fp128)
2324; Test the fmax library function.
2425define double @f1 (double %dummy , double %val1 , double %val2 ) {
2526; CHECK-LABEL: f1:
26- ; CHECK: wfmaxdb %f0, %f2, %f4, 4
27- ; CHECK: br %r14
27+ ; CHECK: # %bb.0:
28+ ; CHECK-NEXT: wfmaxdb %f0, %f2, %f4, 4
29+ ; CHECK-NEXT: br %r14
2830 %ret = call double @fmax (double %val1 , double %val2 ) readnone
2931 ret double %ret
3032}
3133
3234; Test the f64 maxnum intrinsic.
3335define double @f2 (double %dummy , double %val1 , double %val2 ) {
3436; CHECK-LABEL: f2:
35- ; CHECK: wfmaxdb %f0, %f2, %f4, 4
36- ; CHECK: br %r14
37+ ; CHECK: # %bb.0:
38+ ; CHECK-NEXT: wfmaxdb %f0, %f2, %f4, 4
39+ ; CHECK-NEXT: br %r14
3740 %ret = call double @llvm.maxnum.f64 (double %val1 , double %val2 )
3841 ret double %ret
3942}
4043
4144; Test the f64 maximum intrinsic.
4245define double @f3 (double %dummy , double %val1 , double %val2 ) {
4346; CHECK-LABEL: f3:
44- ; CHECK: wfmaxdb %f0, %f2, %f4, 1
45- ; CHECK: br %r14
47+ ; CHECK: # %bb.0:
48+ ; CHECK-NEXT: wfmaxdb %f0, %f2, %f4, 1
49+ ; CHECK-NEXT: br %r14
4650 %ret = call double @llvm.maximum.f64 (double %val1 , double %val2 )
4751 ret double %ret
4852}
4953
5054; Test a f64 constant compare/select resulting in maxnum.
5155define double @f4 (double %dummy , double %val ) {
5256; CHECK-LABEL: f4:
53- ; CHECK: lzdr [[REG:%f[0-9]+]]
54- ; CHECK: wfmaxdb %f0, %f2, [[REG]], 4
55- ; CHECK: br %r14
57+ ; CHECK: # %bb.0:
58+ ; CHECK-NEXT: lzdr %f0
59+ ; CHECK-NEXT: wfmaxdb %f0, %f2, %f0, 4
60+ ; CHECK-NEXT: br %r14
5661 %cmp = fcmp ogt double %val , 0 .0
5762 %ret = select i1 %cmp , double %val , double 0 .0
5863 ret double %ret
@@ -61,79 +66,104 @@ define double @f4(double %dummy, double %val) {
6166; Test a f64 constant compare/select resulting in maximum.
6267define double @f5 (double %dummy , double %val ) {
6368; CHECK-LABEL: f5:
64- ; CHECK: ltdbr %f1, %f2
65- ; CHECK-NEXT: ldr %f0, %f2
66- ; CHECK: br %r14
69+ ; CHECK: # %bb.0:
70+ ; CHECK-NEXT: ltdbr %f1, %f2
71+ ; CHECK-NEXT: ldr %f0, %f2
72+ ; CHECK-NEXT: bnler %r14
73+ ; CHECK-NEXT: .LBB4_1:
74+ ; CHECK-NEXT: lzdr %f0
75+ ; CHECK-NEXT: br %r14
6776 %cmp = fcmp ugt double %val , 0 .0
6877 %ret = select i1 %cmp , double %val , double 0 .0
6978 ret double %ret
7079}
7180
7281; Test the v2f64 maxnum intrinsic.
73- define <2 x double > @f6 (<2 x double > %dummy , <2 x double > %val1 ,
74- <2 x double > %val2 ) {
82+ define <2 x double > @f6 (<2 x double > %dummy , <2 x double > %val1 , <2 x double > %val2 ) {
7583; CHECK-LABEL: f6:
76- ; CHECK: vfmaxdb %v24, %v26, %v28, 4
77- ; CHECK: br %r14
84+ ; CHECK: # %bb.0:
85+ ; CHECK-NEXT: vfmaxdb %v24, %v26, %v28, 4
86+ ; CHECK-NEXT: br %r14
7887 %ret = call <2 x double > @llvm.maxnum.v2f64 (<2 x double > %val1 , <2 x double > %val2 )
7988 ret <2 x double > %ret
8089}
8190
8291; Test the v2f64 maximum intrinsic.
83- define <2 x double > @f7 (<2 x double > %dummy , <2 x double > %val1 ,
84- <2 x double > %val2 ) {
92+ define <2 x double > @f7 (<2 x double > %dummy , <2 x double > %val1 , <2 x double > %val2 ) {
8593; CHECK-LABEL: f7:
86- ; CHECK: vfmaxdb %v24, %v26, %v28, 1
87- ; CHECK: br %r14
94+ ; CHECK: # %bb.0:
95+ ; CHECK-NEXT: vfmaxdb %v24, %v26, %v28, 1
96+ ; CHECK-NEXT: br %r14
8897 %ret = call <2 x double > @llvm.maximum.v2f64 (<2 x double > %val1 , <2 x double > %val2 )
8998 ret <2 x double > %ret
9099}
91100
92101; Test the fmaxf library function.
93102define float @f11 (float %dummy , float %val1 , float %val2 ) {
94103; CHECK-LABEL: f11:
95- ; CHECK: wfmaxsb %f0, %f2, %f4, 4
96- ; CHECK: br %r14
104+ ; CHECK: # %bb.0:
105+ ; CHECK-NEXT: wfmaxsb %f0, %f2, %f4, 4
106+ ; CHECK-NEXT: br %r14
97107 %ret = call float @fmaxf (float %val1 , float %val2 ) readnone
98108 ret float %ret
99109}
100110
101111; Test the f16 maxnum intrinsic.
102112define half @f12_half (half %dummy , half %val1 , half %val2 ) {
103113; CHECK-LABEL: f12_half:
104- ; CHECK: brasl %r14, __extendhfsf2@PLT
105- ; CHECK: brasl %r14, __extendhfsf2@PLT
106- ; CHECK: wfmaxsb %f0, %f0, %f9, 4
107- ; CHECK: brasl %r14, __truncsfhf2@PLT
108- ; CHECK: br %r14
114+ ; CHECK: # %bb.0:
115+ ; CHECK-NEXT: stmg %r14, %r15, 112(%r15)
116+ ; CHECK-NEXT: .cfi_offset %r14, -48
117+ ; CHECK-NEXT: .cfi_offset %r15, -40
118+ ; CHECK-NEXT: aghi %r15, -176
119+ ; CHECK-NEXT: .cfi_def_cfa_offset 336
120+ ; CHECK-NEXT: std %f8, 168(%r15) # 8-byte Spill
121+ ; CHECK-NEXT: std %f9, 160(%r15) # 8-byte Spill
122+ ; CHECK-NEXT: .cfi_offset %f8, -168
123+ ; CHECK-NEXT: .cfi_offset %f9, -176
124+ ; CHECK-NEXT: ldr %f0, %f4
125+ ; CHECK-NEXT: ldr %f8, %f2
126+ ; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT
127+ ; CHECK-NEXT: ldr %f9, %f0
128+ ; CHECK-NEXT: ldr %f0, %f8
129+ ; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT
130+ ; CHECK-NEXT: wfmaxsb %f0, %f0, %f9, 4
131+ ; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
132+ ; CHECK-NEXT: ld %f8, 168(%r15) # 8-byte Reload
133+ ; CHECK-NEXT: ld %f9, 160(%r15) # 8-byte Reload
134+ ; CHECK-NEXT: lmg %r14, %r15, 288(%r15)
135+ ; CHECK-NEXT: br %r14
109136 %ret = call half @llvm.maxnum.f16 (half %val1 , half %val2 )
110137 ret half %ret
111138}
112139
113140; Test the f32 maxnum intrinsic.
114141define float @f12 (float %dummy , float %val1 , float %val2 ) {
115142; CHECK-LABEL: f12:
116- ; CHECK: wfmaxsb %f0, %f2, %f4, 4
117- ; CHECK: br %r14
143+ ; CHECK: # %bb.0:
144+ ; CHECK-NEXT: wfmaxsb %f0, %f2, %f4, 4
145+ ; CHECK-NEXT: br %r14
118146 %ret = call float @llvm.maxnum.f32 (float %val1 , float %val2 )
119147 ret float %ret
120148}
121149
122150; Test the f32 maximum intrinsic.
123151define float @f13 (float %dummy , float %val1 , float %val2 ) {
124152; CHECK-LABEL: f13:
125- ; CHECK: wfmaxsb %f0, %f2, %f4, 1
126- ; CHECK: br %r14
153+ ; CHECK: # %bb.0:
154+ ; CHECK-NEXT: wfmaxsb %f0, %f2, %f4, 1
155+ ; CHECK-NEXT: br %r14
127156 %ret = call float @llvm.maximum.f32 (float %val1 , float %val2 )
128157 ret float %ret
129158}
130159
131160; Test a f32 constant compare/select resulting in maxnum.
132161define float @f14 (float %dummy , float %val ) {
133162; CHECK-LABEL: f14:
134- ; CHECK: lzer [[REG:%f[0-9]+]]
135- ; CHECK: wfmaxsb %f0, %f2, [[REG]], 4
136- ; CHECK: br %r14
163+ ; CHECK: # %bb.0:
164+ ; CHECK-NEXT: lzer %f0
165+ ; CHECK-NEXT: wfmaxsb %f0, %f2, %f0, 4
166+ ; CHECK-NEXT: br %r14
137167 %cmp = fcmp ogt float %val , 0 .0
138168 %ret = select i1 %cmp , float %val , float 0 .0
139169 ret float %ret
@@ -142,42 +172,49 @@ define float @f14(float %dummy, float %val) {
142172; Test a f32 constant compare/select resulting in maximum.
143173define float @f15 (float %dummy , float %val ) {
144174; CHECK-LABEL: f15:
145- ; CHECK: ltebr %f1, %f2
146- ; CHECK: ldr %f0, %f2
147- ; CHECK: br %r14
175+ ; CHECK: # %bb.0:
176+ ; CHECK-NEXT: ltebr %f1, %f2
177+ ; CHECK-NEXT: ldr %f0, %f2
178+ ; CHECK-NEXT: bnler %r14
179+ ; CHECK-NEXT: .LBB12_1:
180+ ; CHECK-NEXT: lzer %f0
181+ ; CHECK-NEXT: br %r14
148182 %cmp = fcmp ugt float %val , 0 .0
149183 %ret = select i1 %cmp , float %val , float 0 .0
150184 ret float %ret
151185}
152186
153187; Test the v4f32 maxnum intrinsic.
154188define <4 x float > @f16 (<4 x float > %dummy , <4 x float > %val1 ,
155- <4 x float > %val2 ) {
156189; CHECK-LABEL: f16:
157- ; CHECK: vfmaxsb %v24, %v26, %v28, 4
158- ; CHECK: br %r14
190+ ; CHECK: # %bb.0:
191+ ; CHECK-NEXT: vfmaxsb %v24, %v26, %v28, 4
192+ ; CHECK-NEXT: br %r14
193+ <4 x float > %val2 ) {
159194 %ret = call <4 x float > @llvm.maxnum.v4f32 (<4 x float > %val1 , <4 x float > %val2 )
160195 ret <4 x float > %ret
161196}
162197
163198; Test the v4f32 maximum intrinsic.
164199define <4 x float > @f17 (<4 x float > %dummy , <4 x float > %val1 ,
165- <4 x float > %val2 ) {
166200; CHECK-LABEL: f17:
167- ; CHECK: vfmaxsb %v24, %v26, %v28, 1
168- ; CHECK: br %r14
201+ ; CHECK: # %bb.0:
202+ ; CHECK-NEXT: vfmaxsb %v24, %v26, %v28, 1
203+ ; CHECK-NEXT: br %r14
204+ <4 x float > %val2 ) {
169205 %ret = call <4 x float > @llvm.maximum.v4f32 (<4 x float > %val1 , <4 x float > %val2 )
170206 ret <4 x float > %ret
171207}
172208
173209; Test the fmaxl library function.
174210define void @f21 (ptr %ptr1 , ptr %ptr2 , ptr %dst ) {
175211; CHECK-LABEL: f21:
176- ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 0(%r2)
177- ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 0(%r3)
178- ; CHECK: wfmaxxb [[RES:%v[0-9]+]], [[REG1]], [[REG2]], 4
179- ; CHECK: vst [[RES]], 0(%r4)
180- ; CHECK: br %r14
212+ ; CHECK: # %bb.0:
213+ ; CHECK-NEXT: vl %v0, 0(%r2), 3
214+ ; CHECK-NEXT: vl %v1, 0(%r3), 3
215+ ; CHECK-NEXT: wfmaxxb %v0, %v0, %v1, 4
216+ ; CHECK-NEXT: vst %v0, 0(%r4), 3
217+ ; CHECK-NEXT: br %r14
181218 %val1 = load fp128 , ptr %ptr1
182219 %val2 = load fp128 , ptr %ptr2
183220 %res = call fp128 @fmaxl (fp128 %val1 , fp128 %val2 ) readnone
@@ -188,11 +225,12 @@ define void @f21(ptr %ptr1, ptr %ptr2, ptr %dst) {
188225; Test the f128 maxnum intrinsic.
189226define void @f22 (ptr %ptr1 , ptr %ptr2 , ptr %dst ) {
190227; CHECK-LABEL: f22:
191- ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 0(%r2)
192- ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 0(%r3)
193- ; CHECK: wfmaxxb [[RES:%v[0-9]+]], [[REG1]], [[REG2]], 4
194- ; CHECK: vst [[RES]], 0(%r4)
195- ; CHECK: br %r14
228+ ; CHECK: # %bb.0:
229+ ; CHECK-NEXT: vl %v0, 0(%r2), 3
230+ ; CHECK-NEXT: vl %v1, 0(%r3), 3
231+ ; CHECK-NEXT: wfmaxxb %v0, %v0, %v1, 4
232+ ; CHECK-NEXT: vst %v0, 0(%r4), 3
233+ ; CHECK-NEXT: br %r14
196234 %val1 = load fp128 , ptr %ptr1
197235 %val2 = load fp128 , ptr %ptr2
198236 %res = call fp128 @llvm.maxnum.f128 (fp128 %val1 , fp128 %val2 )
@@ -203,11 +241,12 @@ define void @f22(ptr %ptr1, ptr %ptr2, ptr %dst) {
203241; Test the f128 maximum intrinsic.
204242define void @f23 (ptr %ptr1 , ptr %ptr2 , ptr %dst ) {
205243; CHECK-LABEL: f23:
206- ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 0(%r2)
207- ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 0(%r3)
208- ; CHECK: wfmaxxb [[RES:%v[0-9]+]], [[REG1]], [[REG2]], 1
209- ; CHECK: vst [[RES]], 0(%r4)
210- ; CHECK: br %r14
244+ ; CHECK: # %bb.0:
245+ ; CHECK-NEXT: vl %v0, 0(%r2), 3
246+ ; CHECK-NEXT: vl %v1, 0(%r3), 3
247+ ; CHECK-NEXT: wfmaxxb %v0, %v0, %v1, 1
248+ ; CHECK-NEXT: vst %v0, 0(%r4), 3
249+ ; CHECK-NEXT: br %r14
211250 %val1 = load fp128 , ptr %ptr1
212251 %val2 = load fp128 , ptr %ptr2
213252 %res = call fp128 @llvm.maximum.f128 (fp128 %val1 , fp128 %val2 )
@@ -218,11 +257,12 @@ define void @f23(ptr %ptr1, ptr %ptr2, ptr %dst) {
218257; Test a f128 constant compare/select resulting in maxnum.
219258define void @f24 (ptr %ptr , ptr %dst ) {
220259; CHECK-LABEL: f24:
221- ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 0(%r2)
222- ; CHECK-DAG: vzero [[REG2:%v[0-9]+]]
223- ; CHECK: wfmaxxb [[RES:%v[0-9]+]], [[REG1]], [[REG2]], 4
224- ; CHECK: vst [[RES]], 0(%r3)
225- ; CHECK: br %r14
260+ ; CHECK: # %bb.0:
261+ ; CHECK-NEXT: vl %v0, 0(%r2), 3
262+ ; CHECK-NEXT: vzero %v1
263+ ; CHECK-NEXT: wfmaxxb %v0, %v0, %v1, 4
264+ ; CHECK-NEXT: vst %v0, 0(%r3), 3
265+ ; CHECK-NEXT: br %r14
226266 %val = load fp128 , ptr %ptr
227267 %cmp = fcmp ogt fp128 %val , 0xL00000000000000000000000000000000
228268 %res = select i1 %cmp , fp128 %val , fp128 0xL00000000000000000000000000000000
@@ -233,11 +273,16 @@ define void @f24(ptr %ptr, ptr %dst) {
233273; Test a f128 constant compare/select resulting in maximum.
234274define void @f25 (ptr %ptr , ptr %dst ) {
235275; CHECK-LABEL: f25:
236- ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 0(%r2)
237- ; CHECK-DAG: vzero [[REG2:%v[0-9]+]]
238- ; CHECK: wfcxb [[REG1]], [[REG2]]
239- ; CHECK: vst [[RES]], 0(%r3)
240- ; CHECK: br %r14
276+ ; CHECK: # %bb.0:
277+ ; CHECK-NEXT: vl %v0, 0(%r2), 3
278+ ; CHECK-NEXT: vzero %v1
279+ ; CHECK-NEXT: wfcxb %v0, %v1
280+ ; CHECK-NEXT: jnle .LBB19_2
281+ ; CHECK-NEXT: # %bb.1:
282+ ; CHECK-NEXT: vzero %v0
283+ ; CHECK-NEXT: .LBB19_2:
284+ ; CHECK-NEXT: vst %v0, 0(%r3), 3
285+ ; CHECK-NEXT: br %r14
241286 %val = load fp128 , ptr %ptr
242287 %cmp = fcmp ugt fp128 %val , 0xL00000000000000000000000000000000
243288 %res = select i1 %cmp , fp128 %val , fp128 0xL00000000000000000000000000000000
0 commit comments