Mercurial > hg > truffle
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 |
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 | 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 } |