2022-07-11 14:57:14 +00:00
|
|
|
/* This file is part of the dynarmic project.
|
|
|
|
* Copyright (c) 2018 MerryMage
|
|
|
|
* SPDX-License-Identifier: 0BSD
|
|
|
|
*/
|
|
|
|
|
2022-12-31 16:26:55 +00:00
|
|
|
#include <catch2/catch_test_macros.hpp>
|
2022-07-11 14:57:14 +00:00
|
|
|
|
|
|
|
#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);
|
|
|
|
}
|