managed_register_mips.cc revision 0703060875166106af3d490c6c264611aea67ec8
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 247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// These core registers are never available for allocation. 257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic const Register kReservedCoreRegistersArray[] = { S0, S1 }; 267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao// We need all registers for caching. 287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic const int kNumberOfAvailableCoreRegisters = (S7 - T0) + 1; 297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic const int kNumberOfAvailableFRegisters = kNumberOfFRegisters; 307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic const int kNumberOfAvailableDRegisters = kNumberOfDRegisters; 317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic const int kNumberOfAvailableOverlappingDRegisters = 327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao kNumberOfOverlappingDRegisters; 337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic const int kNumberOfAvailableRegisterPairs = kNumberOfRegisterPairs; 347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaobool MipsManagedRegister::Overlaps(const MipsManagedRegister& other) const { 367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (IsNoRegister() || other.IsNoRegister()) return false; 377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsValidManagedRegister()); 387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(other.IsValidManagedRegister()); 397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (Equals(other)) return true; 407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (IsRegisterPair()) { 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register low = AsRegisterPairLow(); 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao Register high = AsRegisterPairHigh(); 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return MipsManagedRegister::FromCoreRegister(low).Overlaps(other) || 447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsManagedRegister::FromCoreRegister(high).Overlaps(other); 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (IsOverlappingDRegister()) { 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (other.IsDRegister()) return Equals(other); 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (other.IsFRegister()) { 497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister low = AsOverlappingDRegisterLow(); 507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister high = AsOverlappingDRegisterHigh(); 517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao FRegister other_freg = other.AsFRegister(); 527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return (low == other_freg) || (high == other_freg); 537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return false; 557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (other.IsRegisterPair() || other.IsOverlappingDRegister()) { 577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return other.Overlaps(*this); 587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return false; 607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoint MipsManagedRegister::AllocIdLow() const { 647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsOverlappingDRegister() || IsRegisterPair()); 657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const int r = RegId() - (kNumberOfCoreRegIds + kNumberOfFRegIds); 667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int low; 677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (r < kNumberOfOverlappingDRegIds) { 687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsOverlappingDRegister()); 697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao low = (r * 2) + kNumberOfCoreRegIds; // Return an FRegister. 707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao CHECK(IsRegisterPair()); 720703060875166106af3d490c6c264611aea67ec8jeffhao low = (r - kNumberOfDRegIds) * 2 + 2; // Return a Register. 730703060875166106af3d490c6c264611aea67ec8jeffhao if (low >= 24) { 740703060875166106af3d490c6c264611aea67ec8jeffhao // we got a pair higher than S6_S7, must be the dalvik special case 757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao low = 5; 767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return low; 797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoint MipsManagedRegister::AllocIdHigh() const { 837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return AllocIdLow() + 1; 847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaovoid MipsManagedRegister::Print(std::ostream& os) const { 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (!IsValidManagedRegister()) { 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "No Register"; 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsCoreRegister()) { 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "Core: " << static_cast<int>(AsCoreRegister()); 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsRegisterPair()) { 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "Pair: " << AsRegisterPairLow() << ", " << AsRegisterPairHigh(); 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsFRegister()) { 957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "FRegister: " << static_cast<int>(AsFRegister()); 967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else if (IsDRegister()) { 977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "DRegister: " << static_cast<int>(AsDRegister()); 987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << "??: " << RegId(); 1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostd::ostream& operator<<(std::ostream& os, const MipsManagedRegister& reg) { 1047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao reg.Print(os); 1057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return os; 1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostd::ostream& operator<<(std::ostream& os, const RegisterPair& reg) { 1097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao os << MipsManagedRegister::FromRegisterPair(reg); 1107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return os; 1117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace mips 1147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace art 115