xref: /llvm-project/llvm/test/CodeGen/RISCV/fp16-promote.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr +d -target-abi ilp32d < %s | FileCheck %s
3
4define void @test_load_store(ptr %p, ptr %q) nounwind {
5; CHECK-LABEL: test_load_store:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    lh a0, 0(a0)
8; CHECK-NEXT:    sh a0, 0(a1)
9; CHECK-NEXT:    ret
10  %a = load half, ptr %p
11  store half %a, ptr %q
12  ret void
13}
14
15define float @test_fpextend_float(ptr %p) nounwind {
16; CHECK-LABEL: test_fpextend_float:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    addi sp, sp, -16
19; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20; CHECK-NEXT:    lhu a0, 0(a0)
21; CHECK-NEXT:    fmv.w.x fa0, a0
22; CHECK-NEXT:    call __extendhfsf2
23; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
24; CHECK-NEXT:    addi sp, sp, 16
25; CHECK-NEXT:    ret
26  %a = load half, ptr %p
27  %r = fpext half %a to float
28  ret float %r
29}
30
31define double @test_fpextend_double(ptr %p) nounwind {
32; CHECK-LABEL: test_fpextend_double:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    addi sp, sp, -16
35; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
36; CHECK-NEXT:    lhu a0, 0(a0)
37; CHECK-NEXT:    fmv.w.x fa0, a0
38; CHECK-NEXT:    call __extendhfsf2
39; CHECK-NEXT:    fcvt.d.s fa0, fa0
40; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
41; CHECK-NEXT:    addi sp, sp, 16
42; CHECK-NEXT:    ret
43  %a = load half, ptr %p
44  %r = fpext half %a to double
45  ret double %r
46}
47
48define void @test_fptrunc_float(float %f, ptr %p) nounwind {
49; CHECK-LABEL: test_fptrunc_float:
50; CHECK:       # %bb.0:
51; CHECK-NEXT:    addi sp, sp, -16
52; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
53; CHECK-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
54; CHECK-NEXT:    mv s0, a0
55; CHECK-NEXT:    call __truncsfhf2
56; CHECK-NEXT:    fmv.x.w a0, fa0
57; CHECK-NEXT:    sh a0, 0(s0)
58; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
59; CHECK-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
60; CHECK-NEXT:    addi sp, sp, 16
61; CHECK-NEXT:    ret
62  %a = fptrunc float %f to half
63  store half %a, ptr %p
64  ret void
65}
66
67define void @test_fptrunc_double(double %d, ptr %p) nounwind {
68; CHECK-LABEL: test_fptrunc_double:
69; CHECK:       # %bb.0:
70; CHECK-NEXT:    addi sp, sp, -16
71; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
72; CHECK-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
73; CHECK-NEXT:    mv s0, a0
74; CHECK-NEXT:    call __truncdfhf2
75; CHECK-NEXT:    fmv.x.w a0, fa0
76; CHECK-NEXT:    sh a0, 0(s0)
77; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
78; CHECK-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
79; CHECK-NEXT:    addi sp, sp, 16
80; CHECK-NEXT:    ret
81  %a = fptrunc double %d to half
82  store half %a, ptr %p
83  ret void
84}
85
86define void @test_fadd(ptr %p, ptr %q) nounwind {
87; CHECK-LABEL: test_fadd:
88; CHECK:       # %bb.0:
89; CHECK-NEXT:    addi sp, sp, -32
90; CHECK-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
91; CHECK-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
92; CHECK-NEXT:    fsd fs0, 16(sp) # 8-byte Folded Spill
93; CHECK-NEXT:    fsd fs1, 8(sp) # 8-byte Folded Spill
94; CHECK-NEXT:    mv s0, a0
95; CHECK-NEXT:    lhu a0, 0(a0)
96; CHECK-NEXT:    lhu a1, 0(a1)
97; CHECK-NEXT:    fmv.w.x fs0, a0
98; CHECK-NEXT:    fmv.w.x fa0, a1
99; CHECK-NEXT:    call __extendhfsf2
100; CHECK-NEXT:    fmv.s fs1, fa0
101; CHECK-NEXT:    fmv.s fa0, fs0
102; CHECK-NEXT:    call __extendhfsf2
103; CHECK-NEXT:    fadd.s fa0, fa0, fs1
104; CHECK-NEXT:    call __truncsfhf2
105; CHECK-NEXT:    fmv.x.w a0, fa0
106; CHECK-NEXT:    sh a0, 0(s0)
107; CHECK-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
108; CHECK-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
109; CHECK-NEXT:    fld fs0, 16(sp) # 8-byte Folded Reload
110; CHECK-NEXT:    fld fs1, 8(sp) # 8-byte Folded Reload
111; CHECK-NEXT:    addi sp, sp, 32
112; CHECK-NEXT:    ret
113  %a = load half, ptr %p
114  %b = load half, ptr %q
115  %r = fadd half %a, %b
116  store half %r, ptr %p
117  ret void
118}
119
120define void @test_fmul(ptr %p, ptr %q) nounwind {
121; CHECK-LABEL: test_fmul:
122; CHECK:       # %bb.0:
123; CHECK-NEXT:    addi sp, sp, -32
124; CHECK-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
125; CHECK-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
126; CHECK-NEXT:    fsd fs0, 16(sp) # 8-byte Folded Spill
127; CHECK-NEXT:    fsd fs1, 8(sp) # 8-byte Folded Spill
128; CHECK-NEXT:    mv s0, a0
129; CHECK-NEXT:    lhu a0, 0(a0)
130; CHECK-NEXT:    lhu a1, 0(a1)
131; CHECK-NEXT:    fmv.w.x fs0, a0
132; CHECK-NEXT:    fmv.w.x fa0, a1
133; CHECK-NEXT:    call __extendhfsf2
134; CHECK-NEXT:    fmv.s fs1, fa0
135; CHECK-NEXT:    fmv.s fa0, fs0
136; CHECK-NEXT:    call __extendhfsf2
137; CHECK-NEXT:    fmul.s fa0, fa0, fs1
138; CHECK-NEXT:    call __truncsfhf2
139; CHECK-NEXT:    fmv.x.w a0, fa0
140; CHECK-NEXT:    sh a0, 0(s0)
141; CHECK-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
142; CHECK-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
143; CHECK-NEXT:    fld fs0, 16(sp) # 8-byte Folded Reload
144; CHECK-NEXT:    fld fs1, 8(sp) # 8-byte Folded Reload
145; CHECK-NEXT:    addi sp, sp, 32
146; CHECK-NEXT:    ret
147  %a = load half, ptr %p
148  %b = load half, ptr %q
149  %r = fmul half %a, %b
150  store half %r, ptr %p
151  ret void
152}
153