1fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko/*
2fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Copyright (C) 2014 The Android Open Source Project
3fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *
4fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Licensed under the Apache License, Version 2.0 (the "License");
5fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * you may not use this file except in compliance with the License.
6fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * You may obtain a copy of the License at
7fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *
8fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *      http://www.apache.org/licenses/LICENSE-2.0
9fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *
10fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Unless required by applicable law or agreed to in writing, software
11fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * distributed under the License is distributed on an "AS IS" BASIS,
12fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * See the License for the specific language governing permissions and
14fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * limitations under the License.
15fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko */
16fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
17fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#ifndef ART_COMPILER_UTILS_X86_64_MANAGED_REGISTER_X86_64_H_
18fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#define ART_COMPILER_UTILS_X86_64_MANAGED_REGISTER_X86_64_H_
19fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
20fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "constants_x86_64.h"
214fda4eb799c95be266f52aaf3461a440ea86b841David Srbecky#include "debug/dwarf/register.h"
22fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "utils/managed_register.h"
23fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
24fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace art {
25fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace x86_64 {
26fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
27fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// Values for register pairs.
28fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// The registers in kReservedCpuRegistersArray in x86.cc are not used in pairs.
29fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// The table kRegisterPairs in x86.cc must be kept in sync with this enum.
30fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoenum RegisterPair {
31fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RAX_RDX = 0,
32fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RAX_RCX = 1,
33fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RAX_RBX = 2,
34fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RAX_RDI = 3,
35fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RDX_RCX = 4,
36fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RDX_RBX = 5,
37fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RDX_RDI = 6,
38fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RCX_RBX = 7,
39fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RCX_RDI = 8,
40fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  RBX_RDI = 9,
41fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  kNumberOfRegisterPairs = 10,
42fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  kNoRegisterPair = -1,
43fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko};
44fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
45fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkostd::ostream& operator<<(std::ostream& os, const RegisterPair& reg);
46fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
47fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfCpuRegIds = kNumberOfCpuRegisters;
48fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfCpuAllocIds = kNumberOfCpuRegisters;
49fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
50dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersconst int kNumberOfXmmRegIds = kNumberOfFloatRegisters;
51dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersconst int kNumberOfXmmAllocIds = kNumberOfFloatRegisters;
52fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
53fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfX87RegIds = kNumberOfX87Registers;
54fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfX87AllocIds = kNumberOfX87Registers;
55fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
56fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfPairRegIds = kNumberOfRegisterPairs;
57fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
58fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfRegIds = kNumberOfCpuRegIds + kNumberOfXmmRegIds +
59fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    kNumberOfX87RegIds + kNumberOfPairRegIds;
60fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoconst int kNumberOfAllocIds = kNumberOfCpuAllocIds + kNumberOfXmmAllocIds +
61fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    kNumberOfX87RegIds;
62fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
63fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// Register ids map:
64fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [0..R[  cpu registers (enum Register)
65fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [R..X[  xmm registers (enum XmmRegister)
66fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [X..S[  x87 registers (enum X87Register)
67fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [S..P[  register pairs (enum RegisterPair)
68fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// where
69fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   R = kNumberOfCpuRegIds
70fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   X = R + kNumberOfXmmRegIds
71fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   S = X + kNumberOfX87RegIds
72fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   P = X + kNumberOfRegisterPairs
73fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
74fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// Allocation ids map:
75fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [0..R[  cpu registers (enum Register)
76fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [R..X[  xmm registers (enum XmmRegister)
77fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   [X..S[  x87 registers (enum X87Register)
78fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// where
79fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   R = kNumberOfCpuRegIds
80fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   X = R + kNumberOfXmmRegIds
81fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko//   S = X + kNumberOfX87RegIds
82fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
83fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
84fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// An instance of class 'ManagedRegister' represents a single cpu register (enum
85fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// Register), an xmm register (enum XmmRegister), or a pair of cpu registers
86fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// (enum RegisterPair).
87fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// 'ManagedRegister::NoRegister()' provides an invalid register.
88fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko// There is a one-to-one mapping between ManagedRegister and register id.
89fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoclass X86_64ManagedRegister : public ManagedRegister {
90fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko public:
91dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  CpuRegister AsCpuRegister() const {
92fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsCpuRegister());
93dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers    return CpuRegister(static_cast<Register>(id_));
94fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
95fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
96fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  XmmRegister AsXmmRegister() const {
97fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsXmmRegister());
98dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers    return XmmRegister(static_cast<FloatRegister>(id_ - kNumberOfCpuRegIds));
99fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
100fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
101fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  X87Register AsX87Register() const {
102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsX87Register());
103fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return static_cast<X87Register>(id_ -
104fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko                                    (kNumberOfCpuRegIds + kNumberOfXmmRegIds));
105fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
106fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
107dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  CpuRegister AsRegisterPairLow() const {
108fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsRegisterPair());
109fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    // Appropriate mapping of register ids allows to use AllocIdLow().
110fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return FromRegId(AllocIdLow()).AsCpuRegister();
111fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
112fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
113dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  CpuRegister AsRegisterPairHigh() const {
114fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsRegisterPair());
115fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    // Appropriate mapping of register ids allows to use AllocIdHigh().
116fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return FromRegId(AllocIdHigh()).AsCpuRegister();
117fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
118fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
119fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCpuRegister() const {
120fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsValidManagedRegister());
121fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return (0 <= id_) && (id_ < kNumberOfCpuRegIds);
122fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
123fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
124fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsXmmRegister() const {
125fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsValidManagedRegister());
126fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    const int test = id_ - kNumberOfCpuRegIds;
127fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return (0 <= test) && (test < kNumberOfXmmRegIds);
128fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
129fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
130fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsX87Register() const {
131fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsValidManagedRegister());
132fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    const int test = id_ - (kNumberOfCpuRegIds + kNumberOfXmmRegIds);
133fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return (0 <= test) && (test < kNumberOfX87RegIds);
134fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
135fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
136fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsRegisterPair() const {
137fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsValidManagedRegister());
138fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    const int test = id_ -
139fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko        (kNumberOfCpuRegIds + kNumberOfXmmRegIds + kNumberOfX87RegIds);
140fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return (0 <= test) && (test < kNumberOfPairRegIds);
141fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
142fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
143fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  void Print(std::ostream& os) const;
144fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
145fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Returns true if the two managed-registers ('this' and 'other') overlap.
146fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Either managed-register may be the NoRegister. If both are the NoRegister
147fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // then false is returned.
148fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool Overlaps(const X86_64ManagedRegister& other) const;
149fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
150fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  static X86_64ManagedRegister FromCpuRegister(Register r) {
151fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK_NE(r, kNoRegister);
152fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return FromRegId(r);
153fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
154fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
155dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  static X86_64ManagedRegister FromXmmRegister(FloatRegister r) {
156fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return FromRegId(r + kNumberOfCpuRegIds);
157fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
158fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
159fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  static X86_64ManagedRegister FromX87Register(X87Register r) {
160fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK_NE(r, kNoX87Register);
161fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return FromRegId(r + kNumberOfCpuRegIds + kNumberOfXmmRegIds);
162fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
163fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
164fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  static X86_64ManagedRegister FromRegisterPair(RegisterPair r) {
165fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK_NE(r, kNoRegisterPair);
166fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return FromRegId(r + (kNumberOfCpuRegIds + kNumberOfXmmRegIds +
167fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko                          kNumberOfX87RegIds));
168fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
169fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
170fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko private:
171fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsValidManagedRegister() const {
172fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return (0 <= id_) && (id_ < kNumberOfRegIds);
173fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
174fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
175fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  int RegId() const {
176fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(!IsNoRegister());
177fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return id_;
178fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
179fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
180fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  int AllocId() const {
181fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(IsValidManagedRegister() && !IsRegisterPair());
182fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK_LT(id_, kNumberOfAllocIds);
183fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return id_;
184fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
185fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
186fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  int AllocIdLow() const;
187fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  int AllocIdHigh() const;
188fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
189fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  friend class ManagedRegister;
190fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
191fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  explicit X86_64ManagedRegister(int reg_id) : ManagedRegister(reg_id) {}
192fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  static X86_64ManagedRegister FromRegId(int reg_id) {
194fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    X86_64ManagedRegister reg(reg_id);
195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    CHECK(reg.IsValidManagedRegister());
196fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return reg;
197fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
198fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko};
199fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
200fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkostd::ostream& operator<<(std::ostream& os, const X86_64ManagedRegister& reg);
201fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
202fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko}  // namespace x86_64
203fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
204fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoinline x86_64::X86_64ManagedRegister ManagedRegister::AsX86_64() const {
205fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  x86_64::X86_64ManagedRegister reg(id_);
206fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister());
207fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  return reg;
208fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko}
209fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
210fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko}  // namespace art
211fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
212fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#endif  // ART_COMPILER_UTILS_X86_64_MANAGED_REGISTER_X86_64_H_
213