// Copyright 2021 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #include #include #include "Common/Arm64Emitter.h" #include "Common/Assert.h" #include "Common/BitUtils.h" #include "Common/Random.h" #include 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(fn), const_cast(GetCodePtr())); const u64 result = Common::BitCast(fn)(); EXPECT_EQ(value, result); } void Check64(u64 value) { ResetCodePtr(); const u8* fn = GetCodePtr(); MOVI2R(X0, value); RET(); FlushIcacheSection(const_cast(fn), const_cast(GetCodePtr())); const u64 result = Common::BitCast(fn)(); EXPECT_EQ(value, result); } }; } // namespace TEST(JitArm64, MovI2R_32BitValues) { Common::Random::PRNG rng{0}; TestMovI2R test; for (u64 i = 0; i < 0x100000; i++) { const u32 value = rng.GenerateValue(); test.Check32(value); test.Check64(value); } } TEST(JitArm64, MovI2R_Rand) { Common::Random::PRNG rng{0}; TestMovI2R test; for (u64 i = 0; i < 0x100000; i++) { test.Check64(rng.GenerateValue()); } } TEST(JitArm64, MovI2R_ADP) { TestMovI2R test; const u64 base = Common::BitCast(test.GetCodePtr()); for (s64 i = -0x20000; i < 0x20000; i++) { const u64 offset = static_cast(i); test.Check64(base + offset); } } TEST(JitArm64, MovI2R_ADRP) { TestMovI2R test; const u64 base = Common::BitCast(test.GetCodePtr()) & ~0xFFF; for (s64 i = -0x20000; i < 0x20000; i++) { const u64 offset = static_cast(i) << 12; test.Check64(base + offset); } }