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