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
7 declare void @llvm.va_start(ptr)
8 declare void @llvm.va_end(ptr)
11 define 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
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
63 call void (i32, ...) @va_double(i32 1, double 2.000000e+00)
67 define 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
98 ; ILP32E-NEXT: .LBB1_2: # %if.then
99 ; ILP32E-NEXT: .cfi_restore_state
100 ; ILP32E-NEXT: call abort
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
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
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
163 %args2 = bitcast ptr %args to ptr
164 call void @llvm.va_end(ptr %args2)