managed_register_x86.h revision 21ba27fc8d31b831a19b90bf570550b46ac9e8cd
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
16b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#ifndef ART_SRC_OAT_UTILS_X86_MANAGED_REGISTER_X86_H_
1857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#define ART_SRC_OAT_UTILS_X86_MANAGED_REGISTER_X86_H_
19b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
20578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "constants_x86.h"
2157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "oat/utils/managed_register.h"
22b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
23b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersnamespace art {
242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 {
25b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
26b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Values for register pairs.
27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// The registers in kReservedCpuRegistersArray in x86.cc are not used in pairs.
28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// The table kRegisterPairs in x86.cc must be kept in sync with this enum.
29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersenum RegisterPair {
30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_EDX = 0,
31b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_ECX = 1,
32b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_EBX = 2,
33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_EDI = 3,
34b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EDX_ECX = 4,
35b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EDX_EBX = 5,
36b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EDX_EDI = 6,
37b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  ECX_EBX = 7,
38b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  ECX_EDI = 8,
39b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EBX_EDI = 9,
40b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  kNumberOfRegisterPairs = 10,
41b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  kNoRegisterPair = -1,
42b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers};
43b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
44b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const RegisterPair& reg);
45b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
46b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfCpuRegIds = kNumberOfCpuRegisters;
47b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfCpuAllocIds = kNumberOfCpuRegisters;
48b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
49b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfXmmRegIds = kNumberOfXmmRegisters;
50b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfXmmAllocIds = kNumberOfXmmRegisters;
51b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
52b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfX87RegIds = kNumberOfX87Registers;
53b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfX87AllocIds = kNumberOfX87Registers;
54b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
55b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfPairRegIds = kNumberOfRegisterPairs;
56b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
57b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfRegIds = kNumberOfCpuRegIds + kNumberOfXmmRegIds +
58b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    kNumberOfX87RegIds + kNumberOfPairRegIds;
59b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfAllocIds = kNumberOfCpuAllocIds + kNumberOfXmmAllocIds +
60b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    kNumberOfX87RegIds;
61b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
62b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Register ids map:
63b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [0..R[  cpu registers (enum Register)
64b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [R..X[  xmm registers (enum XmmRegister)
65b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [X..S[  x87 registers (enum X87Register)
66b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [S..P[  register pairs (enum RegisterPair)
67b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// where
68b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   R = kNumberOfCpuRegIds
69b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   X = R + kNumberOfXmmRegIds
70b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   S = X + kNumberOfX87RegIds
71b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   P = X + kNumberOfRegisterPairs
72b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
73b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Allocation ids map:
74b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [0..R[  cpu registers (enum Register)
75b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [R..X[  xmm registers (enum XmmRegister)
76b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [X..S[  x87 registers (enum X87Register)
77b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// where
78b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   R = kNumberOfCpuRegIds
79b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   X = R + kNumberOfXmmRegIds
80b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   S = X + kNumberOfX87RegIds
81b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
82b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
83b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// An instance of class 'ManagedRegister' represents a single cpu register (enum
84b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Register), an xmm register (enum XmmRegister), or a pair of cpu registers
85b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// (enum RegisterPair).
86b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// 'ManagedRegister::NoRegister()' provides an invalid register.
87b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// There is a one-to-one mapping between ManagedRegister and register id.
882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersclass X86ManagedRegister : public ManagedRegister {
89b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers public:
9058136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao  ByteRegister AsByteRegister() const {
9158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao    CHECK(IsCpuRegister());
9221ba27fc8d31b831a19b90bf570550b46ac9e8cdIan Rogers    CHECK_LT(AsCpuRegister(), ESP);  // ESP, EBP, ESI and EDI cannot be encoded as byte registers.
9358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao    return static_cast<ByteRegister>(id_);
9458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao  }
9558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao
96b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  Register AsCpuRegister() const {
97b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsCpuRegister());
98b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return static_cast<Register>(id_);
99b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
100b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
101b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  XmmRegister AsXmmRegister() const {
102b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsXmmRegister());
103b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return static_cast<XmmRegister>(id_ - kNumberOfCpuRegIds);
104b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
105b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
106b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  X87Register AsX87Register() const {
107b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsX87Register());
108b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return static_cast<X87Register>(id_ -
109b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers                                    (kNumberOfCpuRegIds + kNumberOfXmmRegIds));
110b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
111b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
112b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  Register AsRegisterPairLow() const {
113b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsRegisterPair());
114b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    // Appropriate mapping of register ids allows to use AllocIdLow().
115b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(AllocIdLow()).AsCpuRegister();
116b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
117b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
118b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  Register AsRegisterPairHigh() const {
119b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsRegisterPair());
120b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    // Appropriate mapping of register ids allows to use AllocIdHigh().
121b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(AllocIdHigh()).AsCpuRegister();
122b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
123b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
124b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsCpuRegister() const {
125b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
126b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= id_) && (id_ < kNumberOfCpuRegIds);
127b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
128b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
129b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsXmmRegister() const {
130b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
131b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    const int test = id_ - kNumberOfCpuRegIds;
132b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= test) && (test < kNumberOfXmmRegIds);
133b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
134b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
135b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsX87Register() const {
136b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
137b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    const int test = id_ - (kNumberOfCpuRegIds + kNumberOfXmmRegIds);
138b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers    return (0 <= test) && (test < kNumberOfX87RegIds);
139b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
140b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
141b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsRegisterPair() const {
142b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
143b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    const int test = id_ -
144b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers        (kNumberOfCpuRegIds + kNumberOfXmmRegIds + kNumberOfX87RegIds);
145b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= test) && (test < kNumberOfPairRegIds);
146b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
147b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
148b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  void Print(std::ostream& os) const;
149b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // Returns true if the two managed-registers ('this' and 'other') overlap.
151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // Either managed-register may be the NoRegister. If both are the NoRegister
152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // then false is returned.
1532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  bool Overlaps(const X86ManagedRegister& other) const;
154b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromCpuRegister(Register r) {
156b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoRegister);
157b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r);
158b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
159b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromXmmRegister(XmmRegister r) {
161b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoXmmRegister);
162b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r + kNumberOfCpuRegIds);
163b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
164b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromX87Register(X87Register r) {
166b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoX87Register);
167b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r + kNumberOfCpuRegIds + kNumberOfXmmRegIds);
168b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
169b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromRegisterPair(RegisterPair r) {
171b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoRegisterPair);
172b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r + (kNumberOfCpuRegIds + kNumberOfXmmRegIds +
173b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers                          kNumberOfX87RegIds));
174b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
175b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
176b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers private:
177b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsValidManagedRegister() const {
178b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= id_) && (id_ < kNumberOfRegIds);
179b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
180b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
181b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int RegId() const {
182b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(!IsNoRegister());
183b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return id_;
184b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
185b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
186b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int AllocId() const {
187b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister() && !IsRegisterPair());
188b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_LT(id_, kNumberOfAllocIds);
189b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return id_;
190b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
191b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
192b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int AllocIdLow() const;
193b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int AllocIdHigh() const;
194b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  friend class ManagedRegister;
1962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
197a51a3dd5603daf3d368b7735067e1d9eb54c4c40Elliott Hughes  explicit X86ManagedRegister(int reg_id) : ManagedRegister(reg_id) {}
1982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
1992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromRegId(int reg_id) {
2002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers    X86ManagedRegister reg(reg_id);
201b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(reg.IsValidManagedRegister());
202b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return reg;
203b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
204b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers};
205b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
2062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersstd::ostream& operator<<(std::ostream& os, const X86ManagedRegister& reg);
2072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
2082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}  // namespace x86
2092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
2102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline x86::X86ManagedRegister ManagedRegister::AsX86() const {
2112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  x86::X86ManagedRegister reg(id_);
2122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister());
2132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  return reg;
2142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}
215b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
216b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}  // namespace art
217b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
21857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#endif  // ART_SRC_OAT_UTILS_X86_MANAGED_REGISTER_X86_H_
219