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