Mercurial > hg > truffle
annotate graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java @ 15298:e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Tue, 22 Apr 2014 16:36:16 +0200 |
parents | |
children | 60406b8d6ad1 |
rev | line source |
---|---|
15298
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
1 /* |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
4 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
8 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
14 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
18 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
21 * questions. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
22 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
23 package com.oracle.graal.lir.gen; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
24 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
25 import com.oracle.graal.api.code.*; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
26 import com.oracle.graal.api.meta.*; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
27 import com.oracle.graal.compiler.common.*; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
28 import com.oracle.graal.nodes.*; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
29 import com.oracle.graal.nodes.extended.*; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
30 import com.oracle.graal.nodes.spi.*; |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
31 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
32 public interface LIRGeneratorTool extends ArithmeticLIRGenerator { |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
33 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
34 TargetDescription target(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
35 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
36 MetaAccessProvider getMetaAccess(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
37 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
38 CodeCacheProvider getCodeCache(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
39 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
40 ForeignCallsProvider getForeignCalls(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
41 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
42 Value emitLoad(PlatformKind kind, Value address, Access access); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
43 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
44 void emitStore(PlatformKind kind, Value address, Value input, Access access); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
45 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
46 Value emitCompareAndSwap(Value address, Value expectedValue, Value newValue, Value trueValue, Value falseValue); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
47 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
48 /** |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
49 * Emit an atomic read-and-add instruction. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
50 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
51 * @param address address of the value to be read and written |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
52 * @param delta the value to be added |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
53 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
54 default Value emitAtomicReadAndAdd(Value address, Value delta) { |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
55 throw GraalInternalError.unimplemented(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
56 } |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
57 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
58 /** |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
59 * Emit an atomic read-and-write instruction. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
60 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
61 * @param address address of the value to be read and written |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
62 * @param newValue the new value to be written |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
63 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
64 default Value emitAtomicReadAndWrite(Value address, Value newValue) { |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
65 throw GraalInternalError.unimplemented(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
66 } |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
67 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
68 void emitDeoptimize(Value actionAndReason, Value failedSpeculation, DeoptimizingNode deopting); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
69 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
70 Value emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
71 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
72 /** |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
73 * Checks whether the supplied constant can be used without loading it into a register for most |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
74 * operations, i.e., for commonly used arithmetic, logical, and comparison operations. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
75 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
76 * @param c The constant to check. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
77 * @return True if the constant can be used directly, false if the constant needs to be in a |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
78 * register. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
79 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
80 boolean canInlineConstant(Constant c); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
81 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
82 boolean canStoreConstant(Constant c, boolean isCompressed); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
83 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
84 RegisterAttributes attributes(Register register); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
85 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
86 AllocatableValue newVariable(PlatformKind kind); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
87 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
88 AllocatableValue emitMove(Value input); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
89 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
90 void emitMove(AllocatableValue dst, Value src); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
91 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
92 /** |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
93 * Emits an op that loads the address of some raw data. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
94 * |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
95 * @param dst the variable into which the address is loaded |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
96 * @param data the data to be installed with the generated code |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
97 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
98 void emitData(AllocatableValue dst, byte[] data); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
99 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
100 Value emitAddress(Value base, long displacement, Value index, int scale); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
101 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
102 Value emitAddress(StackSlot slot); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
103 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
104 void emitMembar(int barriers); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
105 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
106 void emitUnwind(Value operand); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
107 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
108 /** |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
109 * Called just before register allocation is performed on the LIR owned by this generator. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
110 * Overriding implementations of this method must call the overridden method. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
111 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
112 void beforeRegisterAllocation(); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
113 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
114 void emitIncomingValues(Value[] params); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
115 |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
116 /** |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
117 * Emits a return instruction. Implementations need to insert a move if the input is not in the |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
118 * correct location. |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
119 */ |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
120 void emitReturn(Value input); |
e4d6c613d552
Move LIRGeneratorTool to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
121 } |