annotate src/share/vm/opto/machnode.hpp @ 10185:d50cc62e94ff

8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime. Reviewed-by: twisti, johnc Contributed-by: Martin Doerr <martin.doerr@sap.com>
author johnc
date Wed, 24 Apr 2013 14:48:43 -0700
parents da91efe96a93
children 9758d9f36299
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 4120
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1203
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1203
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1203
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_OPTO_MACHNODE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_OPTO_MACHNODE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "opto/callnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "opto/matcher.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "opto/multnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "opto/node.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "opto/regmask.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class BufferBlob;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class CodeBuffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class JVMState;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class MachCallDynamicJavaNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class MachCallJavaNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class MachCallLeafNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class MachCallNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class MachCallRuntimeNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class MachCallStaticJavaNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class MachEpilogNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class MachIfNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class MachNullCheckNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class MachOper;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class MachProjNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class MachPrologNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class MachReturnNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class MachSafePointNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class MachSpillCopyNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class Matcher;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class PhaseRegAlloc;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class RegMask;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class State;
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 //---------------------------MachOper------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class MachOper : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // Allocate right next to the MachNodes in the same arena
a61af66fc99e Initial load
duke
parents:
diff changeset
61 void *operator new( size_t x, Compile* C ) { return C->node_arena()->Amalloc_D(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
64 virtual uint opcode() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // Number of input edges.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // Generally at least 1
a61af66fc99e Initial load
duke
parents:
diff changeset
68 virtual uint num_edges() const { return 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // Array of Register masks
a61af66fc99e Initial load
duke
parents:
diff changeset
70 virtual const RegMask *in_RegMask(int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Methods to output the encoding of the operand
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Negate conditional branches. Error for non-branch Nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
75 virtual void negate();
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Return the value requested
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // result register lookup, corresponding to int_format
a61af66fc99e Initial load
duke
parents:
diff changeset
79 virtual int reg(PhaseRegAlloc *ra_, const Node *node) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // input register lookup, corresponding to ext_format
a61af66fc99e Initial load
duke
parents:
diff changeset
81 virtual int reg(PhaseRegAlloc *ra_, const Node *node, int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // helpers for MacroAssembler generation from ADLC
a61af66fc99e Initial load
duke
parents:
diff changeset
84 Register as_Register(PhaseRegAlloc *ra_, const Node *node) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 return ::as_Register(reg(ra_, node));
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87 Register as_Register(PhaseRegAlloc *ra_, const Node *node, int idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return ::as_Register(reg(ra_, node, idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 FloatRegister as_FloatRegister(PhaseRegAlloc *ra_, const Node *node) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 return ::as_FloatRegister(reg(ra_, node));
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 FloatRegister as_FloatRegister(PhaseRegAlloc *ra_, const Node *node, int idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 return ::as_FloatRegister(reg(ra_, node, idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 #if defined(IA32) || defined(AMD64)
a61af66fc99e Initial load
duke
parents:
diff changeset
98 XMMRegister as_XMMRegister(PhaseRegAlloc *ra_, const Node *node) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return ::as_XMMRegister(reg(ra_, node));
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 XMMRegister as_XMMRegister(PhaseRegAlloc *ra_, const Node *node, int idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 return ::as_XMMRegister(reg(ra_, node, idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 virtual intptr_t constant() const;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6179
diff changeset
107 virtual relocInfo::relocType constant_reloc() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 virtual jdouble constantD() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 virtual jfloat constantF() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 virtual jlong constantL() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 virtual TypeOopPtr *oop() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 virtual int ccode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // A zero, default, indicates this value is not needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // May need to lookup the base register, as done in int_ and ext_format
a61af66fc99e Initial load
duke
parents:
diff changeset
115 virtual int base (PhaseRegAlloc *ra_, const Node *node, int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 virtual int index(PhaseRegAlloc *ra_, const Node *node, int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 virtual int scale() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Parameters needed to support MEMORY_INTERFACE access to stackSlot
a61af66fc99e Initial load
duke
parents:
diff changeset
119 virtual int disp (PhaseRegAlloc *ra_, const Node *node, int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Check for PC-Relative displacement
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6179
diff changeset
121 virtual relocInfo::relocType disp_reloc() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 virtual int constant_disp() const; // usu. 0, may return Type::OffsetBot
a61af66fc99e Initial load
duke
parents:
diff changeset
123 virtual int base_position() const; // base edge position, or -1
a61af66fc99e Initial load
duke
parents:
diff changeset
124 virtual int index_position() const; // index edge position, or -1
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Access the TypeKlassPtr of operands with a base==RegI and disp==RegP
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Only returns non-null value for i486.ad's indOffset32X
a61af66fc99e Initial load
duke
parents:
diff changeset
128 virtual const TypePtr *disp_as_type() const { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Return the label
a61af66fc99e Initial load
duke
parents:
diff changeset
131 virtual Label *label() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // Return the method's address
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual intptr_t method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Hash and compare over operands are currently identical
a61af66fc99e Initial load
duke
parents:
diff changeset
137 virtual uint hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 virtual uint cmp( const MachOper &oper ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Virtual clone, since I do not know how big the MachOper is.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 virtual MachOper *clone(Compile* C) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Return ideal Type from simple operands. Fail for complex operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 virtual const Type *type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Set an integer offset if we have one, or error otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
147 virtual void set_con( jint c0 ) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Return name of operand
a61af66fc99e Initial load
duke
parents:
diff changeset
151 virtual const char *Name() const { return "???";}
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Methods to output the text version of the operand
a61af66fc99e Initial load
duke
parents:
diff changeset
154 virtual void int_format(PhaseRegAlloc *,const MachNode *node, outputStream *st) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 virtual void ext_format(PhaseRegAlloc *,const MachNode *node,int idx, outputStream *st) const=0;
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 virtual void dump_spec(outputStream *st) const; // Print per-operand info
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
159 };
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 //------------------------------MachNode---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Base type for all machine specific nodes. All node classes generated by the
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // ADLC inherit from this class.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 class MachNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
166 MachNode() : Node((uint)0), _num_opnds(0), _opnds(NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 init_class_id(Class_Mach);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Required boilerplate
a61af66fc99e Initial load
duke
parents:
diff changeset
170 virtual uint size_of() const { return sizeof(MachNode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 virtual int Opcode() const; // Always equal to MachNode
a61af66fc99e Initial load
duke
parents:
diff changeset
172 virtual uint rule() const = 0; // Machine-specific opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Number of inputs which come before the first operand.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Generally at least 1, to skip the Control input
a61af66fc99e Initial load
duke
parents:
diff changeset
175 virtual uint oper_input_base() const { return 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Copy inputs and operands to new node of instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // Called from cisc_version() and short_branch_version().
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // !!!! The method's body is defined in ad_<arch>.cpp file.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void fill_new_machnode(MachNode *n, Compile* C) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Return an equivalent instruction using memory for cisc_operand position
a61af66fc99e Initial load
duke
parents:
diff changeset
183 virtual MachNode *cisc_version(int offset, Compile* C);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Modify this instruction's register mask to use stack version for cisc_operand
a61af66fc99e Initial load
duke
parents:
diff changeset
185 virtual void use_cisc_RegMask();
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Support for short branches
a61af66fc99e Initial load
duke
parents:
diff changeset
188 bool may_be_short_branch() const { return (flags() & Flag_may_be_short_branch) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3842
diff changeset
190 // Avoid back to back some instructions on some CPUs.
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3842
diff changeset
191 bool avoid_back_to_back() const { return (flags() & Flag_avoid_back_to_back) != 0; }
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3842
diff changeset
192
4120
f03a3c8bd5e5 7077312: Provide a CALL effect for instruct declaration in the ad file
roland
parents: 3853
diff changeset
193 // instruction implemented with a call
f03a3c8bd5e5 7077312: Provide a CALL effect for instruct declaration in the ad file
roland
parents: 3853
diff changeset
194 bool has_call() const { return (flags() & Flag_has_call) != 0; }
f03a3c8bd5e5 7077312: Provide a CALL effect for instruct declaration in the ad file
roland
parents: 3853
diff changeset
195
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // First index in _in[] corresponding to operand, or -1 if there is none
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int operand_index(uint operand) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Register class input is expected in
a61af66fc99e Initial load
duke
parents:
diff changeset
200 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // cisc-spillable instructions redefine for use by in_RegMask
a61af66fc99e Initial load
duke
parents:
diff changeset
203 virtual const RegMask *cisc_RegMask() const { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // If this instruction is a 2-address instruction, then return the
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // index of the input which must match the output. Not nessecary
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // for instructions which bind the input and output register to the
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // same singleton regiser (e.g., Intel IDIV which binds AX to be
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // both an input and an output). It is nessecary when the input and
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // output have choices - but they must use the same choice.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 virtual uint two_adr( ) const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Array of complex operand pointers. Each corresponds to zero or
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // more leafs. Must be set by MachNode constructor to point to an
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // internal array of MachOpers. The MachOper array is sized by
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // specific MachNodes described in the ADL.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 uint _num_opnds;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 MachOper **_opnds;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 uint num_opnds() const { return _num_opnds; }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Emit bytes into cbuf
a61af66fc99e Initial load
duke
parents:
diff changeset
222 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Size of instruction in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
224 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Helper function that computes size by emitting code
a61af66fc99e Initial load
duke
parents:
diff changeset
226 virtual uint emit_size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Return the alignment required (in units of relocInfo::addr_unit())
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // for this instruction (must be a power of 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
230 virtual int alignment_required() const { return 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Return the padding (in bytes) to be emitted before this
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // instruction to properly align it.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 virtual int compute_padding(int current_offset) const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Return number of relocatable values contained in this instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
237 virtual int reloc() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Hash and compare over operands. Used to do GVN on machine Nodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 virtual uint hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Expand method for MachNode, replaces nodes representing pseudo
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // instructions with a set of nodes which represent real machine
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // instructions and compute the same value.
1203
844a9d73ec22 6916644: C2 compiler crash on x86
never
parents: 1137
diff changeset
246 virtual MachNode *Expand( State *, Node_List &proj_list, Node* mem ) { return this; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Bottom_type call; value comes from operand0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 virtual const class Type *bottom_type() const { return _opnds[0]->type(); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6179
diff changeset
250 virtual uint ideal_reg() const { const Type *t = _opnds[0]->type(); return t == TypeInt::CC ? Op_RegFlags : t->ideal_reg(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // If this is a memory op, return the base pointer and fixed offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // If there are no such, return NULL. If there are multiple addresses
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // or the address is indeterminate (rare cases) then return (Node*)-1,
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // which serves as node bottom.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // If the offset is not statically determined, set it to Type::OffsetBot.
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // This method is free to ignore stack slots if that helps.
a61af66fc99e Initial load
duke
parents:
diff changeset
258 #define TYPE_PTR_SENTINAL ((const TypePtr*)-1)
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Passing TYPE_PTR_SENTINAL as adr_type asks for computation of the adr_type if possible
a61af66fc99e Initial load
duke
parents:
diff changeset
260 const Node* get_base_and_disp(intptr_t &offset, const TypePtr* &adr_type) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // Helper for get_base_and_disp: find the base and index input nodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Returns the MachOper as determined by memory_operand(), for use, if
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // needed by the caller. If (MachOper *)-1 is returned, base and index
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // are set to NodeSentinel. If (MachOper *) NULL is returned, base and
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // index are set to NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 const MachOper* memory_inputs(Node* &base, Node* &index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Helper for memory_inputs: Which operand carries the necessary info?
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // By default, returns NULL, which means there is no such operand.
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // If it returns (MachOper*)-1, this means there are multiple memories.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 virtual const MachOper* memory_operand() const { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Call "get_base_and_disp" to decide which category of memory is used here.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 virtual const class TypePtr *adr_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Apply peephole rule(s) to this instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
278 virtual MachNode *peephole( Block *block, int block_index, PhaseRegAlloc *ra_, int &deleted, Compile* C );
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // Top-level ideal Opcode matched
a61af66fc99e Initial load
duke
parents:
diff changeset
281 virtual int ideal_Opcode() const { return Op_Node; }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Adds the label for the case
a61af66fc99e Initial load
duke
parents:
diff changeset
284 virtual void add_case_label( int switch_val, Label* blockLabel);
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Set the absolute address for methods
a61af66fc99e Initial load
duke
parents:
diff changeset
287 virtual void method_set( intptr_t addr );
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // Should we clone rather than spill this instruction?
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool rematerialize() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Get the pipeline info
a61af66fc99e Initial load
duke
parents:
diff changeset
293 static const Pipeline *pipeline_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
294 virtual const Pipeline *pipeline() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
297 virtual const char *Name() const = 0; // Machine-specific name
a61af66fc99e Initial load
duke
parents:
diff changeset
298 virtual void dump_spec(outputStream *st) const; // Print per-node info
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void dump_format(PhaseRegAlloc *ra, outputStream *st) const; // access to virtual
a61af66fc99e Initial load
duke
parents:
diff changeset
300 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
301 };
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 //------------------------------MachIdealNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Machine specific versions of nodes that must be defined by user.
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // These are not converted by matcher from ideal nodes to machine nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // but are inserted into the code by the compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 class MachIdealNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
309 MachIdealNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Define the following defaults for non-matched machine nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
312 virtual uint oper_input_base() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 virtual uint rule() const { return 9999999; }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 virtual const class Type *bottom_type() const { return _opnds == NULL ? Type::CONTROL : MachNode::bottom_type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 };
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 //------------------------------MachTypeNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Machine Nodes that need to retain a known Type.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 class MachTypeNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 virtual uint size_of() const { return sizeof(*this); } // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
321 public:
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 4120
diff changeset
322 MachTypeNode( ) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 const Type *_bottom_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 virtual const class Type *bottom_type() const { return _bottom_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
327 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
329 };
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 //------------------------------MachBreakpointNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Machine breakpoint or interrupt Node
a61af66fc99e Initial load
duke
parents:
diff changeset
333 class MachBreakpointNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
335 MachBreakpointNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
336 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
337 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
340 virtual const char *Name() const { return "Breakpoint"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
341 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
343 };
a61af66fc99e Initial load
duke
parents:
diff changeset
344
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
345 //------------------------------MachConstantBaseNode--------------------------
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
346 // Machine node that represents the base address of the constant table.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
347 class MachConstantBaseNode : public MachIdealNode {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
348 public:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
349 static const RegMask& _out_RegMask; // We need the out_RegMask statically in MachConstantNode::in_RegMask().
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
350
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
351 public:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
352 MachConstantBaseNode() : MachIdealNode() {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
353 init_class_id(Class_MachConstantBase);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
354 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
355 virtual const class Type* bottom_type() const { return TypeRawPtr::NOTNULL; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
356 virtual uint ideal_reg() const { return Op_RegP; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
357 virtual uint oper_input_base() const { return 1; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
358
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
359 virtual void emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
360 virtual uint size(PhaseRegAlloc* ra_) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
361 virtual bool pinned() const { return UseRDPCForConstantTableBase; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
362
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
363 static const RegMask& static_out_RegMask() { return _out_RegMask; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
364 virtual const RegMask& out_RegMask() const { return static_out_RegMask(); }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
365
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
366 #ifndef PRODUCT
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
367 virtual const char* Name() const { return "MachConstantBaseNode"; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
368 virtual void format(PhaseRegAlloc*, outputStream* st) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
369 #endif
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
370 };
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
371
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
372 //------------------------------MachConstantNode-------------------------------
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
373 // Machine node that holds a constant which is stored in the constant table.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 4120
diff changeset
374 class MachConstantNode : public MachTypeNode {
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
375 protected:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
376 Compile::Constant _constant; // This node's constant.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
377
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
378 public:
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 4120
diff changeset
379 MachConstantNode() : MachTypeNode() {
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
380 init_class_id(Class_MachConstant);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
381 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
382
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
383 virtual void eval_constant(Compile* C) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
384 #ifdef ASSERT
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
385 tty->print("missing MachConstantNode eval_constant function: ");
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
386 dump();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
387 #endif
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
388 ShouldNotCallThis();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
389 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
390
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
391 virtual const RegMask &in_RegMask(uint idx) const {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
392 if (idx == mach_constant_base_node_input())
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
393 return MachConstantBaseNode::static_out_RegMask();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
394 return MachNode::in_RegMask(idx);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
395 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
396
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
397 // Input edge of MachConstantBaseNode.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
398 uint mach_constant_base_node_input() const { return req() - 1; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
399
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
400 int constant_offset();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
401 int constant_offset() const { return ((MachConstantNode*) this)->constant_offset(); }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
402 };
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
403
0
a61af66fc99e Initial load
duke
parents:
diff changeset
404 //------------------------------MachUEPNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Machine Unvalidated Entry Point Node
a61af66fc99e Initial load
duke
parents:
diff changeset
406 class MachUEPNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
408 MachUEPNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
409 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
413 virtual const char *Name() const { return "Unvalidated-Entry-Point"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
416 };
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 //------------------------------MachPrologNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // Machine function Prolog Node
a61af66fc99e Initial load
duke
parents:
diff changeset
420 class MachPrologNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
421 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
422 MachPrologNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
423 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
425 virtual int reloc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
428 virtual const char *Name() const { return "Prolog"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
429 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
431 };
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 //------------------------------MachEpilogNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // Machine function Epilog Node
a61af66fc99e Initial load
duke
parents:
diff changeset
435 class MachEpilogNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
437 MachEpilogNode(bool do_poll = false) : _do_polling(do_poll) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
438 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
439 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 virtual int reloc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 virtual const Pipeline *pipeline() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
444 bool _do_polling;
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
447 bool do_polling() const { return _do_polling; }
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Offset of safepoint from the beginning of the node
a61af66fc99e Initial load
duke
parents:
diff changeset
450 int safepoint_offset() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
453 virtual const char *Name() const { return "Epilog"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
455 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
456 };
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 //------------------------------MachNopNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // Machine function Nop Node
a61af66fc99e Initial load
duke
parents:
diff changeset
460 class MachNopNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
462 int _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
464 MachNopNode( ) : _count(1) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
465 MachNopNode( int count ) : _count(count) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 virtual const class Type *bottom_type() const { return Type::CONTROL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 virtual int ideal_Opcode() const { return Op_Con; } // bogus; see output.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
472 virtual const Pipeline *pipeline() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
474 virtual const char *Name() const { return "Nop"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
475 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 virtual void dump_spec(outputStream *st) const { } // No per-operand info
a61af66fc99e Initial load
duke
parents:
diff changeset
477 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
478 };
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 //------------------------------MachSpillCopyNode------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Machine SpillCopy Node. Copies 1 or 2 words from any location to any
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // location (stack or register).
a61af66fc99e Initial load
duke
parents:
diff changeset
483 class MachSpillCopyNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 const RegMask *_in; // RegMask for input
a61af66fc99e Initial load
duke
parents:
diff changeset
485 const RegMask *_out; // RegMask for output
a61af66fc99e Initial load
duke
parents:
diff changeset
486 const Type *_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
488 MachSpillCopyNode( Node *n, const RegMask &in, const RegMask &out ) :
a61af66fc99e Initial load
duke
parents:
diff changeset
489 MachIdealNode(), _in(&in), _out(&out), _type(n->bottom_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 init_class_id(Class_MachSpillCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
491 init_flags(Flag_is_Copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
493 add_req(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void set_out_RegMask(const RegMask &out) { _out = &out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void set_in_RegMask(const RegMask &in) { _in = &in; }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 virtual const RegMask &out_RegMask() const { return *_out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 virtual const RegMask &in_RegMask(uint) const { return *_in; }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 virtual const class Type *bottom_type() const { return _type; }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6179
diff changeset
501 virtual uint ideal_reg() const { return _type->ideal_reg(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
502 virtual uint oper_input_base() const { return 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 uint implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
509 virtual const char *Name() const { return "MachSpillCopy"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
510 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
511 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
512 };
a61af66fc99e Initial load
duke
parents:
diff changeset
513
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
514 //------------------------------MachBranchNode--------------------------------
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
515 // Abstract machine branch Node
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
516 class MachBranchNode : public MachIdealNode {
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
517 public:
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
518 MachBranchNode() : MachIdealNode() {
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
519 init_class_id(Class_MachBranch);
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
520 }
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
521 virtual void label_set(Label* label, uint block_num) = 0;
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
522 virtual void save_label(Label** label, uint* block_num) = 0;
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
523
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
524 // Support for short branches
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
525 virtual MachNode *short_branch_version(Compile* C) { return NULL; }
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
526
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
527 virtual bool pinned() const { return true; };
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
528 };
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
529
0
a61af66fc99e Initial load
duke
parents:
diff changeset
530 //------------------------------MachNullChkNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // Machine-dependent null-pointer-check Node. Points a real MachNode that is
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // also some kind of memory op. Turns the indicated MachNode into a
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // conditional branch with good latency on the ptr-not-null path and awful
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // latency on the pointer-is-null path.
a61af66fc99e Initial load
duke
parents:
diff changeset
535
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
536 class MachNullCheckNode : public MachBranchNode {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
537 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
538 const uint _vidx; // Index of memop being tested
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
539 MachNullCheckNode( Node *ctrl, Node *memop, uint vidx ) : MachBranchNode(), _vidx(vidx) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 init_class_id(Class_MachNullCheck);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 add_req(ctrl);
a61af66fc99e Initial load
duke
parents:
diff changeset
542 add_req(memop);
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
544 virtual uint size_of() const { return sizeof(*this); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2008
diff changeset
547 virtual void label_set(Label* label, uint block_num);
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
548 virtual void save_label(Label** label, uint* block_num);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 virtual void negate() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
550 virtual const class Type *bottom_type() const { return TypeTuple::IFBOTH; }
a61af66fc99e Initial load
duke
parents:
diff changeset
551 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 virtual const RegMask &out_RegMask() const { return RegMask::Empty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
555 virtual const char *Name() const { return "NullCheck"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
558 };
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 //------------------------------MachProjNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // Machine-dependent Ideal projections (how is that for an oxymoron). Really
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // just MachNodes made by the Ideal world that replicate simple projections
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // but with machine-dependent input & output register masks. Generally
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // produced as part of calling conventions. Normally I make MachNodes as part
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // of the Matcher process, but the Matcher is ill suited to issues involving
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // frame handling, so frame handling is all done in the Ideal world with
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // occasional callbacks to the machine model for important info.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 class MachProjNode : public ProjNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 public:
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
570 MachProjNode( Node *multi, uint con, const RegMask &out, uint ideal_reg ) : ProjNode(multi,con), _rout(out), _ideal_reg(ideal_reg) {
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
571 init_class_id(Class_MachProj);
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
572 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
573 RegMask _rout;
a61af66fc99e Initial load
duke
parents:
diff changeset
574 const uint _ideal_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
575 enum projType {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 unmatched_proj = 0, // Projs for Control, I/O, memory not matched
a61af66fc99e Initial load
duke
parents:
diff changeset
577 fat_proj = 999 // Projs killing many regs, defined by _rout
a61af66fc99e Initial load
duke
parents:
diff changeset
578 };
a61af66fc99e Initial load
duke
parents:
diff changeset
579 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 virtual const TypePtr *adr_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 virtual const RegMask &in_RegMask(uint) const { return RegMask::Empty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
583 virtual const RegMask &out_RegMask() const { return _rout; }
a61af66fc99e Initial load
duke
parents:
diff changeset
584 virtual uint ideal_reg() const { return _ideal_reg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // Need size_of() for virtual ProjNode::clone()
a61af66fc99e Initial load
duke
parents:
diff changeset
586 virtual uint size_of() const { return sizeof(MachProjNode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
587 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
588 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
589 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
590 };
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 //------------------------------MachIfNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // Machine-specific versions of IfNodes
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
594 class MachIfNode : public MachBranchNode {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 virtual uint size_of() const { return sizeof(*this); } // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
596 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
597 float _prob; // Probability branch goes either way
a61af66fc99e Initial load
duke
parents:
diff changeset
598 float _fcnt; // Frequency counter
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
599 MachIfNode() : MachBranchNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600 init_class_id(Class_MachIf);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
602 // Negate conditional branches.
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
603 virtual void negate() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
604 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
605 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
607 };
a61af66fc99e Initial load
duke
parents:
diff changeset
608
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
609 //------------------------------MachGotoNode-----------------------------------
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
610 // Machine-specific versions of GotoNodes
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
611 class MachGotoNode : public MachBranchNode {
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
612 public:
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
613 MachGotoNode() : MachBranchNode() {
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
614 init_class_id(Class_MachGoto);
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
615 }
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
616 };
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
617
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618 //------------------------------MachFastLockNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Machine-specific versions of FastLockNodes
a61af66fc99e Initial load
duke
parents:
diff changeset
620 class MachFastLockNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
621 virtual uint size_of() const { return sizeof(*this); } // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
622 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
623 BiasedLockingCounters* _counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 MachFastLockNode() : MachNode() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
626 };
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 //------------------------------MachReturnNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Machine-specific versions of subroutine returns
a61af66fc99e Initial load
duke
parents:
diff changeset
630 class MachReturnNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
632 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
633 RegMask *_in_rms; // Input register masks, set during allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
634 ReallocMark _nesting; // assertion check for reallocations
a61af66fc99e Initial load
duke
parents:
diff changeset
635 const TypePtr* _adr_type; // memory effects of call or return
a61af66fc99e Initial load
duke
parents:
diff changeset
636 MachReturnNode() : MachNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 init_class_id(Class_MachReturn);
a61af66fc99e Initial load
duke
parents:
diff changeset
638 _adr_type = TypePtr::BOTTOM; // the default: all of memory
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 void set_adr_type(const TypePtr* atp) { _adr_type = atp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 virtual bool pinned() const { return true; };
a61af66fc99e Initial load
duke
parents:
diff changeset
645 virtual const TypePtr *adr_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 };
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 //------------------------------MachSafePointNode-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // Machine-specific versions of safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
650 class MachSafePointNode : public MachReturnNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
652 OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
653 JVMState* _jvms; // Pointer to list of JVM State Objects
a61af66fc99e Initial load
duke
parents:
diff changeset
654 uint _jvmadj; // Extra delta to jvms indexes (mach. args)
a61af66fc99e Initial load
duke
parents:
diff changeset
655 OopMap* oop_map() const { return _oop_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
656 void set_oop_map(OopMap* om) { _oop_map = om; }
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 MachSafePointNode() : MachReturnNode(), _oop_map(NULL), _jvms(NULL), _jvmadj(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
659 init_class_id(Class_MachSafePoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 virtual JVMState* jvms() const { return _jvms; }
a61af66fc99e Initial load
duke
parents:
diff changeset
663 void set_jvms(JVMState* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 _jvms = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // Functionality from old debug nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
671 Node *returnadr() const { return in(TypeFunc::ReturnAdr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
672 Node *frameptr () const { return in(TypeFunc::FramePtr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674 Node *local(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
676 return in(_jvmadj + jvms->locoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
678 Node *stack(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
680 return in(_jvmadj + jvms->stkoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682 Node *monitor_obj(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
683 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
684 return in(_jvmadj + jvms->monitor_obj_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 Node *monitor_box(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
688 return in(_jvmadj + jvms->monitor_box_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
690 void set_local(const JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
692 set_req(_jvmadj + jvms->locoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
694 void set_stack(const JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
696 set_req(_jvmadj + jvms->stkoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 void set_monitor(const JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
700 set_req(_jvmadj + jvms->monoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702 };
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 //------------------------------MachCallNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // Machine-specific versions of subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
706 class MachCallNode : public MachSafePointNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
708 virtual uint hash() const { return NO_HASH; } // CFG nodes do not hash
a61af66fc99e Initial load
duke
parents:
diff changeset
709 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
710 virtual uint size_of() const = 0; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
711 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
712 const TypeFunc *_tf; // Function type
a61af66fc99e Initial load
duke
parents:
diff changeset
713 address _entry_point; // Address of the method being called
a61af66fc99e Initial load
duke
parents:
diff changeset
714 float _cnt; // Estimate of number of times called
a61af66fc99e Initial load
duke
parents:
diff changeset
715 uint _argsize; // Size of argument block on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 const TypeFunc* tf() const { return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 const address entry_point() const { return _entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
719 const float cnt() const { return _cnt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 uint argsize() const { return _argsize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 void set_tf(const TypeFunc* tf) { _tf = tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 void set_entry_point(address p) { _entry_point = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 void set_cnt(float c) { _cnt = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
725 void set_argsize(int s) { _argsize = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 MachCallNode() : MachSafePointNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 init_class_id(Class_MachCall);
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
732 virtual bool pinned() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
733 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
734 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 virtual int ret_addr_offset() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 bool returns_long() const { return tf()->return_type() == T_LONG; }
a61af66fc99e Initial load
duke
parents:
diff changeset
738 bool return_value_is_used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
739 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
740 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
742 };
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 //------------------------------MachCallJavaNode------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // "Base" class for machine-specific versions of subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
746 class MachCallJavaNode : public MachCallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
748 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
750 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
751 ciMethod* _method; // Method being direct called
a61af66fc99e Initial load
duke
parents:
diff changeset
752 int _bci; // Byte Code index of call byte code
a61af66fc99e Initial load
duke
parents:
diff changeset
753 bool _optimized_virtual; // Tells if node is a static call or an optimized virtual
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
754 bool _method_handle_invoke; // Tells if the call has to preserve SP
0
a61af66fc99e Initial load
duke
parents:
diff changeset
755 MachCallJavaNode() : MachCallNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
756 init_class_id(Class_MachCallJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 }
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
758
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
759 virtual const RegMask &in_RegMask(uint) const;
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
760
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
762 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
763 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
764 };
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766 //------------------------------MachCallStaticJavaNode------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // Machine-specific versions of monomorphic subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
768 class MachCallStaticJavaNode : public MachCallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
769 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
771 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
772 const char *_name; // Runtime wrapper name
a61af66fc99e Initial load
duke
parents:
diff changeset
773 MachCallStaticJavaNode() : MachCallJavaNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 init_class_id(Class_MachCallStaticJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // If this is an uncommon trap, return the request code, else zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
778 int uncommon_trap_request() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 virtual int ret_addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
781 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
782 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 void dump_trap_args(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
785 };
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 //------------------------------MachCallDynamicJavaNode------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Machine-specific versions of possibly megamorphic subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
789 class MachCallDynamicJavaNode : public MachCallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
791 int _vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 MachCallDynamicJavaNode() : MachCallJavaNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 init_class_id(Class_MachCallDynamicJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 DEBUG_ONLY(_vtable_index = -99); // throw an assert if uninitialized
a61af66fc99e Initial load
duke
parents:
diff changeset
795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
796 virtual int ret_addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
797 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
798 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
799 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
800 };
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 //------------------------------MachCallRuntimeNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // Machine-specific versions of subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
804 class MachCallRuntimeNode : public MachCallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
806 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
807 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
808 const char *_name; // Printable name, if _method is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
809 MachCallRuntimeNode() : MachCallNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 init_class_id(Class_MachCallRuntime);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 virtual int ret_addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
813 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
814 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
816 };
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 class MachCallLeafNode: public MachCallRuntimeNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
820 MachCallLeafNode() : MachCallRuntimeNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 init_class_id(Class_MachCallLeaf);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
823 };
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 //------------------------------MachHaltNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
826 // Machine-specific versions of halt nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
827 class MachHaltNode : public MachReturnNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
828 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
829 virtual JVMState* jvms() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
830 };
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 //------------------------------MachTempNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // Node used by the adlc to construct inputs to represent temporary registers
a61af66fc99e Initial load
duke
parents:
diff changeset
835 class MachTempNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
837 MachOper *_opnd_array[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
840 virtual const RegMask &out_RegMask() const { return *_opnds[0]->in_RegMask(0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
841 virtual uint rule() const { return 9999999; }
a61af66fc99e Initial load
duke
parents:
diff changeset
842 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {}
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 MachTempNode(MachOper* oper) {
a61af66fc99e Initial load
duke
parents:
diff changeset
845 init_class_id(Class_MachTemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 _num_opnds = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
847 _opnds = _opnd_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
848 add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
849 _opnds[0] = oper;
a61af66fc99e Initial load
duke
parents:
diff changeset
850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
851 virtual uint size_of() const { return sizeof(MachTempNode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
852
a61af66fc99e Initial load
duke
parents:
diff changeset
853 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
854 virtual void format(PhaseRegAlloc *, outputStream *st ) const {}
a61af66fc99e Initial load
duke
parents:
diff changeset
855 virtual const char *Name() const { return "MachTemp";}
a61af66fc99e Initial load
duke
parents:
diff changeset
856 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
857 };
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 //------------------------------labelOper--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // Machine-independent version of label operand
a61af66fc99e Initial load
duke
parents:
diff changeset
863 class labelOper : public MachOper {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
865 virtual uint num_edges() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
866 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
867 // Supported for fixed size branches
a61af66fc99e Initial load
duke
parents:
diff changeset
868 Label* _label; // Label for branch(es)
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 uint _block_num;
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 labelOper() : _block_num(0), _label(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 labelOper(Label* label, uint block_num) : _label(label), _block_num(block_num) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 labelOper(labelOper* l) : _label(l->_label) , _block_num(l->_block_num) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 virtual MachOper *clone(Compile* C) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
879
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2008
diff changeset
880 virtual Label *label() const { assert(_label != NULL, "need Label"); return _label; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 virtual uint opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884 virtual uint hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 virtual uint cmp( const MachOper &oper ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
887 virtual const char *Name() const { return "Label";}
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 virtual void int_format(PhaseRegAlloc *ra, const MachNode *node, outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 virtual void ext_format(PhaseRegAlloc *ra, const MachNode *node, int idx, outputStream *st) const { int_format( ra, node, st ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
891 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
892 };
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894
a61af66fc99e Initial load
duke
parents:
diff changeset
895 //------------------------------methodOper--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // Machine-independent version of method operand
a61af66fc99e Initial load
duke
parents:
diff changeset
897 class methodOper : public MachOper {
a61af66fc99e Initial load
duke
parents:
diff changeset
898 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
899 virtual uint num_edges() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
900 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
901 intptr_t _method; // Address of method
a61af66fc99e Initial load
duke
parents:
diff changeset
902 methodOper() : _method(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
903 methodOper(intptr_t method) : _method(method) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 virtual MachOper *clone(Compile* C) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 virtual intptr_t method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 virtual uint opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 virtual uint hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
912 virtual uint cmp( const MachOper &oper ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
913 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
914 virtual const char *Name() const { return "Method";}
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 virtual void int_format(PhaseRegAlloc *ra, const MachNode *node, outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
917 virtual void ext_format(PhaseRegAlloc *ra, const MachNode *node, int idx, outputStream *st) const { int_format( ra, node, st ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
918 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
919 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
920
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
921 #endif // SHARE_VM_OPTO_MACHNODE_HPP