1 /*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "gtest/gtest.h"
18
19 #include "berberis/backend/common/machine_ir.h"
20
21 namespace berberis {
22
23 namespace {
24
TEST(MachineReg,DefaultConstructedRegIsInvalid)25 TEST(MachineReg, DefaultConstructedRegIsInvalid) {
26 MachineReg reg;
27 EXPECT_EQ(reg, kInvalidMachineReg);
28 }
29
TEST(MachineReg,Compare)30 TEST(MachineReg, Compare) {
31 MachineReg reg1{10};
32 MachineReg reg2{12};
33 MachineReg reg3{10};
34 EXPECT_NE(reg1, reg2);
35 EXPECT_EQ(reg1, reg3);
36 }
37
TEST(MachineReg,InvalidRegIsNotVRegsNorSpilledRegNorHardReg)38 TEST(MachineReg, InvalidRegIsNotVRegsNorSpilledRegNorHardReg) {
39 MachineReg reg;
40 EXPECT_FALSE(reg.IsVReg());
41 EXPECT_FALSE(reg.IsSpilledReg());
42 EXPECT_FALSE(reg.IsHardReg());
43 }
44
TEST(MachineReg,CreateAndCheckVRegByIndex)45 TEST(MachineReg, CreateAndCheckVRegByIndex) {
46 MachineReg reg = MachineReg::CreateVRegFromIndex(43);
47 ASSERT_TRUE(reg.IsVReg());
48 EXPECT_EQ(reg.GetVRegIndex(), 43U);
49 EXPECT_FALSE(reg.IsSpilledReg());
50 EXPECT_FALSE(reg.IsHardReg());
51 EXPECT_DEATH((void)reg.GetSpilledRegIndex(), "");
52 }
53
TEST(MachineReg,CreateAndCheckSpilledRegByIndex)54 TEST(MachineReg, CreateAndCheckSpilledRegByIndex) {
55 MachineReg reg = MachineReg::CreateSpilledRegFromIndex(43);
56 ASSERT_TRUE(reg.IsSpilledReg());
57 EXPECT_EQ(reg.GetSpilledRegIndex(), 43U);
58 EXPECT_FALSE(reg.IsVReg());
59 EXPECT_FALSE(reg.IsHardReg());
60 EXPECT_DEATH((void)reg.GetVRegIndex(), "");
61 }
62
TEST(MachineReg,CreateAndCheckHardReg)63 TEST(MachineReg, CreateAndCheckHardReg) {
64 MachineReg reg{10};
65 ASSERT_TRUE(reg.IsHardReg());
66 EXPECT_EQ(reg.reg(), 10);
67 EXPECT_FALSE(reg.IsVReg());
68 EXPECT_FALSE(reg.IsSpilledReg());
69 EXPECT_DEATH((void)reg.GetVRegIndex(), "");
70 EXPECT_DEATH((void)reg.GetVRegIndex(), "");
71 }
72
TEST(MachineReg,CreateRegByIndexOutOfBounds)73 TEST(MachineReg, CreateRegByIndexOutOfBounds) {
74 EXPECT_DEATH((void)MachineReg::CreateVRegFromIndex(std::numeric_limits<int>::max()), "");
75 EXPECT_DEATH((void)MachineReg::CreateSpilledRegFromIndex(std::numeric_limits<int>::max()), "");
76 }
77
TEST(MachineReg,CreateVRegByIndexOnTheBound)78 TEST(MachineReg, CreateVRegByIndexOnTheBound) {
79 // Note - we use knowledge about internal representation of MachineReg here.
80 constexpr const uint32_t kVRegMaxIndex =
81 std::numeric_limits<int>::max() - MachineReg::GetFirstVRegNumberForTesting();
82
83 auto reg = MachineReg::CreateVRegFromIndex(kVRegMaxIndex);
84 ASSERT_TRUE(reg.IsVReg());
85 EXPECT_EQ(reg.GetVRegIndex(), kVRegMaxIndex);
86 EXPECT_FALSE(reg.IsSpilledReg());
87 EXPECT_FALSE(reg.IsHardReg());
88 EXPECT_DEATH((void)MachineReg::CreateVRegFromIndex(kVRegMaxIndex + 1), "");
89 }
90
TEST(MachineReg,CreateSpilledRegByIndexOnTheBound)91 TEST(MachineReg, CreateSpilledRegByIndexOnTheBound) {
92 // Note - we use knowledge about internal representation of MachineReg here.
93 constexpr const uint32_t kSpilledRegMaxIndex =
94 -(std::numeric_limits<int>::min() - MachineReg::GetLastSpilledRegNumberForTesting());
95
96 auto reg = MachineReg::CreateSpilledRegFromIndex(kSpilledRegMaxIndex);
97 ASSERT_TRUE(reg.IsSpilledReg());
98 EXPECT_EQ(reg.GetSpilledRegIndex(), kSpilledRegMaxIndex);
99 EXPECT_FALSE(reg.IsVReg());
100 EXPECT_FALSE(reg.IsHardReg());
101 EXPECT_DEATH((void)MachineReg::CreateSpilledRegFromIndex(kSpilledRegMaxIndex + 1), "");
102 }
103
104 } // namespace
105
106 } // namespace berberis
107