annotate src/share/vm/opto/machnode.hpp @ 4710:41406797186b

7113012: G1: rename not-fully-young GCs as "mixed" Summary: Renamed partially-young GCs as mixed and fully-young GCs as young. Change all external output that includes those terms (GC log and GC ergo log) as well as any comments, fields, methods, etc. The changeset also includes very minor code tidying up (added some curly brackets). Reviewed-by: johnc, brutisso
author tonyp
date Fri, 16 Dec 2011 02:14:27 -0500
parents f03a3c8bd5e5
children 8c92982cbbc4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1203
diff changeset
2 * Copyright (c) 1997, 2010, 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;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 virtual bool constant_is_oop() const;
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
a61af66fc99e Initial load
duke
parents:
diff changeset
121 virtual bool disp_is_oop() const;
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(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 virtual uint ideal_reg() const { const Type *t = _opnds[0]->type(); return t == TypeInt::CC ? Op_RegFlags : Matcher::base2reg[t->base()]; }
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:
a61af66fc99e Initial load
duke
parents:
diff changeset
322 const Type *_bottom_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 virtual const class Type *bottom_type() const { return _bottom_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
326 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
327 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
328 };
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 //------------------------------MachBreakpointNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // Machine breakpoint or interrupt Node
a61af66fc99e Initial load
duke
parents:
diff changeset
332 class MachBreakpointNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
334 MachBreakpointNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
335 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
339 virtual const char *Name() const { return "Breakpoint"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
340 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
342 };
a61af66fc99e Initial load
duke
parents:
diff changeset
343
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
344 //------------------------------MachConstantBaseNode--------------------------
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
345 // 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
346 class MachConstantBaseNode : public MachIdealNode {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
347 public:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
348 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
349
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
350 public:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
351 MachConstantBaseNode() : MachIdealNode() {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
352 init_class_id(Class_MachConstantBase);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
353 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
354 virtual const class Type* bottom_type() const { return TypeRawPtr::NOTNULL; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
355 virtual uint ideal_reg() const { return Op_RegP; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
356 virtual uint oper_input_base() const { return 1; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
357
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
358 virtual void emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
359 virtual uint size(PhaseRegAlloc* ra_) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
360 virtual bool pinned() const { return UseRDPCForConstantTableBase; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
361
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
362 static const RegMask& static_out_RegMask() { return _out_RegMask; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
363 virtual const RegMask& out_RegMask() const { return static_out_RegMask(); }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
364
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
365 #ifndef PRODUCT
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
366 virtual const char* Name() const { return "MachConstantBaseNode"; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
367 virtual void format(PhaseRegAlloc*, outputStream* st) const;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
368 #endif
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
369 };
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 //------------------------------MachConstantNode-------------------------------
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
372 // Machine node that holds a constant which is stored in the constant table.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
373 class MachConstantNode : public MachNode {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
374 protected:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
375 Compile::Constant _constant; // This node's constant.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
376
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
377 public:
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
378 MachConstantNode() : MachNode() {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
379 init_class_id(Class_MachConstant);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
380 }
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 virtual void eval_constant(Compile* C) {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
383 #ifdef ASSERT
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
384 tty->print("missing MachConstantNode eval_constant function: ");
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
385 dump();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
386 #endif
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
387 ShouldNotCallThis();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
388 }
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 virtual const RegMask &in_RegMask(uint idx) const {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
391 if (idx == mach_constant_base_node_input())
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
392 return MachConstantBaseNode::static_out_RegMask();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
393 return MachNode::in_RegMask(idx);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
394 }
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 // Input edge of MachConstantBaseNode.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
397 uint mach_constant_base_node_input() const { return req() - 1; }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
398
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
399 int constant_offset();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
400 int constant_offset() const { return ((MachConstantNode*) this)->constant_offset(); }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
401 };
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1972
diff changeset
402
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 //------------------------------MachUEPNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Machine Unvalidated Entry Point Node
a61af66fc99e Initial load
duke
parents:
diff changeset
405 class MachUEPNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
407 MachUEPNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
408 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
412 virtual const char *Name() const { return "Unvalidated-Entry-Point"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
415 };
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 //------------------------------MachPrologNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // Machine function Prolog Node
a61af66fc99e Initial load
duke
parents:
diff changeset
419 class MachPrologNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
421 MachPrologNode( ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
422 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
423 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
424 virtual int reloc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
427 virtual const char *Name() const { return "Prolog"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
428 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
430 };
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 //------------------------------MachEpilogNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // Machine function Epilog Node
a61af66fc99e Initial load
duke
parents:
diff changeset
434 class MachEpilogNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
436 MachEpilogNode(bool do_poll = false) : _do_polling(do_poll) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
437 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
439 virtual int reloc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 virtual const Pipeline *pipeline() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
443 bool _do_polling;
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
446 bool do_polling() const { return _do_polling; }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // Offset of safepoint from the beginning of the node
a61af66fc99e Initial load
duke
parents:
diff changeset
449 int safepoint_offset() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
452 virtual const char *Name() const { return "Epilog"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
453 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
455 };
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 //------------------------------MachNopNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Machine function Nop Node
a61af66fc99e Initial load
duke
parents:
diff changeset
459 class MachNopNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
461 int _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
463 MachNopNode( ) : _count(1) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
464 MachNopNode( int count ) : _count(count) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
465 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 virtual const class Type *bottom_type() const { return Type::CONTROL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 virtual int ideal_Opcode() const { return Op_Con; } // bogus; see output.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
471 virtual const Pipeline *pipeline() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
473 virtual const char *Name() const { return "Nop"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
474 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 virtual void dump_spec(outputStream *st) const { } // No per-operand info
a61af66fc99e Initial load
duke
parents:
diff changeset
476 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
477 };
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 //------------------------------MachSpillCopyNode------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Machine SpillCopy Node. Copies 1 or 2 words from any location to any
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // location (stack or register).
a61af66fc99e Initial load
duke
parents:
diff changeset
482 class MachSpillCopyNode : public MachIdealNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 const RegMask *_in; // RegMask for input
a61af66fc99e Initial load
duke
parents:
diff changeset
484 const RegMask *_out; // RegMask for output
a61af66fc99e Initial load
duke
parents:
diff changeset
485 const Type *_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
487 MachSpillCopyNode( Node *n, const RegMask &in, const RegMask &out ) :
a61af66fc99e Initial load
duke
parents:
diff changeset
488 MachIdealNode(), _in(&in), _out(&out), _type(n->bottom_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
489 init_class_id(Class_MachSpillCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
490 init_flags(Flag_is_Copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
491 add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 add_req(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
495 void set_out_RegMask(const RegMask &out) { _out = &out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void set_in_RegMask(const RegMask &in) { _in = &in; }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 virtual const RegMask &out_RegMask() const { return *_out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 virtual const RegMask &in_RegMask(uint) const { return *_in; }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 virtual const class Type *bottom_type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 virtual uint ideal_reg() const { return Matcher::base2reg[_type->base()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 virtual uint oper_input_base() const { return 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
502 uint implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 virtual uint size(PhaseRegAlloc *ra_) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
508 virtual const char *Name() const { return "MachSpillCopy"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
511 };
a61af66fc99e Initial load
duke
parents:
diff changeset
512
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
513 //------------------------------MachBranchNode--------------------------------
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
514 // Abstract machine branch Node
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
515 class MachBranchNode : public MachIdealNode {
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
516 public:
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
517 MachBranchNode() : MachIdealNode() {
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
518 init_class_id(Class_MachBranch);
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
519 }
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
520 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
521 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
522
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
523 // Support for short branches
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
524 virtual MachNode *short_branch_version(Compile* C) { return NULL; }
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
525
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
526 virtual bool pinned() const { return true; };
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
527 };
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
528
0
a61af66fc99e Initial load
duke
parents:
diff changeset
529 //------------------------------MachNullChkNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // Machine-dependent null-pointer-check Node. Points a real MachNode that is
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // also some kind of memory op. Turns the indicated MachNode into a
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // conditional branch with good latency on the ptr-not-null path and awful
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // latency on the pointer-is-null path.
a61af66fc99e Initial load
duke
parents:
diff changeset
534
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
535 class MachNullCheckNode : public MachBranchNode {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
536 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
537 const uint _vidx; // Index of memop being tested
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
538 MachNullCheckNode( Node *ctrl, Node *memop, uint vidx ) : MachBranchNode(), _vidx(vidx) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539 init_class_id(Class_MachNullCheck);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 add_req(ctrl);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 add_req(memop);
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
543 virtual uint size_of() const { return sizeof(*this); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2008
diff changeset
546 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
547 virtual void save_label(Label** label, uint* block_num);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
548 virtual void negate() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 virtual const class Type *bottom_type() const { return TypeTuple::IFBOTH; }
a61af66fc99e Initial load
duke
parents:
diff changeset
550 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
551 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 virtual const RegMask &out_RegMask() const { return RegMask::Empty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
554 virtual const char *Name() const { return "NullCheck"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 virtual void format( PhaseRegAlloc *, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
557 };
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 //------------------------------MachProjNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Machine-dependent Ideal projections (how is that for an oxymoron). Really
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // just MachNodes made by the Ideal world that replicate simple projections
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // but with machine-dependent input & output register masks. Generally
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // produced as part of calling conventions. Normally I make MachNodes as part
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // of the Matcher process, but the Matcher is ill suited to issues involving
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // frame handling, so frame handling is all done in the Ideal world with
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // occasional callbacks to the machine model for important info.
a61af66fc99e Initial load
duke
parents:
diff changeset
567 class MachProjNode : public ProjNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
568 public:
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
569 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
570 init_class_id(Class_MachProj);
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
571 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572 RegMask _rout;
a61af66fc99e Initial load
duke
parents:
diff changeset
573 const uint _ideal_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
574 enum projType {
a61af66fc99e Initial load
duke
parents:
diff changeset
575 unmatched_proj = 0, // Projs for Control, I/O, memory not matched
a61af66fc99e Initial load
duke
parents:
diff changeset
576 fat_proj = 999 // Projs killing many regs, defined by _rout
a61af66fc99e Initial load
duke
parents:
diff changeset
577 };
a61af66fc99e Initial load
duke
parents:
diff changeset
578 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
579 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 virtual const TypePtr *adr_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 virtual const RegMask &in_RegMask(uint) const { return RegMask::Empty; }
a61af66fc99e Initial load
duke
parents:
diff changeset
582 virtual const RegMask &out_RegMask() const { return _rout; }
a61af66fc99e Initial load
duke
parents:
diff changeset
583 virtual uint ideal_reg() const { return _ideal_reg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // Need size_of() for virtual ProjNode::clone()
a61af66fc99e Initial load
duke
parents:
diff changeset
585 virtual uint size_of() const { return sizeof(MachProjNode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
587 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
589 };
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 //------------------------------MachIfNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // Machine-specific versions of IfNodes
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
593 class MachIfNode : public MachBranchNode {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 virtual uint size_of() const { return sizeof(*this); } // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
595 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
596 float _prob; // Probability branch goes either way
a61af66fc99e Initial load
duke
parents:
diff changeset
597 float _fcnt; // Frequency counter
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
598 MachIfNode() : MachBranchNode() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 init_class_id(Class_MachIf);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
601 // Negate conditional branches.
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
602 virtual void negate() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
603 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
604 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
606 };
a61af66fc99e Initial load
duke
parents:
diff changeset
607
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
608 //------------------------------MachGotoNode-----------------------------------
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
609 // Machine-specific versions of GotoNodes
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
610 class MachGotoNode : public MachBranchNode {
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
611 public:
3853
11211f7cb5a0 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 3851
diff changeset
612 MachGotoNode() : MachBranchNode() {
3842
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
613 init_class_id(Class_MachGoto);
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
614 }
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
615 };
c7b60b601eb4 7069452: Cleanup NodeFlags
kvn
parents: 3839
diff changeset
616
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617 //------------------------------MachFastLockNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // Machine-specific versions of FastLockNodes
a61af66fc99e Initial load
duke
parents:
diff changeset
619 class MachFastLockNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 virtual uint size_of() const { return sizeof(*this); } // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
621 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
622 BiasedLockingCounters* _counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 MachFastLockNode() : MachNode() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
625 };
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 //------------------------------MachReturnNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // Machine-specific versions of subroutine returns
a61af66fc99e Initial load
duke
parents:
diff changeset
629 class MachReturnNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
630 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
631 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
632 RegMask *_in_rms; // Input register masks, set during allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
633 ReallocMark _nesting; // assertion check for reallocations
a61af66fc99e Initial load
duke
parents:
diff changeset
634 const TypePtr* _adr_type; // memory effects of call or return
a61af66fc99e Initial load
duke
parents:
diff changeset
635 MachReturnNode() : MachNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 init_class_id(Class_MachReturn);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 _adr_type = TypePtr::BOTTOM; // the default: all of memory
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 void set_adr_type(const TypePtr* atp) { _adr_type = atp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
643 virtual bool pinned() const { return true; };
a61af66fc99e Initial load
duke
parents:
diff changeset
644 virtual const TypePtr *adr_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 };
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 //------------------------------MachSafePointNode-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // Machine-specific versions of safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
649 class MachSafePointNode : public MachReturnNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
650 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
651 OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
652 JVMState* _jvms; // Pointer to list of JVM State Objects
a61af66fc99e Initial load
duke
parents:
diff changeset
653 uint _jvmadj; // Extra delta to jvms indexes (mach. args)
a61af66fc99e Initial load
duke
parents:
diff changeset
654 OopMap* oop_map() const { return _oop_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
655 void set_oop_map(OopMap* om) { _oop_map = om; }
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 MachSafePointNode() : MachReturnNode(), _oop_map(NULL), _jvms(NULL), _jvmadj(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 init_class_id(Class_MachSafePoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 virtual JVMState* jvms() const { return _jvms; }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 void set_jvms(JVMState* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 _jvms = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // Functionality from old debug nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
670 Node *returnadr() const { return in(TypeFunc::ReturnAdr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 Node *frameptr () const { return in(TypeFunc::FramePtr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 Node *local(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
675 return in(_jvmadj + jvms->locoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677 Node *stack(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
679 return in(_jvmadj + jvms->stkoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
681 Node *monitor_obj(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
683 return in(_jvmadj + jvms->monitor_obj_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 Node *monitor_box(const JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
686 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
687 return in(_jvmadj + jvms->monitor_box_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689 void set_local(const JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
690 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
691 set_req(_jvmadj + jvms->locoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
693 void set_stack(const JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
695 set_req(_jvmadj + jvms->stkoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
697 void set_monitor(const JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
699 set_req(_jvmadj + jvms->monoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
701 };
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 //------------------------------MachCallNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Machine-specific versions of subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
705 class MachCallNode : public MachSafePointNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
707 virtual uint hash() const { return NO_HASH; } // CFG nodes do not hash
a61af66fc99e Initial load
duke
parents:
diff changeset
708 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 virtual uint size_of() const = 0; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
710 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
711 const TypeFunc *_tf; // Function type
a61af66fc99e Initial load
duke
parents:
diff changeset
712 address _entry_point; // Address of the method being called
a61af66fc99e Initial load
duke
parents:
diff changeset
713 float _cnt; // Estimate of number of times called
a61af66fc99e Initial load
duke
parents:
diff changeset
714 uint _argsize; // Size of argument block on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 const TypeFunc* tf() const { return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
717 const address entry_point() const { return _entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 const float cnt() const { return _cnt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
719 uint argsize() const { return _argsize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 void set_tf(const TypeFunc* tf) { _tf = tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
722 void set_entry_point(address p) { _entry_point = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 void set_cnt(float c) { _cnt = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 void set_argsize(int s) { _argsize = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 MachCallNode() : MachSafePointNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
727 init_class_id(Class_MachCall);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
731 virtual bool pinned() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
732 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
733 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
734 virtual int ret_addr_offset() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 bool returns_long() const { return tf()->return_type() == T_LONG; }
a61af66fc99e Initial load
duke
parents:
diff changeset
737 bool return_value_is_used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
738 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
739 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
741 };
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 //------------------------------MachCallJavaNode------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // "Base" class for machine-specific versions of subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
745 class MachCallJavaNode : public MachCallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
747 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
749 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
750 ciMethod* _method; // Method being direct called
a61af66fc99e Initial load
duke
parents:
diff changeset
751 int _bci; // Byte Code index of call byte code
a61af66fc99e Initial load
duke
parents:
diff changeset
752 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
753 bool _method_handle_invoke; // Tells if the call has to preserve SP
0
a61af66fc99e Initial load
duke
parents:
diff changeset
754 MachCallJavaNode() : MachCallNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 init_class_id(Class_MachCallJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
757
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
758 virtual const RegMask &in_RegMask(uint) const;
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 0
diff changeset
759
0
a61af66fc99e Initial load
duke
parents:
diff changeset
760 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
761 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
762 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
763 };
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 //------------------------------MachCallStaticJavaNode------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // Machine-specific versions of monomorphic subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
767 class MachCallStaticJavaNode : public MachCallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
770 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
771 const char *_name; // Runtime wrapper name
a61af66fc99e Initial load
duke
parents:
diff changeset
772 MachCallStaticJavaNode() : MachCallJavaNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 init_class_id(Class_MachCallStaticJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // If this is an uncommon trap, return the request code, else zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
777 int uncommon_trap_request() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 virtual int ret_addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
780 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
781 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 void dump_trap_args(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
784 };
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 //------------------------------MachCallDynamicJavaNode------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // Machine-specific versions of possibly megamorphic subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
788 class MachCallDynamicJavaNode : public MachCallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
790 int _vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
791 MachCallDynamicJavaNode() : MachCallJavaNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
792 init_class_id(Class_MachCallDynamicJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
793 DEBUG_ONLY(_vtable_index = -99); // throw an assert if uninitialized
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795 virtual int ret_addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
796 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
797 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
798 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
799 };
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 //------------------------------MachCallRuntimeNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // Machine-specific versions of subroutine calls
a61af66fc99e Initial load
duke
parents:
diff changeset
803 class MachCallRuntimeNode : public MachCallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
805 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
806 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
807 const char *_name; // Printable name, if _method is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
808 MachCallRuntimeNode() : MachCallNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
809 init_class_id(Class_MachCallRuntime);
a61af66fc99e Initial load
duke
parents:
diff changeset
810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
811 virtual int ret_addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
812 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
813 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
815 };
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 class MachCallLeafNode: public MachCallRuntimeNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
819 MachCallLeafNode() : MachCallRuntimeNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 init_class_id(Class_MachCallLeaf);
a61af66fc99e Initial load
duke
parents:
diff changeset
821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
822 };
a61af66fc99e Initial load
duke
parents:
diff changeset
823
a61af66fc99e Initial load
duke
parents:
diff changeset
824 //------------------------------MachHaltNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // Machine-specific versions of halt nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
826 class MachHaltNode : public MachReturnNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
828 virtual JVMState* jvms() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 };
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832 //------------------------------MachTempNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // Node used by the adlc to construct inputs to represent temporary registers
a61af66fc99e Initial load
duke
parents:
diff changeset
834 class MachTempNode : public MachNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
836 MachOper *_opnd_array[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
839 virtual const RegMask &out_RegMask() const { return *_opnds[0]->in_RegMask(0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 virtual uint rule() const { return 9999999; }
a61af66fc99e Initial load
duke
parents:
diff changeset
841 virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {}
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 MachTempNode(MachOper* oper) {
a61af66fc99e Initial load
duke
parents:
diff changeset
844 init_class_id(Class_MachTemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
845 _num_opnds = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 _opnds = _opnd_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
847 add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 _opnds[0] = oper;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850 virtual uint size_of() const { return sizeof(MachTempNode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
853 virtual void format(PhaseRegAlloc *, outputStream *st ) const {}
a61af66fc99e Initial load
duke
parents:
diff changeset
854 virtual const char *Name() const { return "MachTemp";}
a61af66fc99e Initial load
duke
parents:
diff changeset
855 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
856 };
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 //------------------------------labelOper--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // Machine-independent version of label operand
a61af66fc99e Initial load
duke
parents:
diff changeset
862 class labelOper : public MachOper {
a61af66fc99e Initial load
duke
parents:
diff changeset
863 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
864 virtual uint num_edges() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
865 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // Supported for fixed size branches
a61af66fc99e Initial load
duke
parents:
diff changeset
867 Label* _label; // Label for branch(es)
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 uint _block_num;
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 labelOper() : _block_num(0), _label(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 labelOper(Label* label, uint block_num) : _label(label), _block_num(block_num) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 labelOper(labelOper* l) : _label(l->_label) , _block_num(l->_block_num) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 virtual MachOper *clone(Compile* C) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
878
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2008
diff changeset
879 virtual Label *label() const { assert(_label != NULL, "need Label"); return _label; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 virtual uint opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 virtual uint hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 virtual uint cmp( const MachOper &oper ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
885 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
886 virtual const char *Name() const { return "Label";}
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 virtual void int_format(PhaseRegAlloc *ra, const MachNode *node, outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
889 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
890 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
891 };
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 //------------------------------methodOper--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // Machine-independent version of method operand
a61af66fc99e Initial load
duke
parents:
diff changeset
896 class methodOper : public MachOper {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
898 virtual uint num_edges() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
900 intptr_t _method; // Address of method
a61af66fc99e Initial load
duke
parents:
diff changeset
901 methodOper() : _method(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
902 methodOper(intptr_t method) : _method(method) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 virtual MachOper *clone(Compile* C) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 virtual intptr_t method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 virtual uint opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 virtual uint hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
911 virtual uint cmp( const MachOper &oper ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
912 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
913 virtual const char *Name() const { return "Method";}
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 virtual void int_format(PhaseRegAlloc *ra, const MachNode *node, outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
916 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
917 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
918 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
919
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
920 #endif // SHARE_VM_OPTO_MACHNODE_HPP