[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / PowerPC / ctr-minmaxnum.ll
bloba160074ba4f25b135bcbc8d51e8a6cda29f12797
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
4 declare float @fabsf(float)
6 declare float @fminf(float, float)
7 declare double @fmin(double, double)
8 declare float @llvm.minnum.f32(float, float)
9 declare double @llvm.minnum.f64(double, double)
11 declare float @fmaxf(float, float)
12 declare double @fmax(double, double)
13 declare float @llvm.maxnum.f32(float, float)
14 declare double @llvm.maxnum.f64(double, double)
16 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
17 declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)
18 declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
19 declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)
21 define void @test1(float %f, float* %fp) {
22 entry:
23   br label %loop_body
25 loop_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
33 loop_exit:
34   ret void
37 ; CHECK-LABEL: test1:
38 ; CHECK-NOT: mtctr
39 ; CHECK: bl fminf
40 ; CHECK-NOT: bl fminf
41 ; CHECK-NOT: mtctr
42 ; CHECK: blr
44 define void @test1v(<4 x float> %f, <4 x float>* %fp) {
45 entry:
46   br label %loop_body
48 loop_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
56 loop_exit:
57   ret void
60 ; CHECK-LABEL: test1v:
61 ; CHECK: xvminsp
62 ; CHECK-NOT: bl fminf
63 ; CHECK: mtctr
64 ; CHECK-NOT: bl fminf
65 ; CHECK: blr
67 ; QPX-LABEL: test1v:
68 ; QPX: mtctr
69 ; QPX-NOT: bl fminf
70 ; QPX: blr
72 define void @test1a(float %f, float* %fp) {
73 entry:
74   br label %loop_body
76 loop_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
84 loop_exit:
85   ret void
88 ; CHECK-LABEL: test1a:
89 ; CHECK-NOT: mtctr
90 ; CHECK: bl fminf
91 ; CHECK-NOT: bl fminf
92 ; CHECK-NOT: mtctr
93 ; CHECK: blr
95 define void @test2(float %f, float* %fp) {
96 entry:
97   br label %loop_body
99 loop_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
107 loop_exit:
108   ret void
111 ; CHECK-LABEL: test2:
112 ; CHECK-NOT: mtctr
113 ; CHECK: bl fmaxf
114 ; CHECK-NOT: bl fmaxf
115 ; CHECK-NOT: mtctr
116 ; CHECK: blr
118 define void @test2v(<4 x double> %f, <4 x double>* %fp) {
119 entry:
120   br label %loop_body
122 loop_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
130 loop_exit:
131   ret void
134 ; CHECK-LABEL: test2v:
135 ; CHECK: xvmaxdp
136 ; CHECK: xvmaxdp
137 ; CHECK-NOT: bl fmax
138 ; CHECK: mtctr
139 ; CHECK-NOT: bl fmax
140 ; CHECK: blr
142 ; QPX-LABEL: test2v:
143 ; QPX: mtctr
144 ; QPX-NOT: bl fmax
145 ; QPX: blr
147 define void @test2a(float %f, float* %fp) {
148 entry:
149   br label %loop_body
151 loop_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
159 loop_exit:
160   ret void
163 ; CHECK-LABEL: test2a:
164 ; CHECK-NOT: mtctr
165 ; CHECK: bl fmaxf
166 ; CHECK-NOT: bl fmaxf
167 ; CHECK-NOT: mtctr
168 ; CHECK: blr
170 define void @test3(double %f, double* %fp) {
171 entry:
172   br label %loop_body
174 loop_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
182 loop_exit:
183   ret void
186 ; CHECK-LABEL: test3:
187 ; CHECK-NOT: mtctr
188 ; CHECK: bl fmin
189 ; CHECK-NOT: bl fmin
190 ; CHECK-NOT: mtctr
191 ; CHECK: blr
193 define void @test3a(double %f, double* %fp) {
194 entry:
195   br label %loop_body
197 loop_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
205 loop_exit:
206   ret void
209 ; CHECK-LABEL: test3a:
210 ; CHECK-NOT: mtctr
211 ; CHECK: bl fmin
212 ; CHECK-NOT: bl fmin
213 ; CHECK-NOT: mtctr
214 ; CHECK: blr
216 define void @test4(double %f, double* %fp) {
217 entry:
218   br label %loop_body
220 loop_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
228 loop_exit:
229   ret void
232 ; CHECK-LABEL: test4:
233 ; CHECK-NOT: mtctr
234 ; CHECK: bl fmax
235 ; CHECK-NOT: bl fmax
236 ; CHECK-NOT: mtctr
237 ; CHECK: blr
239 define void @test4a(double %f, double* %fp) {
240 entry:
241   br label %loop_body
243 loop_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
251 loop_exit:
252   ret void
255 ; CHECK-LABEL: test4a:
256 ; CHECK-NOT: mtctr
257 ; CHECK: bl fmax
258 ; CHECK-NOT: bl fmax
259 ; CHECK-NOT: mtctr
260 ; CHECK: blr