From 6c655321e6b04b8648802e296bb5ca11d290ae68 Mon Sep 17 00:00:00 2001 From: swurl Date: Sat, 31 May 2025 02:33:02 -0400 Subject: Move dead submodules in-tree Signed-off-by: swurl --- externals/oaknut/tests/vector_code_gen.cpp | 91 ++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 externals/oaknut/tests/vector_code_gen.cpp (limited to 'externals/oaknut/tests/vector_code_gen.cpp') diff --git a/externals/oaknut/tests/vector_code_gen.cpp b/externals/oaknut/tests/vector_code_gen.cpp new file mode 100644 index 0000000000..5ede9e565c --- /dev/null +++ b/externals/oaknut/tests/vector_code_gen.cpp @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: Copyright (c) 2023 merryhime +// SPDX-License-Identifier: MIT + +#include +#include +#include +#include +#include + +#include + +#include "architecture.hpp" + +#ifdef ON_ARM64 + +# include "oaknut/code_block.hpp" +# include "oaknut/oaknut.hpp" +# include "rand_int.hpp" + +using namespace oaknut; +using namespace oaknut::util; + +TEST_CASE("Basic Test (VectorCodeGenerator)") +{ + std::vector vec; + VectorCodeGenerator code{vec}; + + code.MOV(W0, 42); + code.RET(); + + CodeBlock mem{4096}; + + mem.unprotect(); + std::memcpy(mem.ptr(), vec.data(), vec.size() * sizeof(std::uint32_t)); + mem.protect(); + mem.invalidate_all(); + + int result = ((int (*)())mem.ptr())(); + REQUIRE(result == 42); +} + +TEST_CASE("Fibonacci (VectorCodeGenerator)") +{ + std::vector vec; + VectorCodeGenerator code{vec}; + + 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.MOV(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(); + + CodeBlock mem{4096}; + + mem.unprotect(); + std::memcpy(mem.ptr(), vec.data(), vec.size() * sizeof(std::uint32_t)); + mem.protect(); + mem.invalidate_all(); + + auto fib = (int (*)(int))mem.ptr(); + + REQUIRE(fib(0) == 0); + REQUIRE(fib(1) == 1); + REQUIRE(fib(5) == 5); + REQUIRE(fib(9) == 34); +} + +#endif -- cgit v1.2.3