managed_register_mips64.h revision 57b34294758e9c00993913ebe43c7ee4698a5cc6
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_COMPILER_UTILS_MIPS64_MANAGED_REGISTER_MIPS64_H_
18#define ART_COMPILER_UTILS_MIPS64_MANAGED_REGISTER_MIPS64_H_
19
20#include "constants_mips64.h"
21#include "utils/managed_register.h"
22
23namespace art {
24namespace mips64 {
25
26const int kNumberOfGpuRegIds = kNumberOfGpuRegisters;
27const int kNumberOfGpuAllocIds = kNumberOfGpuRegisters;
28
29const int kNumberOfFpuRegIds = kNumberOfFpuRegisters;
30const int kNumberOfFpuAllocIds = kNumberOfFpuRegisters;
31
32const int kNumberOfRegIds = kNumberOfGpuRegIds + kNumberOfFpuRegIds;
33const int kNumberOfAllocIds = kNumberOfGpuAllocIds + kNumberOfFpuAllocIds;
34
35// An instance of class 'ManagedRegister' represents a single GPU register (enum
36// Register) or a double precision FP register (enum FpuRegister)
37// 'ManagedRegister::NoRegister()' provides an invalid register.
38// There is a one-to-one mapping between ManagedRegister and register id.
39class Mips64ManagedRegister : public ManagedRegister {
40 public:
41  GpuRegister AsGpuRegister() const {
42    CHECK(IsGpuRegister());
43    return static_cast<GpuRegister>(id_);
44  }
45
46  FpuRegister AsFpuRegister() const {
47    CHECK(IsFpuRegister());
48    return static_cast<FpuRegister>(id_ - kNumberOfGpuRegIds);
49  }
50
51  bool IsGpuRegister() const {
52    CHECK(IsValidManagedRegister());
53    return (0 <= id_) && (id_ < kNumberOfGpuRegIds);
54  }
55
56  bool IsFpuRegister() const {
57    CHECK(IsValidManagedRegister());
58    const int test = id_ - kNumberOfGpuRegIds;
59    return (0 <= test) && (test < kNumberOfFpuRegIds);
60  }
61
62  void Print(std::ostream& os) const;
63
64  // Returns true if the two managed-registers ('this' and 'other') overlap.
65  // Either managed-register may be the NoRegister. If both are the NoRegister
66  // then false is returned.
67  bool Overlaps(const Mips64ManagedRegister& other) const;
68
69  static Mips64ManagedRegister FromGpuRegister(GpuRegister r) {
70    CHECK_NE(r, kNoGpuRegister);
71    return FromRegId(r);
72  }
73
74  static Mips64ManagedRegister FromFpuRegister(FpuRegister r) {
75    CHECK_NE(r, kNoFpuRegister);
76    return FromRegId(r + kNumberOfGpuRegIds);
77  }
78
79 private:
80  bool IsValidManagedRegister() const {
81    return (0 <= id_) && (id_ < kNumberOfRegIds);
82  }
83
84  int RegId() const {
85    CHECK(!IsNoRegister());
86    return id_;
87  }
88
89  int AllocId() const {
90    CHECK(IsValidManagedRegister());
91    CHECK_LT(id_, kNumberOfAllocIds);
92    return id_;
93  }
94
95  int AllocIdLow() const;
96  int AllocIdHigh() const;
97
98  friend class ManagedRegister;
99
100  explicit Mips64ManagedRegister(int reg_id) : ManagedRegister(reg_id) {}
101
102  static Mips64ManagedRegister FromRegId(int reg_id) {
103    Mips64ManagedRegister reg(reg_id);
104    CHECK(reg.IsValidManagedRegister());
105    return reg;
106  }
107};
108
109std::ostream& operator<<(std::ostream& os, const Mips64ManagedRegister& reg);
110
111}  // namespace mips64
112
113inline mips64::Mips64ManagedRegister ManagedRegister::AsMips64() const {
114  mips64::Mips64ManagedRegister reg(id_);
115  CHECK(reg.IsNoRegister() || reg.IsValidManagedRegister());
116  return reg;
117}
118
119}  // namespace art
120
121#endif  // ART_COMPILER_UTILS_MIPS64_MANAGED_REGISTER_MIPS64_H_
122