1 ; RUN: llc < %s -mtriple=arm64-apple-ios -asm-verbose=false | FileCheck %s
3 define float @load0(i16* nocapture readonly %a) nounwind {
5 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0]
6 ; CHECK-NEXT: fcvt s0, [[HREG]]
9 %tmp = load i16* %a, align 2
10 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
14 define double @load1(i16* nocapture readonly %a) nounwind {
16 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0]
17 ; CHECK-NEXT: fcvt d0, [[HREG]]
20 %tmp = load i16* %a, align 2
21 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
22 %conv = fpext float %tmp1 to double
26 define float @load2(i16* nocapture readonly %a, i32 %i) nounwind {
28 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1]
29 ; CHECK-NEXT: fcvt s0, [[HREG]]
32 %idxprom = sext i32 %i to i64
33 %arrayidx = getelementptr inbounds i16* %a, i64 %idxprom
34 %tmp = load i16* %arrayidx, align 2
35 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
39 define double @load3(i16* nocapture readonly %a, i32 %i) nounwind {
41 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1]
42 ; CHECK-NEXT: fcvt d0, [[HREG]]
45 %idxprom = sext i32 %i to i64
46 %arrayidx = getelementptr inbounds i16* %a, i64 %idxprom
47 %tmp = load i16* %arrayidx, align 2
48 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
49 %conv = fpext float %tmp1 to double
53 define float @load4(i16* nocapture readonly %a, i64 %i) nounwind {
55 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1]
56 ; CHECK-NEXT: fcvt s0, [[HREG]]
59 %arrayidx = getelementptr inbounds i16* %a, i64 %i
60 %tmp = load i16* %arrayidx, align 2
61 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
65 define double @load5(i16* nocapture readonly %a, i64 %i) nounwind {
67 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1]
68 ; CHECK-NEXT: fcvt d0, [[HREG]]
71 %arrayidx = getelementptr inbounds i16* %a, i64 %i
72 %tmp = load i16* %arrayidx, align 2
73 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
74 %conv = fpext float %tmp1 to double
78 define float @load6(i16* nocapture readonly %a) nounwind {
80 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20]
81 ; CHECK-NEXT: fcvt s0, [[HREG]]
84 %arrayidx = getelementptr inbounds i16* %a, i64 10
85 %tmp = load i16* %arrayidx, align 2
86 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
90 define double @load7(i16* nocapture readonly %a) nounwind {
92 ; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20]
93 ; CHECK-NEXT: fcvt d0, [[HREG]]
96 %arrayidx = getelementptr inbounds i16* %a, i64 10
97 %tmp = load i16* %arrayidx, align 2
98 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
99 %conv = fpext float %tmp1 to double
103 define float @load8(i16* nocapture readonly %a) nounwind {
104 ; CHECK-LABEL: load8:
105 ; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20]
106 ; CHECK-NEXT: fcvt s0, [[HREG]]
109 %arrayidx = getelementptr inbounds i16* %a, i64 -10
110 %tmp = load i16* %arrayidx, align 2
111 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
115 define double @load9(i16* nocapture readonly %a) nounwind {
116 ; CHECK-LABEL: load9:
117 ; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20]
118 ; CHECK-NEXT: fcvt d0, [[HREG]]
121 %arrayidx = getelementptr inbounds i16* %a, i64 -10
122 %tmp = load i16* %arrayidx, align 2
123 %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)
124 %conv = fpext float %tmp1 to double
128 define void @store0(i16* nocapture %a, float %val) nounwind {
129 ; CHECK-LABEL: store0:
130 ; CHECK-NEXT: fcvt h0, s0
131 ; CHECK-NEXT: str h0, [x0]
134 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
135 store i16 %tmp, i16* %a, align 2
139 define void @store1(i16* nocapture %a, double %val) nounwind {
140 ; CHECK-LABEL: store1:
141 ; CHECK-NEXT: fcvt h0, d0
142 ; CHECK-NEXT: str h0, [x0]
145 %conv = fptrunc double %val to float
146 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
147 store i16 %tmp, i16* %a, align 2
151 define void @store2(i16* nocapture %a, i32 %i, float %val) nounwind {
152 ; CHECK-LABEL: store2:
153 ; CHECK-NEXT: fcvt h0, s0
154 ; CHECK-NEXT: str h0, [x0, w1, sxtw #1]
157 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
158 %idxprom = sext i32 %i to i64
159 %arrayidx = getelementptr inbounds i16* %a, i64 %idxprom
160 store i16 %tmp, i16* %arrayidx, align 2
164 define void @store3(i16* nocapture %a, i32 %i, double %val) nounwind {
165 ; CHECK-LABEL: store3:
166 ; CHECK-NEXT: fcvt h0, d0
167 ; CHECK-NEXT: str h0, [x0, w1, sxtw #1]
170 %conv = fptrunc double %val to float
171 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
172 %idxprom = sext i32 %i to i64
173 %arrayidx = getelementptr inbounds i16* %a, i64 %idxprom
174 store i16 %tmp, i16* %arrayidx, align 2
178 define void @store4(i16* nocapture %a, i64 %i, float %val) nounwind {
179 ; CHECK-LABEL: store4:
180 ; CHECK-NEXT: fcvt h0, s0
181 ; CHECK-NEXT: str h0, [x0, x1, lsl #1]
184 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
185 %arrayidx = getelementptr inbounds i16* %a, i64 %i
186 store i16 %tmp, i16* %arrayidx, align 2
190 define void @store5(i16* nocapture %a, i64 %i, double %val) nounwind {
191 ; CHECK-LABEL: store5:
192 ; CHECK-NEXT: fcvt h0, d0
193 ; CHECK-NEXT: str h0, [x0, x1, lsl #1]
196 %conv = fptrunc double %val to float
197 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
198 %arrayidx = getelementptr inbounds i16* %a, i64 %i
199 store i16 %tmp, i16* %arrayidx, align 2
203 define void @store6(i16* nocapture %a, float %val) nounwind {
204 ; CHECK-LABEL: store6:
205 ; CHECK-NEXT: fcvt h0, s0
206 ; CHECK-NEXT: str h0, [x0, #20]
209 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
210 %arrayidx = getelementptr inbounds i16* %a, i64 10
211 store i16 %tmp, i16* %arrayidx, align 2
215 define void @store7(i16* nocapture %a, double %val) nounwind {
216 ; CHECK-LABEL: store7:
217 ; CHECK-NEXT: fcvt h0, d0
218 ; CHECK-NEXT: str h0, [x0, #20]
221 %conv = fptrunc double %val to float
222 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
223 %arrayidx = getelementptr inbounds i16* %a, i64 10
224 store i16 %tmp, i16* %arrayidx, align 2
228 define void @store8(i16* nocapture %a, float %val) nounwind {
229 ; CHECK-LABEL: store8:
230 ; CHECK-NEXT: fcvt h0, s0
231 ; CHECK-NEXT: stur h0, [x0, #-20]
234 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)
235 %arrayidx = getelementptr inbounds i16* %a, i64 -10
236 store i16 %tmp, i16* %arrayidx, align 2
240 define void @store9(i16* nocapture %a, double %val) nounwind {
241 ; CHECK-LABEL: store9:
242 ; CHECK-NEXT: fcvt h0, d0
243 ; CHECK-NEXT: stur h0, [x0, #-20]
246 %conv = fptrunc double %val to float
247 %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)
248 %arrayidx = getelementptr inbounds i16* %a, i64 -10
249 store i16 %tmp, i16* %arrayidx, align 2
253 declare i16 @llvm.convert.to.fp16.f32(float) nounwind readnone
254 declare float @llvm.convert.from.fp16.f32(i16) nounwind readnone