xref: /llvm-project/llvm/test/CodeGen/RISCV/vararg-ilp32e.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -target-abi ilp32e -verify-machineinstrs < %s \
3; RUN:   | FileCheck -check-prefix=ILP32E %s
4; RUN: llc -mtriple=riscv32 -target-abi ilp32e -frame-pointer=all -verify-machineinstrs < %s \
5; RUN:   | FileCheck -check-prefix=ILP32E-WITHFP %s
6
7declare void @llvm.va_start(ptr)
8declare void @llvm.va_end(ptr)
9declare void @abort()
10
11define i32 @caller(i32 %a) {
12; ILP32E-LABEL: caller:
13; ILP32E:       # %bb.0: # %entry
14; ILP32E-NEXT:    addi sp, sp, -8
15; ILP32E-NEXT:    .cfi_def_cfa_offset 8
16; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
17; ILP32E-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
18; ILP32E-NEXT:    .cfi_offset ra, -4
19; ILP32E-NEXT:    .cfi_offset s0, -8
20; ILP32E-NEXT:    mv s0, a0
21; ILP32E-NEXT:    li a0, 1
22; ILP32E-NEXT:    lui a2, 262144
23; ILP32E-NEXT:    li a1, 0
24; ILP32E-NEXT:    call va_double
25; ILP32E-NEXT:    mv a0, s0
26; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
27; ILP32E-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
28; ILP32E-NEXT:    .cfi_restore ra
29; ILP32E-NEXT:    .cfi_restore s0
30; ILP32E-NEXT:    addi sp, sp, 8
31; ILP32E-NEXT:    .cfi_def_cfa_offset 0
32; ILP32E-NEXT:    ret
33;
34; ILP32E-WITHFP-LABEL: caller:
35; ILP32E-WITHFP:       # %bb.0: # %entry
36; ILP32E-WITHFP-NEXT:    addi sp, sp, -12
37; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 12
38; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
39; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
40; ILP32E-WITHFP-NEXT:    sw s1, 0(sp) # 4-byte Folded Spill
41; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
42; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
43; ILP32E-WITHFP-NEXT:    .cfi_offset s1, -12
44; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
45; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
46; ILP32E-WITHFP-NEXT:    mv s1, a0
47; ILP32E-WITHFP-NEXT:    li a0, 1
48; ILP32E-WITHFP-NEXT:    lui a2, 262144
49; ILP32E-WITHFP-NEXT:    li a1, 0
50; ILP32E-WITHFP-NEXT:    call va_double
51; ILP32E-WITHFP-NEXT:    mv a0, s1
52; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 12
53; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
54; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
55; ILP32E-WITHFP-NEXT:    lw s1, 0(sp) # 4-byte Folded Reload
56; ILP32E-WITHFP-NEXT:    .cfi_restore ra
57; ILP32E-WITHFP-NEXT:    .cfi_restore s0
58; ILP32E-WITHFP-NEXT:    .cfi_restore s1
59; ILP32E-WITHFP-NEXT:    addi sp, sp, 12
60; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
61; ILP32E-WITHFP-NEXT:    ret
62entry:
63  call void (i32, ...) @va_double(i32 1, double 2.000000e+00)
64  ret i32 %a
65}
66
67define void @va_double(i32 %n, ...) {
68; ILP32E-LABEL: va_double:
69; ILP32E:       # %bb.0: # %entry
70; ILP32E-NEXT:    addi sp, sp, -32
71; ILP32E-NEXT:    .cfi_def_cfa_offset 32
72; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
73; ILP32E-NEXT:    .cfi_offset ra, -28
74; ILP32E-NEXT:    .cfi_remember_state
75; ILP32E-NEXT:    sw a5, 28(sp)
76; ILP32E-NEXT:    sw a1, 12(sp)
77; ILP32E-NEXT:    sw a2, 16(sp)
78; ILP32E-NEXT:    sw a3, 20(sp)
79; ILP32E-NEXT:    sw a4, 24(sp)
80; ILP32E-NEXT:    addi a0, sp, 12
81; ILP32E-NEXT:    addi a1, sp, 19
82; ILP32E-NEXT:    sw a0, 0(sp)
83; ILP32E-NEXT:    andi a1, a1, -8
84; ILP32E-NEXT:    addi a0, a1, 8
85; ILP32E-NEXT:    sw a0, 0(sp)
86; ILP32E-NEXT:    lw a0, 0(a1)
87; ILP32E-NEXT:    lw a1, 4(a1)
88; ILP32E-NEXT:    lui a3, 262144
89; ILP32E-NEXT:    li a2, 0
90; ILP32E-NEXT:    call __eqdf2
91; ILP32E-NEXT:    bnez a0, .LBB1_2
92; ILP32E-NEXT:  # %bb.1: # %if.end
93; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
94; ILP32E-NEXT:    .cfi_restore ra
95; ILP32E-NEXT:    addi sp, sp, 32
96; ILP32E-NEXT:    .cfi_def_cfa_offset 0
97; ILP32E-NEXT:    ret
98; ILP32E-NEXT:  .LBB1_2: # %if.then
99; ILP32E-NEXT:    .cfi_restore_state
100; ILP32E-NEXT:    call abort
101;
102; ILP32E-WITHFP-LABEL: va_double:
103; ILP32E-WITHFP:       # %bb.0: # %entry
104; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
105; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 36
106; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
107; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
108; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -28
109; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -32
110; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
111; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 24
112; ILP32E-WITHFP-NEXT:    .cfi_remember_state
113; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
114; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
115; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
116; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
117; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
118; ILP32E-WITHFP-NEXT:    addi a0, s0, 4
119; ILP32E-WITHFP-NEXT:    addi a1, s0, 11
120; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
121; ILP32E-WITHFP-NEXT:    andi a1, a1, -8
122; ILP32E-WITHFP-NEXT:    addi a0, a1, 8
123; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
124; ILP32E-WITHFP-NEXT:    lw a0, 0(a1)
125; ILP32E-WITHFP-NEXT:    lw a1, 4(a1)
126; ILP32E-WITHFP-NEXT:    lui a3, 262144
127; ILP32E-WITHFP-NEXT:    li a2, 0
128; ILP32E-WITHFP-NEXT:    call __eqdf2
129; ILP32E-WITHFP-NEXT:    bnez a0, .LBB1_2
130; ILP32E-WITHFP-NEXT:  # %bb.1: # %if.end
131; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 36
132; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
133; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
134; ILP32E-WITHFP-NEXT:    .cfi_restore ra
135; ILP32E-WITHFP-NEXT:    .cfi_restore s0
136; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
137; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
138; ILP32E-WITHFP-NEXT:    ret
139; ILP32E-WITHFP-NEXT:  .LBB1_2: # %if.then
140; ILP32E-WITHFP-NEXT:    .cfi_restore_state
141; ILP32E-WITHFP-NEXT:    call abort
142entry:
143  %args = alloca ptr, align 4
144  %args1 = bitcast ptr %args to ptr
145  call void @llvm.va_start(ptr %args1)
146  %argp.cur = load ptr, ptr %args, align 4
147  %0 = ptrtoint ptr %argp.cur to i32
148  %1 = add i32 %0, 7
149  %2 = and i32 %1, -8
150  %argp.cur.aligned = inttoptr i32 %2 to ptr
151  %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 8
152  store ptr %argp.next, ptr %args, align 4
153  %3 = bitcast ptr %argp.cur.aligned to ptr
154  %4 = load double, ptr %3, align 8
155  %cmp = fcmp une double %4, 2.000000e+00
156  br i1 %cmp, label %if.then, label %if.end
157
158if.then:
159  call void @abort()
160  unreachable
161
162if.end:
163  %args2 = bitcast ptr %args to ptr
164  call void @llvm.va_end(ptr %args2)
165  ret void
166}
167