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