diff options
Diffstat (limited to 'externals/dynarmic/tests/A64/test_invalidation.cpp')
-rw-r--r-- | externals/dynarmic/tests/A64/test_invalidation.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/externals/dynarmic/tests/A64/test_invalidation.cpp b/externals/dynarmic/tests/A64/test_invalidation.cpp new file mode 100644 index 0000000000..fa35b02b7f --- /dev/null +++ b/externals/dynarmic/tests/A64/test_invalidation.cpp @@ -0,0 +1,113 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2018 MerryMage + * SPDX-License-Identifier: 0BSD + */ + +#include <catch2/catch_test_macros.hpp> + +#include "./testenv.h" +#include "dynarmic/interface/A64/a64.h" + +using namespace Dynarmic; + +TEST_CASE("ensure fast dispatch entry is cleared even when a block does not have any patching requirements", "[a64]") { + A64TestEnv env; + + A64::UserConfig conf{&env}; + A64::Jit jit{conf}; + + REQUIRE(conf.HasOptimization(OptimizationFlag::FastDispatch)); + + env.code_mem_start_address = 100; + env.code_mem.clear(); + env.code_mem.emplace_back(0xd2800d80); // MOV X0, 108 + env.code_mem.emplace_back(0xd61f0000); // BR X0 + env.code_mem.emplace_back(0xd2800540); // MOV X0, 42 + env.code_mem.emplace_back(0x14000000); // B . + + jit.SetPC(100); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + jit.SetPC(100); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + jit.InvalidateCacheRange(108, 4); + + jit.SetPC(100); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + env.code_mem[2] = 0xd28008a0; // MOV X0, 69 + + jit.SetPC(100); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + jit.InvalidateCacheRange(108, 4); + + jit.SetPC(100); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 69); + + jit.SetPC(100); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 69); +} + +TEST_CASE("ensure fast dispatch entry is cleared even when a block does not have any patching requirements 2", "[a64]") { + A64TestEnv env; + + A64::UserConfig conf{&env}; + A64::Jit jit{conf}; + + REQUIRE(conf.HasOptimization(OptimizationFlag::FastDispatch)); + + env.code_mem.emplace_back(0xd2800100); // MOV X0, 8 + env.code_mem.emplace_back(0xd61f0000); // BR X0 + env.code_mem.emplace_back(0xd2800540); // MOV X0, 42 + env.code_mem.emplace_back(0x14000000); // B . + + jit.SetPC(0); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + jit.SetPC(0); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + jit.InvalidateCacheRange(8, 4); + + jit.SetPC(0); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + env.code_mem[2] = 0xd28008a0; // MOV X0, 69 + + jit.SetPC(0); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 42); + + jit.InvalidateCacheRange(8, 4); + + jit.SetPC(0); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 69); + + jit.SetPC(0); + env.ticks_left = 4; + jit.Run(); + REQUIRE(jit.GetRegister(0) == 69); +} |