xref: /llvm-project/llvm/test/CodeGen/ARM/fp16-vminmaxnm.ll (revision 834f7dc7abada8e8b10cc323ea296464771e9a94)
1*834f7dc7SSjoerd Meijer; RUN: llc < %s -mtriple=arm-eabi -mattr=+fullfp16 -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck %s
2*834f7dc7SSjoerd Meijer; RUN: llc < %s -mtriple thumbv7a -mattr=+fullfp16 -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck %s
3*834f7dc7SSjoerd Meijer
4*834f7dc7SSjoerd Meijer; TODO: we can't pass half-precision arguments as "half" types yet. We do
5*834f7dc7SSjoerd Meijer; that for the time being by passing "float %f.coerce" and the necessary
6*834f7dc7SSjoerd Meijer; bitconverts/truncates. In these tests we pass i16 and use 1 bitconvert, which
7*834f7dc7SSjoerd Meijer; is the shortest way to get a half type. But when we can pass half types, we
8*834f7dc7SSjoerd Meijer; want to use that here.
9*834f7dc7SSjoerd Meijer
10*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_o(i16 signext %a, i16 signext %b) {
11*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_o:
12*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
13*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
14*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S2]], [[S0]]
15*834f7dc7SSjoerd Meijerentry:
16*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
17*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
18*834f7dc7SSjoerd Meijer  %cmp = fcmp fast olt half %0, %1
19*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
20*834f7dc7SSjoerd Meijer  ret half %cond
21*834f7dc7SSjoerd Meijer}
22*834f7dc7SSjoerd Meijer
23*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_o_rev(i16 signext %a, i16 signext %b) {
24*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_o_rev:
25*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
26*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
27*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S2]], [[S0]]
28*834f7dc7SSjoerd Meijerentry:
29*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
30*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
31*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ogt half %0, %1
32*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %1, half %0
33*834f7dc7SSjoerd Meijer  ret half %cond
34*834f7dc7SSjoerd Meijer}
35*834f7dc7SSjoerd Meijer
36*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_u(i16 signext %a, i16 signext %b) {
37*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_u:
38*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
39*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
40*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S2]], [[S0]]
41*834f7dc7SSjoerd Meijerentry:
42*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
43*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
44*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ult half %0, %1
45*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
46*834f7dc7SSjoerd Meijer  ret half %cond
47*834f7dc7SSjoerd Meijer}
48*834f7dc7SSjoerd Meijer
49*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_ule(i16 signext %a, i16 signext %b) {
50*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_ule:
51*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
52*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
53*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S2]], [[S0]]
54*834f7dc7SSjoerd Meijerentry:
55*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
56*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
57*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ule half %0, %1
58*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
59*834f7dc7SSjoerd Meijer  ret half %cond
60*834f7dc7SSjoerd Meijer}
61*834f7dc7SSjoerd Meijer
62*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_u_rev(i16 signext %a, i16 signext %b) {
63*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_u_rev:
64*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
65*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
66*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S2]], [[S0]]
67*834f7dc7SSjoerd Meijerentry:
68*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
69*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
70*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ugt half %0, %1
71*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %1, half %0
72*834f7dc7SSjoerd Meijer  ret half %cond
73*834f7dc7SSjoerd Meijer}
74*834f7dc7SSjoerd Meijer
75*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_o(i16 signext %a, i16 signext %b) {
76*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_o:
77*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
78*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
79*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
80*834f7dc7SSjoerd Meijerentry:
81*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
82*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
83*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ogt half %0, %1
84*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
85*834f7dc7SSjoerd Meijer  ret half %cond
86*834f7dc7SSjoerd Meijer}
87*834f7dc7SSjoerd Meijer
88*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_oge(i16 signext %a, i16 signext %b) {
89*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_oge:
90*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
91*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
92*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
93*834f7dc7SSjoerd Meijerentry:
94*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
95*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
96*834f7dc7SSjoerd Meijer  %cmp = fcmp fast oge half %0, %1
97*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
98*834f7dc7SSjoerd Meijer  ret half %cond
99*834f7dc7SSjoerd Meijer}
100*834f7dc7SSjoerd Meijer
101*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_o_rev(i16 signext %a, i16 signext %b) {
102*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_o_rev:
103*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
104*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
105*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
106*834f7dc7SSjoerd Meijerentry:
107*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
108*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
109*834f7dc7SSjoerd Meijer  %cmp = fcmp fast olt half %0, %1
110*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %1, half %0
111*834f7dc7SSjoerd Meijer  ret half %cond
112*834f7dc7SSjoerd Meijer}
113*834f7dc7SSjoerd Meijer
114*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_ole_rev(i16 signext %a, i16 signext %b) {
115*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_ole_rev:
116*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
117*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
118*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
119*834f7dc7SSjoerd Meijerentry:
120*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
121*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
122*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ole half %0, %1
123*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %1, half %0
124*834f7dc7SSjoerd Meijer  ret half %cond
125*834f7dc7SSjoerd Meijer}
126*834f7dc7SSjoerd Meijer
127*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_u(i16 signext %a, i16 signext %b) {
128*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_u:
129*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
130*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
131*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
132*834f7dc7SSjoerd Meijerentry:
133*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
134*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
135*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ugt half %0, %1
136*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
137*834f7dc7SSjoerd Meijer  ret half %cond
138*834f7dc7SSjoerd Meijer}
139*834f7dc7SSjoerd Meijer
140*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_uge(i16 signext %a, i16 signext %b) {
141*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_uge:
142*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
143*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
144*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
145*834f7dc7SSjoerd Meijerentry:
146*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
147*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
148*834f7dc7SSjoerd Meijer  %cmp = fcmp fast uge half %0, %1
149*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %0, half %1
150*834f7dc7SSjoerd Meijer  ret half %cond
151*834f7dc7SSjoerd Meijer}
152*834f7dc7SSjoerd Meijer
153*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_u_rev(i16 signext %a, i16 signext %b) {
154*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_u_rev:
155*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
156*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
157*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
158*834f7dc7SSjoerd Meijerentry:
159*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
160*834f7dc7SSjoerd Meijer  %1 = bitcast i16 %b to half
161*834f7dc7SSjoerd Meijer  %cmp = fcmp fast ult half %0, %1
162*834f7dc7SSjoerd Meijer  %cond = select i1 %cmp, half %1, half %0
163*834f7dc7SSjoerd Meijer  ret half %cond
164*834f7dc7SSjoerd Meijer}
165*834f7dc7SSjoerd Meijer
166*834f7dc7SSjoerd Meijer; known non-NaNs
167*834f7dc7SSjoerd Meijer
168*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNo(i16 signext %a) {
169*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNo:
170*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
171*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], #1.200000e+01
172*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
173*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
174*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
175*834f7dc7SSjoerd Meijerentry:
176*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
177*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast olt half %0, 12.
178*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half 12.
179*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast olt half 34., %cond1
180*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half 34., half %cond1
181*834f7dc7SSjoerd Meijer  ret half %cond2
182*834f7dc7SSjoerd Meijer}
183*834f7dc7SSjoerd Meijer
184*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNo_rev(i16 signext %a) {
185*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNo_rev:
186*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
187*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
188*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
189*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
190*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
191*834f7dc7SSjoerd Meijerentry:
192*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
193*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ogt half %0, 56.
194*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 56., half %0
195*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ogt half 78., %cond1
196*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 78.
197*834f7dc7SSjoerd Meijer  ret half %cond2
198*834f7dc7SSjoerd Meijer}
199*834f7dc7SSjoerd Meijer
200*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNu(i16 signext %b) {
201*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNu:
202*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
203*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], #1.200000e+01
204*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
205*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
206*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
207*834f7dc7SSjoerd Meijerentry:
208*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %b to half
209*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ult half 12., %0
210*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 12., half %0
211*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ult half %cond1, 34.
212*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 34.
213*834f7dc7SSjoerd Meijer  ret half %cond2
214*834f7dc7SSjoerd Meijer}
215*834f7dc7SSjoerd Meijer
216*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNule(i16 signext %b) {
217*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNule:
218*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
219*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
220*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
221*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
222*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
223*834f7dc7SSjoerd Meijerentry:
224*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %b to half
225*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ule half 34., %0
226*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 34., half %0
227*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ule half %cond1, 56.
228*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 56.
229*834f7dc7SSjoerd Meijer  ret half %cond2
230*834f7dc7SSjoerd Meijer}
231*834f7dc7SSjoerd Meijer
232*834f7dc7SSjoerd Meijerdefine half @fp16_vminnm_NNNu_rev(i16 signext %b) {
233*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminnm_NNNu_rev:
234*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
235*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
236*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
237*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
238*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s0, [[S0]], [[S2]]
239*834f7dc7SSjoerd Meijerentry:
240*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %b to half
241*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ugt half 56., %0
242*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half 56.
243*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ugt half %cond1, 78.
244*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half 78., half %cond1
245*834f7dc7SSjoerd Meijer  ret half %cond2
246*834f7dc7SSjoerd Meijer}
247*834f7dc7SSjoerd Meijer
248*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNo(i16 signext %a) {
249*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNo:
250*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
251*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], #1.200000e+01
252*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
253*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
254*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
255*834f7dc7SSjoerd Meijerentry:
256*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
257*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ogt half %0, 12.
258*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half 12.
259*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ogt half 34., %cond1
260*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half 34., half %cond1
261*834f7dc7SSjoerd Meijer  ret half %cond2
262*834f7dc7SSjoerd Meijer}
263*834f7dc7SSjoerd Meijer
264*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNoge(i16 signext %a) {
265*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNoge:
266*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
267*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
268*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
269*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
270*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
271*834f7dc7SSjoerd Meijerentry:
272*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
273*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast oge half %0, 34.
274*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half 34.
275*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast oge half 56., %cond1
276*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half 56., half %cond1
277*834f7dc7SSjoerd Meijer  ret half %cond2
278*834f7dc7SSjoerd Meijer}
279*834f7dc7SSjoerd Meijer
280*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNo_rev(i16 signext %a) {
281*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNo_rev:
282*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
283*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
284*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
285*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
286*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
287*834f7dc7SSjoerd Meijerentry:
288*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
289*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast olt half %0, 56.
290*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 56., half %0
291*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast olt half 78., %cond1
292*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 78.
293*834f7dc7SSjoerd Meijer  ret half %cond2
294*834f7dc7SSjoerd Meijer}
295*834f7dc7SSjoerd Meijer
296*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNole_rev(i16 signext %a) {
297*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNole_rev:
298*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
299*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
300*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
301*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
302*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
303*834f7dc7SSjoerd Meijerentry:
304*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
305*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ole half %0, 78.
306*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 78., half %0
307*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ole half 90., %cond1
308*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 90.
309*834f7dc7SSjoerd Meijer  ret half %cond2
310*834f7dc7SSjoerd Meijer}
311*834f7dc7SSjoerd Meijer
312*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNu(i16 signext %b) {
313*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNu:
314*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
315*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], #1.200000e+01
316*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
317*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
318*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
319*834f7dc7SSjoerd Meijerentry:
320*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %b to half
321*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ugt half 12., %0
322*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 12., half %0
323*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ugt half %cond1, 34.
324*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 34.
325*834f7dc7SSjoerd Meijer  ret half %cond2
326*834f7dc7SSjoerd Meijer}
327*834f7dc7SSjoerd Meijer
328*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNuge(i16 signext %b) {
329*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNuge:
330*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
331*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
332*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
333*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
334*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
335*834f7dc7SSjoerd Meijerentry:
336*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %b to half
337*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast uge half 34., %0
338*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 34., half %0
339*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast uge half %cond1, 56.
340*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 56.
341*834f7dc7SSjoerd Meijer  ret half %cond2
342*834f7dc7SSjoerd Meijer}
343*834f7dc7SSjoerd Meijer
344*834f7dc7SSjoerd Meijerdefine half @fp16_vmaxnm_NNNu_rev(i16 signext %b) {
345*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vmaxnm_NNNu_rev:
346*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
347*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S0:s[0-9]]], r{{.}}
348*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
349*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s2, .LCPI{{.*}}
350*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S0]], [[S2]]
351*834f7dc7SSjoerd Meijerentry:
352*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %b to half
353*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ult half 56., %0
354*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half 56.
355*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ult half %cond1, 78.
356*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half 78., half %cond1
357*834f7dc7SSjoerd Meijer  ret half %cond2
358*834f7dc7SSjoerd Meijer}
359*834f7dc7SSjoerd Meijer
360*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_0(i16 signext %a) {
361*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_0:
362*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s0, .LCPI{{.*}}
363*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
364*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s2, s2, s0
365*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
366*834f7dc7SSjoerd Meijerentry:
367*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
368*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast olt half %0, 0.
369*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half 0.
370*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ogt half %cond1, 0.
371*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half 0.
372*834f7dc7SSjoerd Meijer  ret half %cond2
373*834f7dc7SSjoerd Meijer}
374*834f7dc7SSjoerd Meijer
375*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_neg0(i16 signext %a) {
376*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_neg0:
377*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s0, .LCPI{{.*}}
378*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
379*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s2, s2, s0
380*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
381*834f7dc7SSjoerd Meijerentry:
382*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
383*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast olt half %0, -0.
384*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half %0, half -0.
385*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast ugt half %cond1, -0.
386*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half %cond1, half -0.
387*834f7dc7SSjoerd Meijer  ret half %cond2
388*834f7dc7SSjoerd Meijer}
389*834f7dc7SSjoerd Meijer
390*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_e_0(i16 signext %a) {
391*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_e_0:
392*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s0, .LCPI{{.*}}
393*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
394*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s2, s2, s0
395*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
396*834f7dc7SSjoerd Meijerentry:
397*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
398*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ule half 0., %0
399*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half 0., half %0
400*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast uge half 0., %cond1
401*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half 0., half %cond1
402*834f7dc7SSjoerd Meijer  ret half %cond2
403*834f7dc7SSjoerd Meijer}
404*834f7dc7SSjoerd Meijer
405*834f7dc7SSjoerd Meijerdefine half @fp16_vminmaxnm_e_neg0(i16 signext %a) {
406*834f7dc7SSjoerd Meijer; CHECK-LABEL: fp16_vminmaxnm_e_neg0:
407*834f7dc7SSjoerd Meijer; CHECK:    vldr.16 s0, .LCPI{{.*}}
408*834f7dc7SSjoerd Meijer; CHECK:    vmov.f16 [[S2:s[0-9]]], r{{.}}
409*834f7dc7SSjoerd Meijer; CHECK:    vminnm.f16 s2, s2, s0
410*834f7dc7SSjoerd Meijer; CHECK:    vmaxnm.f16 s0, [[S2]], [[S0]]
411*834f7dc7SSjoerd Meijerentry:
412*834f7dc7SSjoerd Meijer  %0 = bitcast i16 %a to half
413*834f7dc7SSjoerd Meijer  %cmp1 = fcmp fast ule half -0., %0
414*834f7dc7SSjoerd Meijer  %cond1 = select i1 %cmp1, half -0., half %0
415*834f7dc7SSjoerd Meijer  %cmp2 = fcmp fast oge half -0., %cond1
416*834f7dc7SSjoerd Meijer  %cond2 = select i1 %cmp2, half -0., half %cond1
417*834f7dc7SSjoerd Meijer  ret half %cond2
418*834f7dc7SSjoerd Meijer}
419