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