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
17166db04e259ca51838c311891598664deeed85adIan Rogers#ifndef ART_COMPILER_UTILS_X86_MANAGED_REGISTER_X86_H_
18166db04e259ca51838c311891598664deeed85adIan Rogers#define ART_COMPILER_UTILS_X86_MANAGED_REGISTER_X86_H_
19b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
20578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "constants_x86.h"
214fda4eb799c95be266f52aaf3461a440ea86b841David Srbecky#include "debug/dwarf/register.h"
22166db04e259ca51838c311891598664deeed85adIan Rogers#include "utils/managed_register.h"
23b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
24b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersnamespace art {
252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 {
26b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Values for register pairs.
28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// The registers in kReservedCpuRegistersArray in x86.cc are not used in pairs.
29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// The table kRegisterPairs in x86.cc must be kept in sync with this enum.
30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersenum RegisterPair {
31b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_EDX = 0,
32b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_ECX = 1,
33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_EBX = 2,
34b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EAX_EDI = 3,
35b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EDX_ECX = 4,
36b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EDX_EBX = 5,
37b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EDX_EDI = 6,
38b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  ECX_EBX = 7,
39b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  ECX_EDI = 8,
40b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EBX_EDI = 9,
4101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  ECX_EDX = 10,  // Dalvik style passing
4201bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  kNumberOfRegisterPairs = 11,
43b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  kNoRegisterPair = -1,
44b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers};
45b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
46b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const RegisterPair& reg);
47b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
48b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfCpuRegIds = kNumberOfCpuRegisters;
49b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfCpuAllocIds = kNumberOfCpuRegisters;
50b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
51b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfXmmRegIds = kNumberOfXmmRegisters;
52b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfXmmAllocIds = kNumberOfXmmRegisters;
53b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
54b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfX87RegIds = kNumberOfX87Registers;
55b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfX87AllocIds = kNumberOfX87Registers;
56b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
57b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfPairRegIds = kNumberOfRegisterPairs;
58b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
59b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfRegIds = kNumberOfCpuRegIds + kNumberOfXmmRegIds +
60b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    kNumberOfX87RegIds + kNumberOfPairRegIds;
61b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersconst int kNumberOfAllocIds = kNumberOfCpuAllocIds + kNumberOfXmmAllocIds +
62b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    kNumberOfX87RegIds;
63b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
64b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Register ids map:
65b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [0..R[  cpu registers (enum Register)
66b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [R..X[  xmm registers (enum XmmRegister)
67b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [X..S[  x87 registers (enum X87Register)
68b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [S..P[  register pairs (enum RegisterPair)
69b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// where
70b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   R = kNumberOfCpuRegIds
71b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   X = R + kNumberOfXmmRegIds
72b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   S = X + kNumberOfX87RegIds
73b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   P = X + kNumberOfRegisterPairs
74b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
75b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Allocation ids map:
76b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [0..R[  cpu registers (enum Register)
77b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [R..X[  xmm registers (enum XmmRegister)
78b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   [X..S[  x87 registers (enum X87Register)
79b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// where
80b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   R = kNumberOfCpuRegIds
81b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   X = R + kNumberOfXmmRegIds
82b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   S = X + kNumberOfX87RegIds
83b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
84b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
85b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// An instance of class 'ManagedRegister' represents a single cpu register (enum
86b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Register), an xmm register (enum XmmRegister), or a pair of cpu registers
87b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// (enum RegisterPair).
88b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// 'ManagedRegister::NoRegister()' provides an invalid register.
89b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// There is a one-to-one mapping between ManagedRegister and register id.
902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersclass X86ManagedRegister : public ManagedRegister {
91b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers public:
9258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao  ByteRegister AsByteRegister() const {
9358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao    CHECK(IsCpuRegister());
9421ba27fc8d31b831a19b90bf570550b46ac9e8cdIan Rogers    CHECK_LT(AsCpuRegister(), ESP);  // ESP, EBP, ESI and EDI cannot be encoded as byte registers.
9558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao    return static_cast<ByteRegister>(id_);
9658136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao  }
9758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao
98b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  Register AsCpuRegister() const {
99b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsCpuRegister());
100b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return static_cast<Register>(id_);
101b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
102b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
103b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  XmmRegister AsXmmRegister() const {
104b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsXmmRegister());
105b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return static_cast<XmmRegister>(id_ - kNumberOfCpuRegIds);
106b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
107b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
108b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  X87Register AsX87Register() const {
109b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsX87Register());
110b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return static_cast<X87Register>(id_ -
111b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers                                    (kNumberOfCpuRegIds + kNumberOfXmmRegIds));
112b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
113b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
114b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  Register AsRegisterPairLow() const {
115b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsRegisterPair());
116b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    // Appropriate mapping of register ids allows to use AllocIdLow().
117b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(AllocIdLow()).AsCpuRegister();
118b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
119b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
120b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  Register AsRegisterPairHigh() const {
121b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsRegisterPair());
122b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    // Appropriate mapping of register ids allows to use AllocIdHigh().
123b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(AllocIdHigh()).AsCpuRegister();
124b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
125b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
12601bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  RegisterPair AsRegisterPair() const {
12701bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray    CHECK(IsRegisterPair());
12801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray    return static_cast<RegisterPair>(id_ -
12901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray        (kNumberOfCpuRegIds + kNumberOfXmmRegIds + kNumberOfX87RegIds));
13001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  }
13101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray
132b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsCpuRegister() const {
133b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
134b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= id_) && (id_ < kNumberOfCpuRegIds);
135b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
136b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
137b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsXmmRegister() const {
138b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
139b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    const int test = id_ - kNumberOfCpuRegIds;
140b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= test) && (test < kNumberOfXmmRegIds);
141b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
142b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
143b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsX87Register() const {
144b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
145b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    const int test = id_ - (kNumberOfCpuRegIds + kNumberOfXmmRegIds);
146b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers    return (0 <= test) && (test < kNumberOfX87RegIds);
147b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
148b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
149b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsRegisterPair() const {
150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister());
151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    const int test = id_ -
152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers        (kNumberOfCpuRegIds + kNumberOfXmmRegIds + kNumberOfX87RegIds);
153b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= test) && (test < kNumberOfPairRegIds);
154b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
155b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
156b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  void Print(std::ostream& os) const;
157b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
158b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // Returns true if the two managed-registers ('this' and 'other') overlap.
159b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // Either managed-register may be the NoRegister. If both are the NoRegister
160b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // then false is returned.
1612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  bool Overlaps(const X86ManagedRegister& other) const;
162b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromCpuRegister(Register r) {
164b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoRegister);
165b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r);
166b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
167b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromXmmRegister(XmmRegister r) {
169b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoXmmRegister);
170b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r + kNumberOfCpuRegIds);
171b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
172b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromX87Register(X87Register r) {
174b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoX87Register);
175b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r + kNumberOfCpuRegIds + kNumberOfXmmRegIds);
176b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
177b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
1782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromRegisterPair(RegisterPair r) {
179b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_NE(r, kNoRegisterPair);
180b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return FromRegId(r + (kNumberOfCpuRegIds + kNumberOfXmmRegIds +
181b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers                          kNumberOfX87RegIds));
182b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
183b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
184b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers private:
185b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  bool IsValidManagedRegister() const {
186b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return (0 <= id_) && (id_ < kNumberOfRegIds);
187b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
188b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
189b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int RegId() const {
190b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(!IsNoRegister());
191b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return id_;
192b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
193b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
194b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int AllocId() const {
195b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(IsValidManagedRegister() && !IsRegisterPair());
196b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK_LT(id_, kNumberOfAllocIds);
197b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return id_;
198b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
199b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
200b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int AllocIdLow() const;
201b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  int AllocIdHigh() const;
202b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
2032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  friend class ManagedRegister;
2042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
205a51a3dd5603daf3d368b7735067e1d9eb54c4c40Elliott Hughes  explicit X86ManagedRegister(int reg_id) : ManagedRegister(reg_id) {}
2062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
2072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  static X86ManagedRegister FromRegId(int reg_id) {
2082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers    X86ManagedRegister reg(reg_id);
209b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    CHECK(reg.IsValidManagedRegister());
210b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers    return reg;
211b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  }
212b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers};
213b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
2142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersstd::ostream& operator<<(std::ostream& os, const X86ManagedRegister& reg);
2152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
2162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}  // namespace x86
2172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
2182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersinline x86::X86ManagedRegister ManagedRegister::AsX86() const {
2192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  x86::X86ManagedRegister reg(id_);
2202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister());
2212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers  return reg;
2222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}
223b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
224b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}  // namespace art
225b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
226166db04e259ca51838c311891598664deeed85adIan Rogers#endif  // ART_COMPILER_UTILS_X86_MANAGED_REGISTER_X86_H_
227