123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /* 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);
- }
|