|
1 | 1 | //@ add-minicore |
2 | 2 | //@ assembly-output: emit-asm |
3 | 3 | // |
4 | | -//@ revisions: AARCH64_LINUX AARCH64_DARWIN AARCH64_BE ARM64EC_MSVC |
| 4 | +//@ revisions: AARCH64_LINUX AARCH64_DARWIN AARCH64_BE AARCH64_MSVC ARM64EC_MSVC |
5 | 5 | //@ [AARCH64_LINUX] compile-flags: -Copt-level=3 --target aarch64-unknown-linux-gnu |
6 | 6 | //@ [AARCH64_LINUX] needs-llvm-components: aarch64 |
7 | 7 | //@ [AARCH64_BE] compile-flags: -Copt-level=3 --target aarch64_be-unknown-linux-gnu |
8 | 8 | //@ [AARCH64_BE] needs-llvm-components: aarch64 |
9 | 9 | //@ [AARCH64_DARWIN] compile-flags: -Copt-level=3 --target aarch64-apple-darwin |
10 | 10 | //@ [AARCH64_DARWIN] needs-llvm-components: aarch64 |
| 11 | +//@ [AARCH64_MSVC] compile-flags: -Copt-level=3 --target aarch64-pc-windows-msvc |
| 12 | +//@ [AARCH64_MSVC] needs-llvm-components: aarch64 |
11 | 13 | //@ [ARM64EC_MSVC] compile-flags: -Copt-level=3 --target arm64ec-pc-windows-msvc |
12 | 14 | //@ [ARM64EC_MSVC] needs-llvm-components: aarch64 |
13 | 15 | #![feature(c_variadic, no_core, lang_items, intrinsics, rustc_attrs)] |
@@ -101,6 +103,12 @@ unsafe extern "C" fn read_f64(ap: &mut VaList<'_>) -> f64 { |
101 | 103 | // AARCH64_DARWIN-NEXT: ldr d0, [x8], #8 |
102 | 104 | // AARCH64_DARWIN-NEXT: str x8, [x0] |
103 | 105 | // AARCH64_DARWIN-NEXT: ret |
| 106 | + |
| 107 | + // AARCH64_MSVC-LABEL: read_f64: |
| 108 | + // AARCH64_MSVC: ldr x8, [x0] |
| 109 | + // AARCH64_MSVC-NEXT: ldr d0, [x8], #8 |
| 110 | + // AARCH64_MSVC-NEXT: str x8, [x0] |
| 111 | + // AARCH64_MSVC-NEXT: ret |
104 | 112 | va_arg(ap) |
105 | 113 | } |
106 | 114 |
|
@@ -157,6 +165,13 @@ unsafe extern "C" fn read_i32(ap: &mut VaList<'_>) -> i32 { |
157 | 165 | // AARCH64_DARWIN-NEXT: str x9, [x0] |
158 | 166 | // AARCH64_DARWIN-NEXT: mov x0, x8 |
159 | 167 | // AARCH64_DARWIN-NEXT: ret |
| 168 | + |
| 169 | + // AARCH64_MSVC-LABEL: read_i32: |
| 170 | + // AARCH64_MSVC: ldr x9, [x0] |
| 171 | + // AARCH64_MSVC-NEXT: mov x8, x0 |
| 172 | + // AARCH64_MSVC-NEXT: ldr w0, [x9], #8 |
| 173 | + // AARCH64_MSVC-NEXT: str x9, [x8] |
| 174 | + // AARCH64_MSVC-NEXT: ret |
160 | 175 | va_arg(ap) |
161 | 176 | } |
162 | 177 |
|
@@ -214,6 +229,13 @@ unsafe extern "C" fn read_i64(ap: &mut VaList<'_>) -> i64 { |
214 | 229 | // AARCH64_DARWIN-NEXT: str x9, [x0] |
215 | 230 | // AARCH64_DARWIN-NEXT: mov x0, x8 |
216 | 231 | // AARCH64_DARWIN-NEXT: ret |
| 232 | + |
| 233 | + // AARCH64_MSVC-LABEL: read_i64: |
| 234 | + // AARCH64_MSVC: ldr x9, [x0] |
| 235 | + // AARCH64_MSVC-NEXT: mov x8, x0 |
| 236 | + // AARCH64_MSVC-NEXT: ldr x0, [x9], #8 |
| 237 | + // AARCH64_MSVC-NEXT: str x9, [x8] |
| 238 | + // AARCH64_MSVC-NEXT: ret |
217 | 239 | va_arg(ap) |
218 | 240 | } |
219 | 241 |
|
@@ -281,13 +303,28 @@ unsafe extern "C" fn read_i128(ap: &mut VaList<'_>) -> i128 { |
281 | 303 | // AARCH64_DARWIN-NEXT: str x9, [x0] |
282 | 304 | // AARCH64_DARWIN-NEXT: mov x0, x8 |
283 | 305 | // AARCH64_DARWIN-NEXT: ret |
| 306 | + |
| 307 | + // NOTE: rustc bumps the alignment to 16, which deviates from clang's va_arg |
| 308 | + // but matches MSVC and how clang passes i128 c-variadic arguments. |
| 309 | + // |
| 310 | + // AARCH64_MSVC-LABEL: read_i128: |
| 311 | + // AARCH64_MSVC: ldr x9, [x0] |
| 312 | + // AARCH64_MSVC-NEXT: mov x8, x0 |
| 313 | + // AARCH64_MSVC-NEXT: add x9, x9, #15 |
| 314 | + // AARCH64_MSVC-NEXT: and x9, x9, #0xfffffffffffffff0 |
| 315 | + // AARCH64_MSVC-NEXT: mov x10, x9 |
| 316 | + // AARCH64_MSVC-NEXT: ldr x1, [x9, #8] |
| 317 | + // AARCH64_MSVC-NEXT: ldr x0, [x10], #16 |
| 318 | + // AARCH64_MSVC-NEXT: str x10, [x8] |
| 319 | + // AARCH64_MSVC-NEXT: ret |
284 | 320 | va_arg(ap) |
285 | 321 | } |
286 | 322 |
|
287 | 323 | #[unsafe(no_mangle)] |
288 | 324 | unsafe extern "C" fn read_ptr(ap: &mut VaList<'_>) -> *const u8 { |
289 | 325 | // AARCH64_LINUX-CHECK: read_ptr = read_i64 |
290 | 326 | // AARCH64_BE-CHECK: read_ptr = read_i64 |
| 327 | + // AARCH64_MSVC: read_ptr = read_i64 |
291 | 328 | // ARM64EC_MSVC: "#read_ptr" = "#read_i64" |
292 | 329 | // AARCH64_DARWIN-CHECK: _read_ptr = _read_i64 |
293 | 330 | va_arg(ap) |
|
0 commit comments