| ... | ... | @@ -458,4 +458,57 @@ pub fn addCases(ctx: *TestContext) !void { |
| 458 | 458 | "", |
| 459 | 459 | ); |
| 460 | 460 | } |
| 461 | |
| 462 | { |
| 463 | var case = ctx.exe("spilling registers", linux_arm); |
| 464 | case.addCompareOutput( |
| 465 | \\export fn _start() noreturn { |
| 466 | \\ assert(add(3, 4) == 791); |
| 467 | \\ exit(); |
| 468 | \\} |
| 469 | \\ |
| 470 | \\fn add(a: u32, b: u32) u32 { |
| 471 | \\ const x: u32 = blk: { |
| 472 | \\ const c = a + b; // 7 |
| 473 | \\ const d = a + c; // 10 |
| 474 | \\ const e = d + b; // 14 |
| 475 | \\ const f = d + e; // 24 |
| 476 | \\ const g = e + f; // 38 |
| 477 | \\ const h = f + g; // 62 |
| 478 | \\ const i = g + h; // 100 |
| 479 | \\ const j = i + d; // 110 |
| 480 | \\ const k = i + j; // 210 |
| 481 | \\ const l = k + c; // 217 |
| 482 | \\ const m = l + d; // 227 |
| 483 | \\ const n = m + e; // 241 |
| 484 | \\ const o = n + f; // 265 |
| 485 | \\ const p = o + g; // 303 |
| 486 | \\ const q = p + h; // 365 |
| 487 | \\ const r = q + i; // 465 |
| 488 | \\ const s = r + j; // 575 |
| 489 | \\ const t = s + k; // 785 |
| 490 | \\ break :blk t; |
| 491 | \\ }; |
| 492 | \\ const y = x + a; // 788 |
| 493 | \\ const z = y + a; // 791 |
| 494 | \\ return z; |
| 495 | \\} |
| 496 | \\ |
| 497 | \\fn assert(ok: bool) void { |
| 498 | \\ if (!ok) unreachable; |
| 499 | \\} |
| 500 | \\ |
| 501 | \\fn exit() noreturn { |
| 502 | \\ asm volatile ("svc #0" |
| 503 | \\ : |
| 504 | \\ : [number] "{r7}" (1), |
| 505 | \\ [arg1] "{r0}" (0) |
| 506 | \\ : "memory" |
| 507 | \\ ); |
| 508 | \\ unreachable; |
| 509 | \\} |
| 510 | , |
| 511 | "", |
| 512 | ); |
| 513 | } |
| 461 | 514 | } |