[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / RISCV / GlobalISel / double-convert.ll
bloba4f92640697bc7f26ef1f61b2ea648f07e77f537
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -global-isel -mattr=+d -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32d | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s
4 ; RUN: llc -mtriple=riscv64 -global-isel -mattr=+d -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64d | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s
7 define float @fcvt_s_d(double %a) nounwind {
8 ; CHECKIFD-LABEL: fcvt_s_d:
9 ; CHECKIFD:       # %bb.0:
10 ; CHECKIFD-NEXT:    fcvt.s.d fa0, fa0
11 ; CHECKIFD-NEXT:    ret
12   %1 = fptrunc double %a to float
13   ret float %1
16 define double @fcvt_d_s(float %a) nounwind {
17 ; CHECKIFD-LABEL: fcvt_d_s:
18 ; CHECKIFD:       # %bb.0:
19 ; CHECKIFD-NEXT:    fcvt.d.s fa0, fa0
20 ; CHECKIFD-NEXT:    ret
21   %1 = fpext float %a to double
22   ret double %1
25 define i32 @fcvt_w_d(double %a) nounwind {
26 ; CHECKIFD-LABEL: fcvt_w_d:
27 ; CHECKIFD:       # %bb.0:
28 ; CHECKIFD-NEXT:    fcvt.w.d a0, fa0, rtz
29 ; CHECKIFD-NEXT:    ret
30   %1 = fptosi double %a to i32
31   ret i32 %1
34 define i32 @fcvt_wu_d(double %a) nounwind {
35 ; CHECKIFD-LABEL: fcvt_wu_d:
36 ; CHECKIFD:       # %bb.0:
37 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rtz
38 ; CHECKIFD-NEXT:    ret
39   %1 = fptoui double %a to i32
40   ret i32 %1
43 define i32 @fcvt_wu_d_multiple_use(double %x, ptr %y) nounwind {
44 ; RV32IFD-LABEL: fcvt_wu_d_multiple_use:
45 ; RV32IFD:       # %bb.0:
46 ; RV32IFD-NEXT:    fcvt.wu.d a1, fa0, rtz
47 ; RV32IFD-NEXT:    li a0, 1
48 ; RV32IFD-NEXT:    beqz a1, .LBB4_2
49 ; RV32IFD-NEXT:  # %bb.1:
50 ; RV32IFD-NEXT:    mv a0, a1
51 ; RV32IFD-NEXT:  .LBB4_2:
52 ; RV32IFD-NEXT:    ret
54 ; RV64IFD-LABEL: fcvt_wu_d_multiple_use:
55 ; RV64IFD:       # %bb.0:
56 ; RV64IFD-NEXT:    fcvt.wu.d a1, fa0, rtz
57 ; RV64IFD-NEXT:    slli a0, a1, 32
58 ; RV64IFD-NEXT:    srli a2, a0, 32
59 ; RV64IFD-NEXT:    li a0, 1
60 ; RV64IFD-NEXT:    beqz a2, .LBB4_2
61 ; RV64IFD-NEXT:  # %bb.1:
62 ; RV64IFD-NEXT:    mv a0, a1
63 ; RV64IFD-NEXT:  .LBB4_2:
64 ; RV64IFD-NEXT:    ret
65   %a = fptoui double %x to i32
66   %b = icmp eq i32 %a, 0
67   %c = select i1 %b, i32 1, i32 %a
68   ret i32 %c
71 define double @fcvt_d_w(i32 %a) nounwind {
72 ; CHECKIFD-LABEL: fcvt_d_w:
73 ; CHECKIFD:       # %bb.0:
74 ; CHECKIFD-NEXT:    fcvt.d.w fa0, a0
75 ; CHECKIFD-NEXT:    ret
76   %1 = sitofp i32 %a to double
77   ret double %1
80 define double @fcvt_d_w_load(ptr %p) nounwind {
81 ; CHECKIFD-LABEL: fcvt_d_w_load:
82 ; CHECKIFD:       # %bb.0:
83 ; CHECKIFD-NEXT:    lw a0, 0(a0)
84 ; CHECKIFD-NEXT:    fcvt.d.w fa0, a0
85 ; CHECKIFD-NEXT:    ret
86   %a = load i32, ptr %p
87   %1 = sitofp i32 %a to double
88   ret double %1
91 define double @fcvt_d_wu(i32 %a) nounwind {
92 ; CHECKIFD-LABEL: fcvt_d_wu:
93 ; CHECKIFD:       # %bb.0:
94 ; CHECKIFD-NEXT:    fcvt.d.wu fa0, a0
95 ; CHECKIFD-NEXT:    ret
96   %1 = uitofp i32 %a to double
97   ret double %1
100 define double @fcvt_d_wu_load(ptr %p) nounwind {
101 ; RV32IFD-LABEL: fcvt_d_wu_load:
102 ; RV32IFD:       # %bb.0:
103 ; RV32IFD-NEXT:    lw a0, 0(a0)
104 ; RV32IFD-NEXT:    fcvt.d.wu fa0, a0
105 ; RV32IFD-NEXT:    ret
107 ; RV64IFD-LABEL: fcvt_d_wu_load:
108 ; RV64IFD:       # %bb.0:
109 ; RV64IFD-NEXT:    lwu a0, 0(a0)
110 ; RV64IFD-NEXT:    fcvt.d.wu fa0, a0
111 ; RV64IFD-NEXT:    ret
112   %a = load i32, ptr %p
113   %1 = uitofp i32 %a to double
114   ret double %1
117 define i64 @fcvt_l_d(double %a) nounwind {
118 ; RV32IFD-LABEL: fcvt_l_d:
119 ; RV32IFD:       # %bb.0:
120 ; RV32IFD-NEXT:    addi sp, sp, -16
121 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
122 ; RV32IFD-NEXT:    call __fixdfdi
123 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
124 ; RV32IFD-NEXT:    addi sp, sp, 16
125 ; RV32IFD-NEXT:    ret
127 ; RV64IFD-LABEL: fcvt_l_d:
128 ; RV64IFD:       # %bb.0:
129 ; RV64IFD-NEXT:    fcvt.l.d a0, fa0, rtz
130 ; RV64IFD-NEXT:    ret
131   %1 = fptosi double %a to i64
132   ret i64 %1
135 define i64 @fcvt_lu_d(double %a) nounwind {
136 ; RV32IFD-LABEL: fcvt_lu_d:
137 ; RV32IFD:       # %bb.0:
138 ; RV32IFD-NEXT:    addi sp, sp, -16
139 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
140 ; RV32IFD-NEXT:    call __fixunsdfdi
141 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
142 ; RV32IFD-NEXT:    addi sp, sp, 16
143 ; RV32IFD-NEXT:    ret
145 ; RV64IFD-LABEL: fcvt_lu_d:
146 ; RV64IFD:       # %bb.0:
147 ; RV64IFD-NEXT:    fcvt.lu.d a0, fa0, rtz
148 ; RV64IFD-NEXT:    ret
149   %1 = fptoui double %a to i64
150   ret i64 %1
153 define i64 @fmv_x_d(double %a, double %b) nounwind {
154 ; RV32IFD-LABEL: fmv_x_d:
155 ; RV32IFD:       # %bb.0:
156 ; RV32IFD-NEXT:    addi sp, sp, -16
157 ; RV32IFD-NEXT:    fadd.d fa5, fa0, fa1
158 ; RV32IFD-NEXT:    fsd fa5, 8(sp)
159 ; RV32IFD-NEXT:    lw a0, 8(sp)
160 ; RV32IFD-NEXT:    lw a1, 12(sp)
161 ; RV32IFD-NEXT:    addi sp, sp, 16
162 ; RV32IFD-NEXT:    ret
164 ; RV64IFD-LABEL: fmv_x_d:
165 ; RV64IFD:       # %bb.0:
166 ; RV64IFD-NEXT:    fadd.d fa5, fa0, fa1
167 ; RV64IFD-NEXT:    fmv.x.d a0, fa5
168 ; RV64IFD-NEXT:    ret
169   %1 = fadd double %a, %b
170   %2 = bitcast double %1 to i64
171   ret i64 %2
174 define double @fcvt_d_l(i64 %a) nounwind {
175 ; RV32IFD-LABEL: fcvt_d_l:
176 ; RV32IFD:       # %bb.0:
177 ; RV32IFD-NEXT:    addi sp, sp, -16
178 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
179 ; RV32IFD-NEXT:    call __floatdidf
180 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
181 ; RV32IFD-NEXT:    addi sp, sp, 16
182 ; RV32IFD-NEXT:    ret
184 ; RV64IFD-LABEL: fcvt_d_l:
185 ; RV64IFD:       # %bb.0:
186 ; RV64IFD-NEXT:    fcvt.d.l fa0, a0
187 ; RV64IFD-NEXT:    ret
188   %1 = sitofp i64 %a to double
189   ret double %1
192 define double @fcvt_d_lu(i64 %a) nounwind {
193 ; RV32IFD-LABEL: fcvt_d_lu:
194 ; RV32IFD:       # %bb.0:
195 ; RV32IFD-NEXT:    addi sp, sp, -16
196 ; RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
197 ; RV32IFD-NEXT:    call __floatundidf
198 ; RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
199 ; RV32IFD-NEXT:    addi sp, sp, 16
200 ; RV32IFD-NEXT:    ret
202 ; RV64IFD-LABEL: fcvt_d_lu:
203 ; RV64IFD:       # %bb.0:
204 ; RV64IFD-NEXT:    fcvt.d.lu fa0, a0
205 ; RV64IFD-NEXT:    ret
206   %1 = uitofp i64 %a to double
207   ret double %1
210 define double @fmv_d_x(i64 %a, i64 %b) nounwind {
211 ; RV32IFD-LABEL: fmv_d_x:
212 ; RV32IFD:       # %bb.0:
213 ; RV32IFD-NEXT:    addi sp, sp, -16
214 ; RV32IFD-NEXT:    sw a0, 8(sp)
215 ; RV32IFD-NEXT:    sw a1, 12(sp)
216 ; RV32IFD-NEXT:    fld fa5, 8(sp)
217 ; RV32IFD-NEXT:    sw a2, 8(sp)
218 ; RV32IFD-NEXT:    sw a3, 12(sp)
219 ; RV32IFD-NEXT:    fld fa4, 8(sp)
220 ; RV32IFD-NEXT:    fadd.d fa0, fa5, fa4
221 ; RV32IFD-NEXT:    addi sp, sp, 16
222 ; RV32IFD-NEXT:    ret
224 ; RV64IFD-LABEL: fmv_d_x:
225 ; RV64IFD:       # %bb.0:
226 ; RV64IFD-NEXT:    fmv.d.x fa5, a0
227 ; RV64IFD-NEXT:    fmv.d.x fa4, a1
228 ; RV64IFD-NEXT:    fadd.d fa0, fa5, fa4
229 ; RV64IFD-NEXT:    ret
230   %1 = bitcast i64 %a to double
231   %2 = bitcast i64 %b to double
232   %3 = fadd double %1, %2
233   ret double %3
236 define double @fcvt_d_w_i8(i8 signext %a) nounwind {
237 ; CHECKIFD-LABEL: fcvt_d_w_i8:
238 ; CHECKIFD:       # %bb.0:
239 ; CHECKIFD-NEXT:    fcvt.d.w fa0, a0
240 ; CHECKIFD-NEXT:    ret
241   %1 = sitofp i8 %a to double
242   ret double %1
245 define double @fcvt_d_wu_i8(i8 zeroext %a) nounwind {
246 ; CHECKIFD-LABEL: fcvt_d_wu_i8:
247 ; CHECKIFD:       # %bb.0:
248 ; CHECKIFD-NEXT:    fcvt.d.wu fa0, a0
249 ; CHECKIFD-NEXT:    ret
250   %1 = uitofp i8 %a to double
251   ret double %1
254 define double @fcvt_d_w_i16(i16 signext %a) nounwind {
255 ; CHECKIFD-LABEL: fcvt_d_w_i16:
256 ; CHECKIFD:       # %bb.0:
257 ; CHECKIFD-NEXT:    fcvt.d.w fa0, a0
258 ; CHECKIFD-NEXT:    ret
259   %1 = sitofp i16 %a to double
260   ret double %1
263 define double @fcvt_d_wu_i16(i16 zeroext %a) nounwind {
264 ; CHECKIFD-LABEL: fcvt_d_wu_i16:
265 ; CHECKIFD:       # %bb.0:
266 ; CHECKIFD-NEXT:    fcvt.d.wu fa0, a0
267 ; CHECKIFD-NEXT:    ret
268   %1 = uitofp i16 %a to double
269   ret double %1
272 define signext i32 @fcvt_d_w_demanded_bits(i32 signext %0, ptr %1) nounwind {
273 ; RV32IFD-LABEL: fcvt_d_w_demanded_bits:
274 ; RV32IFD:       # %bb.0:
275 ; RV32IFD-NEXT:    addi a0, a0, 1
276 ; RV32IFD-NEXT:    fcvt.d.w fa5, a0
277 ; RV32IFD-NEXT:    fsd fa5, 0(a1)
278 ; RV32IFD-NEXT:    ret
280 ; RV64IFD-LABEL: fcvt_d_w_demanded_bits:
281 ; RV64IFD:       # %bb.0:
282 ; RV64IFD-NEXT:    addiw a0, a0, 1
283 ; RV64IFD-NEXT:    fcvt.d.w fa5, a0
284 ; RV64IFD-NEXT:    fsd fa5, 0(a1)
285 ; RV64IFD-NEXT:    ret
286   %3 = add i32 %0, 1
287   %4 = sitofp i32 %3 to double
288   store double %4, ptr %1, align 8
289   ret i32 %3
292 define signext i32 @fcvt_d_wu_demanded_bits(i32 signext %0, ptr %1) nounwind {
293 ; RV32IFD-LABEL: fcvt_d_wu_demanded_bits:
294 ; RV32IFD:       # %bb.0:
295 ; RV32IFD-NEXT:    addi a0, a0, 1
296 ; RV32IFD-NEXT:    fcvt.d.wu fa5, a0
297 ; RV32IFD-NEXT:    fsd fa5, 0(a1)
298 ; RV32IFD-NEXT:    ret
300 ; RV64IFD-LABEL: fcvt_d_wu_demanded_bits:
301 ; RV64IFD:       # %bb.0:
302 ; RV64IFD-NEXT:    addiw a0, a0, 1
303 ; RV64IFD-NEXT:    fcvt.d.wu fa5, a0
304 ; RV64IFD-NEXT:    fsd fa5, 0(a1)
305 ; RV64IFD-NEXT:    ret
306   %3 = add i32 %0, 1
307   %4 = uitofp i32 %3 to double
308   store double %4, ptr %1, align 8
309   ret i32 %3
312 define signext i16 @fcvt_w_s_i16(double %a) nounwind {
313 ; RV32IFD-LABEL: fcvt_w_s_i16:
314 ; RV32IFD:       # %bb.0:
315 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
316 ; RV32IFD-NEXT:    slli a0, a0, 16
317 ; RV32IFD-NEXT:    srai a0, a0, 16
318 ; RV32IFD-NEXT:    ret
320 ; RV64IFD-LABEL: fcvt_w_s_i16:
321 ; RV64IFD:       # %bb.0:
322 ; RV64IFD-NEXT:    fcvt.w.d a0, fa0, rtz
323 ; RV64IFD-NEXT:    slli a0, a0, 48
324 ; RV64IFD-NEXT:    srai a0, a0, 48
325 ; RV64IFD-NEXT:    ret
326   %1 = fptosi double %a to i16
327   ret i16 %1
330 define zeroext i16 @fcvt_wu_s_i16(double %a) nounwind {
331 ; RV32IFD-LABEL: fcvt_wu_s_i16:
332 ; RV32IFD:       # %bb.0:
333 ; RV32IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
334 ; RV32IFD-NEXT:    lui a1, 16
335 ; RV32IFD-NEXT:    addi a1, a1, -1
336 ; RV32IFD-NEXT:    and a0, a0, a1
337 ; RV32IFD-NEXT:    ret
339 ; RV64IFD-LABEL: fcvt_wu_s_i16:
340 ; RV64IFD:       # %bb.0:
341 ; RV64IFD-NEXT:    fcvt.wu.d a0, fa0, rtz
342 ; RV64IFD-NEXT:    lui a1, 16
343 ; RV64IFD-NEXT:    addiw a1, a1, -1
344 ; RV64IFD-NEXT:    and a0, a0, a1
345 ; RV64IFD-NEXT:    ret
346   %1 = fptoui double %a to i16
347   ret i16 %1
350 define signext i8 @fcvt_w_s_i8(double %a) nounwind {
351 ; RV32IFD-LABEL: fcvt_w_s_i8:
352 ; RV32IFD:       # %bb.0:
353 ; RV32IFD-NEXT:    fcvt.w.d a0, fa0, rtz
354 ; RV32IFD-NEXT:    slli a0, a0, 24
355 ; RV32IFD-NEXT:    srai a0, a0, 24
356 ; RV32IFD-NEXT:    ret
358 ; RV64IFD-LABEL: fcvt_w_s_i8:
359 ; RV64IFD:       # %bb.0:
360 ; RV64IFD-NEXT:    fcvt.w.d a0, fa0, rtz
361 ; RV64IFD-NEXT:    slli a0, a0, 56
362 ; RV64IFD-NEXT:    srai a0, a0, 56
363 ; RV64IFD-NEXT:    ret
364   %1 = fptosi double %a to i8
365   ret i8 %1
368 define zeroext i8 @fcvt_wu_s_i8(double %a) nounwind {
369 ; CHECKIFD-LABEL: fcvt_wu_s_i8:
370 ; CHECKIFD:       # %bb.0:
371 ; CHECKIFD-NEXT:    fcvt.wu.d a0, fa0, rtz
372 ; CHECKIFD-NEXT:    andi a0, a0, 255
373 ; CHECKIFD-NEXT:    ret
374   %1 = fptoui double %a to i8
375   ret i8 %1