aboutsummaryrefslogtreecommitdiff
path: root/externals/dynarmic/tests/A64/test_invalidation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/dynarmic/tests/A64/test_invalidation.cpp')
-rw-r--r--externals/dynarmic/tests/A64/test_invalidation.cpp113
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);
+}