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