|
2 | 2 |
|
3 | 3 | define void @pass_va(i32 %count, ...) nounwind {
|
4 | 4 | entry:
|
5 |
| -; CHECK: sub sp, sp, #80 |
| 5 | +; CHECK: str x30, [sp, #-80]! |
6 | 6 | ; CHECK: add x8, sp, #24
|
7 | 7 | ; CHECK: add x0, sp, #24
|
8 | 8 | ; CHECK: stp x6, x7, [sp, #64]
|
9 | 9 | ; CHECK: stp x4, x5, [sp, #48]
|
10 | 10 | ; CHECK: stp x2, x3, [sp, #32]
|
11 | 11 | ; CHECK: str x1, [sp, #24]
|
12 |
| -; CHECK: stp x30, x8, [sp] |
| 12 | +; CHECK: str x8, [sp, #8] |
13 | 13 | ; CHECK: bl other_func
|
14 | 14 | ; CHECK: ldr x30, [sp], #80
|
15 | 15 | ; CHECK: ret
|
@@ -102,6 +102,113 @@ declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
|
102 | 102 | declare i32 @__stdio_common_vsprintf(i64, i8*, i64, i8*, i8*, i8*) local_unnamed_addr #3
|
103 | 103 | declare i64* @__local_stdio_printf_options() local_unnamed_addr #4
|
104 | 104 |
|
| 105 | +; CHECK-LABEL: fp |
| 106 | +; CHECK: str x21, [sp, #-96]! |
| 107 | +; CHECK: stp x20, x19, [sp, #16] |
| 108 | +; CHECK: stp x29, x30, [sp, #32] |
| 109 | +; CHECK: add x29, sp, #32 |
| 110 | +; CHECK: add x8, x29, #24 |
| 111 | +; CHECK: mov x19, x2 |
| 112 | +; CHECK: mov x20, x1 |
| 113 | +; CHECK: mov x21, x0 |
| 114 | +; CHECK: stp x6, x7, [x29, #48] |
| 115 | +; CHECK: stp x4, x5, [x29, #32] |
| 116 | +; CHECK: str x3, [x29, #24] |
| 117 | +; CHECK: str x8, [sp, #8] |
| 118 | +; CHECK: bl __local_stdio_printf_options |
| 119 | +; CHECK: ldr x8, [x0] |
| 120 | +; CHECK: add x5, x29, #24 |
| 121 | +; CHECK: mov x1, x21 |
| 122 | +; CHECK: mov x2, x20 |
| 123 | +; CHECK: orr x0, x8, #0x2 |
| 124 | +; CHECK: mov x3, x19 |
| 125 | +; CHECK: mov x4, xzr |
| 126 | +; CHECK: bl __stdio_common_vsprintf |
| 127 | +; CHECK: ldp x29, x30, [sp, #32] |
| 128 | +; CHECK: ldp x20, x19, [sp, #16] |
| 129 | +; CHECK: cmp w0, #0 |
| 130 | +; CHECK: csinv w0, w0, wzr, ge |
| 131 | +; CHECK: ldr x21, [sp], #96 |
| 132 | +; CHECK: ret |
| 133 | +define i32 @fp(i8*, i64, i8*, ...) local_unnamed_addr #6 { |
| 134 | + %4 = alloca i8*, align 8 |
| 135 | + %5 = bitcast i8** %4 to i8* |
| 136 | + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %5) #2 |
| 137 | + call void @llvm.va_start(i8* nonnull %5) |
| 138 | + %6 = load i8*, i8** %4, align 8 |
| 139 | + %7 = call i64* @__local_stdio_printf_options() #2 |
| 140 | + %8 = load i64, i64* %7, align 8 |
| 141 | + %9 = or i64 %8, 2 |
| 142 | + %10 = call i32 @__stdio_common_vsprintf(i64 %9, i8* %0, i64 %1, i8* %2, i8* null, i8* %6) #2 |
| 143 | + %11 = icmp sgt i32 %10, -1 |
| 144 | + %12 = select i1 %11, i32 %10, i32 -1 |
| 145 | + call void @llvm.va_end(i8* nonnull %5) |
| 146 | + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %5) #2 |
| 147 | + ret i32 %12 |
| 148 | +} |
| 149 | + |
| 150 | +attributes #6 = { "no-frame-pointer-elim"="true" } |
| 151 | + |
| 152 | +; CHECK-LABEL: vla |
| 153 | +; CHECK: str x23, [sp, #-112]! |
| 154 | +; CHECK: stp x22, x21, [sp, #16] |
| 155 | +; CHECK: stp x20, x19, [sp, #32] |
| 156 | +; CHECK: stp x29, x30, [sp, #48] |
| 157 | +; CHECK: add x29, sp, #48 |
| 158 | +; CHECK: add x8, x29, #16 |
| 159 | +; CHECK: stur x8, [x29, #-40] |
| 160 | +; CHECK: mov w8, w0 |
| 161 | +; CHECK: add x8, x8, #15 |
| 162 | +; CHECK: mov x9, sp |
| 163 | +; CHECK: and x8, x8, #0x1fffffff0 |
| 164 | +; CHECK: sub x20, x9, x8 |
| 165 | +; CHECK: mov x19, x1 |
| 166 | +; CHECK: mov x23, sp |
| 167 | +; CHECK: stp x6, x7, [x29, #48] |
| 168 | +; CHECK: stp x4, x5, [x29, #32] |
| 169 | +; CHECK: stp x2, x3, [x29, #16] |
| 170 | +; CHECK: mov sp, x20 |
| 171 | +; CHECK: ldur x21, [x29, #-40] |
| 172 | +; CHECK: sxtw x22, w0 |
| 173 | +; CHECK: bl __local_stdio_printf_options |
| 174 | +; CHECK: ldr x8, [x0] |
| 175 | +; CHECK: mov x1, x20 |
| 176 | +; CHECK: mov x2, x22 |
| 177 | +; CHECK: mov x3, x19 |
| 178 | +; CHECK: orr x0, x8, #0x2 |
| 179 | +; CHECK: mov x4, xzr |
| 180 | +; CHECK: mov x5, x21 |
| 181 | +; CHECK: bl __stdio_common_vsprintf |
| 182 | +; CHECK: mov sp, x23 |
| 183 | +; CHECK: sub sp, x29, #48 |
| 184 | +; CHECK: ldp x29, x30, [sp, #48] |
| 185 | +; CHECK: ldp x20, x19, [sp, #32] |
| 186 | +; CHECK: ldp x22, x21, [sp, #16] |
| 187 | +; CHECK: ldr x23, [sp], #112 |
| 188 | +; CHECK: ret |
| 189 | +define void @vla(i32, i8*, ...) local_unnamed_addr { |
| 190 | + %3 = alloca i8*, align 8 |
| 191 | + %4 = bitcast i8** %3 to i8* |
| 192 | + call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %4) #5 |
| 193 | + call void @llvm.va_start(i8* nonnull %4) |
| 194 | + %5 = zext i32 %0 to i64 |
| 195 | + %6 = call i8* @llvm.stacksave() |
| 196 | + %7 = alloca i8, i64 %5, align 1 |
| 197 | + %8 = load i8*, i8** %3, align 8 |
| 198 | + %9 = sext i32 %0 to i64 |
| 199 | + %10 = call i64* @__local_stdio_printf_options() |
| 200 | + %11 = load i64, i64* %10, align 8 |
| 201 | + %12 = or i64 %11, 2 |
| 202 | + %13 = call i32 @__stdio_common_vsprintf(i64 %12, i8* nonnull %7, i64 %9, i8* %1, i8* null, i8* %8) |
| 203 | + call void @llvm.va_end(i8* nonnull %4) |
| 204 | + call void @llvm.stackrestore(i8* %6) |
| 205 | + call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %4) #5 |
| 206 | + ret void |
| 207 | +} |
| 208 | + |
| 209 | +declare i8* @llvm.stacksave() |
| 210 | +declare void @llvm.stackrestore(i8*) |
| 211 | + |
105 | 212 | ; CHECK-LABEL: snprintf
|
106 | 213 | ; CHECK: sub sp, sp, #96
|
107 | 214 | ; CHECK: stp x21, x20, [sp, #16]
|
|
0 commit comments