managed_register_x86.h revision 4fda4eb799c95be266f52aaf3461a440ea86b841
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