test_invalidation.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* This file is part of the dynarmic project.
  2. * Copyright (c) 2018 MerryMage
  3. * SPDX-License-Identifier: 0BSD
  4. */
  5. #include <catch2/catch_test_macros.hpp>
  6. #include "./testenv.h"
  7. #include "dynarmic/interface/A64/a64.h"
  8. using namespace Dynarmic;
  9. TEST_CASE("ensure fast dispatch entry is cleared even when a block does not have any patching requirements", "[a64]") {
  10. A64TestEnv env;
  11. A64::UserConfig conf{&env};
  12. A64::Jit jit{conf};
  13. REQUIRE(conf.HasOptimization(OptimizationFlag::FastDispatch));
  14. env.code_mem_start_address = 100;
  15. env.code_mem.clear();
  16. env.code_mem.emplace_back(0xd2800d80); // MOV X0, 108
  17. env.code_mem.emplace_back(0xd61f0000); // BR X0
  18. env.code_mem.emplace_back(0xd2800540); // MOV X0, 42
  19. env.code_mem.emplace_back(0x14000000); // B .
  20. jit.SetPC(100);
  21. env.ticks_left = 4;
  22. jit.Run();
  23. REQUIRE(jit.GetRegister(0) == 42);
  24. jit.SetPC(100);
  25. env.ticks_left = 4;
  26. jit.Run();
  27. REQUIRE(jit.GetRegister(0) == 42);
  28. jit.InvalidateCacheRange(108, 4);
  29. jit.SetPC(100);
  30. env.ticks_left = 4;
  31. jit.Run();
  32. REQUIRE(jit.GetRegister(0) == 42);
  33. env.code_mem[2] = 0xd28008a0; // MOV X0, 69
  34. jit.SetPC(100);
  35. env.ticks_left = 4;
  36. jit.Run();
  37. REQUIRE(jit.GetRegister(0) == 42);
  38. jit.InvalidateCacheRange(108, 4);
  39. jit.SetPC(100);
  40. env.ticks_left = 4;
  41. jit.Run();
  42. REQUIRE(jit.GetRegister(0) == 69);
  43. jit.SetPC(100);
  44. env.ticks_left = 4;
  45. jit.Run();
  46. REQUIRE(jit.GetRegister(0) == 69);
  47. }
  48. TEST_CASE("ensure fast dispatch entry is cleared even when a block does not have any patching requirements 2", "[a64]") {
  49. A64TestEnv env;
  50. A64::UserConfig conf{&env};
  51. A64::Jit jit{conf};
  52. REQUIRE(conf.HasOptimization(OptimizationFlag::FastDispatch));
  53. env.code_mem.emplace_back(0xd2800100); // MOV X0, 8
  54. env.code_mem.emplace_back(0xd61f0000); // BR X0
  55. env.code_mem.emplace_back(0xd2800540); // MOV X0, 42
  56. env.code_mem.emplace_back(0x14000000); // B .
  57. jit.SetPC(0);
  58. env.ticks_left = 4;
  59. jit.Run();
  60. REQUIRE(jit.GetRegister(0) == 42);
  61. jit.SetPC(0);
  62. env.ticks_left = 4;
  63. jit.Run();
  64. REQUIRE(jit.GetRegister(0) == 42);
  65. jit.InvalidateCacheRange(8, 4);
  66. jit.SetPC(0);
  67. env.ticks_left = 4;
  68. jit.Run();
  69. REQUIRE(jit.GetRegister(0) == 42);
  70. env.code_mem[2] = 0xd28008a0; // MOV X0, 69
  71. jit.SetPC(0);
  72. env.ticks_left = 4;
  73. jit.Run();
  74. REQUIRE(jit.GetRegister(0) == 42);
  75. jit.InvalidateCacheRange(8, 4);
  76. jit.SetPC(0);
  77. env.ticks_left = 4;
  78. jit.Run();
  79. REQUIRE(jit.GetRegister(0) == 69);
  80. jit.SetPC(0);
  81. env.ticks_left = 4;
  82. jit.Run();
  83. REQUIRE(jit.GetRegister(0) == 69);
  84. }