| ... | @@ -419,4 +419,43 @@ pub fn addCases(ctx: *TestContext) !void { | ... | @@ -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 | } |