annotate graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterAllocationConfig.java @ 21673:5024c80224c7

moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
author Doug Simon <doug.simon@oracle.com>
date Tue, 02 Jun 2015 22:11:52 +0200
parents e49a0ebb2659
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21509
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
1 /*
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
2 * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
4 *
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
7 * published by the Free Software Foundation.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
8 *
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
13 * accompanied this code).
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
14 *
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
18 *
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
21 * questions.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
22 */
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
23 package com.oracle.graal.hotspot.amd64;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
24
21673
5024c80224c7 moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21656
diff changeset
25 import static com.oracle.jvmci.amd64.AMD64.*;
21509
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
26
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
27 import java.util.*;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
28
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
29 import com.oracle.graal.compiler.common.alloc.*;
21561
Doug Simon <doug.simon@oracle.com>
parents: 21509
diff changeset
30 import com.oracle.jvmci.code.*;
21509
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
31
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
32 class AMD64HotSpotRegisterAllocationConfig extends RegisterAllocationConfig {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
33 /**
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
34 * Specify priority of register selection within phases of register allocation. Highest priority
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
35 * is first. A useful heuristic is to give registers a low priority when they are required by
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
36 * machine instructions, like EAX and EDX on I486, and choose no-save registers before
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
37 * save-on-call, & save-on-call before save-on-entry. Registers which participate in fixed
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
38 * calling sequences should come last. Registers which are used as pairs must fall on an even
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
39 * boundary.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
40 *
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
41 * Adopted from x86_64.ad.
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
42 */
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
43 // @formatter:off
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
44 static final Register[] registerAllocationOrder = {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
45 r10, r11, r8, r9, r12, rcx, rbx, rdi, rdx, rsi, rax, rbp, r13, r14, /*r15,*/ /*rsp,*/
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
46 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
47 xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
48 };
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
49 // @formatter:on
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
50
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
51 public AMD64HotSpotRegisterAllocationConfig(RegisterConfig registerConfig) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
52 super(registerConfig);
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
53 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
54
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
55 @Override
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
56 protected Register[] initAllocatable(Register[] registers) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
57 BitSet regMap = new BitSet(registerConfig.getAllocatableRegisters().length);
21656
e49a0ebb2659 AMD64HotSpotRegisterAllocationConfig: adhere to the register order specified by -G:RegisterPressure.
Josef Eisl <josef.eisl@jku.at>
parents: 21561
diff changeset
58 for (Register reg : registers) {
21509
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
59 regMap.set(reg.number);
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
60 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
61
21656
e49a0ebb2659 AMD64HotSpotRegisterAllocationConfig: adhere to the register order specified by -G:RegisterPressure.
Josef Eisl <josef.eisl@jku.at>
parents: 21561
diff changeset
62 Register[] allocatableRegisters = new Register[registers.length];
21509
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
63 int i = 0;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
64 for (Register reg : registerAllocationOrder) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
65 if (regMap.get(reg.number)) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
66 allocatableRegisters[i++] = reg;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
67 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
68 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
69
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
70 assert i == allocatableRegisters.length;
21656
e49a0ebb2659 AMD64HotSpotRegisterAllocationConfig: adhere to the register order specified by -G:RegisterPressure.
Josef Eisl <josef.eisl@jku.at>
parents: 21561
diff changeset
71 return super.initAllocatable(allocatableRegisters);
21509
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
72 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
73
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
74 @Override
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
75 protected AllocatableRegisters createAllocatableRegisters(Register[] registers) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
76 int min = Integer.MAX_VALUE;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
77 int max = Integer.MIN_VALUE;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
78 for (Register reg : registers) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
79 int number = reg.number;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
80 if (number < min) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
81 min = number;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
82 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
83 if (number > max) {
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
84 max = number;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
85 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
86 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
87 assert min < max;
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
88 return new AllocatableRegisters(registers, min, max);
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
89 }
60cc389e56ee Add AMD64HotSpotRegisterAllocationConfig.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
90 }