From 6f074d8db8e433bfba0bc56d245d33b92d175c7d Mon Sep 17 00:00:00 2001 From: Merry Date: Sat, 9 Jul 2022 22:22:46 +0100 Subject: [PATCH] tests: Add fibonacci test Test added to test labels --- tests/basic.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/basic.cpp b/tests/basic.cpp index 1561436..1fa84e8 100644 --- a/tests/basic.cpp +++ b/tests/basic.cpp @@ -28,3 +28,52 @@ TEST_CASE("Basic Test") int result = ((int (*)())mem.ptr())(); REQUIRE(result == 42); } + +TEST_CASE("Fibonacci") +{ + using namespace oaknut; + using namespace oaknut::util; + + CodeBlock mem{4096}; + CodeGenerator code{mem.ptr()}; + + mem.unprotect(); + + auto fib = code.ptr(); + Label start, end, zero, recurse; + + code.l(start); + code.STP(X29, X30, SP, PRE_INDEXED, -32); + code.STP(X20, X19, SP, 16); + code.MOV(X29, SP); + code.MOV(W19, W0); + code.SUBS(W0, W0, 1); + code.B(LT, zero); + code.B(NE, recurse); + code.MOVZ(W0, 1); + code.B(end); + + code.l(zero); + code.MOV(W0, WZR); + code.B(end); + + code.l(recurse); + code.BL(start); + code.MOV(W20, W0); + code.SUB(W0, W19, 2); + code.BL(start); + code.ADD(W0, W0, W20); + + code.l(end); + code.LDP(X20, X19, SP, 16); + code.LDP(X29, X30, SP, POST_INDEXED, 32); + code.RET(X30); + + mem.protect(); + mem.invalidate_all(); + + REQUIRE(fib(0) == 0); + REQUIRE(fib(1) == 1); + REQUIRE(fib(5) == 5); + REQUIRE(fib(9) == 34); +}