17fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* 27fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Copyright (C) 2011 The Android Open Source Project 37fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 47fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 57fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * you may not use this file except in compliance with the License. 67fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * You may obtain a copy of the License at 77fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 87fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * http://www.apache.org/licenses/LICENSE-2.0 97fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Unless required by applicable law or agreed to in writing, software 117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * distributed under the License is distributed on an "AS IS" BASIS, 127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * See the License for the specific language governing permissions and 147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * limitations under the License. 157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao */ 167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "managed_register_mips.h" 187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#include "globals.h" 207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace art { 227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace mips { 237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaobool MipsManagedRegister::Overlaps(const MipsManagedRegister& other) const { 257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (IsNoRegister() || other.IsNoRegister()) return false; 267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(other.IsValidManagedRegister()); 287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (Equals(other)) return true; 297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (IsRegisterPair()) { 307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register low = AsRegisterPairLow(); 317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register high = AsRegisterPairHigh(); 327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return MipsManagedRegister::FromCoreRegister(low).Overlaps(other) || 337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsManagedRegister::FromCoreRegister(high).Overlaps(other); 347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (IsOverlappingDRegister()) { 367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (other.IsDRegister()) return Equals(other); 377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (other.IsFRegister()) { 387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister low = AsOverlappingDRegisterLow(); 397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister high = AsOverlappingDRegisterHigh(); 407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister other_freg = other.AsFRegister(); 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (low == other_freg) || (high == other_freg); 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return false; 447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (other.IsRegisterPair() || other.IsOverlappingDRegister()) { 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return other.Overlaps(*this); 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return false; 497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoint MipsManagedRegister::AllocIdLow() const { 537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsOverlappingDRegister() || IsRegisterPair()); 547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const int r = RegId() - (kNumberOfCoreRegIds + kNumberOfFRegIds); 557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int low; 567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (r < kNumberOfOverlappingDRegIds) { 577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsOverlappingDRegister()); 587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao low = (r * 2) + kNumberOfCoreRegIds; // Return an FRegister. 597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsRegisterPair()); 610703060875166106af3d490c6c264611aea67ec8jeffhao low = (r - kNumberOfDRegIds) * 2 + 2; // Return a Register. 620703060875166106af3d490c6c264611aea67ec8jeffhao if (low >= 24) { 630703060875166106af3d490c6c264611aea67ec8jeffhao // we got a pair higher than S6_S7, must be the dalvik special case 647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao low = 5; 657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return low; 687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoint MipsManagedRegister::AllocIdHigh() const { 727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return AllocIdLow() + 1; 737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaovoid MipsManagedRegister::Print(std::ostream& os) const { 777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (!IsValidManagedRegister()) { 787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "No Register"; 797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsCoreRegister()) { 807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "Core: " << static_cast<int>(AsCoreRegister()); 817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsRegisterPair()) { 827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "Pair: " << AsRegisterPairLow() << ", " << AsRegisterPairHigh(); 837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsFRegister()) { 847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "FRegister: " << static_cast<int>(AsFRegister()); 857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsDRegister()) { 867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "DRegister: " << static_cast<int>(AsDRegister()); 877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "??: " << RegId(); 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostd::ostream& operator<<(std::ostream& os, const MipsManagedRegister& reg) { 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao reg.Print(os); 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return os; 957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostd::ostream& operator<<(std::ostream& os, const RegisterPair& reg) { 987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << MipsManagedRegister::FromRegisterPair(reg); 997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return os; 1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace mips 1037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace art 104