comparison test/CodeGen/AArch64/f16-convert.ll @ 77:54457678186b LLVM3.6

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