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" 224fda4eb799c95be266f52aaf3461a440ea86b841David Srbecky#include "debug/dwarf/register.h" 23ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#include "utils/managed_register.h" 24ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 25ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescunamespace art { 26ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescunamespace arm64 { 27ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 2837c92df53979f9f6ab83155ab9521d554d717161Alexandre Ramesconst int kNumberOfXRegIds = kNumberOfXRegisters; 29ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfWRegIds = kNumberOfWRegisters; 30ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfDRegIds = kNumberOfDRegisters; 31ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuconst int kNumberOfSRegIds = kNumberOfSRegisters; 32ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 3337c92df53979f9f6ab83155ab9521d554d717161Alexandre Ramesconst int kNumberOfRegIds = kNumberOfXRegIds + kNumberOfWRegIds + 34ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds + kNumberOfSRegIds; 35ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 36ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// Register ids map: 3737c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames// [0..X[ core registers 64bit (enum XRegister) 38ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [X..W[ core registers 32bit (enum WRegister) 39ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [W..D[ double precision VFP registers (enum DRegister) 40ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// [D..S[ single precision VFP registers (enum SRegister) 41ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// 42ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// where: 4337c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames// X = kNumberOfXRegIds 44ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// W = X + kNumberOfWRegIds 45ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// D = W + kNumberOfDRegIds 46ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// S = D + kNumberOfSRegIds 47ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// 48ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// An instance of class 'ManagedRegister' represents a single Arm64 49ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// register. A register can be one of the following: 5037c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames// * core register 64bit context (enum XRegister) 51ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * core register 32bit context (enum WRegister) 52ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * VFP double precision register (enum DRegister) 53ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// * VFP single precision register (enum SRegister) 54ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// 55ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu// There is a one to one mapping between ManagedRegister and register id. 56ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 57ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuclass Arm64ManagedRegister : public ManagedRegister { 58ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu public: 5937c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames XRegister AsXRegister() const { 6037c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames CHECK(IsXRegister()); 6137c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return static_cast<XRegister>(id_); 62ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 63ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 64ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu WRegister AsWRegister() const { 65ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsWRegister()); 6637c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return static_cast<WRegister>(id_ - kNumberOfXRegIds); 67ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 68ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 69ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu DRegister AsDRegister() const { 70ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsDRegister()); 7137c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return static_cast<DRegister>(id_ - kNumberOfXRegIds - kNumberOfWRegIds); 72ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 73ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 74ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu SRegister AsSRegister() const { 75ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsSRegister()); 7637c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return static_cast<SRegister>(id_ - kNumberOfXRegIds - kNumberOfWRegIds - 77ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds); 78ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 79ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 8037c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames WRegister AsOverlappingWRegister() const { 81ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 82a304f97c97d38af73afe6b49259ac4faf0902123Alexandre Rames if (IsZeroRegister()) return WZR; 8337c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return static_cast<WRegister>(AsXRegister()); 84ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 85ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 8637c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames XRegister AsOverlappingXRegister() const { 87ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 8837c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return static_cast<XRegister>(AsWRegister()); 89ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 90ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 9137c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames SRegister AsOverlappingSRegister() const { 92ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 93ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<SRegister>(AsDRegister()); 94ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 95ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 9637c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames DRegister AsOverlappingDRegister() const { 97ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 98ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return static_cast<DRegister>(AsSRegister()); 99ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 100ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 10137c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames bool IsXRegister() const { 102ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 10337c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return (0 <= id_) && (id_ < kNumberOfXRegIds); 104ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 105ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 106ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsWRegister() const { 107ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 10837c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames const int test = id_ - kNumberOfXRegIds; 109ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= test) && (test < kNumberOfWRegIds); 110ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 111ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 112ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsDRegister() const { 113ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 11437c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames const int test = id_ - (kNumberOfXRegIds + kNumberOfWRegIds); 115ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= test) && (test < kNumberOfDRegIds); 116ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 117ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 118ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsSRegister() const { 119ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister()); 12080afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko const int test = id_ - (kNumberOfXRegIds + kNumberOfWRegIds + kNumberOfDRegIds); 121ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= test) && (test < kNumberOfSRegIds); 122ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 123ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 124ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsGPRegister() const { 12537c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return IsXRegister() || IsWRegister(); 126ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 127ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 128ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsFPRegister() const { 129ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return IsDRegister() || IsSRegister(); 130ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 131ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 132ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsSameType(Arm64ManagedRegister test) const { 133ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(IsValidManagedRegister() && test.IsValidManagedRegister()); 134ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return 13537c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames (IsXRegister() && test.IsXRegister()) || 136ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsWRegister() && test.IsWRegister()) || 137ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsDRegister() && test.IsDRegister()) || 138ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu (IsSRegister() && test.IsSRegister()); 139ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 140ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 141ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Returns true if the two managed-registers ('this' and 'other') overlap. 142ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Either managed-register may be the NoRegister. If both are the NoRegister 143ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // then false is returned. 144ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool Overlaps(const Arm64ManagedRegister& other) const; 145ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 146ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu void Print(std::ostream& os) const; 147ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 14837c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames static Arm64ManagedRegister FromXRegister(XRegister r) { 149ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoRegister); 150ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r); 151ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 152ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 153ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromWRegister(WRegister r) { 154ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoWRegister); 15537c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return FromRegId(r + kNumberOfXRegIds); 156ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 157ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 158ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromDRegister(DRegister r) { 159ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoDRegister); 16037c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return FromRegId(r + (kNumberOfXRegIds + kNumberOfWRegIds)); 161ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 162ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 163ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromSRegister(SRegister r) { 164ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoSRegister); 16537c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return FromRegId(r + (kNumberOfXRegIds + kNumberOfWRegIds + 166ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu kNumberOfDRegIds)); 167ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 168ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 169ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Returns the X register overlapping W register r. 17037c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames static Arm64ManagedRegister FromWRegisterX(WRegister r) { 171ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoWRegister); 172ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return FromRegId(r); 173ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 174ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 175ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu // Return the D register overlapping S register r. 176ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromSRegisterD(SRegister r) { 177ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK_NE(r, kNoSRegister); 17837c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return FromRegId(r + (kNumberOfXRegIds + kNumberOfWRegIds)); 179ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 180ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 181ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu private: 182ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsValidManagedRegister() const { 183ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return (0 <= id_) && (id_ < kNumberOfRegIds); 184ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 185ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 186ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu bool IsStackPointer() const { 18737c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return IsXRegister() && (id_ == SP); 188ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 189ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 19015523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu bool IsZeroRegister() const { 19137c92df53979f9f6ab83155ab9521d554d717161Alexandre Rames return IsXRegister() && (id_ == XZR); 19215523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu } 19315523731549152276f23dcf94d81b1a9ce9c5038Serban Constantinescu 194ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegId() const { 195ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(!IsNoRegister()); 196ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return id_; 197ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 198ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 199ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegNo() const; 200ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegIdLow() const; 201ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu int RegIdHigh() const; 202ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 203ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu friend class ManagedRegister; 204ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 205ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu explicit Arm64ManagedRegister(int reg_id) : ManagedRegister(reg_id) {} 206ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 207ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu static Arm64ManagedRegister FromRegId(int reg_id) { 208ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu Arm64ManagedRegister reg(reg_id); 209ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(reg.IsValidManagedRegister()); 210ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return reg; 211ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu } 212ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu}; 213ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 214ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescustd::ostream& operator<<(std::ostream& os, const Arm64ManagedRegister& reg); 215ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 216ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu} // namespace arm64 217ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 218ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescuinline arm64::Arm64ManagedRegister ManagedRegister::AsArm64() const { 219ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu arm64::Arm64ManagedRegister reg(id_); 220ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister()); 221ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu return reg; 222ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu} 223ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 224ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu} // namespace art 225ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu 226ed8dd492e43cbaaa435c4892447072c84dbaf2dcSerban Constantinescu#endif // ART_COMPILER_UTILS_ARM64_MANAGED_REGISTER_ARM64_H_ 227