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