diff --git a/externals/oaknut/.github/workflows/build-and-test.yml b/externals/oaknut/.github/workflows/build-and-test.yml index 2918c83e..793b52dd 100644 --- a/externals/oaknut/.github/workflows/build-and-test.yml +++ b/externals/oaknut/.github/workflows/build-and-test.yml @@ -3,7 +3,7 @@ on: [push, pull_request] jobs: test_on_ubuntu: runs-on: ubuntu-latest - name: g++-10 + name: g++-10 (aarch64) steps: - name: Checkout oaknut repo @@ -207,3 +207,40 @@ jobs: - name: Build working-directory: ${{github.workspace}}/build run: cmake --build . --config Release + + x86_64: + runs-on: ubuntu-latest + name: x86_64 + + steps: + - name: Checkout oaknut repo + uses: actions/checkout@v3 + + - name: Update package repositories + run: sudo apt-get update + + - name: Install dependencies + run: sudo apt-get install -q -y ninja-build + + - name: Checkout Catch2 v3 repo + uses: actions/checkout@v3 + with: + repository: catchorg/Catch2 + ref: v3.2.0 + path: externals/catch + + - name: Configure CMake + run: > + cmake + -B ${{github.workspace}}/build + -H. + -GNinja + -DOAKNUT_USE_BUNDLED_CATCH=ON + + - name: Build + working-directory: ${{github.workspace}}/build + run: ninja + + - name: Test + working-directory: ${{github.workspace}}/build + run: ./oaknut-tests -d yes diff --git a/externals/oaknut/CMakeLists.txt b/externals/oaknut/CMakeLists.txt index 1ad90ba5..5b4062d0 100644 --- a/externals/oaknut/CMakeLists.txt +++ b/externals/oaknut/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.8) -project(oaknut LANGUAGES CXX VERSION 2.0.1) +project(oaknut LANGUAGES CXX VERSION 2.0.2) # Determine if we're built as a subproject (using add_subdirectory) # or if this is the master project. @@ -50,12 +50,16 @@ add_library(merry::oaknut ALIAS oaknut) target_sources(oaknut INTERFACE "$") target_include_directories(oaknut INTERFACE $ - $ + $ ) target_compile_features(oaknut INTERFACE cxx_std_20) # Tests if (MASTER_PROJECT) + include(CTest) +endif() + +if (BUILD_TESTING) option(OAKNUT_USE_BUNDLED_CATCH "Use the embedded Catch2 submodule" OFF) if (OAKNUT_USE_BUNDLED_CATCH) add_subdirectory(externals/catch) @@ -101,6 +105,8 @@ if (MASTER_PROJECT) else() target_compile_options(oaknut-tests PRIVATE -Wall -Wextra -Wcast-qual -pedantic -pedantic-errors -Wfatal-errors -Wno-missing-braces) endif() + + add_test(oaknut-tests oaknut-tests --durations yes) endif() # Install diff --git a/externals/oaknut/tests/_feature_detect.cpp b/externals/oaknut/tests/_feature_detect.cpp index 875abac4..60de46fb 100644 --- a/externals/oaknut/tests/_feature_detect.cpp +++ b/externals/oaknut/tests/_feature_detect.cpp @@ -5,8 +5,12 @@ #include -#include "oaknut/feature_detection/feature_detection.hpp" -#include "oaknut/feature_detection/feature_detection_idregs.hpp" +#include "architecture.hpp" + +#ifdef ON_ARM64 + +# include "oaknut/feature_detection/feature_detection.hpp" +# include "oaknut/feature_detection/feature_detection_idregs.hpp" using namespace oaknut; @@ -16,26 +20,6 @@ TEST_CASE("Print CPU features (Default)") std::fputs("CPU Features: ", stdout); -#define OAKNUT_CPU_FEATURE(name) \ - if (features.has(CpuFeature::name)) \ - std::fputs(#name " ", stdout); -#include "oaknut/impl/cpu_feature.inc.hpp" -#undef OAKNUT_CPU_FEATURE - - std::fputs("\n", stdout); -} - -#if OAKNUT_SUPPORTS_READING_ID_REGISTERS == 1 - -TEST_CASE("Print CPU features (Using CPUID)") -{ - std::optional id_regs = read_id_registers(); - REQUIRE(!!id_regs); - - CpuFeatures features = detect_features_via_id_registers(*id_regs); - - std::fputs("CPU Features (CPUID method): ", stdout); - # define OAKNUT_CPU_FEATURE(name) \ if (features.has(CpuFeature::name)) \ std::fputs(#name " ", stdout); @@ -45,7 +29,27 @@ TEST_CASE("Print CPU features (Using CPUID)") std::fputs("\n", stdout); } -#elif OAKNUT_SUPPORTS_READING_ID_REGISTERS == 2 +# if OAKNUT_SUPPORTS_READING_ID_REGISTERS == 1 + +TEST_CASE("Print CPU features (Using CPUID)") +{ + std::optional id_regs = read_id_registers(); + REQUIRE(!!id_regs); + + CpuFeatures features = detect_features_via_id_registers(*id_regs); + + std::fputs("CPU Features (CPUID method): ", stdout); + +# define OAKNUT_CPU_FEATURE(name) \ + if (features.has(CpuFeature::name)) \ + std::fputs(#name " ", stdout); +# include "oaknut/impl/cpu_feature.inc.hpp" +# undef OAKNUT_CPU_FEATURE + + std::fputs("\n", stdout); +} + +# elif OAKNUT_SUPPORTS_READING_ID_REGISTERS == 2 TEST_CASE("Print CPU features (Using CPUID)") { @@ -58,14 +62,16 @@ TEST_CASE("Print CPU features (Using CPUID)") std::printf("CPU Features (CPUID method - Core %zu): ", core_index); -# define OAKNUT_CPU_FEATURE(name) \ - if (features.has(CpuFeature::name)) \ - std::fputs(#name " ", stdout); -# include "oaknut/impl/cpu_feature.inc.hpp" -# undef OAKNUT_CPU_FEATURE +# define OAKNUT_CPU_FEATURE(name) \ + if (features.has(CpuFeature::name)) \ + std::fputs(#name " ", stdout); +# include "oaknut/impl/cpu_feature.inc.hpp" +# undef OAKNUT_CPU_FEATURE std::fputs("\n", stdout); } } +# endif + #endif diff --git a/externals/oaknut/tests/architecture.hpp b/externals/oaknut/tests/architecture.hpp new file mode 100644 index 00000000..90471a73 --- /dev/null +++ b/externals/oaknut/tests/architecture.hpp @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: Copyright (c) 2024 merryhime +// SPDX-License-Identifier: MIT + +#if defined(__ARM64__) || defined(__aarch64__) || defined(_M_ARM64) +# define ON_ARM64 +#endif diff --git a/externals/oaknut/tests/basic.cpp b/externals/oaknut/tests/basic.cpp index e621faec..344d9d70 100644 --- a/externals/oaknut/tests/basic.cpp +++ b/externals/oaknut/tests/basic.cpp @@ -7,14 +7,18 @@ #include -#include "oaknut/code_block.hpp" -#include "oaknut/dual_code_block.hpp" +#include "architecture.hpp" #include "oaknut/oaknut.hpp" #include "rand_int.hpp" using namespace oaknut; using namespace oaknut::util; +#ifdef ON_ARM64 + +# include "oaknut/code_block.hpp" +# include "oaknut/dual_code_block.hpp" + TEST_CASE("Basic Test") { CodeBlock mem{4096}; @@ -196,19 +200,6 @@ TEST_CASE("ADR", "[slow]") } } -TEST_CASE("PageOffset (rollover)") -{ - REQUIRE(PageOffset<21, 12>::encode(0x0000000088e74000, 0xffffffffd167dece) == 0xd2202); -} - -TEST_CASE("PageOffset (page boundary)") -{ - REQUIRE(PageOffset<21, 12>::encode(0x0001000000000002, 0x0001000000000001) == 0); - REQUIRE(PageOffset<21, 12>::encode(0x0001000000000001, 0x0001000000000002) == 0); - REQUIRE(PageOffset<21, 12>::encode(0x0001000000001000, 0x0001000000000fff) == 0x1fffff); - REQUIRE(PageOffset<21, 12>::encode(0x0001000000000fff, 0x0001000000001000) == 0x080000); -} - TEST_CASE("ADRP", "[slow]") { CodeBlock mem{4096}; @@ -325,3 +316,18 @@ TEST_CASE("MOVP2R (4GiB boundary)") test(-i); } } + +#endif + +TEST_CASE("PageOffset (rollover)") +{ + REQUIRE(PageOffset<21, 12>::encode(0x0000000088e74000, 0xffffffffd167dece) == 0xd2202); +} + +TEST_CASE("PageOffset (page boundary)") +{ + REQUIRE(PageOffset<21, 12>::encode(0x0001000000000002, 0x0001000000000001) == 0); + REQUIRE(PageOffset<21, 12>::encode(0x0001000000000001, 0x0001000000000002) == 0); + REQUIRE(PageOffset<21, 12>::encode(0x0001000000001000, 0x0001000000000fff) == 0x1fffff); + REQUIRE(PageOffset<21, 12>::encode(0x0001000000000fff, 0x0001000000001000) == 0x080000); +} diff --git a/externals/oaknut/tests/vector_code_gen.cpp b/externals/oaknut/tests/vector_code_gen.cpp index baceeeff..5ede9e56 100644 --- a/externals/oaknut/tests/vector_code_gen.cpp +++ b/externals/oaknut/tests/vector_code_gen.cpp @@ -9,9 +9,13 @@ #include -#include "oaknut/code_block.hpp" -#include "oaknut/oaknut.hpp" -#include "rand_int.hpp" +#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; @@ -83,3 +87,5 @@ TEST_CASE("Fibonacci (VectorCodeGenerator)") REQUIRE(fib(5) == 5); REQUIRE(fib(9) == 34); } + +#endif