1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
4 declare i16 @llvm.convert.to.fp16.f32(float %a)
5 declare i16 @llvm.convert.to.fp16.f64(double %a)
7 declare float @llvm.convert.from.fp16.f32(i16 %a)
8 declare double @llvm.convert.from.fp16.f64(i16 %a)
10 define float @func_i16fp32(ptr %a) {
11 ; CHECK-LABEL: func_i16fp32:
13 ; CHECK-NEXT: st %s9, (, %s11)
14 ; CHECK-NEXT: st %s10, 8(, %s11)
15 ; CHECK-NEXT: or %s9, 0, %s11
16 ; CHECK-NEXT: lea %s11, -240(, %s11)
17 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB0_2
18 ; CHECK-NEXT: # %bb.1:
19 ; CHECK-NEXT: ld %s61, 24(, %s14)
20 ; CHECK-NEXT: or %s62, 0, %s0
21 ; CHECK-NEXT: lea %s63, 315
22 ; CHECK-NEXT: shm.l %s63, (%s61)
23 ; CHECK-NEXT: shm.l %s8, 8(%s61)
24 ; CHECK-NEXT: shm.l %s11, 16(%s61)
26 ; CHECK-NEXT: or %s0, 0, %s62
27 ; CHECK-NEXT: .LBB0_2:
28 ; CHECK-NEXT: ld2b.zx %s0, (, %s0)
29 ; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo
30 ; CHECK-NEXT: and %s1, %s1, (32)0
31 ; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
32 ; CHECK-NEXT: bsic %s10, (, %s12)
33 ; CHECK-NEXT: or %s11, 0, %s9
34 ; CHECK-NEXT: ld %s10, 8(, %s11)
35 ; CHECK-NEXT: ld %s9, (, %s11)
36 ; CHECK-NEXT: b.l.t (, %s10)
37 %a.val = load i16, ptr %a, align 4
38 %a.asd = call float @llvm.convert.from.fp16.f32(i16 %a.val)
42 define double @func_i16fp64(ptr %a) {
43 ; CHECK-LABEL: func_i16fp64:
45 ; CHECK-NEXT: st %s9, (, %s11)
46 ; CHECK-NEXT: st %s10, 8(, %s11)
47 ; CHECK-NEXT: or %s9, 0, %s11
48 ; CHECK-NEXT: lea %s11, -240(, %s11)
49 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB1_2
50 ; CHECK-NEXT: # %bb.1:
51 ; CHECK-NEXT: ld %s61, 24(, %s14)
52 ; CHECK-NEXT: or %s62, 0, %s0
53 ; CHECK-NEXT: lea %s63, 315
54 ; CHECK-NEXT: shm.l %s63, (%s61)
55 ; CHECK-NEXT: shm.l %s8, 8(%s61)
56 ; CHECK-NEXT: shm.l %s11, 16(%s61)
58 ; CHECK-NEXT: or %s0, 0, %s62
59 ; CHECK-NEXT: .LBB1_2:
60 ; CHECK-NEXT: ld2b.zx %s0, (, %s0)
61 ; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo
62 ; CHECK-NEXT: and %s1, %s1, (32)0
63 ; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
64 ; CHECK-NEXT: bsic %s10, (, %s12)
65 ; CHECK-NEXT: cvt.d.s %s0, %s0
66 ; CHECK-NEXT: or %s11, 0, %s9
67 ; CHECK-NEXT: ld %s10, 8(, %s11)
68 ; CHECK-NEXT: ld %s9, (, %s11)
69 ; CHECK-NEXT: b.l.t (, %s10)
70 %a.val = load i16, ptr %a, align 4
71 %a.asd = call double @llvm.convert.from.fp16.f64(i16 %a.val)
75 define float @func_fp16fp32(ptr %a) {
76 ; CHECK-LABEL: func_fp16fp32:
78 ; CHECK-NEXT: st %s9, (, %s11)
79 ; CHECK-NEXT: st %s10, 8(, %s11)
80 ; CHECK-NEXT: or %s9, 0, %s11
81 ; CHECK-NEXT: lea %s11, -240(, %s11)
82 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB2_2
83 ; CHECK-NEXT: # %bb.1:
84 ; CHECK-NEXT: ld %s61, 24(, %s14)
85 ; CHECK-NEXT: or %s62, 0, %s0
86 ; CHECK-NEXT: lea %s63, 315
87 ; CHECK-NEXT: shm.l %s63, (%s61)
88 ; CHECK-NEXT: shm.l %s8, 8(%s61)
89 ; CHECK-NEXT: shm.l %s11, 16(%s61)
91 ; CHECK-NEXT: or %s0, 0, %s62
92 ; CHECK-NEXT: .LBB2_2:
93 ; CHECK-NEXT: ld2b.zx %s0, (, %s0)
94 ; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo
95 ; CHECK-NEXT: and %s1, %s1, (32)0
96 ; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
97 ; CHECK-NEXT: bsic %s10, (, %s12)
98 ; CHECK-NEXT: or %s11, 0, %s9
99 ; CHECK-NEXT: ld %s10, 8(, %s11)
100 ; CHECK-NEXT: ld %s9, (, %s11)
101 ; CHECK-NEXT: b.l.t (, %s10)
102 %a.val = load half, ptr %a, align 4
103 %a.asd = fpext half %a.val to float
107 define double @func_fp16fp64(ptr %a) {
108 ; CHECK-LABEL: func_fp16fp64:
110 ; CHECK-NEXT: st %s9, (, %s11)
111 ; CHECK-NEXT: st %s10, 8(, %s11)
112 ; CHECK-NEXT: or %s9, 0, %s11
113 ; CHECK-NEXT: lea %s11, -240(, %s11)
114 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB3_2
115 ; CHECK-NEXT: # %bb.1:
116 ; CHECK-NEXT: ld %s61, 24(, %s14)
117 ; CHECK-NEXT: or %s62, 0, %s0
118 ; CHECK-NEXT: lea %s63, 315
119 ; CHECK-NEXT: shm.l %s63, (%s61)
120 ; CHECK-NEXT: shm.l %s8, 8(%s61)
121 ; CHECK-NEXT: shm.l %s11, 16(%s61)
123 ; CHECK-NEXT: or %s0, 0, %s62
124 ; CHECK-NEXT: .LBB3_2:
125 ; CHECK-NEXT: ld2b.zx %s0, (, %s0)
126 ; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo
127 ; CHECK-NEXT: and %s1, %s1, (32)0
128 ; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
129 ; CHECK-NEXT: bsic %s10, (, %s12)
130 ; CHECK-NEXT: cvt.d.s %s0, %s0
131 ; CHECK-NEXT: or %s11, 0, %s9
132 ; CHECK-NEXT: ld %s10, 8(, %s11)
133 ; CHECK-NEXT: ld %s9, (, %s11)
134 ; CHECK-NEXT: b.l.t (, %s10)
135 %a.val = load half, ptr %a, align 4
136 %a.asd = fpext half %a.val to double
140 define void @func_fp32i16(ptr %fl.ptr, float %val) {
141 ; CHECK-LABEL: func_fp32i16:
143 ; CHECK-NEXT: st %s9, (, %s11)
144 ; CHECK-NEXT: st %s10, 8(, %s11)
145 ; CHECK-NEXT: or %s9, 0, %s11
146 ; CHECK-NEXT: lea %s11, -240(, %s11)
147 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB4_2
148 ; CHECK-NEXT: # %bb.1:
149 ; CHECK-NEXT: ld %s61, 24(, %s14)
150 ; CHECK-NEXT: or %s62, 0, %s0
151 ; CHECK-NEXT: lea %s63, 315
152 ; CHECK-NEXT: shm.l %s63, (%s61)
153 ; CHECK-NEXT: shm.l %s8, 8(%s61)
154 ; CHECK-NEXT: shm.l %s11, 16(%s61)
156 ; CHECK-NEXT: or %s0, 0, %s62
157 ; CHECK-NEXT: .LBB4_2:
158 ; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill
159 ; CHECK-NEXT: or %s18, 0, %s0
160 ; CHECK-NEXT: lea %s0, __gnu_f2h_ieee@lo
161 ; CHECK-NEXT: and %s0, %s0, (32)0
162 ; CHECK-NEXT: lea.sl %s12, __gnu_f2h_ieee@hi(, %s0)
163 ; CHECK-NEXT: or %s0, 0, %s1
164 ; CHECK-NEXT: bsic %s10, (, %s12)
165 ; CHECK-NEXT: st2b %s0, (, %s18)
166 ; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload
167 ; CHECK-NEXT: or %s11, 0, %s9
168 ; CHECK-NEXT: ld %s10, 8(, %s11)
169 ; CHECK-NEXT: ld %s9, (, %s11)
170 ; CHECK-NEXT: b.l.t (, %s10)
171 %val.asf = call i16 @llvm.convert.to.fp16.f32(float %val)
172 store i16 %val.asf, ptr %fl.ptr
176 define half @func_fp32fp16(ptr %fl.ptr, float %a) {
177 ; CHECK-LABEL: func_fp32fp16:
179 ; CHECK-NEXT: st %s9, (, %s11)
180 ; CHECK-NEXT: st %s10, 8(, %s11)
181 ; CHECK-NEXT: or %s9, 0, %s11
182 ; CHECK-NEXT: lea %s11, -240(, %s11)
183 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB5_2
184 ; CHECK-NEXT: # %bb.1:
185 ; CHECK-NEXT: ld %s61, 24(, %s14)
186 ; CHECK-NEXT: or %s62, 0, %s0
187 ; CHECK-NEXT: lea %s63, 315
188 ; CHECK-NEXT: shm.l %s63, (%s61)
189 ; CHECK-NEXT: shm.l %s8, 8(%s61)
190 ; CHECK-NEXT: shm.l %s11, 16(%s61)
192 ; CHECK-NEXT: or %s0, 0, %s62
193 ; CHECK-NEXT: .LBB5_2:
194 ; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill
195 ; CHECK-NEXT: st %s19, 296(, %s11) # 8-byte Folded Spill
196 ; CHECK-NEXT: or %s18, 0, %s0
197 ; CHECK-NEXT: lea %s0, __gnu_f2h_ieee@lo
198 ; CHECK-NEXT: and %s0, %s0, (32)0
199 ; CHECK-NEXT: lea.sl %s12, __gnu_f2h_ieee@hi(, %s0)
200 ; CHECK-NEXT: or %s0, 0, %s1
201 ; CHECK-NEXT: bsic %s10, (, %s12)
202 ; CHECK-NEXT: or %s19, 0, %s0
203 ; CHECK-NEXT: lea %s0, __gnu_h2f_ieee@lo
204 ; CHECK-NEXT: and %s0, %s0, (32)0
205 ; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s0)
206 ; CHECK-NEXT: or %s0, 0, %s19
207 ; CHECK-NEXT: bsic %s10, (, %s12)
208 ; CHECK-NEXT: st2b %s19, (, %s18)
209 ; CHECK-NEXT: ld %s19, 296(, %s11) # 8-byte Folded Reload
210 ; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload
211 ; CHECK-NEXT: or %s11, 0, %s9
212 ; CHECK-NEXT: ld %s10, 8(, %s11)
213 ; CHECK-NEXT: ld %s9, (, %s11)
214 ; CHECK-NEXT: b.l.t (, %s10)
215 %a.asd = fptrunc float %a to half
216 store half %a.asd, ptr %fl.ptr
220 define double @func_fp32fp64(ptr %a) {
221 ; CHECK-LABEL: func_fp32fp64:
223 ; CHECK-NEXT: ldu %s0, (, %s0)
224 ; CHECK-NEXT: cvt.d.s %s0, %s0
225 ; CHECK-NEXT: b.l.t (, %s10)
226 %a.val = load float, ptr %a, align 4
227 %a.asd = fpext float %a.val to double
231 define void @func_fp64i16(ptr %fl.ptr, double %val) {
232 ; CHECK-LABEL: func_fp64i16:
234 ; CHECK-NEXT: st %s9, (, %s11)
235 ; CHECK-NEXT: st %s10, 8(, %s11)
236 ; CHECK-NEXT: or %s9, 0, %s11
237 ; CHECK-NEXT: lea %s11, -240(, %s11)
238 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB7_2
239 ; CHECK-NEXT: # %bb.1:
240 ; CHECK-NEXT: ld %s61, 24(, %s14)
241 ; CHECK-NEXT: or %s62, 0, %s0
242 ; CHECK-NEXT: lea %s63, 315
243 ; CHECK-NEXT: shm.l %s63, (%s61)
244 ; CHECK-NEXT: shm.l %s8, 8(%s61)
245 ; CHECK-NEXT: shm.l %s11, 16(%s61)
247 ; CHECK-NEXT: or %s0, 0, %s62
248 ; CHECK-NEXT: .LBB7_2:
249 ; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill
250 ; CHECK-NEXT: or %s18, 0, %s0
251 ; CHECK-NEXT: lea %s0, __truncdfhf2@lo
252 ; CHECK-NEXT: and %s0, %s0, (32)0
253 ; CHECK-NEXT: lea.sl %s12, __truncdfhf2@hi(, %s0)
254 ; CHECK-NEXT: or %s0, 0, %s1
255 ; CHECK-NEXT: bsic %s10, (, %s12)
256 ; CHECK-NEXT: st2b %s0, (, %s18)
257 ; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload
258 ; CHECK-NEXT: or %s11, 0, %s9
259 ; CHECK-NEXT: ld %s10, 8(, %s11)
260 ; CHECK-NEXT: ld %s9, (, %s11)
261 ; CHECK-NEXT: b.l.t (, %s10)
262 %val.asf = call i16 @llvm.convert.to.fp16.f64(double %val)
263 store i16 %val.asf, ptr %fl.ptr
267 define void @func_fp64fp16(ptr %fl.ptr, double %val) {
268 ; CHECK-LABEL: func_fp64fp16:
270 ; CHECK-NEXT: st %s9, (, %s11)
271 ; CHECK-NEXT: st %s10, 8(, %s11)
272 ; CHECK-NEXT: or %s9, 0, %s11
273 ; CHECK-NEXT: lea %s11, -240(, %s11)
274 ; CHECK-NEXT: brge.l.t %s11, %s8, .LBB8_2
275 ; CHECK-NEXT: # %bb.1:
276 ; CHECK-NEXT: ld %s61, 24(, %s14)
277 ; CHECK-NEXT: or %s62, 0, %s0
278 ; CHECK-NEXT: lea %s63, 315
279 ; CHECK-NEXT: shm.l %s63, (%s61)
280 ; CHECK-NEXT: shm.l %s8, 8(%s61)
281 ; CHECK-NEXT: shm.l %s11, 16(%s61)
283 ; CHECK-NEXT: or %s0, 0, %s62
284 ; CHECK-NEXT: .LBB8_2:
285 ; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill
286 ; CHECK-NEXT: or %s18, 0, %s0
287 ; CHECK-NEXT: lea %s0, __truncdfhf2@lo
288 ; CHECK-NEXT: and %s0, %s0, (32)0
289 ; CHECK-NEXT: lea.sl %s12, __truncdfhf2@hi(, %s0)
290 ; CHECK-NEXT: or %s0, 0, %s1
291 ; CHECK-NEXT: bsic %s10, (, %s12)
292 ; CHECK-NEXT: st2b %s0, (, %s18)
293 ; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload
294 ; CHECK-NEXT: or %s11, 0, %s9
295 ; CHECK-NEXT: ld %s10, 8(, %s11)
296 ; CHECK-NEXT: ld %s9, (, %s11)
297 ; CHECK-NEXT: b.l.t (, %s10)
298 %val.asf = fptrunc double %val to half
299 store half %val.asf, ptr %fl.ptr
303 define void @func_fp64fp32(ptr %fl.ptr, double %val) {
304 ; CHECK-LABEL: func_fp64fp32:
306 ; CHECK-NEXT: cvt.s.d %s1, %s1
307 ; CHECK-NEXT: stu %s1, (, %s0)
308 ; CHECK-NEXT: b.l.t (, %s10)
309 %val.asf = fptrunc double %val to float
310 store float %val.asf, ptr %fl.ptr