8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package jdk.vm.ci.hotspot.aarch64;
24
25 import static jdk.vm.ci.aarch64.AArch64.lr;
26 import static jdk.vm.ci.aarch64.AArch64.r0;
27 import static jdk.vm.ci.aarch64.AArch64.r1;
28 import static jdk.vm.ci.aarch64.AArch64.r12;
29 import static jdk.vm.ci.aarch64.AArch64.r2;
30 import static jdk.vm.ci.aarch64.AArch64.r27;
31 import static jdk.vm.ci.aarch64.AArch64.r28;
32 import static jdk.vm.ci.aarch64.AArch64.r29;
33 import static jdk.vm.ci.aarch64.AArch64.r3;
34 import static jdk.vm.ci.aarch64.AArch64.r31;
35 import static jdk.vm.ci.aarch64.AArch64.r4;
36 import static jdk.vm.ci.aarch64.AArch64.r5;
37 import static jdk.vm.ci.aarch64.AArch64.r6;
38 import static jdk.vm.ci.aarch64.AArch64.r7;
39 import static jdk.vm.ci.aarch64.AArch64.r9;
40 import static jdk.vm.ci.aarch64.AArch64.sp;
41 import static jdk.vm.ci.aarch64.AArch64.v0;
42 import static jdk.vm.ci.aarch64.AArch64.v1;
43 import static jdk.vm.ci.aarch64.AArch64.v2;
44 import static jdk.vm.ci.aarch64.AArch64.v3;
45 import static jdk.vm.ci.aarch64.AArch64.v4;
46 import static jdk.vm.ci.aarch64.AArch64.v5;
47 import static jdk.vm.ci.aarch64.AArch64.v6;
48 import static jdk.vm.ci.aarch64.AArch64.v7;
49 import static jdk.vm.ci.aarch64.AArch64.zr;
50
51 import java.util.ArrayList;
52 import java.util.HashSet;
53 import java.util.List;
54 import java.util.Set;
55
56 import jdk.vm.ci.aarch64.AArch64;
57 import jdk.vm.ci.code.Architecture;
58 import jdk.vm.ci.code.CallingConvention;
59 import jdk.vm.ci.code.CallingConvention.Type;
97 public RegisterArray filterAllocatableRegisters(PlatformKind kind, RegisterArray registers) {
98 ArrayList<Register> list = new ArrayList<>();
99 for (Register reg : registers) {
100 if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) {
101 list.add(reg);
102 }
103 }
104
105 return new RegisterArray(list);
106 }
107
108 @Override
109 public RegisterAttributes[] getAttributesMap() {
110 return attributesMap.clone();
111 }
112
113 private final RegisterArray javaGeneralParameterRegisters = new RegisterArray(r1, r2, r3, r4, r5, r6, r7, r0);
114 private final RegisterArray nativeGeneralParameterRegisters = new RegisterArray(r0, r1, r2, r3, r4, r5, r6, r7);
115 private final RegisterArray simdParameterRegisters = new RegisterArray(v0, v1, v2, v3, v4, v5, v6, v7);
116
117 public static final Register inlineCacheRegister = r9;
118
119 /**
120 * Vtable stubs expect the metaspace Method in r12.
121 */
122 public static final Register metaspaceMethodRegister = r12;
123
124 public static final Register heapBaseRegister = r27;
125 public static final Register threadRegister = r28;
126 public static final Register fp = r29;
127
128 private static final RegisterArray reservedRegisters = new RegisterArray(threadRegister, fp, lr, r31, zr, sp);
129
130 private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) {
131 RegisterArray allRegisters = arch.getAvailableValueRegisters();
132 Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)];
133 List<Register> reservedRegistersList = reservedRegisters.asList();
134
135 int idx = 0;
136 for (Register reg : allRegisters) {
137 if (reservedRegistersList.contains(reg)) {
138 // skip reserved registers
139 continue;
140 }
141 assert !(reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp));
142 if (reserveForHeapBase && reg.equals(heapBaseRegister)) {
143 // skip heap base register
144 continue;
145 }
146
147 registers[idx++] = reg;
148 }
|
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package jdk.vm.ci.hotspot.aarch64;
24
25 import static jdk.vm.ci.aarch64.AArch64.lr;
26 import static jdk.vm.ci.aarch64.AArch64.r0;
27 import static jdk.vm.ci.aarch64.AArch64.r1;
28 import static jdk.vm.ci.aarch64.AArch64.r2;
29 import static jdk.vm.ci.aarch64.AArch64.r3;
30 import static jdk.vm.ci.aarch64.AArch64.r4;
31 import static jdk.vm.ci.aarch64.AArch64.r5;
32 import static jdk.vm.ci.aarch64.AArch64.r6;
33 import static jdk.vm.ci.aarch64.AArch64.r7;
34 import static jdk.vm.ci.aarch64.AArch64.rscratch1;
35 import static jdk.vm.ci.aarch64.AArch64.rscratch2;
36 import static jdk.vm.ci.aarch64.AArch64.r12;
37 import static jdk.vm.ci.aarch64.AArch64.r27;
38 import static jdk.vm.ci.aarch64.AArch64.r28;
39 import static jdk.vm.ci.aarch64.AArch64.r29;
40 import static jdk.vm.ci.aarch64.AArch64.r31;
41 import static jdk.vm.ci.aarch64.AArch64.sp;
42 import static jdk.vm.ci.aarch64.AArch64.v0;
43 import static jdk.vm.ci.aarch64.AArch64.v1;
44 import static jdk.vm.ci.aarch64.AArch64.v2;
45 import static jdk.vm.ci.aarch64.AArch64.v3;
46 import static jdk.vm.ci.aarch64.AArch64.v4;
47 import static jdk.vm.ci.aarch64.AArch64.v5;
48 import static jdk.vm.ci.aarch64.AArch64.v6;
49 import static jdk.vm.ci.aarch64.AArch64.v7;
50 import static jdk.vm.ci.aarch64.AArch64.zr;
51
52 import java.util.ArrayList;
53 import java.util.HashSet;
54 import java.util.List;
55 import java.util.Set;
56
57 import jdk.vm.ci.aarch64.AArch64;
58 import jdk.vm.ci.code.Architecture;
59 import jdk.vm.ci.code.CallingConvention;
60 import jdk.vm.ci.code.CallingConvention.Type;
98 public RegisterArray filterAllocatableRegisters(PlatformKind kind, RegisterArray registers) {
99 ArrayList<Register> list = new ArrayList<>();
100 for (Register reg : registers) {
101 if (target.arch.canStoreValue(reg.getRegisterCategory(), kind)) {
102 list.add(reg);
103 }
104 }
105
106 return new RegisterArray(list);
107 }
108
109 @Override
110 public RegisterAttributes[] getAttributesMap() {
111 return attributesMap.clone();
112 }
113
114 private final RegisterArray javaGeneralParameterRegisters = new RegisterArray(r1, r2, r3, r4, r5, r6, r7, r0);
115 private final RegisterArray nativeGeneralParameterRegisters = new RegisterArray(r0, r1, r2, r3, r4, r5, r6, r7);
116 private final RegisterArray simdParameterRegisters = new RegisterArray(v0, v1, v2, v3, v4, v5, v6, v7);
117
118 public static final Register inlineCacheRegister = rscratch2;
119
120 /**
121 * Vtable stubs expect the metaspace Method in r12.
122 */
123 public static final Register metaspaceMethodRegister = r12;
124
125 public static final Register heapBaseRegister = r27;
126 public static final Register threadRegister = r28;
127 public static final Register fp = r29;
128
129 private static final RegisterArray reservedRegisters
130 = new RegisterArray(rscratch1, rscratch2, threadRegister, fp, lr, r31, zr, sp);
131
132 private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) {
133 RegisterArray allRegisters = arch.getAvailableValueRegisters();
134 Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)];
135 List<Register> reservedRegistersList = reservedRegisters.asList();
136
137 int idx = 0;
138 for (Register reg : allRegisters) {
139 if (reservedRegistersList.contains(reg)) {
140 // skip reserved registers
141 continue;
142 }
143 assert !(reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp));
144 if (reserveForHeapBase && reg.equals(heapBaseRegister)) {
145 // skip heap base register
146 continue;
147 }
148
149 registers[idx++] = reg;
150 }
|