1 // Copyright 2017 Dolphin Emulator Project
2 // Licensed under GPLv2+
3 // Refer to the license.txt file included.
4 
5 #include <gtest/gtest.h>
6 
7 #include "Common/BitUtils.h"
8 #include "Common/CommonTypes.h"
9 
TEST(BitUtils,BitSize)10 TEST(BitUtils, BitSize)
11 {
12   EXPECT_EQ(Common::BitSize<s8>(), 8u);
13   EXPECT_EQ(Common::BitSize<s16>(), 16u);
14   EXPECT_EQ(Common::BitSize<s32>(), 32u);
15   EXPECT_EQ(Common::BitSize<s64>(), 64u);
16 
17   EXPECT_EQ(Common::BitSize<u8>(), 8u);
18   EXPECT_EQ(Common::BitSize<u16>(), 16u);
19   EXPECT_EQ(Common::BitSize<u32>(), 32u);
20   EXPECT_EQ(Common::BitSize<u64>(), 64u);
21 }
22 
TEST(BitUtils,ExtractBit)23 TEST(BitUtils, ExtractBit)
24 {
25   constexpr s32 zero = 0;
26   EXPECT_EQ(Common::ExtractBit<0>(zero), 0);
27 
28   constexpr s32 one = 1;
29   EXPECT_EQ(Common::ExtractBit<0>(one), 1);
30 
31   constexpr s32 negative_one = -1;
32   EXPECT_EQ(Common::ExtractBit<31>(negative_one), 1);
33 
34   constexpr s32 one_hundred_twenty_eight = 0b10000000;
35   EXPECT_EQ(Common::ExtractBit<7>(one_hundred_twenty_eight), 1);
36 }
37 
TEST(BitUtils,ExtractBits)38 TEST(BitUtils, ExtractBits)
39 {
40   // Note: Parenthesizing is necessary to prevent the macros from
41   //       mangling the template function usages.
42 
43   constexpr s32 two_hundred_four_signed = 0b0011001100;
44   EXPECT_EQ((Common::ExtractBits<2, 3>(two_hundred_four_signed)), 3u);
45   EXPECT_EQ((Common::ExtractBits<2, 7>(two_hundred_four_signed)), 51u);
46   EXPECT_EQ((Common::ExtractBits<3, 6>(two_hundred_four_signed)), 9u);
47 
48   constexpr u32 two_hundred_four_unsigned = 0b0011001100;
49   EXPECT_EQ((Common::ExtractBits<2, 3>(two_hundred_four_unsigned)), 3u);
50   EXPECT_EQ((Common::ExtractBits<2, 7>(two_hundred_four_unsigned)), 51u);
51   EXPECT_EQ((Common::ExtractBits<3, 6>(two_hundred_four_unsigned)), 9u);
52 
53   // Ensure bit extraction remains sign-independent even when signed types are used.
54   constexpr s32 negative_one = -1;
55   EXPECT_EQ((Common::ExtractBits<0, 31>(negative_one)), 0xFFFFFFFFU);
56 
57   // Ensure bit extraction with type overriding works as expected
58   EXPECT_EQ((Common::ExtractBits<0, 31, s32, s32>(negative_one)), -1);
59 }
60 
TEST(BitUtils,RotateLeft)61 TEST(BitUtils, RotateLeft)
62 {
63   EXPECT_EQ(Common::RotateLeft(0xF0F0F0F0, 0), 0xF0F0F0F0U);
64   EXPECT_EQ(Common::RotateLeft(0xF0F0F0F0, 4), 0x0F0F0F0FU);
65   EXPECT_EQ(Common::RotateLeft(0xF0F0F0F0, 8), 0xF0F0F0F0U);
66   EXPECT_EQ(Common::RotateLeft(0xF0F0F0F0F0F0F0F0, 0), 0xF0F0F0F0F0F0F0F0U);
67   EXPECT_EQ(Common::RotateLeft(0xF0F0F0F0F0F0F0F0, 4), 0x0F0F0F0F0F0F0F0FU);
68   EXPECT_EQ(Common::RotateLeft(0xF0F0F0F0F0F0F0F0, 8), 0xF0F0F0F0F0F0F0F0U);
69 
70   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1, 1), 0xE3E3E3E3U);
71   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1, 2), 0xC7C7C7C7U);
72   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1, 3), 0x8F8F8F8FU);
73   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1, 4), 0x1F1F1F1FU);
74   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1F1F1F1F1, 1), 0xE3E3E3E3E3E3E3E3U);
75   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1F1F1F1F1, 2), 0xC7C7C7C7C7C7C7C7U);
76   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1F1F1F1F1, 3), 0x8F8F8F8F8F8F8F8FU);
77   EXPECT_EQ(Common::RotateLeft(0xF1F1F1F1F1F1F1F1, 4), 0x1F1F1F1F1F1F1F1FU);
78 }
79 
TEST(BitUtils,RotateRight)80 TEST(BitUtils, RotateRight)
81 {
82   EXPECT_EQ(Common::RotateRight(0xF0F0F0F0, 0), 0xF0F0F0F0U);
83   EXPECT_EQ(Common::RotateRight(0xF0F0F0F0, 4), 0x0F0F0F0FU);
84   EXPECT_EQ(Common::RotateRight(0xF0F0F0F0, 8), 0xF0F0F0F0U);
85   EXPECT_EQ(Common::RotateRight(0xF0F0F0F0F0F0F0F0, 0), 0xF0F0F0F0F0F0F0F0U);
86   EXPECT_EQ(Common::RotateRight(0xF0F0F0F0F0F0F0F0, 4), 0x0F0F0F0F0F0F0F0FU);
87   EXPECT_EQ(Common::RotateRight(0xF0F0F0F0F0F0F0F0, 8), 0xF0F0F0F0F0F0F0F0U);
88 
89   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1, 1), 0xF8F8F8F8U);
90   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1, 2), 0x7C7C7C7CU);
91   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1, 3), 0x3E3E3E3EU);
92   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1, 4), 0x1F1F1F1FU);
93   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1F1F1F1F1, 1), 0xF8F8F8F8F8F8F8F8U);
94   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1F1F1F1F1, 2), 0x7C7C7C7C7C7C7C7CU);
95   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1F1F1F1F1, 3), 0x3E3E3E3E3E3E3E3EU);
96   EXPECT_EQ(Common::RotateRight(0xF1F1F1F1F1F1F1F1, 4), 0x1F1F1F1F1F1F1F1FU);
97 }
98 
TEST(BitUtils,IsValidLowMask)99 TEST(BitUtils, IsValidLowMask)
100 {
101   EXPECT_TRUE(Common::IsValidLowMask(0b0u));
102   EXPECT_TRUE(Common::IsValidLowMask(0b1u));
103   EXPECT_FALSE(Common::IsValidLowMask(0b10u));
104   EXPECT_TRUE(Common::IsValidLowMask(0b11u));
105   EXPECT_FALSE(Common::IsValidLowMask(0b1110u));
106   EXPECT_TRUE(Common::IsValidLowMask(0b1111u));
107   EXPECT_FALSE(Common::IsValidLowMask(0b10000u));
108   EXPECT_FALSE(Common::IsValidLowMask(0b101111u));
109 
110   EXPECT_TRUE(Common::IsValidLowMask((u8)~0b0));
111   EXPECT_FALSE(Common::IsValidLowMask((u8)(~0b0 - 1)));
112   EXPECT_FALSE(Common::IsValidLowMask((u8) ~(0b10000)));
113   EXPECT_FALSE(Common::IsValidLowMask((u8)(~((u8)(~0b0) >> 1) | 0b1111)));
114 
115   EXPECT_TRUE(Common::IsValidLowMask((u16)~0b0));
116   EXPECT_FALSE(Common::IsValidLowMask((u16)(~0b0 - 1)));
117   EXPECT_FALSE(Common::IsValidLowMask((u16) ~(0b10000)));
118   EXPECT_FALSE(Common::IsValidLowMask((u16)(~((u16)(~0b0) >> 1) | 0b1111)));
119 
120   EXPECT_TRUE(Common::IsValidLowMask((u32)~0b0));
121   EXPECT_FALSE(Common::IsValidLowMask((u32)(~0b0 - 1)));
122   EXPECT_FALSE(Common::IsValidLowMask((u32) ~(0b10000)));
123   EXPECT_FALSE(Common::IsValidLowMask((u32)(~((u32)(~0b0) >> 1) | 0b1111)));
124 
125   EXPECT_TRUE(Common::IsValidLowMask((u64)~0b0));
126   EXPECT_FALSE(Common::IsValidLowMask((u64)(~0b0 - 1)));
127   EXPECT_FALSE(Common::IsValidLowMask((u64) ~(0b10000)));
128   EXPECT_FALSE(Common::IsValidLowMask((u64)(~((u64)(~0b0) >> 1) | 0b1111)));
129 }
130 
TEST(BitUtils,BitCast)131 TEST(BitUtils, BitCast)
132 {
133   EXPECT_EQ(0x00000000U, Common::BitCast<u32>(0.0f));
134   EXPECT_EQ(0x80000000U, Common::BitCast<u32>(-0.0f));
135   EXPECT_EQ(0x3F800000U, Common::BitCast<u32>(1.0f));
136   EXPECT_EQ(0xBF800000U, Common::BitCast<u32>(-1.0f));
137 
138   EXPECT_EQ(0x0000000000000000ULL, Common::BitCast<u64>(0.0));
139   EXPECT_EQ(0x8000000000000000ULL, Common::BitCast<u64>(-0.0));
140   EXPECT_EQ(0x3FF0000000000000ULL, Common::BitCast<u64>(1.0));
141   EXPECT_EQ(0xBFF0000000000000ULL, Common::BitCast<u64>(-1.0));
142 }
143