1; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s
2; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -verify-machineinstrs -mcpu=a2q < %s | FileCheck %s --check-prefix=QPX
3
4declare float @fabsf(float)
5
6declare float @fminf(float, float)
7declare double @fmin(double, double)
8declare float @llvm.minnum.f32(float, float)
9declare double @llvm.minnum.f64(double, double)
10
11declare float @fmaxf(float, float)
12declare double @fmax(double, double)
13declare float @llvm.maxnum.f32(float, float)
14declare double @llvm.maxnum.f64(double, double)
15
16declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
17declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)
18declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
19declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)
20
21define void @test1(float %f, float* %fp) {
22entry:
23  br label %loop_body
24
25loop_body:
26  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
27  %0 = call float @llvm.minnum.f32(float %f, float 1.0)
28  store float %0, float* %fp, align 4
29  %1 = add i64 %invar_address.dim.0.01, 1
30  %2 = icmp eq i64 %1, 2
31  br i1 %2, label %loop_exit, label %loop_body
32
33loop_exit:
34  ret void
35}
36
37; CHECK-LABEL: test1:
38; CHECK-NOT: mtctr
39; CHECK: xsmindp
40; CHECK-NOT: xsmindp
41; CHECK-NOT: mtctr
42; CHECK: blr
43
44define void @test1v(<4 x float> %f, <4 x float>* %fp) {
45entry:
46  br label %loop_body
47
48loop_body:
49  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
50  %0 = call <4 x float> @llvm.minnum.v4f32(<4 x float> %f, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>)
51  store <4 x float> %0, <4 x float>* %fp, align 16
52  %1 = add i64 %invar_address.dim.0.01, 1
53  %2 = icmp eq i64 %1, 4
54  br i1 %2, label %loop_exit, label %loop_body
55
56loop_exit:
57  ret void
58}
59
60; CHECK-LABEL: test1v:
61; CHECK: xvminsp
62; CHECK-NOT: xsmindp
63; CHECK: mtctr
64; CHECK-NOT: xsmindp
65; CHECK: blr
66
67; QPX-LABEL: test1v:
68; QPX: mtctr
69; QPX-NOT: bl fminf
70; QPX: blr
71
72define void @test1a(float %f, float* %fp) {
73entry:
74  br label %loop_body
75
76loop_body:
77  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
78  %0 = call float @fminf(float %f, float 1.0) readnone
79  store float %0, float* %fp, align 4
80  %1 = add i64 %invar_address.dim.0.01, 1
81  %2 = icmp eq i64 %1, 2
82  br i1 %2, label %loop_exit, label %loop_body
83
84loop_exit:
85  ret void
86}
87
88; CHECK-LABEL: test1a:
89; CHECK-NOT: mtctr
90; CHECK: xsmindp
91; CHECK-NOT: xsmindp
92; CHECK-NOT: mtctr
93; CHECK: blr
94
95define void @test2(float %f, float* %fp) {
96entry:
97  br label %loop_body
98
99loop_body:
100  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
101  %0 = call float @llvm.maxnum.f32(float %f, float 1.0)
102  store float %0, float* %fp, align 4
103  %1 = add i64 %invar_address.dim.0.01, 1
104  %2 = icmp eq i64 %1, 2
105  br i1 %2, label %loop_exit, label %loop_body
106
107loop_exit:
108  ret void
109}
110
111; CHECK-LABEL: test2:
112; CHECK-NOT: mtctr
113; CHECK: xsmaxdp
114; CHECK-NOT: xsmaxdp
115; CHECK-NOT: mtctr
116; CHECK: blr
117
118define void @test2v(<4 x double> %f, <4 x double>* %fp) {
119entry:
120  br label %loop_body
121
122loop_body:
123  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
124  %0 = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %f, <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>)
125  store <4 x double> %0, <4 x double>* %fp, align 16
126  %1 = add i64 %invar_address.dim.0.01, 1
127  %2 = icmp eq i64 %1, 4
128  br i1 %2, label %loop_exit, label %loop_body
129
130loop_exit:
131  ret void
132}
133
134; CHECK-LABEL: test2v:
135; CHECK: xvmaxdp
136; CHECK: xvmaxdp
137; CHECK-NOT: xsmaxdp
138; CHECK: mtctr
139; CHECK-NOT: xsmaxdp
140; CHECK: blr
141
142; QPX-LABEL: test2v:
143; QPX: mtctr
144; QPX-NOT: bl fmax
145; QPX: blr
146
147define void @test2a(float %f, float* %fp) {
148entry:
149  br label %loop_body
150
151loop_body:
152  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
153  %0 = call float @fmaxf(float %f, float 1.0) readnone
154  store float %0, float* %fp, align 4
155  %1 = add i64 %invar_address.dim.0.01, 1
156  %2 = icmp eq i64 %1, 2
157  br i1 %2, label %loop_exit, label %loop_body
158
159loop_exit:
160  ret void
161}
162
163; CHECK-LABEL: test2a:
164; CHECK-NOT: mtctr
165; CHECK: xsmaxdp
166; CHECK-NOT: xsmaxdp
167; CHECK-NOT: mtctr
168; CHECK: blr
169
170define void @test3(double %f, double* %fp) {
171entry:
172  br label %loop_body
173
174loop_body:
175  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
176  %0 = call double @llvm.minnum.f64(double %f, double 1.0)
177  store double %0, double* %fp, align 8
178  %1 = add i64 %invar_address.dim.0.01, 1
179  %2 = icmp eq i64 %1, 2
180  br i1 %2, label %loop_exit, label %loop_body
181
182loop_exit:
183  ret void
184}
185
186; CHECK-LABEL: test3:
187; CHECK-NOT: mtctr
188; CHECK: xsmindp
189; CHECK-NOT: xsmindp
190; CHECK-NOT: mtctr
191; CHECK: blr
192
193define void @test3a(double %f, double* %fp) {
194entry:
195  br label %loop_body
196
197loop_body:
198  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
199  %0 = call double @fmin(double %f, double 1.0) readnone
200  store double %0, double* %fp, align 8
201  %1 = add i64 %invar_address.dim.0.01, 1
202  %2 = icmp eq i64 %1, 2
203  br i1 %2, label %loop_exit, label %loop_body
204
205loop_exit:
206  ret void
207}
208
209; CHECK-LABEL: test3a:
210; CHECK-NOT: mtctr
211; CHECK: xsmindp
212; CHECK-NOT: xsmindp
213; CHECK-NOT: mtctr
214; CHECK: blr
215
216define void @test4(double %f, double* %fp) {
217entry:
218  br label %loop_body
219
220loop_body:
221  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
222  %0 = call double @llvm.maxnum.f64(double %f, double 1.0)
223  store double %0, double* %fp, align 8
224  %1 = add i64 %invar_address.dim.0.01, 1
225  %2 = icmp eq i64 %1, 2
226  br i1 %2, label %loop_exit, label %loop_body
227
228loop_exit:
229  ret void
230}
231
232; CHECK-LABEL: test4:
233; CHECK-NOT: mtctr
234; CHECK: xsmaxdp
235; CHECK-NOT: xsmaxdp
236; CHECK-NOT: mtctr
237; CHECK: blr
238
239define void @test4a(double %f, double* %fp) {
240entry:
241  br label %loop_body
242
243loop_body:
244  %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
245  %0 = call double @fmax(double %f, double 1.0) readnone
246  store double %0, double* %fp, align 8
247  %1 = add i64 %invar_address.dim.0.01, 1
248  %2 = icmp eq i64 %1, 2
249  br i1 %2, label %loop_exit, label %loop_body
250
251loop_exit:
252  ret void
253}
254
255; CHECK-LABEL: test4a:
256; CHECK-NOT: mtctr
257; CHECK: xsmaxdp
258; CHECK-NOT: xsmaxdp
259; CHECK-NOT: mtctr
260; CHECK: blr
261
262