xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/f16-convert.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm64-apple-ios -asm-verbose=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine float @load0(i16* nocapture readonly %a) nounwind {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load0:
5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0]
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]]
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %a, align 2
10*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
11*9880d681SAndroid Build Coastguard Worker  ret float %tmp1
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine double @load1(i16* nocapture readonly %a) nounwind {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load1:
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0]
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]]
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %a, align 2
21*9880d681SAndroid Build Coastguard Worker  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)
22*9880d681SAndroid Build Coastguard Worker  ret double %conv
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine float @load2(i16* nocapture readonly %a, i32 %i) nounwind {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load2:
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1]
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]]
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %i to i64
32*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom
33*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
34*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
35*9880d681SAndroid Build Coastguard Worker  ret float %tmp1
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine double @load3(i16* nocapture readonly %a, i32 %i) nounwind {
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load3:
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1]
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]]
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %i to i64
45*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom
46*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
47*9880d681SAndroid Build Coastguard Worker  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)
48*9880d681SAndroid Build Coastguard Worker  ret double %conv
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine float @load4(i16* nocapture readonly %a, i64 %i) nounwind {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load4:
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1]
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]]
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i
58*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
59*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
60*9880d681SAndroid Build Coastguard Worker  ret float %tmp1
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine double @load5(i16* nocapture readonly %a, i64 %i) nounwind {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load5:
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1]
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]]
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i
70*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
71*9880d681SAndroid Build Coastguard Worker  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)
72*9880d681SAndroid Build Coastguard Worker  ret double %conv
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine float @load6(i16* nocapture readonly %a) nounwind {
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load6:
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20]
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]]
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 10
82*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
83*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
84*9880d681SAndroid Build Coastguard Worker  ret float %tmp1
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine double @load7(i16* nocapture readonly %a) nounwind {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load7:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20]
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]]
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 10
94*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
95*9880d681SAndroid Build Coastguard Worker  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)
96*9880d681SAndroid Build Coastguard Worker  ret double %conv
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine float @load8(i16* nocapture readonly %a) nounwind {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load8:
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20]
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]]
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10
106*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
107*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
108*9880d681SAndroid Build Coastguard Worker  ret float %tmp1
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine double @load9(i16* nocapture readonly %a) nounwind {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load9:
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20]
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]]
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10
118*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %arrayidx, align 2
119*9880d681SAndroid Build Coastguard Worker  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)
120*9880d681SAndroid Build Coastguard Worker  ret double %conv
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine void @store0(i16* nocapture %a, float %val) nounwind {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store0:
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str  h0, [x0]
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
130*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %a, align 2
131*9880d681SAndroid Build Coastguard Worker  ret void
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine void @store1(i16* nocapture %a, double %val) nounwind {
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store1:
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str  h0, [x0]
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc double %val to float
142*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
143*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %a, align 2
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine void @store2(i16* nocapture %a, i32 %i, float %val) nounwind {
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store2:
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, w1, sxtw #1]
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
154*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %i to i64
155*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom
156*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
157*9880d681SAndroid Build Coastguard Worker  ret void
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdefine void @store3(i16* nocapture %a, i32 %i, double %val) nounwind {
161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store3:
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, w1, sxtw #1]
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc double %val to float
168*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
169*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %i to i64
170*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom
171*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdefine void @store4(i16* nocapture %a, i64 %i, float %val) nounwind {
176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store4:
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, x1, lsl #1]
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
182*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i
183*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
184*9880d681SAndroid Build Coastguard Worker  ret void
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdefine void @store5(i16* nocapture %a, i64 %i, double %val) nounwind {
188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store5:
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, x1, lsl #1]
192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc double %val to float
195*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
196*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i
197*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
198*9880d681SAndroid Build Coastguard Worker  ret void
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdefine void @store6(i16* nocapture %a, float %val) nounwind {
202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store6:
203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, #20]
205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
208*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 10
209*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
210*9880d681SAndroid Build Coastguard Worker  ret void
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine void @store7(i16* nocapture %a, double %val) nounwind {
214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store7:
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0
216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, #20]
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc double %val to float
221*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
222*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 10
223*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
224*9880d681SAndroid Build Coastguard Worker  ret void
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdefine void @store8(i16* nocapture %a, float %val) nounwind {
228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store8:
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stur h0, [x0, #-20]
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
234*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10
235*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
236*9880d681SAndroid Build Coastguard Worker  ret void
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine void @store9(i16* nocapture %a, double %val) nounwind {
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store9:
241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0
242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stur h0, [x0, #-20]
244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker  %conv = fptrunc double %val to float
247*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
248*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10
249*9880d681SAndroid Build Coastguard Worker  store i16 %tmp, i16* %arrayidx, align 2
250*9880d681SAndroid Build Coastguard Worker  ret void
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f32(float) nounwind readnone
254*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.convert.from.fp16.f32(i16) nounwind readnone
255*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f64(double) nounwind readnone
256*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.convert.from.fp16.f64(i16) nounwind readnone
257