| ... | ... | @@ -419,4 +419,43 @@ pub fn addCases(ctx: *TestContext) !void { |
| 419 | 419 | "", |
| 420 | 420 | ); |
| 421 | 421 | } |
| 422 | |
| 423 | { |
| 424 | var case = ctx.exe("recursive fibonacci", linux_arm); |
| 425 | case.addCompareOutput( |
| 426 | \\export fn _start() noreturn { |
| 427 | \\ assert(fib(0) == 0); |
| 428 | \\ assert(fib(1) == 1); |
| 429 | \\ assert(fib(2) == 1); |
| 430 | \\ assert(fib(3) == 2); |
| 431 | \\ assert(fib(10) == 55); |
| 432 | \\ assert(fib(20) == 6765); |
| 433 | \\ exit(); |
| 434 | \\} |
| 435 | \\ |
| 436 | \\fn fib(n: u32) u32 { |
| 437 | \\ if (n < 2) { |
| 438 | \\ return n; |
| 439 | \\ } else { |
| 440 | \\ return fib(n - 2) + fib(n - 1); |
| 441 | \\ } |
| 442 | \\} |
| 443 | \\ |
| 444 | \\fn assert(ok: bool) void { |
| 445 | \\ if (!ok) unreachable; |
| 446 | \\} |
| 447 | \\ |
| 448 | \\fn exit() noreturn { |
| 449 | \\ asm volatile ("svc #0" |
| 450 | \\ : |
| 451 | \\ : [number] "{r7}" (1), |
| 452 | \\ [arg1] "{r0}" (0) |
| 453 | \\ : "memory" |
| 454 | \\ ); |
| 455 | \\ unreachable; |
| 456 | \\} |
| 457 | , |
| 458 | "", |
| 459 | ); |
| 460 | } |
| 422 | 461 | } |