1ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu/* 2ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * Copyright (C) 2014 The Android Open Source Project 3ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * 4ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * Licensed under the Apache License, Version 2.0 (the "License"); 5ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * you may not use this file except in compliance with the License. 6ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * You may obtain a copy of the License at 7ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * 8ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * http://www.apache.org/licenses/LICENSE-2.0 9ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * 10ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * Unless required by applicable law or agreed to in writing, software 11ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * distributed under the License is distributed on an "AS IS" BASIS, 12ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * See the License for the specific language governing permissions and 14ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu * limitations under the License. 15ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu */ 16ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 17ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#ifndef ART_COMPILER_UTILS_ARM64_MANAGED_REGISTER_ARM64_H_ 18ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#define ART_COMPILER_UTILS_ARM64_MANAGED_REGISTER_ARM64_H_ 19ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 20ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#include "base/logging.h" 21ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#include "constants_arm64.h" 22ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#include "utils/managed_register.h" 23ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 24ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescunamespace art { 25ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescunamespace arm64 { 26ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 2715523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescuconst int kNumberOfCoreRegIds = kNumberOfCoreRegisters; 28ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfWRegIds = kNumberOfWRegisters; 29ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfDRegIds = kNumberOfDRegisters; 30ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfSRegIds = kNumberOfSRegisters; 31ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 32ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfRegIds = kNumberOfCoreRegIds + kNumberOfWRegIds + 33ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds + kNumberOfSRegIds; 34ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 35ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// Register ids map: 36ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [0..X[ core registers 64bit (enum Register) 37ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [X..W[ core registers 32bit (enum WRegister) 38ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [W..D[ double precision VFP registers (enum DRegister) 39ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [D..S[ single precision VFP registers (enum SRegister) 40ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// 41ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// where: 42ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// X = kNumberOfCoreRegIds 43ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// W = X + kNumberOfWRegIds 44ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// D = W + kNumberOfDRegIds 45ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// S = D + kNumberOfSRegIds 46ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// 47ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// An instance of class 'ManagedRegister' represents a single Arm64 48ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// register. A register can be one of the following: 49ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * core register 64bit context (enum Register) 50ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * core register 32bit context (enum WRegister) 51ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * VFP double precision register (enum DRegister) 52ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * VFP single precision register (enum SRegister) 53ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// 54ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// There is a one to one mapping between ManagedRegister and register id. 55ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 56ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuclass Arm64ManagedRegister : public ManagedRegister { 57ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu public: 58ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu Register AsCoreRegister() const { 59ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsCoreRegister()); 60ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<Register>(id_); 61ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 62ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 63ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu WRegister AsWRegister() const { 64ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsWRegister()); 65ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<WRegister>(id_ - kNumberOfCoreRegIds); 66ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 67ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 68ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu DRegister AsDRegister() const { 69ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsDRegister()); 70ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<DRegister>(id_ - kNumberOfCoreRegIds - kNumberOfWRegIds); 71ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 72ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 73ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu SRegister AsSRegister() const { 74ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsSRegister()); 75ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<SRegister>(id_ - kNumberOfCoreRegIds - kNumberOfWRegIds - 76ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds); 77ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 78ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 79ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu WRegister AsOverlappingCoreRegisterLow() const { 80ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 8115523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu if (IsZeroRegister()) return W31; 82ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<WRegister>(AsCoreRegister()); 83ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 84ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 85ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // FIXME: Find better naming. 86ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu Register AsOverlappingWRegisterCore() const { 87ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 88ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<Register>(AsWRegister()); 89ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 90ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 91ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu SRegister AsOverlappingDRegisterLow() const { 92ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 93ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<SRegister>(AsDRegister()); 94ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 95ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 96ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // FIXME: Find better naming. 97ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu DRegister AsOverlappingSRegisterD() const { 98ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 99ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<DRegister>(AsSRegister()); 100ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 101ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 102ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsCoreRegister() const { 103ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 104ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= id_) && (id_ < kNumberOfCoreRegIds); 105ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 106ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 107ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsWRegister() const { 108ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 109ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu const int test = id_ - kNumberOfCoreRegIds; 110ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= test) && (test < kNumberOfWRegIds); 111ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 112ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 113ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsDRegister() const { 114ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 115ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu const int test = id_ - (kNumberOfCoreRegIds + kNumberOfWRegIds); 116ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= test) && (test < kNumberOfDRegIds); 117ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 118ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 119ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsSRegister() const { 120ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 121ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu const int test = id_ - (kNumberOfCoreRegIds + kNumberOfWRegIds + 122ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds); 123ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= test) && (test < kNumberOfSRegIds); 124ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 125ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 126ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsGPRegister() const { 127ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return IsCoreRegister() || IsWRegister(); 128ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 129ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 130ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsFPRegister() const { 131ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return IsDRegister() || IsSRegister(); 132ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 133ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 134ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsSameType(Arm64ManagedRegister test) const { 135ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister() && test.IsValidManagedRegister()); 136ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return 137ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsCoreRegister() && test.IsCoreRegister()) || 138ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsWRegister() && test.IsWRegister()) || 139ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsDRegister() && test.IsDRegister()) || 140ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsSRegister() && test.IsSRegister()); 141ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 142ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 143ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Returns true if the two managed-registers ('this' and 'other') overlap. 144ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Either managed-register may be the NoRegister. If both are the NoRegister 145ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // then false is returned. 146ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool Overlaps(const Arm64ManagedRegister& other) const; 147ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 148ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu void Print(std::ostream& os) const; 149ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 150ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromCoreRegister(Register r) { 151ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoRegister); 152ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r); 153ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 154ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 155ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromWRegister(WRegister r) { 156ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoWRegister); 157ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r + kNumberOfCoreRegIds); 158ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 159ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 160ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromDRegister(DRegister r) { 161ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoDRegister); 162ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r + (kNumberOfCoreRegIds + kNumberOfWRegIds)); 163ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 164ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 165ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromSRegister(SRegister r) { 166ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoSRegister); 167ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r + (kNumberOfCoreRegIds + kNumberOfWRegIds + 168ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds)); 169ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 170ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 171ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Returns the X register overlapping W register r. 172ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromWRegisterCore(WRegister r) { 173ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoWRegister); 174ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r); 175ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 176ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 177ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Return the D register overlapping S register r. 178ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromSRegisterD(SRegister r) { 179ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoSRegister); 180ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r + (kNumberOfCoreRegIds + kNumberOfWRegIds)); 181ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 182ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 183ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu private: 184ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsValidManagedRegister() const { 185ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= id_) && (id_ < kNumberOfRegIds); 186ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 187ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 188ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsStackPointer() const { 189ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return IsCoreRegister() && (id_ == SP); 190ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 191ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 19215523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu bool IsZeroRegister() const { 19315523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu return IsCoreRegister() && (id_ == XZR); 19415523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu } 19515523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu 196ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegId() const { 197ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(!IsNoRegister()); 198ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return id_; 199ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 200ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 201ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegNo() const; 202ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegIdLow() const; 203ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegIdHigh() const; 204ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 205ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu friend class ManagedRegister; 206ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 207ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu explicit Arm64ManagedRegister(int reg_id) : ManagedRegister(reg_id) {} 208ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 209ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromRegId(int reg_id) { 210ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu Arm64ManagedRegister reg(reg_id); 211ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(reg.IsValidManagedRegister()); 212ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return reg; 213ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 214ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu}; 215ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 216ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescustd::ostream& operator<<(std::ostream& os, const Arm64ManagedRegister& reg); 217ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 218ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu} // namespace arm64 219ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 220ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuinline arm64::Arm64ManagedRegister ManagedRegister::AsArm64() const { 221ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu arm64::Arm64ManagedRegister reg(id_); 222ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister()); 223ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return reg; 224ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu} 225ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 226ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu} // namespace art 227ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 228ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#endif // ART_COMPILER_UTILS_ARM64_MANAGED_REGISTER_ARM64_H_ 229