xref: /llvm-project/llvm/test/CodeGen/RISCV/calling-conv-ilp32.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3; RUN:   | FileCheck -check-prefix=RV32I-FPELIM %s
4; RUN: llc -mtriple=riscv32 -verify-machineinstrs -frame-pointer=all < %s \
5; RUN:   | FileCheck -check-prefix=RV32I-WITHFP %s
6
7; As well as calling convention details, we check that ra and fp are
8; consistently stored to fp-4 and fp-8.
9
10; Any tests that would have identical output for some combination of the ilp32*
11; ABIs belong in calling-conv-*-common.ll. This file contains tests that will
12; have different output across those ABIs. i.e. where some arguments would be
13; passed according to the floating point ABI.
14
15define i32 @callee_float_in_regs(i32 %a, float %b) nounwind {
16; RV32I-FPELIM-LABEL: callee_float_in_regs:
17; RV32I-FPELIM:       # %bb.0:
18; RV32I-FPELIM-NEXT:    addi sp, sp, -16
19; RV32I-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
20; RV32I-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
21; RV32I-FPELIM-NEXT:    mv s0, a0
22; RV32I-FPELIM-NEXT:    mv a0, a1
23; RV32I-FPELIM-NEXT:    call __fixsfsi
24; RV32I-FPELIM-NEXT:    add a0, s0, a0
25; RV32I-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
26; RV32I-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
27; RV32I-FPELIM-NEXT:    addi sp, sp, 16
28; RV32I-FPELIM-NEXT:    ret
29;
30; RV32I-WITHFP-LABEL: callee_float_in_regs:
31; RV32I-WITHFP:       # %bb.0:
32; RV32I-WITHFP-NEXT:    addi sp, sp, -16
33; RV32I-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
34; RV32I-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
35; RV32I-WITHFP-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
36; RV32I-WITHFP-NEXT:    addi s0, sp, 16
37; RV32I-WITHFP-NEXT:    mv s1, a0
38; RV32I-WITHFP-NEXT:    mv a0, a1
39; RV32I-WITHFP-NEXT:    call __fixsfsi
40; RV32I-WITHFP-NEXT:    add a0, s1, a0
41; RV32I-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
42; RV32I-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
43; RV32I-WITHFP-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
44; RV32I-WITHFP-NEXT:    addi sp, sp, 16
45; RV32I-WITHFP-NEXT:    ret
46  %b_fptosi = fptosi float %b to i32
47  %1 = add i32 %a, %b_fptosi
48  ret i32 %1
49}
50
51define i32 @caller_float_in_regs() nounwind {
52; RV32I-FPELIM-LABEL: caller_float_in_regs:
53; RV32I-FPELIM:       # %bb.0:
54; RV32I-FPELIM-NEXT:    addi sp, sp, -16
55; RV32I-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
56; RV32I-FPELIM-NEXT:    li a0, 1
57; RV32I-FPELIM-NEXT:    lui a1, 262144
58; RV32I-FPELIM-NEXT:    call callee_float_in_regs
59; RV32I-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
60; RV32I-FPELIM-NEXT:    addi sp, sp, 16
61; RV32I-FPELIM-NEXT:    ret
62;
63; RV32I-WITHFP-LABEL: caller_float_in_regs:
64; RV32I-WITHFP:       # %bb.0:
65; RV32I-WITHFP-NEXT:    addi sp, sp, -16
66; RV32I-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
67; RV32I-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
68; RV32I-WITHFP-NEXT:    addi s0, sp, 16
69; RV32I-WITHFP-NEXT:    li a0, 1
70; RV32I-WITHFP-NEXT:    lui a1, 262144
71; RV32I-WITHFP-NEXT:    call callee_float_in_regs
72; RV32I-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
73; RV32I-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
74; RV32I-WITHFP-NEXT:    addi sp, sp, 16
75; RV32I-WITHFP-NEXT:    ret
76  %1 = call i32 @callee_float_in_regs(i32 1, float 2.0)
77  ret i32 %1
78}
79
80define i32 @callee_float_on_stack(i64 %a, i64 %b, i64 %c, i64 %d, float %e) nounwind {
81; RV32I-FPELIM-LABEL: callee_float_on_stack:
82; RV32I-FPELIM:       # %bb.0:
83; RV32I-FPELIM-NEXT:    lw a0, 0(sp)
84; RV32I-FPELIM-NEXT:    add a0, a6, a0
85; RV32I-FPELIM-NEXT:    ret
86;
87; RV32I-WITHFP-LABEL: callee_float_on_stack:
88; RV32I-WITHFP:       # %bb.0:
89; RV32I-WITHFP-NEXT:    addi sp, sp, -16
90; RV32I-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
91; RV32I-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
92; RV32I-WITHFP-NEXT:    addi s0, sp, 16
93; RV32I-WITHFP-NEXT:    lw a0, 0(s0)
94; RV32I-WITHFP-NEXT:    add a0, a6, a0
95; RV32I-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
96; RV32I-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
97; RV32I-WITHFP-NEXT:    addi sp, sp, 16
98; RV32I-WITHFP-NEXT:    ret
99  %1 = trunc i64 %d to i32
100  %2 = bitcast float %e to i32
101  %3 = add i32 %1, %2
102  ret i32 %3
103}
104
105define i32 @caller_float_on_stack() nounwind {
106; RV32I-FPELIM-LABEL: caller_float_on_stack:
107; RV32I-FPELIM:       # %bb.0:
108; RV32I-FPELIM-NEXT:    addi sp, sp, -16
109; RV32I-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
110; RV32I-FPELIM-NEXT:    lui a1, 264704
111; RV32I-FPELIM-NEXT:    li a0, 1
112; RV32I-FPELIM-NEXT:    li a2, 2
113; RV32I-FPELIM-NEXT:    li a4, 3
114; RV32I-FPELIM-NEXT:    li a6, 4
115; RV32I-FPELIM-NEXT:    sw a1, 0(sp)
116; RV32I-FPELIM-NEXT:    li a1, 0
117; RV32I-FPELIM-NEXT:    li a3, 0
118; RV32I-FPELIM-NEXT:    li a5, 0
119; RV32I-FPELIM-NEXT:    li a7, 0
120; RV32I-FPELIM-NEXT:    call callee_float_on_stack
121; RV32I-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
122; RV32I-FPELIM-NEXT:    addi sp, sp, 16
123; RV32I-FPELIM-NEXT:    ret
124;
125; RV32I-WITHFP-LABEL: caller_float_on_stack:
126; RV32I-WITHFP:       # %bb.0:
127; RV32I-WITHFP-NEXT:    addi sp, sp, -16
128; RV32I-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
129; RV32I-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
130; RV32I-WITHFP-NEXT:    addi s0, sp, 16
131; RV32I-WITHFP-NEXT:    lui a1, 264704
132; RV32I-WITHFP-NEXT:    li a0, 1
133; RV32I-WITHFP-NEXT:    li a2, 2
134; RV32I-WITHFP-NEXT:    li a4, 3
135; RV32I-WITHFP-NEXT:    li a6, 4
136; RV32I-WITHFP-NEXT:    sw a1, 0(sp)
137; RV32I-WITHFP-NEXT:    li a1, 0
138; RV32I-WITHFP-NEXT:    li a3, 0
139; RV32I-WITHFP-NEXT:    li a5, 0
140; RV32I-WITHFP-NEXT:    li a7, 0
141; RV32I-WITHFP-NEXT:    call callee_float_on_stack
142; RV32I-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
143; RV32I-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
144; RV32I-WITHFP-NEXT:    addi sp, sp, 16
145; RV32I-WITHFP-NEXT:    ret
146  %1 = call i32 @callee_float_on_stack(i64 1, i64 2, i64 3, i64 4, float 5.0)
147  ret i32 %1
148}
149
150define float @callee_tiny_scalar_ret() nounwind {
151; RV32I-FPELIM-LABEL: callee_tiny_scalar_ret:
152; RV32I-FPELIM:       # %bb.0:
153; RV32I-FPELIM-NEXT:    lui a0, 260096
154; RV32I-FPELIM-NEXT:    ret
155;
156; RV32I-WITHFP-LABEL: callee_tiny_scalar_ret:
157; RV32I-WITHFP:       # %bb.0:
158; RV32I-WITHFP-NEXT:    addi sp, sp, -16
159; RV32I-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
160; RV32I-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
161; RV32I-WITHFP-NEXT:    addi s0, sp, 16
162; RV32I-WITHFP-NEXT:    lui a0, 260096
163; RV32I-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
164; RV32I-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
165; RV32I-WITHFP-NEXT:    addi sp, sp, 16
166; RV32I-WITHFP-NEXT:    ret
167  ret float 1.0
168}
169
170define i32 @caller_tiny_scalar_ret() nounwind {
171; RV32I-FPELIM-LABEL: caller_tiny_scalar_ret:
172; RV32I-FPELIM:       # %bb.0:
173; RV32I-FPELIM-NEXT:    addi sp, sp, -16
174; RV32I-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
175; RV32I-FPELIM-NEXT:    call callee_tiny_scalar_ret
176; RV32I-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
177; RV32I-FPELIM-NEXT:    addi sp, sp, 16
178; RV32I-FPELIM-NEXT:    ret
179;
180; RV32I-WITHFP-LABEL: caller_tiny_scalar_ret:
181; RV32I-WITHFP:       # %bb.0:
182; RV32I-WITHFP-NEXT:    addi sp, sp, -16
183; RV32I-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
184; RV32I-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
185; RV32I-WITHFP-NEXT:    addi s0, sp, 16
186; RV32I-WITHFP-NEXT:    call callee_tiny_scalar_ret
187; RV32I-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
188; RV32I-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
189; RV32I-WITHFP-NEXT:    addi sp, sp, 16
190; RV32I-WITHFP-NEXT:    ret
191  %1 = call float @callee_tiny_scalar_ret()
192  %2 = bitcast float %1 to i32
193  ret i32 %2
194}
195