114 lines
2.6 KiB
C++
114 lines
2.6 KiB
C++
|
/* This file is part of the dynarmic project.
|
||
|
* Copyright (c) 2018 MerryMage
|
||
|
* SPDX-License-Identifier: 0BSD
|
||
|
*/
|
||
|
|
||
|
#include <catch2/catch.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);
|
||
|
}
|