17fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* 27fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Copyright (C) 2011 The Android Open Source Project 37fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 47fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 57fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * you may not use this file except in compliance with the License. 67fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * You may obtain a copy of the License at 77fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 87fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * http://www.apache.org/licenses/LICENSE-2.0 97fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Unless required by applicable law or agreed to in writing, software 117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * distributed under the License is distributed on an "AS IS" BASIS, 127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * See the License for the specific language governing permissions and 147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * limitations under the License. 157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao */ 167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_COMPILER_UTILS_MIPS_MANAGED_REGISTER_MIPS_H_ 18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_COMPILER_UTILS_MIPS_MANAGED_REGISTER_MIPS_H_ 197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "constants_mips.h" 21166db04e259ca51838c311891598664deeed85adIan Rogers#include "utils/managed_register.h" 227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace art { 247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace mips { 257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// Values for register pairs. 277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoenum RegisterPair { 287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao V0_V1 = 0, 297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao A0_A1 = 1, 307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao A2_A3 = 2, 317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao T0_T1 = 3, 327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao T2_T3 = 4, 337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao T4_T5 = 5, 347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao T6_T7 = 6, 357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao S0_S1 = 7, 367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao S2_S3 = 8, 377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao S4_S5 = 9, 387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao S6_S7 = 10, 397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao A1_A2 = 11, // Dalvik style passing 407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kNumberOfRegisterPairs = 12, 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kNoRegisterPair = -1, 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostd::ostream& operator<<(std::ostream& os, const RegisterPair& reg); 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfCoreRegIds = kNumberOfCoreRegisters; 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfCoreAllocIds = kNumberOfCoreRegisters; 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfFRegIds = kNumberOfFRegisters; 507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfFAllocIds = kNumberOfFRegisters; 517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfDRegIds = kNumberOfDRegisters; 537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfOverlappingDRegIds = kNumberOfOverlappingDRegisters; 547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfDAllocIds = kNumberOfDRegisters; 557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfPairRegIds = kNumberOfRegisterPairs; 577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfRegIds = kNumberOfCoreRegIds + kNumberOfFRegIds + 597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kNumberOfDRegIds + kNumberOfPairRegIds; 607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoconst int kNumberOfAllocIds = 617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kNumberOfCoreAllocIds + kNumberOfFAllocIds + kNumberOfDAllocIds; 627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// Register ids map: 647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// [0..R[ core registers (enum Register) 657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// [R..F[ single precision FP registers (enum FRegister) 667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// [F..D[ double precision FP registers (enum DRegister) 677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// [D..P[ core register pairs (enum RegisterPair) 687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// where 697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// R = kNumberOfCoreRegIds 707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// F = R + kNumberOfFRegIds 717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// D = F + kNumberOfDRegIds 727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// P = D + kNumberOfRegisterPairs 737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// Allocation ids map: 757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// [0..R[ core registers (enum Register) 767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// [R..F[ single precision FP registers (enum FRegister) 777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// where 787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// R = kNumberOfCoreRegIds 797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// F = R + kNumberOfFRegIds 807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// An instance of class 'ManagedRegister' represents a single core register (enum 837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// Register), a single precision FP register (enum FRegister), a double precision 847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// FP register (enum DRegister), or a pair of core registers (enum RegisterPair). 857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// 'ManagedRegister::NoRegister()' provides an invalid register. 867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// There is a one-to-one mapping between ManagedRegister and register id. 877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoclass MipsManagedRegister : public ManagedRegister { 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register AsCoreRegister() const { 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsCoreRegister()); 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<Register>(id_); 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister AsFRegister() const { 957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsFRegister()); 967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<FRegister>(id_ - kNumberOfCoreRegIds); 977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DRegister AsDRegister() const { 1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsDRegister()); 1017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<DRegister>(id_ - kNumberOfCoreRegIds - kNumberOfFRegIds); 1027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister AsOverlappingDRegisterLow() const { 1057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsOverlappingDRegister()); 1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DRegister d_reg = AsDRegister(); 1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<FRegister>(d_reg * 2); 1087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister AsOverlappingDRegisterHigh() const { 1117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsOverlappingDRegister()); 1127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DRegister d_reg = AsDRegister(); 1137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return static_cast<FRegister>(d_reg * 2 + 1); 1147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register AsRegisterPairLow() const { 1177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsRegisterPair()); 1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Appropriate mapping of register ids allows to use AllocIdLow(). 1197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return FromRegId(AllocIdLow()).AsCoreRegister(); 1207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register AsRegisterPairHigh() const { 1237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsRegisterPair()); 1247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Appropriate mapping of register ids allows to use AllocIdHigh(). 1257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return FromRegId(AllocIdHigh()).AsCoreRegister(); 1267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsCoreRegister() const { 1297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 1307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (0 <= id_) && (id_ < kNumberOfCoreRegIds); 1317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsFRegister() const { 1347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 1357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const int test = id_ - kNumberOfCoreRegIds; 1367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (0 <= test) && (test < kNumberOfFRegIds); 1377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsDRegister() const { 1407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 1417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const int test = id_ - (kNumberOfCoreRegIds + kNumberOfFRegIds); 1427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (0 <= test) && (test < kNumberOfDRegIds); 1437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Returns true if this DRegister overlaps FRegisters. 1467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsOverlappingDRegister() const { 1477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 1487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const int test = id_ - (kNumberOfCoreRegIds + kNumberOfFRegIds); 1497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (0 <= test) && (test < kNumberOfOverlappingDRegIds); 1507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsRegisterPair() const { 1537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 1547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const int test = 1557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao id_ - (kNumberOfCoreRegIds + kNumberOfFRegIds + kNumberOfDRegIds); 1567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (0 <= test) && (test < kNumberOfPairRegIds); 1577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao void Print(std::ostream& os) const; 1607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Returns true if the two managed-registers ('this' and 'other') overlap. 1627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Either managed-register may be the NoRegister. If both are the NoRegister 1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // then false is returned. 1647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool Overlaps(const MipsManagedRegister& other) const; 1657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static MipsManagedRegister FromCoreRegister(Register r) { 1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_NE(r, kNoRegister); 1687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return FromRegId(r); 1697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static MipsManagedRegister FromFRegister(FRegister r) { 1727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_NE(r, kNoFRegister); 1737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return FromRegId(r + kNumberOfCoreRegIds); 1747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static MipsManagedRegister FromDRegister(DRegister r) { 1777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_NE(r, kNoDRegister); 1787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return FromRegId(r + kNumberOfCoreRegIds + kNumberOfFRegIds); 1797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static MipsManagedRegister FromRegisterPair(RegisterPair r) { 1827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_NE(r, kNoRegisterPair); 1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return FromRegId(r + (kNumberOfCoreRegIds + kNumberOfFRegIds + kNumberOfDRegIds)); 1847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bool IsValidManagedRegister() const { 1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (0 <= id_) && (id_ < kNumberOfRegIds); 1897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int RegId() const { 1927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(!IsNoRegister()); 1937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return id_; 1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int AllocId() const { 1977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister() && !IsOverlappingDRegister() && !IsRegisterPair()); 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK_LT(id_, kNumberOfAllocIds); 1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return id_; 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int AllocIdLow() const; 2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int AllocIdHigh() const; 2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao friend class ManagedRegister; 2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao explicit MipsManagedRegister(int reg_id) : ManagedRegister(reg_id) {} 2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao static MipsManagedRegister FromRegId(int reg_id) { 2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsManagedRegister reg(reg_id); 2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(reg.IsValidManagedRegister()); 2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return reg; 2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostd::ostream& operator<<(std::ostream& os, const MipsManagedRegister& reg); 2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace mips 2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoinline mips::MipsManagedRegister ManagedRegister::AsMips() const { 2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao mips::MipsManagedRegister reg(id_); 2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister()); 2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return reg; 2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace art 2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 228166db04e259ca51838c311891598664deeed85adIan Rogers#endif // ART_COMPILER_UTILS_MIPS_MANAGED_REGISTER_MIPS_H_ 229