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 172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers#include "managed_register_arm.h" 182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 19578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h" 20b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 21b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersnamespace art { 222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace arm { 23b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 24b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Returns true if this managed-register overlaps the other managed-register. 252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersbool ArmManagedRegister::Overlaps(const ArmManagedRegister& other) const { 26b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (IsNoRegister() || other.IsNoRegister()) return false; 27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (Equals(other)) return true; 28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (IsRegisterPair()) { 29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Register low = AsRegisterPairLow(); 30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Register high = AsRegisterPairHigh(); 312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers return ArmManagedRegister::FromCoreRegister(low).Overlaps(other) || 322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ArmManagedRegister::FromCoreRegister(high).Overlaps(other); 33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 34b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (IsOverlappingDRegister()) { 35b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (other.IsDRegister()) return Equals(other); 36b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (other.IsSRegister()) { 37b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers SRegister low = AsOverlappingDRegisterLow(); 38b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers SRegister high = AsOverlappingDRegisterHigh(); 39b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers SRegister other_sreg = other.AsSRegister(); 40b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return (low == other_sreg) || (high == other_sreg); 41b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 42b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return false; 43b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 44b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (other.IsRegisterPair() || other.IsOverlappingDRegister()) { 45b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return other.Overlaps(*this); 46b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 47b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return false; 48b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 49b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 50b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersint ArmManagedRegister::AllocIdLow() const { 52b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsOverlappingDRegister() || IsRegisterPair()); 53b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers const int r = RegId() - (kNumberOfCoreRegIds + kNumberOfSRegIds); 54b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers int low; 55b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (r < kNumberOfOverlappingDRegIds) { 56b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsOverlappingDRegister()); 57b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers low = (r * 2) + kNumberOfCoreRegIds; // Return a SRegister. 58b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 59b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsRegisterPair()); 60b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers low = (r - kNumberOfDRegIds) * 2; // Return a Register. 617a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers if (low > 6) { 627a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers // we didn't got a pair higher than R6_R7, must be the dalvik special case 637a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers low = 1; 647a99c11d220ec68c208b507570e3a78c2c18a7a1Ian Rogers } 65b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 66b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return low; 67b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 68b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 69b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersint ArmManagedRegister::AllocIdHigh() const { 71b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return AllocIdLow() + 1; 72b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 73b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 74b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid ArmManagedRegister::Print(std::ostream& os) const { 76b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!IsValidManagedRegister()) { 77b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "No Register"; 78b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else if (IsCoreRegister()) { 79b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "Core: " << static_cast<int>(AsCoreRegister()); 80b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else if (IsRegisterPair()) { 81b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "Pair: " << static_cast<int>(AsRegisterPairLow()) << ", " 82b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers << static_cast<int>(AsRegisterPairHigh()); 83b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else if (IsSRegister()) { 84b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "SRegister: " << static_cast<int>(AsSRegister()); 85b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else if (IsDRegister()) { 86b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "DRegister: " << static_cast<int>(AsDRegister()); 87b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 88b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "??: " << RegId(); 89b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 90b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 91b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersstd::ostream& operator<<(std::ostream& os, const ArmManagedRegister& reg) { 93b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers reg.Print(os); 94b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os; 95b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 96b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 97b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const RegisterPair& r) { 982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers os << ArmManagedRegister::FromRegisterPair(r); 99b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os; 100b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 101b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace arm 103b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 104