blob: 227467e0c0247324bd0e3e888abbc1984c0d93ac [file] [log] [blame]
Ian Rogersb033c752011-07-20 12:22:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07003#include "globals.h"
4#include "calling_convention.h"
5#include "managed_register.h"
Ian Rogersb033c752011-07-20 12:22:35 -07006
7namespace art {
8
9// We need all registers for caching of locals.
10// Register R9 .. R15 are reserved.
11static const int kNumberOfAvailableCoreRegisters = (R8 - R0) + 1;
12static const int kNumberOfAvailableSRegisters = kNumberOfSRegisters;
13static const int kNumberOfAvailableDRegisters = kNumberOfDRegisters;
14static const int kNumberOfAvailableOverlappingDRegisters =
15 kNumberOfOverlappingDRegisters;
16static const int kNumberOfAvailableRegisterPairs = kNumberOfRegisterPairs;
17
18
19// Returns true if this managed-register overlaps the other managed-register.
20bool ManagedRegister::Overlaps(const ManagedRegister& other) const {
21 if (IsNoRegister() || other.IsNoRegister()) return false;
22 if (Equals(other)) return true;
23 if (IsRegisterPair()) {
24 Register low = AsRegisterPairLow();
25 Register high = AsRegisterPairHigh();
26 return ManagedRegister::FromCoreRegister(low).Overlaps(other) ||
27 ManagedRegister::FromCoreRegister(high).Overlaps(other);
28 }
29 if (IsOverlappingDRegister()) {
30 if (other.IsDRegister()) return Equals(other);
31 if (other.IsSRegister()) {
32 SRegister low = AsOverlappingDRegisterLow();
33 SRegister high = AsOverlappingDRegisterHigh();
34 SRegister other_sreg = other.AsSRegister();
35 return (low == other_sreg) || (high == other_sreg);
36 }
37 return false;
38 }
39 if (other.IsRegisterPair() || other.IsOverlappingDRegister()) {
40 return other.Overlaps(*this);
41 }
42 return false;
43}
44
45
46int ManagedRegister::AllocIdLow() const {
47 CHECK(IsOverlappingDRegister() || IsRegisterPair());
48 const int r = RegId() - (kNumberOfCoreRegIds + kNumberOfSRegIds);
49 int low;
50 if (r < kNumberOfOverlappingDRegIds) {
51 CHECK(IsOverlappingDRegister());
52 low = (r * 2) + kNumberOfCoreRegIds; // Return a SRegister.
53 } else {
54 CHECK(IsRegisterPair());
55 low = (r - kNumberOfDRegIds) * 2; // Return a Register.
56 }
57 return low;
58}
59
60
61int ManagedRegister::AllocIdHigh() const {
62 return AllocIdLow() + 1;
63}
64
65
66void ManagedRegister::Print(std::ostream& os) const {
67 if (!IsValidManagedRegister()) {
68 os << "No Register";
69 } else if (IsCoreRegister()) {
70 os << "Core: " << static_cast<int>(AsCoreRegister());
71 } else if (IsRegisterPair()) {
72 os << "Pair: " << static_cast<int>(AsRegisterPairLow()) << ", "
73 << static_cast<int>(AsRegisterPairHigh());
74 } else if (IsSRegister()) {
75 os << "SRegister: " << static_cast<int>(AsSRegister());
76 } else if (IsDRegister()) {
77 os << "DRegister: " << static_cast<int>(AsDRegister());
78 } else {
79 os << "??: " << RegId();
80 }
81}
82
83std::ostream& operator<<(std::ostream& os, const ManagedRegister& reg) {
84 reg.Print(os);
85 return os;
86}
87
88std::ostream& operator<<(std::ostream& os, const RegisterPair& r) {
89 os << ManagedRegister::FromRegisterPair(r);
90 return os;
91}
92
93} // namespace art