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