Mercurial > hg > CbC > CbC_llvm
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 |