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