xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/f16-instructions.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple aarch64-unknown-unknown -aarch64-neon-syntax=apple -asm-verbose=false -disable-post-ra -disable-fp-elim | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fadd:
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd s0, s0, s1
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
11*9880d681SAndroid Build Coastguard Workerdefine half @test_fadd(half %a, half %b) #0 {
12*9880d681SAndroid Build Coastguard Worker  %r = fadd half %a, %b
13*9880d681SAndroid Build Coastguard Worker  ret half %r
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fsub:
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub s0, s0, s1
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
22*9880d681SAndroid Build Coastguard Workerdefine half @test_fsub(half %a, half %b) #0 {
23*9880d681SAndroid Build Coastguard Worker  %r = fsub half %a, %b
24*9880d681SAndroid Build Coastguard Worker  ret half %r
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmul:
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, s0, s1
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
33*9880d681SAndroid Build Coastguard Workerdefine half @test_fmul(half %a, half %b) #0 {
34*9880d681SAndroid Build Coastguard Worker  %r = fmul half %a, %b
35*9880d681SAndroid Build Coastguard Worker  ret half %r
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fdiv:
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fdiv s0, s0, s1
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
44*9880d681SAndroid Build Coastguard Workerdefine half @test_fdiv(half %a, half %b) #0 {
45*9880d681SAndroid Build Coastguard Worker  %r = fdiv half %a, %b
46*9880d681SAndroid Build Coastguard Worker  ret half %r
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_frem:
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}fmodf
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
58*9880d681SAndroid Build Coastguard Workerdefine half @test_frem(half %a, half %b) #0 {
59*9880d681SAndroid Build Coastguard Worker  %r = frem half %a, %b
60*9880d681SAndroid Build Coastguard Worker  ret half %r
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_store:
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str  h0, [x0]
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
66*9880d681SAndroid Build Coastguard Workerdefine void @test_store(half %a, half* %b) #0 {
67*9880d681SAndroid Build Coastguard Worker  store half %a, half* %b
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load:
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr  h0, [x0]
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
74*9880d681SAndroid Build Coastguard Workerdefine half @test_load(half* %a) #0 {
75*9880d681SAndroid Build Coastguard Worker  %r = load half, half* %a
76*9880d681SAndroid Build Coastguard Worker  ret half %r
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdeclare half @test_callee(half %a, half %b) #0
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_call:
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}test_callee
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
88*9880d681SAndroid Build Coastguard Workerdefine half @test_call(half %a, half %b) #0 {
89*9880d681SAndroid Build Coastguard Worker  %r = call half @test_callee(half %a, half %b)
90*9880d681SAndroid Build Coastguard Worker  ret half %r
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_call_flipped:
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.16b  v2, v0
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.16b  v0, v1
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.16b  v1, v2
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}test_callee
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
102*9880d681SAndroid Build Coastguard Workerdefine half @test_call_flipped(half %a, half %b) #0 {
103*9880d681SAndroid Build Coastguard Worker  %r = call half @test_callee(half %b, half %a)
104*9880d681SAndroid Build Coastguard Worker  ret half %r
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_tailcall_flipped:
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.16b  v2, v0
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.16b  v0, v1
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov.16b  v1, v2
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b {{_?}}test_callee
112*9880d681SAndroid Build Coastguard Workerdefine half @test_tailcall_flipped(half %a, half %b) #0 {
113*9880d681SAndroid Build Coastguard Worker  %r = tail call half @test_callee(half %b, half %a)
114*9880d681SAndroid Build Coastguard Worker  ret half %r
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select:
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp  w0, #0
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel s0, s0, s1, ne
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
124*9880d681SAndroid Build Coastguard Workerdefine half @test_select(half %a, half %b, i1 zeroext %c) #0 {
125*9880d681SAndroid Build Coastguard Worker  %r = select i1 %c, half %a, half %b
126*9880d681SAndroid Build Coastguard Worker  ret half %r
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc:
130*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvt s3, h3
131*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvt s2, h2
132*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvt s1, h1
133*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvt s0, h0
134*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcmp s2, s3
135*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cset [[CC:w[0-9]+]], ne
136*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: cmp [[CC]], #0
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel s0, s0, s1, ne
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
140*9880d681SAndroid Build Coastguard Workerdefine half @test_select_cc(half %a, half %b, half %c, half %d) #0 {
141*9880d681SAndroid Build Coastguard Worker  %cc = fcmp une half %c, %d
142*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cc, half %a, half %b
143*9880d681SAndroid Build Coastguard Worker  ret half %r
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_f32_f16:
147*9880d681SAndroid Build Coastguard Worker; CHECK-DAG:   fcvt s2, h2
148*9880d681SAndroid Build Coastguard Worker; CHECK-DAG:   fcvt s3, h3
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  fcmp s2, s3
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  fcsel s0, s0, s1, ne
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret
152*9880d681SAndroid Build Coastguard Workerdefine float @test_select_cc_f32_f16(float %a, float %b, half %c, half %d) #0 {
153*9880d681SAndroid Build Coastguard Worker  %cc = fcmp une half %c, %d
154*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cc, float %a, float %b
155*9880d681SAndroid Build Coastguard Worker  ret float %r
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_cc_f16_f32:
159*9880d681SAndroid Build Coastguard Worker; CHECK-DAG:  fcvt s0, h0
160*9880d681SAndroid Build Coastguard Worker; CHECK-DAG:  fcvt s1, h1
161*9880d681SAndroid Build Coastguard Worker; CHECK-DAG:  fcmp s2, s3
162*9880d681SAndroid Build Coastguard Worker; CHECK-DAG:  cset w8, ne
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp w8, #0
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcsel s0, s0, s1, ne
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
167*9880d681SAndroid Build Coastguard Workerdefine half @test_select_cc_f16_f32(half %a, half %b, float %c, float %d) #0 {
168*9880d681SAndroid Build Coastguard Worker  %cc = fcmp une float %c, %d
169*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cc, half %a, half %b
170*9880d681SAndroid Build Coastguard Worker  ret half %r
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_une:
174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, ne
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
179*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_une(half %a, half %b) #0 {
180*9880d681SAndroid Build Coastguard Worker  %r = fcmp une half %a, %b
181*9880d681SAndroid Build Coastguard Worker  ret i1 %r
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ueq:
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orr [[TRUE:w[0-9]+]], wzr, #0x1
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel [[CC:w[0-9]+]], [[TRUE]], wzr, eq
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, [[TRUE]], [[CC]], vs
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
192*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ueq(half %a, half %b) #0 {
193*9880d681SAndroid Build Coastguard Worker  %r = fcmp ueq half %a, %b
194*9880d681SAndroid Build Coastguard Worker  ret i1 %r
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ugt:
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, hi
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
203*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ugt(half %a, half %b) #0 {
204*9880d681SAndroid Build Coastguard Worker  %r = fcmp ugt half %a, %b
205*9880d681SAndroid Build Coastguard Worker  ret i1 %r
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_uge:
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, pl
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
214*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_uge(half %a, half %b) #0 {
215*9880d681SAndroid Build Coastguard Worker  %r = fcmp uge half %a, %b
216*9880d681SAndroid Build Coastguard Worker  ret i1 %r
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ult:
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, lt
224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
225*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ult(half %a, half %b) #0 {
226*9880d681SAndroid Build Coastguard Worker  %r = fcmp ult half %a, %b
227*9880d681SAndroid Build Coastguard Worker  ret i1 %r
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ule:
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, le
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
236*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ule(half %a, half %b) #0 {
237*9880d681SAndroid Build Coastguard Worker  %r = fcmp ule half %a, %b
238*9880d681SAndroid Build Coastguard Worker  ret i1 %r
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_uno:
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, vs
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
248*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_uno(half %a, half %b) #0 {
249*9880d681SAndroid Build Coastguard Worker  %r = fcmp uno half %a, %b
250*9880d681SAndroid Build Coastguard Worker  ret i1 %r
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_one:
254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orr [[TRUE:w[0-9]+]], wzr, #0x1
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel [[CC:w[0-9]+]], [[TRUE]], wzr, mi
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel w0, [[TRUE]], [[CC]], gt
260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
261*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_one(half %a, half %b) #0 {
262*9880d681SAndroid Build Coastguard Worker  %r = fcmp one half %a, %b
263*9880d681SAndroid Build Coastguard Worker  ret i1 %r
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_oeq:
267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, eq
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
272*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_oeq(half %a, half %b) #0 {
273*9880d681SAndroid Build Coastguard Worker  %r = fcmp oeq half %a, %b
274*9880d681SAndroid Build Coastguard Worker  ret i1 %r
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ogt:
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, gt
282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
283*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ogt(half %a, half %b) #0 {
284*9880d681SAndroid Build Coastguard Worker  %r = fcmp ogt half %a, %b
285*9880d681SAndroid Build Coastguard Worker  ret i1 %r
286*9880d681SAndroid Build Coastguard Worker}
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_oge:
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
290*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, ge
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
294*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_oge(half %a, half %b) #0 {
295*9880d681SAndroid Build Coastguard Worker  %r = fcmp oge half %a, %b
296*9880d681SAndroid Build Coastguard Worker  ret i1 %r
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_olt:
300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, mi
304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
305*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_olt(half %a, half %b) #0 {
306*9880d681SAndroid Build Coastguard Worker  %r = fcmp olt half %a, %b
307*9880d681SAndroid Build Coastguard Worker  ret i1 %r
308*9880d681SAndroid Build Coastguard Worker}
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ole:
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
314*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, ls
315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
316*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ole(half %a, half %b) #0 {
317*9880d681SAndroid Build Coastguard Worker  %r = fcmp ole half %a, %b
318*9880d681SAndroid Build Coastguard Worker  ret i1 %r
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fcmp_ord:
322*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cset  w0, vc
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
327*9880d681SAndroid Build Coastguard Workerdefine i1 @test_fcmp_ord(half %a, half %b) #0 {
328*9880d681SAndroid Build Coastguard Worker  %r = fcmp ord half %a, %b
329*9880d681SAndroid Build Coastguard Worker  ret i1 %r
330*9880d681SAndroid Build Coastguard Worker}
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_br_cc:
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp s0, s1
336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.mi [[BRCC_ELSE:.?LBB[0-9_]+]]
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str  wzr, [x0]
338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[BRCC_ELSE]]:
340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str  wzr, [x1]
341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
342*9880d681SAndroid Build Coastguard Workerdefine void @test_br_cc(half %a, half %b, i32* %p1, i32* %p2) #0 {
343*9880d681SAndroid Build Coastguard Worker  %c = fcmp uge half %a, %b
344*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %then, label %else
345*9880d681SAndroid Build Coastguard Workerthen:
346*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %p1
347*9880d681SAndroid Build Coastguard Worker  ret void
348*9880d681SAndroid Build Coastguard Workerelse:
349*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %p2
350*9880d681SAndroid Build Coastguard Worker  ret void
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_phi:
354*9880d681SAndroid Build Coastguard Worker; CHECK: mov  x[[PTR:[0-9]+]], x0
355*9880d681SAndroid Build Coastguard Worker; CHECK: ldr  h[[AB:[0-9]+]], [x[[PTR]]]
356*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP:LBB[0-9_]+]]:
357*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b  v[[R:[0-9]+]], v[[AB]]
358*9880d681SAndroid Build Coastguard Worker; CHECK: ldr  h[[AB]], [x[[PTR]]]
359*9880d681SAndroid Build Coastguard Worker; CHECK: mov  x0, x[[PTR]]
360*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?}}test_dummy
361*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b  v0, v[[R]]
362*9880d681SAndroid Build Coastguard Worker; CHECK: ret
363*9880d681SAndroid Build Coastguard Workerdefine half @test_phi(half* %p1) #0 {
364*9880d681SAndroid Build Coastguard Workerentry:
365*9880d681SAndroid Build Coastguard Worker  %a = load half, half* %p1
366*9880d681SAndroid Build Coastguard Worker  br label %loop
367*9880d681SAndroid Build Coastguard Workerloop:
368*9880d681SAndroid Build Coastguard Worker  %r = phi half [%a, %entry], [%b, %loop]
369*9880d681SAndroid Build Coastguard Worker  %b = load half, half* %p1
370*9880d681SAndroid Build Coastguard Worker  %c = call i1 @test_dummy(half* %p1)
371*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %loop, label %return
372*9880d681SAndroid Build Coastguard Workerreturn:
373*9880d681SAndroid Build Coastguard Worker  ret half %r
374*9880d681SAndroid Build Coastguard Worker}
375*9880d681SAndroid Build Coastguard Workerdeclare i1 @test_dummy(half* %p1) #0
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fptosi_i32:
378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtzs w0, s0
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
381*9880d681SAndroid Build Coastguard Workerdefine i32 @test_fptosi_i32(half %a) #0 {
382*9880d681SAndroid Build Coastguard Worker  %r = fptosi half %a to i32
383*9880d681SAndroid Build Coastguard Worker  ret i32 %r
384*9880d681SAndroid Build Coastguard Worker}
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fptosi_i64:
387*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtzs x0, s0
389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
390*9880d681SAndroid Build Coastguard Workerdefine i64 @test_fptosi_i64(half %a) #0 {
391*9880d681SAndroid Build Coastguard Worker  %r = fptosi half %a to i64
392*9880d681SAndroid Build Coastguard Worker  ret i64 %r
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fptoui_i32:
396*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
397*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtzu w0, s0
398*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
399*9880d681SAndroid Build Coastguard Workerdefine i32 @test_fptoui_i32(half %a) #0 {
400*9880d681SAndroid Build Coastguard Worker  %r = fptoui half %a to i32
401*9880d681SAndroid Build Coastguard Worker  ret i32 %r
402*9880d681SAndroid Build Coastguard Worker}
403*9880d681SAndroid Build Coastguard Worker
404*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fptoui_i64:
405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
406*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvtzu x0, s0
407*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
408*9880d681SAndroid Build Coastguard Workerdefine i64 @test_fptoui_i64(half %a) #0 {
409*9880d681SAndroid Build Coastguard Worker  %r = fptoui half %a to i64
410*9880d681SAndroid Build Coastguard Worker  ret i64 %r
411*9880d681SAndroid Build Coastguard Worker}
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_uitofp_i32:
414*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf s0, w0
415*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
416*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
417*9880d681SAndroid Build Coastguard Workerdefine half @test_uitofp_i32(i32 %a) #0 {
418*9880d681SAndroid Build Coastguard Worker  %r = uitofp i32 %a to half
419*9880d681SAndroid Build Coastguard Worker  ret half %r
420*9880d681SAndroid Build Coastguard Worker}
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_uitofp_i64:
423*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf s0, x0
424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
426*9880d681SAndroid Build Coastguard Workerdefine half @test_uitofp_i64(i64 %a) #0 {
427*9880d681SAndroid Build Coastguard Worker  %r = uitofp i64 %a to half
428*9880d681SAndroid Build Coastguard Worker  ret half %r
429*9880d681SAndroid Build Coastguard Worker}
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sitofp_i32:
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf s0, w0
433*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
434*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
435*9880d681SAndroid Build Coastguard Workerdefine half @test_sitofp_i32(i32 %a) #0 {
436*9880d681SAndroid Build Coastguard Worker  %r = sitofp i32 %a to half
437*9880d681SAndroid Build Coastguard Worker  ret half %r
438*9880d681SAndroid Build Coastguard Worker}
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sitofp_i64:
441*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf s0, x0
442*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
444*9880d681SAndroid Build Coastguard Workerdefine half @test_sitofp_i64(i64 %a) #0 {
445*9880d681SAndroid Build Coastguard Worker  %r = sitofp i64 %a to half
446*9880d681SAndroid Build Coastguard Worker  ret half %r
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_uitofp_i32_fadd:
450*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf s1, w0
451*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h1, s1
452*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
453*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
454*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd s0, s0, s1
455*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
457*9880d681SAndroid Build Coastguard Workerdefine half @test_uitofp_i32_fadd(i32 %a, half %b) #0 {
458*9880d681SAndroid Build Coastguard Worker  %c = uitofp i32 %a to half
459*9880d681SAndroid Build Coastguard Worker  %r = fadd half %b, %c
460*9880d681SAndroid Build Coastguard Worker  ret half %r
461*9880d681SAndroid Build Coastguard Worker}
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sitofp_i32_fadd:
464*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf s1, w0
465*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h1, s1
466*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
467*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd s0, s0, s1
469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
471*9880d681SAndroid Build Coastguard Workerdefine half @test_sitofp_i32_fadd(i32 %a, half %b) #0 {
472*9880d681SAndroid Build Coastguard Worker  %c = sitofp i32 %a to half
473*9880d681SAndroid Build Coastguard Worker  %r = fadd half %b, %c
474*9880d681SAndroid Build Coastguard Worker  ret half %r
475*9880d681SAndroid Build Coastguard Worker}
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fptrunc_float:
478*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
479*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Workerdefine half @test_fptrunc_float(float %a) #0 {
482*9880d681SAndroid Build Coastguard Worker  %r = fptrunc float %a to half
483*9880d681SAndroid Build Coastguard Worker  ret half %r
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fptrunc_double:
487*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, d0
488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
489*9880d681SAndroid Build Coastguard Workerdefine half @test_fptrunc_double(double %a) #0 {
490*9880d681SAndroid Build Coastguard Worker  %r = fptrunc double %a to half
491*9880d681SAndroid Build Coastguard Worker  ret half %r
492*9880d681SAndroid Build Coastguard Worker}
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fpext_float:
495*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
496*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
497*9880d681SAndroid Build Coastguard Workerdefine float @test_fpext_float(half %a) #0 {
498*9880d681SAndroid Build Coastguard Worker  %r = fpext half %a to float
499*9880d681SAndroid Build Coastguard Worker  ret float %r
500*9880d681SAndroid Build Coastguard Worker}
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fpext_double:
503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, h0
504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
505*9880d681SAndroid Build Coastguard Workerdefine double @test_fpext_double(half %a) #0 {
506*9880d681SAndroid Build Coastguard Worker  %r = fpext half %a to double
507*9880d681SAndroid Build Coastguard Worker  ret double %r
508*9880d681SAndroid Build Coastguard Worker}
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Worker
511*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcast_halftoi16:
512*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s0
513*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
514*9880d681SAndroid Build Coastguard Workerdefine i16 @test_bitcast_halftoi16(half %a) #0 {
515*9880d681SAndroid Build Coastguard Worker  %r = bitcast half %a to i16
516*9880d681SAndroid Build Coastguard Worker  ret i16 %r
517*9880d681SAndroid Build Coastguard Worker}
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcast_i16tohalf:
520*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov s0, w0
521*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
522*9880d681SAndroid Build Coastguard Workerdefine half @test_bitcast_i16tohalf(i16 %a) #0 {
523*9880d681SAndroid Build Coastguard Worker  %r = bitcast i16 %a to half
524*9880d681SAndroid Build Coastguard Worker  ret half %r
525*9880d681SAndroid Build Coastguard Worker}
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.sqrt.f16(half %a) #0
529*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.powi.f16(half %a, i32 %b) #0
530*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.sin.f16(half %a) #0
531*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.cos.f16(half %a) #0
532*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.pow.f16(half %a, half %b) #0
533*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.exp.f16(half %a) #0
534*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.exp2.f16(half %a) #0
535*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.log.f16(half %a) #0
536*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.log10.f16(half %a) #0
537*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.log2.f16(half %a) #0
538*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.fma.f16(half %a, half %b, half %c) #0
539*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.fabs.f16(half %a) #0
540*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.minnum.f16(half %a, half %b) #0
541*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.maxnum.f16(half %a, half %b) #0
542*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.copysign.f16(half %a, half %b) #0
543*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.floor.f16(half %a) #0
544*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.ceil.f16(half %a) #0
545*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.trunc.f16(half %a) #0
546*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.rint.f16(half %a) #0
547*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.nearbyint.f16(half %a) #0
548*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.round.f16(half %a) #0
549*9880d681SAndroid Build Coastguard Workerdeclare half @llvm.fmuladd.f16(half %a, half %b, half %c) #0
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sqrt:
552*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsqrt s0, s0
554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
555*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
556*9880d681SAndroid Build Coastguard Workerdefine half @test_sqrt(half %a) #0 {
557*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.sqrt.f16(half %a)
558*9880d681SAndroid Build Coastguard Worker  ret half %r
559*9880d681SAndroid Build Coastguard Worker}
560*9880d681SAndroid Build Coastguard Worker
561*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_powi:
562*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
563*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
564*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}__powisf2
566*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
569*9880d681SAndroid Build Coastguard Workerdefine half @test_powi(half %a, i32 %b) #0 {
570*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.powi.f16(half %a, i32 %b)
571*9880d681SAndroid Build Coastguard Worker  ret half %r
572*9880d681SAndroid Build Coastguard Worker}
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sin:
575*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
576*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
578*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}sinf
579*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
580*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
581*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
582*9880d681SAndroid Build Coastguard Workerdefine half @test_sin(half %a) #0 {
583*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.sin.f16(half %a)
584*9880d681SAndroid Build Coastguard Worker  ret half %r
585*9880d681SAndroid Build Coastguard Worker}
586*9880d681SAndroid Build Coastguard Worker
587*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cos:
588*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
589*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
590*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
591*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}cosf
592*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
593*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
594*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
595*9880d681SAndroid Build Coastguard Workerdefine half @test_cos(half %a) #0 {
596*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.cos.f16(half %a)
597*9880d681SAndroid Build Coastguard Worker  ret half %r
598*9880d681SAndroid Build Coastguard Worker}
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_pow:
601*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
602*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
603*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
605*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}powf
606*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
607*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
608*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
609*9880d681SAndroid Build Coastguard Workerdefine half @test_pow(half %a, half %b) #0 {
610*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.pow.f16(half %a, half %b)
611*9880d681SAndroid Build Coastguard Worker  ret half %r
612*9880d681SAndroid Build Coastguard Worker}
613*9880d681SAndroid Build Coastguard Worker
614*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_exp:
615*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
616*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
617*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
618*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}expf
619*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
620*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
621*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
622*9880d681SAndroid Build Coastguard Workerdefine half @test_exp(half %a) #0 {
623*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.exp.f16(half %a)
624*9880d681SAndroid Build Coastguard Worker  ret half %r
625*9880d681SAndroid Build Coastguard Worker}
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_exp2:
628*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
629*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
630*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
631*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}exp2f
632*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
633*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
634*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
635*9880d681SAndroid Build Coastguard Workerdefine half @test_exp2(half %a) #0 {
636*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.exp2.f16(half %a)
637*9880d681SAndroid Build Coastguard Worker  ret half %r
638*9880d681SAndroid Build Coastguard Worker}
639*9880d681SAndroid Build Coastguard Worker
640*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_log:
641*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
642*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
643*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
644*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}logf
645*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
646*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
647*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
648*9880d681SAndroid Build Coastguard Workerdefine half @test_log(half %a) #0 {
649*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.log.f16(half %a)
650*9880d681SAndroid Build Coastguard Worker  ret half %r
651*9880d681SAndroid Build Coastguard Worker}
652*9880d681SAndroid Build Coastguard Worker
653*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_log10:
654*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
655*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
656*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
657*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}log10f
658*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
659*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
660*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
661*9880d681SAndroid Build Coastguard Workerdefine half @test_log10(half %a) #0 {
662*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.log10.f16(half %a)
663*9880d681SAndroid Build Coastguard Worker  ret half %r
664*9880d681SAndroid Build Coastguard Worker}
665*9880d681SAndroid Build Coastguard Worker
666*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_log2:
667*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stp x29, x30, [sp, #-16]!
668*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mov  x29, sp
669*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
670*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bl {{_?}}log2f
671*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldp x29, x30, [sp], #16
673*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
674*9880d681SAndroid Build Coastguard Workerdefine half @test_log2(half %a) #0 {
675*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.log2.f16(half %a)
676*9880d681SAndroid Build Coastguard Worker  ret half %r
677*9880d681SAndroid Build Coastguard Worker}
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fma:
680*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s2, h2
681*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
682*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
683*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmadd s0, s0, s1, s2
684*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
685*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
686*9880d681SAndroid Build Coastguard Workerdefine half @test_fma(half %a, half %b, half %c) #0 {
687*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.fma.f16(half %a, half %b, half %c)
688*9880d681SAndroid Build Coastguard Worker  ret half %r
689*9880d681SAndroid Build Coastguard Worker}
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fabs:
692*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
693*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fabs s0, s0
694*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
695*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
696*9880d681SAndroid Build Coastguard Workerdefine half @test_fabs(half %a) #0 {
697*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.fabs.f16(half %a)
698*9880d681SAndroid Build Coastguard Worker  ret half %r
699*9880d681SAndroid Build Coastguard Worker}
700*9880d681SAndroid Build Coastguard Worker
701*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_minnum:
702*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
703*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
704*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fminnm s0, s0, s1
705*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
706*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
707*9880d681SAndroid Build Coastguard Workerdefine half @test_minnum(half %a, half %b) #0 {
708*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.minnum.f16(half %a, half %b)
709*9880d681SAndroid Build Coastguard Worker  ret half %r
710*9880d681SAndroid Build Coastguard Worker}
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_maxnum:
713*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
714*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
715*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmaxnm s0, s0, s1
716*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
717*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
718*9880d681SAndroid Build Coastguard Workerdefine half @test_maxnum(half %a, half %b) #0 {
719*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.maxnum.f16(half %a, half %b)
720*9880d681SAndroid Build Coastguard Worker  ret half %r
721*9880d681SAndroid Build Coastguard Worker}
722*9880d681SAndroid Build Coastguard Worker
723*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign:
724*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
725*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
726*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v2, #128, lsl #24
727*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2
728*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
729*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
730*9880d681SAndroid Build Coastguard Workerdefine half @test_copysign(half %a, half %b) #0 {
731*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.copysign.f16(half %a, half %b)
732*9880d681SAndroid Build Coastguard Worker  ret half %r
733*9880d681SAndroid Build Coastguard Worker}
734*9880d681SAndroid Build Coastguard Worker
735*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_f32:
736*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
737*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v2, #128, lsl #24
738*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2
739*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
740*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
741*9880d681SAndroid Build Coastguard Workerdefine half @test_copysign_f32(half %a, float %b) #0 {
742*9880d681SAndroid Build Coastguard Worker  %tb = fptrunc float %b to half
743*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.copysign.f16(half %a, half %tb)
744*9880d681SAndroid Build Coastguard Worker  ret half %r
745*9880d681SAndroid Build Coastguard Worker}
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_f64:
748*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, d1
749*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
750*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v2, #128, lsl #24
751*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2
752*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
753*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
754*9880d681SAndroid Build Coastguard Workerdefine half @test_copysign_f64(half %a, double %b) #0 {
755*9880d681SAndroid Build Coastguard Worker  %tb = fptrunc double %b to half
756*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.copysign.f16(half %a, half %tb)
757*9880d681SAndroid Build Coastguard Worker  ret half %r
758*9880d681SAndroid Build Coastguard Worker}
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Worker; Check that the FP promotion will use a truncating FP_ROUND, so we can fold
761*9880d681SAndroid Build Coastguard Worker; away the (fpext (fp_round <result>)) here.
762*9880d681SAndroid Build Coastguard Worker
763*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_extended:
764*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
765*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
766*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4s v2, #128, lsl #24
767*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bit.16b v0, v1, v2
768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
769*9880d681SAndroid Build Coastguard Workerdefine float @test_copysign_extended(half %a, half %b) #0 {
770*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.copysign.f16(half %a, half %b)
771*9880d681SAndroid Build Coastguard Worker  %xr = fpext half %r to float
772*9880d681SAndroid Build Coastguard Worker  ret float %xr
773*9880d681SAndroid Build Coastguard Worker}
774*9880d681SAndroid Build Coastguard Worker
775*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_floor:
776*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt [[FLOAT32:s[0-9]+]], h0
777*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: frintm [[INT32:s[0-9]+]], [[FLOAT32]]
778*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, [[INT32]]
779*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
780*9880d681SAndroid Build Coastguard Workerdefine half @test_floor(half %a) #0 {
781*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.floor.f16(half %a)
782*9880d681SAndroid Build Coastguard Worker  ret half %r
783*9880d681SAndroid Build Coastguard Worker}
784*9880d681SAndroid Build Coastguard Worker
785*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ceil:
786*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt [[FLOAT32:s[0-9]+]], h0
787*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: frintp [[INT32:s[0-9]+]], [[FLOAT32]]
788*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, [[INT32]]
789*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
790*9880d681SAndroid Build Coastguard Workerdefine half @test_ceil(half %a) #0 {
791*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.ceil.f16(half %a)
792*9880d681SAndroid Build Coastguard Worker  ret half %r
793*9880d681SAndroid Build Coastguard Worker}
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_trunc:
796*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt [[FLOAT32:s[0-9]+]], h0
797*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: frintz [[INT32:s[0-9]+]], [[FLOAT32]]
798*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, [[INT32]]
799*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
800*9880d681SAndroid Build Coastguard Workerdefine half @test_trunc(half %a) #0 {
801*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.trunc.f16(half %a)
802*9880d681SAndroid Build Coastguard Worker  ret half %r
803*9880d681SAndroid Build Coastguard Worker}
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rint:
806*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
807*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: frintx s0, s0
808*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
809*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
810*9880d681SAndroid Build Coastguard Workerdefine half @test_rint(half %a) #0 {
811*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.rint.f16(half %a)
812*9880d681SAndroid Build Coastguard Worker  ret half %r
813*9880d681SAndroid Build Coastguard Worker}
814*9880d681SAndroid Build Coastguard Worker
815*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_nearbyint:
816*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
817*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: frinti s0, s0
818*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
819*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
820*9880d681SAndroid Build Coastguard Workerdefine half @test_nearbyint(half %a) #0 {
821*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.nearbyint.f16(half %a)
822*9880d681SAndroid Build Coastguard Worker  ret half %r
823*9880d681SAndroid Build Coastguard Worker}
824*9880d681SAndroid Build Coastguard Worker
825*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_round:
826*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt [[FLOAT32:s[0-9]+]], h0
827*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: frinta [[INT32:s[0-9]+]], [[FLOAT32]]
828*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, [[INT32]]
829*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
830*9880d681SAndroid Build Coastguard Workerdefine half @test_round(half %a) #0 {
831*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.round.f16(half %a)
832*9880d681SAndroid Build Coastguard Worker  ret half %r
833*9880d681SAndroid Build Coastguard Worker}
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmuladd:
836*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h1
837*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
838*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, s0, s1
839*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
840*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, h0
841*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s1, h2
842*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd s0, s0, s1
843*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
844*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
845*9880d681SAndroid Build Coastguard Workerdefine half @test_fmuladd(half %a, half %b, half %c) #0 {
846*9880d681SAndroid Build Coastguard Worker  %r = call half @llvm.fmuladd.f16(half %a, half %b, half %c)
847*9880d681SAndroid Build Coastguard Worker  ret half %r
848*9880d681SAndroid Build Coastguard Worker}
849*9880d681SAndroid Build Coastguard Worker
850*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
851