This fixes tests for dynarmic, print_info and test_generator. Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: #2601 Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
117 lines
3.1 KiB
C++
117 lines
3.1 KiB
C++
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
/* 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 "../native/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{};
|
|
conf.callbacks = &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;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
jit.SetPC(100);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
jit.InvalidateCacheRange(108, 4);
|
|
|
|
jit.SetPC(100);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
env.code_mem[2] = 0xd28008a0; // MOV X0, 69
|
|
|
|
jit.SetPC(100);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
jit.InvalidateCacheRange(108, 4);
|
|
|
|
jit.SetPC(100);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 69);
|
|
|
|
jit.SetPC(100);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { 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{};
|
|
conf.callbacks = &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;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
jit.SetPC(0);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
jit.InvalidateCacheRange(8, 4);
|
|
|
|
jit.SetPC(0);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
env.code_mem[2] = 0xd28008a0; // MOV X0, 69
|
|
|
|
jit.SetPC(0);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 42);
|
|
|
|
jit.InvalidateCacheRange(8, 4);
|
|
|
|
jit.SetPC(0);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 69);
|
|
|
|
jit.SetPC(0);
|
|
env.ticks_left = 4;
|
|
CheckedRun([&]() { jit.Run(); });
|
|
REQUIRE(jit.GetRegister(0) == 69);
|
|
}
|