xref: /aosp_15_r20/external/clang/test/CodeGen/fp16-ops.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: arm-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK
3*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK
4*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK
5*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK
6*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fnative-half-type %s \
7*67e74705SXin Li // RUN:   | FileCheck %s --check-prefix=NATIVE-HALF
8*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fnative-half-type %s \
9*67e74705SXin Li // RUN:   | FileCheck %s --check-prefix=NATIVE-HALF
10*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -o - -x renderscript %s \
11*67e74705SXin Li // RUN:   | FileCheck %s --check-prefix=NATIVE-HALF
12*67e74705SXin Li typedef unsigned cond_t;
13*67e74705SXin Li 
14*67e74705SXin Li volatile cond_t test;
15*67e74705SXin Li volatile int i0;
16*67e74705SXin Li volatile __fp16 h0 = 0.0, h1 = 1.0, h2;
17*67e74705SXin Li volatile float f0, f1, f2;
18*67e74705SXin Li volatile double d0;
19*67e74705SXin Li 
foo(void)20*67e74705SXin Li void foo(void) {
21*67e74705SXin Li   // CHECK-LABEL: define void @foo()
22*67e74705SXin Li 
23*67e74705SXin Li   // Check unary ops
24*67e74705SXin Li 
25*67e74705SXin Li   // NOHALF: [[F16TOF32:call float @llvm.convert.from.fp16.f32]]
26*67e74705SXin Li   // HALF: [[F16TOF32:fpext half]]
27*67e74705SXin Li   // CHECK: fptoui float
28*67e74705SXin Li   // NATIVE-HALF: fptoui half
29*67e74705SXin Li   test = (h0);
30*67e74705SXin Li   // CHECK: uitofp i32
31*67e74705SXin Li   // NOHALF: [[F32TOF16:call i16 @llvm.convert.to.fp16.f32]]
32*67e74705SXin Li   // HALF: [[F32TOF16:fptrunc float]]
33*67e74705SXin Li   // NATIVE-HALF: uitofp i32 {{.*}} to half
34*67e74705SXin Li   h0 = (test);
35*67e74705SXin Li   // CHECK: [[F16TOF32]]
36*67e74705SXin Li   // CHECK: fcmp une float
37*67e74705SXin Li   // NATIVE-HALF: fcmp une half
38*67e74705SXin Li   test = (!h1);
39*67e74705SXin Li   // CHECK: [[F16TOF32]]
40*67e74705SXin Li   // CHECK: fsub float
41*67e74705SXin Li   // NOHALF: [[F32TOF16]]
42*67e74705SXin Li   // HALF: [[F32TOF16]]
43*67e74705SXin Li   // NATIVE-HALF: fsub half
44*67e74705SXin Li   h1 = -h1;
45*67e74705SXin Li   // CHECK: [[F16TOF32]]
46*67e74705SXin Li   // CHECK: [[F32TOF16]]
47*67e74705SXin Li   // NATIVE-HALF: load volatile half
48*67e74705SXin Li   // NATIVE-HALF-NEXT: store volatile half
49*67e74705SXin Li   h1 = +h1;
50*67e74705SXin Li   // CHECK: [[F16TOF32]]
51*67e74705SXin Li   // CHECK: fadd float
52*67e74705SXin Li   // CHECK: [[F32TOF16]]
53*67e74705SXin Li   // NATIVE-HALF: fadd half
54*67e74705SXin Li   h1++;
55*67e74705SXin Li   // CHECK: [[F16TOF32]]
56*67e74705SXin Li   // CHECK: fadd float
57*67e74705SXin Li   // CHECK: [[F32TOF16]]
58*67e74705SXin Li   // NATIVE-HALF: fadd half
59*67e74705SXin Li   ++h1;
60*67e74705SXin Li   // CHECK: [[F16TOF32]]
61*67e74705SXin Li   // CHECK: fadd float
62*67e74705SXin Li   // CHECK: [[F32TOF16]]
63*67e74705SXin Li   // NATIVE-HALF: fadd half
64*67e74705SXin Li   --h1;
65*67e74705SXin Li   // CHECK: [[F16TOF32]]
66*67e74705SXin Li   // CHECK: fadd float
67*67e74705SXin Li   // CHECK: [[F32TOF16]]
68*67e74705SXin Li   // NATIVE-HALF: fadd half
69*67e74705SXin Li   h1--;
70*67e74705SXin Li 
71*67e74705SXin Li   // Check binary ops with various operands
72*67e74705SXin Li   // CHECK: [[F16TOF32]]
73*67e74705SXin Li   // CHECK: [[F16TOF32]]
74*67e74705SXin Li   // CHECK: fmul float
75*67e74705SXin Li   // CHECK: [[F32TOF16]]
76*67e74705SXin Li   // NATIVE-HALF: fmul half
77*67e74705SXin Li   h1 = h0 * h2;
78*67e74705SXin Li   // CHECK: [[F16TOF32]]
79*67e74705SXin Li   // NOHALF: [[F32TOF16]]
80*67e74705SXin Li   // NOHALF: [[F16TOF32]]
81*67e74705SXin Li   // CHECK: fmul float
82*67e74705SXin Li   // CHECK: [[F32TOF16]]
83*67e74705SXin Li   // NATIVE-HALF: fmul half
84*67e74705SXin Li   h1 = h0 * (__fp16) -2.0f;
85*67e74705SXin Li   // CHECK: [[F16TOF32]]
86*67e74705SXin Li   // CHECK: fmul float
87*67e74705SXin Li   // CHECK: [[F32TOF16]]
88*67e74705SXin Li   // NATIVE-HALF: fpext half
89*67e74705SXin Li   // NATIVE-HALF: fmul float
90*67e74705SXin Li   h1 = h0 * f2;
91*67e74705SXin Li   // CHECK: [[F16TOF32]]
92*67e74705SXin Li   // CHECK: fmul float
93*67e74705SXin Li   // CHECK: [[F32TOF16]]
94*67e74705SXin Li   // NATIVE-HALF: fpext half
95*67e74705SXin Li   // NATIVE-HALF: fmul float
96*67e74705SXin Li   h1 = f0 * h2;
97*67e74705SXin Li   // CHECK: [[F16TOF32]]
98*67e74705SXin Li   // CHECK: fmul float
99*67e74705SXin Li   // CHECK: [[F32TOF16]]
100*67e74705SXin Li   // NATIVE-HALF: fmul half
101*67e74705SXin Li   h1 = h0 * i0;
102*67e74705SXin Li 
103*67e74705SXin Li   // CHECK: [[F16TOF32]]
104*67e74705SXin Li   // CHECK: [[F16TOF32]]
105*67e74705SXin Li   // CHECK: fdiv float
106*67e74705SXin Li   // CHECK: [[F32TOF16]]
107*67e74705SXin Li   // NATIVE-HALF: fdiv half
108*67e74705SXin Li   h1 = (h0 / h2);
109*67e74705SXin Li   // CHECK: [[F16TOF32]]
110*67e74705SXin Li   // NOHALF: [[F16TOF32]]
111*67e74705SXin Li   // CHECK: fdiv float
112*67e74705SXin Li   // CHECK: [[F32TOF16]]
113*67e74705SXin Li   // NATIVE-HALF: fdiv half
114*67e74705SXin Li   h1 = (h0 / (__fp16) -2.0f);
115*67e74705SXin Li   // CHECK: [[F16TOF32]]
116*67e74705SXin Li   // CHECK: fdiv float
117*67e74705SXin Li   // CHECK: [[F32TOF16]]
118*67e74705SXin Li   // NATIVE-HALF: fpext half
119*67e74705SXin Li   // NATIVE-HALF: fdiv float
120*67e74705SXin Li   h1 = (h0 / f2);
121*67e74705SXin Li   // CHECK: [[F16TOF32]]
122*67e74705SXin Li   // CHECK: fdiv float
123*67e74705SXin Li   // CHECK: [[F32TOF16]]
124*67e74705SXin Li   // NATIVE-HALF: fpext half
125*67e74705SXin Li   // NATIVE-HALF: fdiv float
126*67e74705SXin Li   h1 = (f0 / h2);
127*67e74705SXin Li   // CHECK: [[F16TOF32]]
128*67e74705SXin Li   // CHECK: fdiv float
129*67e74705SXin Li   // CHECK: [[F32TOF16]]
130*67e74705SXin Li   // NATIVE-HALF: fdiv half
131*67e74705SXin Li   h1 = (h0 / i0);
132*67e74705SXin Li 
133*67e74705SXin Li   // CHECK: [[F16TOF32]]
134*67e74705SXin Li   // CHECK: [[F16TOF32]]
135*67e74705SXin Li   // CHECK: fadd float
136*67e74705SXin Li   // CHECK: [[F32TOF16]]
137*67e74705SXin Li   // NATIVE-HALF: fadd half
138*67e74705SXin Li   h1 = (h2 + h0);
139*67e74705SXin Li   // CHECK: [[F16TOF32]]
140*67e74705SXin Li   // NOHALF: [[F16TOF32]]
141*67e74705SXin Li   // CHECK: fadd float
142*67e74705SXin Li   // CHECK: [[F32TOF16]]
143*67e74705SXin Li   // NATIVE-HALF: fadd half
144*67e74705SXin Li   h1 = ((__fp16)-2.0 + h0);
145*67e74705SXin Li   // CHECK: [[F16TOF32]]
146*67e74705SXin Li   // CHECK: fadd float
147*67e74705SXin Li   // CHECK: [[F32TOF16]]
148*67e74705SXin Li   // NATIVE-HALF: fpext half
149*67e74705SXin Li   // NATIVE-HALF: fadd float
150*67e74705SXin Li   h1 = (h2 + f0);
151*67e74705SXin Li   // CHECK: [[F16TOF32]]
152*67e74705SXin Li   // CHECK: fadd float
153*67e74705SXin Li   // CHECK: [[F32TOF16]]
154*67e74705SXin Li   // NATIVE-HALF: fpext half
155*67e74705SXin Li   // NATIVE-HALF: fadd float
156*67e74705SXin Li   h1 = (f2 + h0);
157*67e74705SXin Li   // CHECK: [[F16TOF32]]
158*67e74705SXin Li   // CHECK: fadd float
159*67e74705SXin Li   // CHECK: [[F32TOF16]]
160*67e74705SXin Li   // NATIVE-HALF: fadd half
161*67e74705SXin Li   h1 = (h0 + i0);
162*67e74705SXin Li 
163*67e74705SXin Li   // CHECK: [[F16TOF32]]
164*67e74705SXin Li   // CHECK: [[F16TOF32]]
165*67e74705SXin Li   // CHECK: fsub float
166*67e74705SXin Li   // CHECK: [[F32TOF16]]
167*67e74705SXin Li   // NATIVE-HALF: fsub half
168*67e74705SXin Li   h1 = (h2 - h0);
169*67e74705SXin Li   // CHECK: [[F16TOF32]]
170*67e74705SXin Li   // NOHALF: [[F16TOF32]]
171*67e74705SXin Li   // CHECK: fsub float
172*67e74705SXin Li   // CHECK: [[F32TOF16]]
173*67e74705SXin Li   // NATIVE-HALF: fsub half
174*67e74705SXin Li   h1 = ((__fp16)-2.0f - h0);
175*67e74705SXin Li   // CHECK: [[F16TOF32]]
176*67e74705SXin Li   // CHECK: fsub float
177*67e74705SXin Li   // CHECK: [[F32TOF16]]
178*67e74705SXin Li   // NATIVE-HALF: fpext half
179*67e74705SXin Li   // NATIVE-HALF: fsub float
180*67e74705SXin Li   h1 = (h2 - f0);
181*67e74705SXin Li   // CHECK: [[F16TOF32]]
182*67e74705SXin Li   // CHECK: fsub float
183*67e74705SXin Li   // CHECK: [[F32TOF16]]
184*67e74705SXin Li   // NATIVE-HALF: fpext half
185*67e74705SXin Li   // NATIVE-HALF: fsub float
186*67e74705SXin Li   h1 = (f2 - h0);
187*67e74705SXin Li   // CHECK: [[F16TOF32]]
188*67e74705SXin Li   // CHECK: fsub float
189*67e74705SXin Li   // CHECK: [[F32TOF16]]
190*67e74705SXin Li   // NATIVE-HALF: fsub half
191*67e74705SXin Li   h1 = (h0 - i0);
192*67e74705SXin Li 
193*67e74705SXin Li   // CHECK: [[F16TOF32]]
194*67e74705SXin Li   // CHECK: [[F16TOF32]]
195*67e74705SXin Li   // CHECK: fcmp olt float
196*67e74705SXin Li   // NATIVE-HALF: fcmp olt half
197*67e74705SXin Li   test = (h2 < h0);
198*67e74705SXin Li   // CHECK: [[F16TOF32]]
199*67e74705SXin Li   // NOHALF: [[F16TOF32]]
200*67e74705SXin Li   // CHECK: fcmp olt float
201*67e74705SXin Li   // NATIVE-HALF: fcmp olt half
202*67e74705SXin Li   test = (h2 < (__fp16)42.0);
203*67e74705SXin Li   // CHECK: [[F16TOF32]]
204*67e74705SXin Li   // CHECK: fcmp olt float
205*67e74705SXin Li   // NATIVE-HALF: fpext half
206*67e74705SXin Li   // NATIVE-HALF: fcmp olt float
207*67e74705SXin Li   test = (h2 < f0);
208*67e74705SXin Li   // CHECK: [[F16TOF32]]
209*67e74705SXin Li   // CHECK: fcmp olt float
210*67e74705SXin Li   // NATIVE-HALF: fpext half
211*67e74705SXin Li   // NATIVE-HALF: fcmp olt float
212*67e74705SXin Li   test = (f2 < h0);
213*67e74705SXin Li   // CHECK: [[F16TOF32]]
214*67e74705SXin Li   // CHECK: fcmp olt float
215*67e74705SXin Li   // NATIVE-HALF: fcmp olt half
216*67e74705SXin Li   test = (i0 < h0);
217*67e74705SXin Li   // CHECK: [[F16TOF32]]
218*67e74705SXin Li   // CHECK: fcmp olt float
219*67e74705SXin Li   // NATIVE-HALF: fcmp olt half
220*67e74705SXin Li   test = (h0 < i0);
221*67e74705SXin Li 
222*67e74705SXin Li   // CHECK: [[F16TOF32]]
223*67e74705SXin Li   // CHECK: [[F16TOF32]]
224*67e74705SXin Li   // CHECK: fcmp ogt float
225*67e74705SXin Li   // NATIVE-HALF: fcmp ogt half
226*67e74705SXin Li   test = (h0 > h2);
227*67e74705SXin Li   // CHECK: [[F16TOF32]]
228*67e74705SXin Li   // NOHALF: [[F16TOF32]]
229*67e74705SXin Li   // CHECK: fcmp ogt float
230*67e74705SXin Li   // NATIVE-HALF: fcmp ogt half
231*67e74705SXin Li   test = ((__fp16)42.0 > h2);
232*67e74705SXin Li   // CHECK: [[F16TOF32]]
233*67e74705SXin Li   // CHECK: fcmp ogt float
234*67e74705SXin Li   // NATIVE-HALF: fpext half
235*67e74705SXin Li   // NATIVE-HALF: fcmp ogt float
236*67e74705SXin Li   test = (h0 > f2);
237*67e74705SXin Li   // CHECK: [[F16TOF32]]
238*67e74705SXin Li   // CHECK: fcmp ogt float
239*67e74705SXin Li   // NATIVE-HALF: fpext half
240*67e74705SXin Li   // NATIVE-HALF: fcmp ogt float
241*67e74705SXin Li   test = (f0 > h2);
242*67e74705SXin Li   // CHECK: [[F16TOF32]]
243*67e74705SXin Li   // CHECK: fcmp ogt float
244*67e74705SXin Li   // NATIVE-HALF: fcmp ogt half
245*67e74705SXin Li   test = (i0 > h0);
246*67e74705SXin Li   // CHECK: [[F16TOF32]]
247*67e74705SXin Li   // CHECK: fcmp ogt float
248*67e74705SXin Li   // NATIVE-HALF: fcmp ogt half
249*67e74705SXin Li   test = (h0 > i0);
250*67e74705SXin Li 
251*67e74705SXin Li   // CHECK: [[F16TOF32]]
252*67e74705SXin Li   // CHECK: [[F16TOF32]]
253*67e74705SXin Li   // CHECK: fcmp ole float
254*67e74705SXin Li   // NATIVE-HALF: fcmp ole half
255*67e74705SXin Li   test = (h2 <= h0);
256*67e74705SXin Li   // CHECK: [[F16TOF32]]
257*67e74705SXin Li   // NOHALF: [[F16TOF32]]
258*67e74705SXin Li   // CHECK: fcmp ole float
259*67e74705SXin Li   // NATIVE-HALF: fcmp ole half
260*67e74705SXin Li   test = (h2 <= (__fp16)42.0);
261*67e74705SXin Li   // CHECK: [[F16TOF32]]
262*67e74705SXin Li   // CHECK: fcmp ole float
263*67e74705SXin Li   // NATIVE-HALF: fpext half
264*67e74705SXin Li   // NATIVE-HALF: fcmp ole float
265*67e74705SXin Li   test = (h2 <= f0);
266*67e74705SXin Li   // CHECK: [[F16TOF32]]
267*67e74705SXin Li   // CHECK: fcmp ole float
268*67e74705SXin Li   // NATIVE-HALF: fpext half
269*67e74705SXin Li   // NATIVE-HALF: fcmp ole float
270*67e74705SXin Li   test = (f2 <= h0);
271*67e74705SXin Li   // CHECK: [[F16TOF32]]
272*67e74705SXin Li   // CHECK: fcmp ole float
273*67e74705SXin Li   // NATIVE-HALF: fcmp ole half
274*67e74705SXin Li   test = (i0 <= h0);
275*67e74705SXin Li   // CHECK: [[F16TOF32]]
276*67e74705SXin Li   // CHECK: fcmp ole float
277*67e74705SXin Li   // NATIVE-HALF: fcmp ole half
278*67e74705SXin Li   test = (h0 <= i0);
279*67e74705SXin Li 
280*67e74705SXin Li 
281*67e74705SXin Li   // CHECK: [[F16TOF32]]
282*67e74705SXin Li   // CHECK: [[F16TOF32]]
283*67e74705SXin Li   // CHECK: fcmp oge float
284*67e74705SXin Li   // NATIVE-HALF: fcmp oge half
285*67e74705SXin Li   test = (h0 >= h2);
286*67e74705SXin Li   // CHECK: [[F16TOF32]]
287*67e74705SXin Li   // NOHALF: [[F16TOF32]]
288*67e74705SXin Li   // CHECK: fcmp oge float
289*67e74705SXin Li   // NATIVE-HALF: fcmp oge half
290*67e74705SXin Li   test = (h0 >= (__fp16)-2.0);
291*67e74705SXin Li   // CHECK: [[F16TOF32]]
292*67e74705SXin Li   // CHECK: fcmp oge float
293*67e74705SXin Li   // NATIVE-HALF: fpext half
294*67e74705SXin Li   // NATIVE-HALF: fcmp oge float
295*67e74705SXin Li   test = (h0 >= f2);
296*67e74705SXin Li   // CHECK: [[F16TOF32]]
297*67e74705SXin Li   // CHECK: fcmp oge float
298*67e74705SXin Li   // NATIVE-HALF: fpext half
299*67e74705SXin Li   // NATIVE-HALF: fcmp oge float
300*67e74705SXin Li   test = (f0 >= h2);
301*67e74705SXin Li   // CHECK: [[F16TOF32]]
302*67e74705SXin Li   // CHECK: fcmp oge float
303*67e74705SXin Li   // NATIVE-HALF: fcmp oge half
304*67e74705SXin Li   test = (i0 >= h0);
305*67e74705SXin Li   // CHECK: [[F16TOF32]]
306*67e74705SXin Li   // CHECK: fcmp oge float
307*67e74705SXin Li   // NATIVE-HALF: fcmp oge half
308*67e74705SXin Li   test = (h0 >= i0);
309*67e74705SXin Li 
310*67e74705SXin Li   // CHECK: [[F16TOF32]]
311*67e74705SXin Li   // CHECK: [[F16TOF32]]
312*67e74705SXin Li   // CHECK: fcmp oeq float
313*67e74705SXin Li   // NATIVE-HALF: fcmp oeq half
314*67e74705SXin Li   test = (h1 == h2);
315*67e74705SXin Li   // CHECK: [[F16TOF32]]
316*67e74705SXin Li   // NOHALF: [[F16TOF32]]
317*67e74705SXin Li   // CHECK: fcmp oeq float
318*67e74705SXin Li   // NATIVE-HALF: fcmp oeq half
319*67e74705SXin Li   test = (h1 == (__fp16)1.0);
320*67e74705SXin Li   // CHECK: [[F16TOF32]]
321*67e74705SXin Li   // CHECK: fcmp oeq float
322*67e74705SXin Li   // NATIVE-HALF: fpext half
323*67e74705SXin Li   // NATIVE-HALF: fcmp oeq float
324*67e74705SXin Li   test = (h1 == f1);
325*67e74705SXin Li   // CHECK: [[F16TOF32]]
326*67e74705SXin Li   // CHECK: fcmp oeq float
327*67e74705SXin Li   // NATIVE-HALF: fpext half
328*67e74705SXin Li   // NATIVE-HALF: fcmp oeq float
329*67e74705SXin Li   test = (f1 == h1);
330*67e74705SXin Li   // CHECK: [[F16TOF32]]
331*67e74705SXin Li   // CHECK: fcmp oeq float
332*67e74705SXin Li   // NATIVE-HALF: fcmp oeq half
333*67e74705SXin Li   test = (i0 == h0);
334*67e74705SXin Li   // CHECK: [[F16TOF32]]
335*67e74705SXin Li   // CHECK: fcmp oeq float
336*67e74705SXin Li   // NATIVE-HALF: fcmp oeq half
337*67e74705SXin Li   test = (h0 == i0);
338*67e74705SXin Li 
339*67e74705SXin Li   // CHECK: [[F16TOF32]]
340*67e74705SXin Li   // CHECK: [[F16TOF32]]
341*67e74705SXin Li   // CHECK: fcmp une float
342*67e74705SXin Li   // NATIVE-HALF: fcmp une half
343*67e74705SXin Li   test = (h1 != h2);
344*67e74705SXin Li   // CHECK: [[F16TOF32]]
345*67e74705SXin Li   // NOHALF: [[F16TOF32]]
346*67e74705SXin Li   // CHECK: fcmp une float
347*67e74705SXin Li   // NATIVE-HALF: fcmp une half
348*67e74705SXin Li   test = (h1 != (__fp16)1.0);
349*67e74705SXin Li   // CHECK: [[F16TOF32]]
350*67e74705SXin Li   // CHECK: fcmp une float
351*67e74705SXin Li   // NATIVE-HALF: fpext half
352*67e74705SXin Li   // NATIVE-HALF: fcmp une float
353*67e74705SXin Li   test = (h1 != f1);
354*67e74705SXin Li   // CHECK: [[F16TOF32]]
355*67e74705SXin Li   // CHECK: fcmp une float
356*67e74705SXin Li   // NATIVE-HALF: fpext half
357*67e74705SXin Li   // NATIVE-HALF: fcmp une float
358*67e74705SXin Li   test = (f1 != h1);
359*67e74705SXin Li   // CHECK: [[F16TOF32]]
360*67e74705SXin Li   // CHECK: fcmp une float
361*67e74705SXin Li   // NATIVE-HALF: fcmp une half
362*67e74705SXin Li   test = (i0 != h0);
363*67e74705SXin Li   // CHECK: [[F16TOF32]]
364*67e74705SXin Li   // CHECK: fcmp une float
365*67e74705SXin Li   // NATIVE-HALF: fcmp une half
366*67e74705SXin Li   test = (h0 != i0);
367*67e74705SXin Li 
368*67e74705SXin Li   // CHECK: [[F16TOF32]]
369*67e74705SXin Li   // CHECK: fcmp une float
370*67e74705SXin Li   // CHECK: [[F16TOF32]]
371*67e74705SXin Li   // CHECK: [[F16TOF32]]
372*67e74705SXin Li   // CHECK: [[F32TOF16]]
373*67e74705SXin Li   // NATIVE-HALF: fcmp une half {{.*}}, 0xH0000
374*67e74705SXin Li   h1 = (h1 ? h2 : h0);
375*67e74705SXin Li   // Check assignments (inc. compound)
376*67e74705SXin Li   h0 = h1;
377*67e74705SXin Li   // NOHALF: [[F32TOF16]]
378*67e74705SXin Li   // HALF: store {{.*}} half 0xHC000
379*67e74705SXin Li   // NATIVE-HALF: store {{.*}} half 0xHC000
380*67e74705SXin Li   h0 = (__fp16)-2.0f;
381*67e74705SXin Li   // CHECK: [[F32TOF16]]
382*67e74705SXin Li   // NATIVE-HALF: fptrunc float
383*67e74705SXin Li   h0 = f0;
384*67e74705SXin Li 
385*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
386*67e74705SXin Li   // CHECK: [[F32TOF16]]
387*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
388*67e74705SXin Li   h0 = i0;
389*67e74705SXin Li   // CHECK: [[F16TOF32]]
390*67e74705SXin Li   // CHECK: fptosi float {{.*}} to i32
391*67e74705SXin Li   // NATIVE-HALF: fptosi half {{.*}} to i32
392*67e74705SXin Li   i0 = h0;
393*67e74705SXin Li 
394*67e74705SXin Li   // CHECK: [[F16TOF32]]
395*67e74705SXin Li   // CHECK: [[F16TOF32]]
396*67e74705SXin Li   // CHECK: fadd float
397*67e74705SXin Li   // CHECK: [[F32TOF16]]
398*67e74705SXin Li   // NATIVE-HALF: fadd half
399*67e74705SXin Li   h0 += h1;
400*67e74705SXin Li   // CHECK: [[F16TOF32]]
401*67e74705SXin Li   // NOHALF: [[F16TOF32]]
402*67e74705SXin Li   // CHECK: fadd float
403*67e74705SXin Li   // CHECK: [[F32TOF16]]
404*67e74705SXin Li   // NATIVE-HALF: fadd half
405*67e74705SXin Li   h0 += (__fp16)1.0f;
406*67e74705SXin Li   // CHECK: [[F16TOF32]]
407*67e74705SXin Li   // CHECK: fadd float
408*67e74705SXin Li   // CHECK: [[F32TOF16]]
409*67e74705SXin Li   // NATIVE-HALF: fpext half
410*67e74705SXin Li   // NATIVE-HALF: fadd float
411*67e74705SXin Li   // NATIVE-HALF: fptrunc float
412*67e74705SXin Li   h0 += f2;
413*67e74705SXin Li   // CHECK: [[F16TOF32]]
414*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
415*67e74705SXin Li   // CHECK: fadd float
416*67e74705SXin Li   // CHECK: fptosi float {{.*}} to i32
417*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
418*67e74705SXin Li   // NATIVE-HALF: fadd half
419*67e74705SXin Li   // NATIVE-HALF: fptosi half {{.*}} to i32
420*67e74705SXin Li   i0 += h0;
421*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
422*67e74705SXin Li   // CHECK: [[F16TOF32]]
423*67e74705SXin Li   // CHECK: fadd float
424*67e74705SXin Li   // CHECK: [[F32TOF16]]
425*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
426*67e74705SXin Li   // NATIVE-HALF: fadd half
427*67e74705SXin Li   h0 += i0;
428*67e74705SXin Li 
429*67e74705SXin Li   // CHECK: [[F16TOF32]]
430*67e74705SXin Li   // CHECK: [[F16TOF32]]
431*67e74705SXin Li   // CHECK: fsub float
432*67e74705SXin Li   // CHECK: [[F32TOF16]]
433*67e74705SXin Li   // NATIVE-HALF: fsub half
434*67e74705SXin Li   h0 -= h1;
435*67e74705SXin Li   // CHECK: [[F16TOF32]]
436*67e74705SXin Li   // NOHALF: [[F16TOF32]]
437*67e74705SXin Li   // CHECK: fsub float
438*67e74705SXin Li   // CHECK: [[F32TOF16]]
439*67e74705SXin Li   // NATIVE-HALF: fsub half
440*67e74705SXin Li   h0 -= (__fp16)1.0;
441*67e74705SXin Li   // CHECK: [[F16TOF32]]
442*67e74705SXin Li   // CHECK: fsub float
443*67e74705SXin Li   // CHECK: [[F32TOF16]]
444*67e74705SXin Li   // NATIVE-HALF: fpext half
445*67e74705SXin Li   // NATIVE-HALF: fsub float
446*67e74705SXin Li   // NATIVE-HALF: fptrunc float
447*67e74705SXin Li   h0 -= f2;
448*67e74705SXin Li   // CHECK: [[F16TOF32]]
449*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
450*67e74705SXin Li   // CHECK: fsub float
451*67e74705SXin Li   // CHECK: fptosi float {{.*}} to i32
452*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
453*67e74705SXin Li   // NATIVE-HALF: fsub half
454*67e74705SXin Li   // NATIVE-HALF: fptosi half {{.*}} to i32
455*67e74705SXin Li   i0 -= h0;
456*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
457*67e74705SXin Li   // CHECK: [[F16TOF32]]
458*67e74705SXin Li   // CHECK: fsub float
459*67e74705SXin Li   // CHECK: [[F32TOF16]]
460*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
461*67e74705SXin Li   // NATIVE-HALF: fsub half
462*67e74705SXin Li   h0 -= i0;
463*67e74705SXin Li 
464*67e74705SXin Li   // CHECK: [[F16TOF32]]
465*67e74705SXin Li   // CHECK: [[F16TOF32]]
466*67e74705SXin Li   // CHECK: fmul float
467*67e74705SXin Li   // CHECK: [[F32TOF16]]
468*67e74705SXin Li   // NATIVE-HALF: fmul half
469*67e74705SXin Li   h0 *= h1;
470*67e74705SXin Li   // CHECK: [[F16TOF32]]
471*67e74705SXin Li   // NOHALF: [[F16TOF32]]
472*67e74705SXin Li   // CHECK: fmul float
473*67e74705SXin Li   // CHECK: [[F32TOF16]]
474*67e74705SXin Li   // NATIVE-HALF: fmul half
475*67e74705SXin Li   h0 *= (__fp16)1.0;
476*67e74705SXin Li   // CHECK: [[F16TOF32]]
477*67e74705SXin Li   // CHECK: fmul float
478*67e74705SXin Li   // CHECK: [[F32TOF16]]
479*67e74705SXin Li   // NATIVE-HALF: fpext half
480*67e74705SXin Li   // NATIVE-HALF: fmul float
481*67e74705SXin Li   // NATIVE-HALF: fptrunc float
482*67e74705SXin Li   h0 *= f2;
483*67e74705SXin Li   // CHECK: [[F16TOF32]]
484*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
485*67e74705SXin Li   // CHECK: fmul float
486*67e74705SXin Li   // CHECK: fptosi float {{.*}} to i32
487*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
488*67e74705SXin Li   // NATIVE-HALF: fmul half
489*67e74705SXin Li   // NATIVE-HALF: fptosi half {{.*}} to i32
490*67e74705SXin Li   i0 *= h0;
491*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
492*67e74705SXin Li   // CHECK: [[F16TOF32]]
493*67e74705SXin Li   // CHECK: fmul float
494*67e74705SXin Li   // CHECK: [[F32TOF16]]
495*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
496*67e74705SXin Li   // NATIVE-HALF: fmul half
497*67e74705SXin Li   h0 *= i0;
498*67e74705SXin Li 
499*67e74705SXin Li   // CHECK: [[F16TOF32]]
500*67e74705SXin Li   // CHECK: [[F16TOF32]]
501*67e74705SXin Li   // CHECK: fdiv float
502*67e74705SXin Li   // CHECK: [[F32TOF16]]
503*67e74705SXin Li   // NATIVE-HALF: fdiv half
504*67e74705SXin Li   h0 /= h1;
505*67e74705SXin Li   // CHECK: [[F16TOF32]]
506*67e74705SXin Li   // NOHALF: [[F16TOF32]]
507*67e74705SXin Li   // CHECK: fdiv float
508*67e74705SXin Li   // CHECK: [[F32TOF16]]
509*67e74705SXin Li   // NATIVE-HALF: fdiv half
510*67e74705SXin Li   h0 /= (__fp16)1.0;
511*67e74705SXin Li   // CHECK: [[F16TOF32]]
512*67e74705SXin Li   // CHECK: fdiv float
513*67e74705SXin Li   // CHECK: [[F32TOF16]]
514*67e74705SXin Li   // NATIVE-HALF: fpext half
515*67e74705SXin Li   // NATIVE-HALF: fdiv float
516*67e74705SXin Li   // NATIVE-HALF: fptrunc float
517*67e74705SXin Li   h0 /= f2;
518*67e74705SXin Li   // CHECK: [[F16TOF32]]
519*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
520*67e74705SXin Li   // CHECK: fdiv float
521*67e74705SXin Li   // CHECK: fptosi float {{.*}} to i32
522*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
523*67e74705SXin Li   // NATIVE-HALF: fdiv half
524*67e74705SXin Li   // NATIVE-HALF: fptosi half {{.*}} to i32
525*67e74705SXin Li   i0 /= h0;
526*67e74705SXin Li   // CHECK: sitofp i32 {{.*}} to float
527*67e74705SXin Li   // CHECK: [[F16TOF32]]
528*67e74705SXin Li   // CHECK: fdiv float
529*67e74705SXin Li   // CHECK: [[F32TOF16]]
530*67e74705SXin Li   // NATIVE-HALF: sitofp i32 {{.*}} to half
531*67e74705SXin Li   // NATIVE-HALF: fdiv half
532*67e74705SXin Li   h0 /= i0;
533*67e74705SXin Li 
534*67e74705SXin Li   // Check conversions to/from double
535*67e74705SXin Li   // NOHALF: call i16 @llvm.convert.to.fp16.f64(
536*67e74705SXin Li   // HALF: fptrunc double {{.*}} to half
537*67e74705SXin Li   // NATIVE-HALF: fptrunc double {{.*}} to half
538*67e74705SXin Li   h0 = d0;
539*67e74705SXin Li 
540*67e74705SXin Li   // CHECK: [[MID:%.*]] = fptrunc double {{%.*}} to float
541*67e74705SXin Li   // NOHALF: call i16 @llvm.convert.to.fp16.f32(float [[MID]])
542*67e74705SXin Li   // HALF: fptrunc float [[MID]] to half
543*67e74705SXin Li   // NATIVE-HALF: [[MID:%.*]] = fptrunc double {{%.*}} to float
544*67e74705SXin Li   // NATIVE-HALF: fptrunc float {{.*}} to half
545*67e74705SXin Li   h0 = (float)d0;
546*67e74705SXin Li 
547*67e74705SXin Li   // NOHALF: call double @llvm.convert.from.fp16.f64(
548*67e74705SXin Li   // HALF: fpext half {{.*}} to double
549*67e74705SXin Li   // NATIVE-HALF: fpext half {{.*}} to double
550*67e74705SXin Li   d0 = h0;
551*67e74705SXin Li 
552*67e74705SXin Li   // NOHALF: [[MID:%.*]] = call float @llvm.convert.from.fp16.f32(
553*67e74705SXin Li   // HALF: [[MID:%.*]] = fpext half {{.*}} to float
554*67e74705SXin Li   // CHECK: fpext float [[MID]] to double
555*67e74705SXin Li   // NATIVE-HALF: [[MID:%.*]] = fpext half {{.*}} to float
556*67e74705SXin Li   // NATIVE-HALF: fpext float [[MID]] to double
557*67e74705SXin Li   d0 = (float)h0;
558*67e74705SXin Li }
559