summaryrefslogtreecommitdiff
path: root/Source/UnitTests/Core
diff options
context:
space:
mode:
authorMerryMage <MerryMage@users.noreply.github.com>2021-01-03 19:49:22 +0000
committerMerryMage <MerryMage@users.noreply.github.com>2021-01-31 13:17:19 +0000
commitfe9207bb56ad87f584d1174582d9ca31d0fb914b (patch)
treea329d1fd964ff2106d52f1784432bda966c3d014 /Source/UnitTests/Core
parentf65c1df0948d00c66eefa583efea6f578ba623b7 (diff)
UnitTests: Add MOVI2R test
Diffstat (limited to 'Source/UnitTests/Core')
-rw-r--r--Source/UnitTests/Core/CMakeLists.txt4
-rw-r--r--Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp95
2 files changed, 99 insertions, 0 deletions
diff --git a/Source/UnitTests/Core/CMakeLists.txt b/Source/UnitTests/Core/CMakeLists.txt
index c6c9ac4463..01bfd99fbe 100644
--- a/Source/UnitTests/Core/CMakeLists.txt
+++ b/Source/UnitTests/Core/CMakeLists.txt
@@ -19,4 +19,8 @@ if(_M_X86)
PowerPC/Jit64Common/ConvertDoubleToSingle.cpp
PowerPC/Jit64Common/Frsqrte.cpp
)
+elseif(_M_ARM_64)
+ add_dolphin_test(PowerPCTest
+ PowerPC/JitArm64/MovI2R.cpp
+ )
endif()
diff --git a/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp b/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp
new file mode 100644
index 0000000000..511d1b2d6f
--- /dev/null
+++ b/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp
@@ -0,0 +1,95 @@
+// Copyright 2021 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <cstddef>
+#include <type_traits>
+
+#include "Common/Arm64Emitter.h"
+#include "Common/Assert.h"
+#include "Common/BitUtils.h"
+#include "Common/Random.h"
+
+#include <gtest/gtest.h>
+
+namespace
+{
+using namespace Arm64Gen;
+
+class TestMovI2R : public ARM64CodeBlock
+{
+public:
+ TestMovI2R() { AllocCodeSpace(4096); }
+
+ void Check32(u32 value)
+ {
+ ResetCodePtr();
+
+ const u8* fn = GetCodePtr();
+ MOVI2R(W0, value);
+ RET();
+
+ FlushIcacheSection(const_cast<u8*>(fn), const_cast<u8*>(GetCodePtr()));
+
+ const u64 result = Common::BitCast<u64 (*)()>(fn)();
+ EXPECT_EQ(value, result);
+ }
+
+ void Check64(u64 value)
+ {
+ ResetCodePtr();
+
+ const u8* fn = GetCodePtr();
+ MOVI2R(X0, value);
+ RET();
+
+ FlushIcacheSection(const_cast<u8*>(fn), const_cast<u8*>(GetCodePtr()));
+
+ const u64 result = Common::BitCast<u64 (*)()>(fn)();
+ EXPECT_EQ(value, result);
+ }
+};
+
+} // namespace
+
+TEST(JitArm64, MovI2R_32BitValues)
+{
+ TestMovI2R test;
+ for (u64 i = 0; i < 0x100000000; i++)
+ {
+ test.Check32(static_cast<u32>(i));
+ test.Check64(i);
+ }
+}
+
+TEST(JitArm64, MovI2R_Rand)
+{
+ Common::Random::PRNG rng{0};
+ TestMovI2R test;
+ for (u64 i = 0; i < 0x100000; i++)
+ {
+ test.Check64(rng.GenerateValue<u64>());
+ }
+}
+
+TEST(JitArm64, MovI2R_ADP)
+{
+ TestMovI2R test;
+ const u64 base = Common::BitCast<u64>(test.GetCodePtr());
+ for (s64 i = -0x20000; i < 0x20000; i++)
+ {
+ const u64 offset = static_cast<u64>(i);
+ test.Check64(base + offset);
+ }
+}
+
+TEST(JitArm64, MovI2R_ADRP)
+{
+ TestMovI2R test;
+ const u64 base = Common::BitCast<u64>(test.GetCodePtr()) & ~0xFFF;
+ for (s64 i = -0x20000; i < 0x20000; i++)
+ {
+ const u64 offset = static_cast<u64>(i) << 12;
+ test.Check64(base + offset);
+ }
+}