blob: 984bb5344d6988458cf7994c8053dbcd5a097d7a [file] [log] [blame]
Ian Rogersb033c752011-07-20 12:22:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
Ian Rogers2c8f6532011-09-02 17:16:34 -07003#include "managed_register_arm.h"
4
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07005#include "globals.h"
6#include "calling_convention.h"
Ian Rogersb033c752011-07-20 12:22:35 -07007
8namespace art {
Ian Rogers2c8f6532011-09-02 17:16:34 -07009namespace arm {
Ian Rogersb033c752011-07-20 12:22:35 -070010
11// We need all registers for caching of locals.
12// Register R9 .. R15 are reserved.
13static const int kNumberOfAvailableCoreRegisters = (R8 - R0) + 1;
14static const int kNumberOfAvailableSRegisters = kNumberOfSRegisters;
15static const int kNumberOfAvailableDRegisters = kNumberOfDRegisters;
16static const int kNumberOfAvailableOverlappingDRegisters =
17 kNumberOfOverlappingDRegisters;
18static const int kNumberOfAvailableRegisterPairs = kNumberOfRegisterPairs;
19
20
21// Returns true if this managed-register overlaps the other managed-register.
Ian Rogers2c8f6532011-09-02 17:16:34 -070022bool ArmManagedRegister::Overlaps(const ArmManagedRegister& other) const {
Ian Rogersb033c752011-07-20 12:22:35 -070023 if (IsNoRegister() || other.IsNoRegister()) return false;
24 if (Equals(other)) return true;
25 if (IsRegisterPair()) {
26 Register low = AsRegisterPairLow();
27 Register high = AsRegisterPairHigh();
Ian Rogers2c8f6532011-09-02 17:16:34 -070028 return ArmManagedRegister::FromCoreRegister(low).Overlaps(other) ||
29 ArmManagedRegister::FromCoreRegister(high).Overlaps(other);
Ian Rogersb033c752011-07-20 12:22:35 -070030 }
31 if (IsOverlappingDRegister()) {
32 if (other.IsDRegister()) return Equals(other);
33 if (other.IsSRegister()) {
34 SRegister low = AsOverlappingDRegisterLow();
35 SRegister high = AsOverlappingDRegisterHigh();
36 SRegister other_sreg = other.AsSRegister();
37 return (low == other_sreg) || (high == other_sreg);
38 }
39 return false;
40 }
41 if (other.IsRegisterPair() || other.IsOverlappingDRegister()) {
42 return other.Overlaps(*this);
43 }
44 return false;
45}
46
47
Ian Rogers2c8f6532011-09-02 17:16:34 -070048int ArmManagedRegister::AllocIdLow() const {
Ian Rogersb033c752011-07-20 12:22:35 -070049 CHECK(IsOverlappingDRegister() || IsRegisterPair());
50 const int r = RegId() - (kNumberOfCoreRegIds + kNumberOfSRegIds);
51 int low;
52 if (r < kNumberOfOverlappingDRegIds) {
53 CHECK(IsOverlappingDRegister());
54 low = (r * 2) + kNumberOfCoreRegIds; // Return a SRegister.
55 } else {
56 CHECK(IsRegisterPair());
57 low = (r - kNumberOfDRegIds) * 2; // Return a Register.
Ian Rogers7a99c112011-09-07 12:48:27 -070058 if (low > 6) {
59 // we didn't got a pair higher than R6_R7, must be the dalvik special case
60 low = 1;
61 }
Ian Rogersb033c752011-07-20 12:22:35 -070062 }
63 return low;
64}
65
66
Ian Rogers2c8f6532011-09-02 17:16:34 -070067int ArmManagedRegister::AllocIdHigh() const {
Ian Rogersb033c752011-07-20 12:22:35 -070068 return AllocIdLow() + 1;
69}
70
71
Ian Rogers2c8f6532011-09-02 17:16:34 -070072void ArmManagedRegister::Print(std::ostream& os) const {
Ian Rogersb033c752011-07-20 12:22:35 -070073 if (!IsValidManagedRegister()) {
74 os << "No Register";
75 } else if (IsCoreRegister()) {
76 os << "Core: " << static_cast<int>(AsCoreRegister());
77 } else if (IsRegisterPair()) {
78 os << "Pair: " << static_cast<int>(AsRegisterPairLow()) << ", "
79 << static_cast<int>(AsRegisterPairHigh());
80 } else if (IsSRegister()) {
81 os << "SRegister: " << static_cast<int>(AsSRegister());
82 } else if (IsDRegister()) {
83 os << "DRegister: " << static_cast<int>(AsDRegister());
84 } else {
85 os << "??: " << RegId();
86 }
87}
88
Ian Rogers2c8f6532011-09-02 17:16:34 -070089std::ostream& operator<<(std::ostream& os, const ArmManagedRegister& reg) {
Ian Rogersb033c752011-07-20 12:22:35 -070090 reg.Print(os);
91 return os;
92}
93
94std::ostream& operator<<(std::ostream& os, const RegisterPair& r) {
Ian Rogers2c8f6532011-09-02 17:16:34 -070095 os << ArmManagedRegister::FromRegisterPair(r);
Ian Rogersb033c752011-07-20 12:22:35 -070096 return os;
97}
98
Ian Rogers2c8f6532011-09-02 17:16:34 -070099} // namespace arm
Ian Rogersb033c752011-07-20 12:22:35 -0700100} // namespace art