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