annotate src/share/vm/opto/matcher.hpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents e9ff18c4ace7
children ae065c367d93
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: 1274
diff changeset
2 * Copyright (c) 1997, 2009, 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: 1274
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1274
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: 1274
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
26 class Node;
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class MachNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class MachTypeNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class MachOper;
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //---------------------------Matcher-------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class Matcher : public PhaseTransform {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Private arena of State objects
a61af66fc99e Initial load
duke
parents:
diff changeset
35 ResourceArea _states_arena;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 VectorSet _visited; // Visit bits
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Used to control the Label pass
a61af66fc99e Initial load
duke
parents:
diff changeset
40 VectorSet _shared; // Shared Ideal Node
a61af66fc99e Initial load
duke
parents:
diff changeset
41 VectorSet _dontcare; // Nothing the matcher cares about
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Private methods which perform the actual matching and reduction
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Walks the label tree, generating machine nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
45 MachNode *ReduceInst( State *s, int rule, Node *&mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
46 void ReduceInst_Chain_Rule( State *s, int rule, Node *&mem, MachNode *mach);
a61af66fc99e Initial load
duke
parents:
diff changeset
47 uint ReduceInst_Interior(State *s, int rule, Node *&mem, MachNode *mach, uint num_opnds);
a61af66fc99e Initial load
duke
parents:
diff changeset
48 void ReduceOper( State *s, int newrule, Node *&mem, MachNode *mach );
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // If this node already matched using "rule", return the MachNode for it.
168
7793bd37a336 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 0
diff changeset
51 MachNode* find_shared_node(Node* n, uint rule);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // Convert a dense opcode number to an expanded rule number
a61af66fc99e Initial load
duke
parents:
diff changeset
54 const int *_reduceOp;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const int *_leftOp;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 const int *_rightOp;
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // Map dense opcode number to info on when rule is swallowed constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 const bool *_swallowed;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Map dense rule number to determine if this is an instruction chain rule
a61af66fc99e Initial load
duke
parents:
diff changeset
62 const uint _begin_inst_chain_rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 const uint _end_inst_chain_rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // We want to clone constants and possible CmpI-variants.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // If we do not clone CmpI, then we can have many instances of
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // condition codes alive at once. This is OK on some chips and
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // bad on others. Hence the machine-dependent table lookup.
a61af66fc99e Initial load
duke
parents:
diff changeset
69 const char *_must_clone;
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Find shared Nodes, or Nodes that otherwise are Matcher roots
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void find_shared( Node *n );
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Debug and profile information for nodes in old space:
a61af66fc99e Initial load
duke
parents:
diff changeset
75 GrowableArray<Node_Notes*>* _old_node_note_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Node labeling iterator for instruction selection
a61af66fc99e Initial load
duke
parents:
diff changeset
78 Node *Label_Root( const Node *n, State *svec, Node *control, const Node *mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 Node *transform( Node *dummy );
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 Node_List &_proj_list; // For Machine nodes killing many values
a61af66fc99e Initial load
duke
parents:
diff changeset
83
168
7793bd37a336 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 0
diff changeset
84 Node_Array _shared_nodes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 debug_only(Node_Array _old2new_map;) // Map roots of ideal-trees to machine-roots
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
87 debug_only(Node_Array _new2old_map;) // Maps machine nodes back to ideal
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Accessors for the inherited field PhaseTransform::_nodes:
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void grow_new_node_array(uint idx_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _nodes.map(idx_limit-1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 bool has_new_node(const Node* n) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 return _nodes.at(n->_idx) != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 Node* new_node(const Node* n) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 assert(has_new_node(n), "set before get");
a61af66fc99e Initial load
duke
parents:
diff changeset
98 return _nodes.at(n->_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void set_new_node(const Node* n, Node *nn) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 assert(!has_new_node(n), "set only once");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _nodes.map(n->_idx, nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Make sure only new nodes are reachable from this node
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void verify_new_nodes_only(Node* root);
216
8d191a7697e2 6715633: when matching a memory node the adr_type should not change
kvn
parents: 168
diff changeset
108
8d191a7697e2 6715633: when matching a memory node the adr_type should not change
kvn
parents: 168
diff changeset
109 Node* _mem_node; // Ideal memory node consumed by mach node
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
111
729
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
112 // Mach node for ConP #NULL
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
113 MachNode* _mach_null;
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
114
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
116 int LabelRootDepth;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static const int base2reg[]; // Map Types to machine register types
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Convert ideal machine register to a register mask for spill-loads
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static const RegMask *idealreg2regmask[];
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 844
diff changeset
120 RegMask *idealreg2spillmask [_last_machine_leaf];
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 844
diff changeset
121 RegMask *idealreg2debugmask [_last_machine_leaf];
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 844
diff changeset
122 RegMask *idealreg2mhdebugmask[_last_machine_leaf];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void init_spill_mask( Node *ret );
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // Convert machine register number to register mask
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static uint mreg2regmask_max;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 static RegMask mreg2regmask[];
a61af66fc99e Initial load
duke
parents:
diff changeset
127 static RegMask STACK_ONLY_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
128
729
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
129 MachNode* mach_null() const { return _mach_null; }
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
130
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 bool is_shared( Node *n ) { return _shared.test(n->_idx) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void set_shared( Node *n ) { _shared.set(n->_idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 bool is_visited( Node *n ) { return _visited.test(n->_idx) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void set_visited( Node *n ) { _visited.set(n->_idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 bool is_dontcare( Node *n ) { return _dontcare.test(n->_idx) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void set_dontcare( Node *n ) { _dontcare.set(n->_idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Mode bit to tell DFA and expand rules whether we are running after
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // (or during) register selection. Usually, the matcher runs before,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // but it will also get called to generate post-allocation spill code.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // In this situation, it is a deadly error to attempt to allocate more
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // temporary registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
143 bool _allocation_started;
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Machine register names
a61af66fc99e Initial load
duke
parents:
diff changeset
146 static const char *regName[];
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Machine register encodings
a61af66fc99e Initial load
duke
parents:
diff changeset
148 static const unsigned char _regEncode[];
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Machine Node names
a61af66fc99e Initial load
duke
parents:
diff changeset
150 const char **_ruleName;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Rules that are cheaper to rematerialize than to spill
a61af66fc99e Initial load
duke
parents:
diff changeset
152 static const uint _begin_rematerialize;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 static const uint _end_rematerialize;
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // An array of chars, from 0 to _last_Mach_Reg.
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // No Save = 'N' (for register windows)
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Save on Entry = 'E'
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Save on Call = 'C'
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Always Save = 'A' (same as SOE + SOC)
a61af66fc99e Initial load
duke
parents:
diff changeset
160 const char *_register_save_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 const char *_c_reg_save_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Convert a machine register to a machine register type, so-as to
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // properly match spill code.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 const int *_register_save_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Maps from machine register to boolean; true if machine register can
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // be holding a call argument in some signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
167 static bool can_be_java_arg( int reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Maps from machine register to boolean; true if machine register holds
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // a spillable argument.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 static bool is_spillable_arg( int reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // List of IfFalse or IfTrue Nodes that indicate a taken null test.
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // List is valid in the post-matching space.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 Node_List _null_check_tests;
368
36ccc817fca4 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 235
diff changeset
175 void collect_null_checks( Node *proj, Node *orig_proj );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void validate_null_checks( );
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 Matcher( Node_List &proj_list );
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Select instructions for entire method
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void match( );
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Helper for match
a61af66fc99e Initial load
duke
parents:
diff changeset
183 OptoReg::Name warp_incoming_stk_arg( VMReg reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Transform, then walk. Does implicit DCE while walking.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Name changed from "transform" to avoid it being virtual.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 Node *xform( Node *old_space_node, int Nodes );
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // Match a single Ideal Node - turn it into a 1-Node tree; Label & Reduce.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 MachNode *match_tree( const Node *n );
a61af66fc99e Initial load
duke
parents:
diff changeset
191 MachNode *match_sfpt( SafePointNode *sfpt );
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Helper for match_sfpt
a61af66fc99e Initial load
duke
parents:
diff changeset
193 OptoReg::Name warp_outgoing_stk_arg( VMReg reg, OptoReg::Name begin_out_arg_area, OptoReg::Name &out_arg_limit_per_call );
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Initialize first stack mask and related masks.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 void init_first_stack_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // If we should save-on-entry this register
a61af66fc99e Initial load
duke
parents:
diff changeset
199 bool is_save_on_entry( int reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Fixup the save-on-entry registers
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void Fixup_Save_On_Entry( );
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // --- Frame handling ---
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Register number of the stack slot corresponding to the incoming SP.
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // SharedInfo::stack0 + locks + in_preserve_stack_slots + pad2.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 OptoReg::Name _old_SP;
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Register number of the stack slot corresponding to the highest incoming
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // argument on the stack. Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // _old_SP + out_preserve_stack_slots + incoming argument size.
a61af66fc99e Initial load
duke
parents:
diff changeset
214 OptoReg::Name _in_arg_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Register number of the stack slot corresponding to the new SP.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // _in_arg_limit + pad0
a61af66fc99e Initial load
duke
parents:
diff changeset
219 OptoReg::Name _new_SP;
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Register number of the stack slot corresponding to the highest outgoing
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // argument on the stack. Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // _new_SP + max outgoing arguments of all calls
a61af66fc99e Initial load
duke
parents:
diff changeset
224 OptoReg::Name _out_arg_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 OptoRegPair *_parm_regs; // Array of machine registers per argument
a61af66fc99e Initial load
duke
parents:
diff changeset
227 RegMask *_calling_convention_mask; // Array of RegMasks per argument
a61af66fc99e Initial load
duke
parents:
diff changeset
228
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
229 // Does matcher have a match rule for this ideal node?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 static const bool has_match_rule(int opcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 static const bool _hasMatchRule[_last_opcode];
a61af66fc99e Initial load
duke
parents:
diff changeset
232
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
233 // Does matcher have a match rule for this ideal node and is the
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
234 // predicate (if there is one) true?
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
235 // NOTE: If this function is used more commonly in the future, ADLC
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
236 // should generate this one.
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
237 static const bool match_rule_supported(int opcode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
238
0
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Used to determine if we have fast l2f conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // USII has it, USIII doesn't
a61af66fc99e Initial load
duke
parents:
diff changeset
241 static const bool convL2FSupported(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Vector width in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
244 static const uint vector_width_in_bytes(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // Vector ideal reg
a61af66fc99e Initial load
duke
parents:
diff changeset
247 static const uint vector_ideal_reg(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // Used to determine a "low complexity" 64-bit constant. (Zero is simple.)
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI).
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Depends on the details of 64-bit constant generation on the CPU.
a61af66fc99e Initial load
duke
parents:
diff changeset
252 static const bool isSimpleConstant64(jlong con);
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // These calls are all generated by the ADLC
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // TRUE - grows up, FALSE - grows down (Intel)
a61af66fc99e Initial load
duke
parents:
diff changeset
257 virtual bool stack_direction() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Java-Java calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // (what you use when Java calls Java)
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // Alignment of stack in bytes, standard Intel word alignment is 4.
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Sparc probably wants at least double-word (8).
a61af66fc99e Initial load
duke
parents:
diff changeset
264 static uint stack_alignment_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // Alignment of stack, measured in stack slots.
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // The size of stack slots is defined by VMRegImpl::stack_slot_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 static uint stack_alignment_in_slots() {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return stack_alignment_in_bytes() / (VMRegImpl::stack_slot_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // Array mapping arguments to registers. Argument 0 is usually the 'this'
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // pointer. Registers can include stack-slots and regular registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 static void calling_convention( BasicType *, VMRegPair *, uint len, bool is_outgoing );
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // Convert a sig into a calling convention register layout
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // and find interesting things about it.
a61af66fc99e Initial load
duke
parents:
diff changeset
277 static OptoReg::Name find_receiver( bool is_outgoing );
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // Return address register. On Intel it is a stack-slot. On PowerPC
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // it is the Link register. On Sparc it is r31?
a61af66fc99e Initial load
duke
parents:
diff changeset
280 virtual OptoReg::Name return_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 RegMask _return_addr_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // Return value register. On Intel it is EAX. On Sparc i0/o0.
a61af66fc99e Initial load
duke
parents:
diff changeset
283 static OptoRegPair return_value(int ideal_reg, bool is_outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 static OptoRegPair c_return_value(int ideal_reg, bool is_outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 RegMask _return_value_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Inline Cache Register
a61af66fc99e Initial load
duke
parents:
diff changeset
287 static OptoReg::Name inline_cache_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
288 static const RegMask &inline_cache_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
289 static int inline_cache_reg_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Register for DIVI projection of divmodI
a61af66fc99e Initial load
duke
parents:
diff changeset
292 static RegMask divI_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // Register for MODI projection of divmodI
a61af66fc99e Initial load
duke
parents:
diff changeset
294 static RegMask modI_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Register for DIVL projection of divmodL
a61af66fc99e Initial load
duke
parents:
diff changeset
297 static RegMask divL_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Register for MODL projection of divmodL
a61af66fc99e Initial load
duke
parents:
diff changeset
299 static RegMask modL_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
300
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 844
diff changeset
301 static const RegMask method_handle_invoke_SP_save_mask();
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 844
diff changeset
302
0
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // Java-Interpreter calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // (what you use when calling between compiled-Java and Interpreted-Java
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Number of callee-save + always-save registers
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Ignores frame pointer and "special" registers
a61af66fc99e Initial load
duke
parents:
diff changeset
308 static int number_of_saved_registers();
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // The Method-klass-holder may be passed in the inline_cache_reg
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // and then expanded into the inline_cache_reg and a method_oop register
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 static OptoReg::Name interpreter_method_oop_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static const RegMask &interpreter_method_oop_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 static int interpreter_method_oop_reg_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 static OptoReg::Name compiler_method_oop_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
318 static const RegMask &compiler_method_oop_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 static int compiler_method_oop_reg_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Interpreter's Frame Pointer Register
a61af66fc99e Initial load
duke
parents:
diff changeset
322 static OptoReg::Name interpreter_frame_pointer_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 static const RegMask &interpreter_frame_pointer_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Java-Native calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // (what you use when intercalling between Java and C++ code)
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // Array mapping arguments to registers. Argument 0 is usually the 'this'
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // pointer. Registers can include stack-slots and regular registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
330 static void c_calling_convention( BasicType*, VMRegPair *, uint );
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // Frame pointer. The frame pointer is kept at the base of the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // and so is probably the stack pointer for most machines. On Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // it is ESP. On the PowerPC it is R1. On Sparc it is SP.
a61af66fc99e Initial load
duke
parents:
diff changeset
334 OptoReg::Name c_frame_pointer() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 static RegMask c_frame_ptr_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // !!!!! Special stuff for building ScopeDescs
a61af66fc99e Initial load
duke
parents:
diff changeset
338 virtual int regnum_to_fpu_offset(int regnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Is this branch offset small enough to be addressed by a short branch?
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 368
diff changeset
341 bool is_short_branch_offset(int rule, int offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // Optional scaling for the parameter to the ClearArray/CopyArray node.
a61af66fc99e Initial load
duke
parents:
diff changeset
344 static const bool init_array_count_is_in_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // Threshold small size (in bytes) for a ClearArray/CopyArray node.
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Anything this size or smaller may get converted to discrete scalar stores.
a61af66fc99e Initial load
duke
parents:
diff changeset
348 static const int init_array_short_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Should the Matcher clone shifts on addressing modes, expecting them to
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // be subsumed into complex addressing expressions or compute them into
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // registers? True for Intel but false for most RISCs
a61af66fc99e Initial load
duke
parents:
diff changeset
353 static const bool clone_shift_expressions;
a61af66fc99e Initial load
duke
parents:
diff changeset
354
1575
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
355 static bool narrow_oop_use_complex_address();
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
356
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
357 // Generate implicit null check for narrow oops if it can fold
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
358 // into address expression (x64).
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
359 //
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
360 // [R12 + narrow_oop_reg<<3 + offset] // fold into address expression
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
361 // NullCheck narrow_oop_reg
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
362 //
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
363 // When narrow oops can't fold into address expression (Sparc) and
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
364 // base is not null use decode_not_null and normal implicit null check.
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
365 // Note, decode_not_null node can be used here since it is referenced
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
366 // only on non null path but it requires special handling, see
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
367 // collect_null_checks():
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
368 //
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
369 // decode_not_null narrow_oop_reg, oop_reg // 'shift' and 'add base'
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
370 // [oop_reg + offset]
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
371 // NullCheck oop_reg
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
372 //
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
373 // With Zero base and when narrow oops can not fold into address
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
374 // expression use normal implicit null check since only shift
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
375 // is needed to decode narrow oop.
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
376 //
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
377 // decode narrow_oop_reg, oop_reg // only 'shift'
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
378 // [oop_reg + offset]
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
379 // NullCheck oop_reg
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
380 //
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
381 inline static bool gen_narrow_oop_implicit_null_checks() {
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
382 return Universe::narrow_oop_use_implicit_null_checks() &&
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
383 (narrow_oop_use_complex_address() ||
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
384 Universe::narrow_oop_base() != NULL);
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
385 }
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1274
diff changeset
386
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Is it better to copy float constants, or load them directly from memory?
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // Intel can load a float constant from a direct address, requiring no
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // extra registers. Most RISCs will have to materialize an address into a
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // register first, so they may as well materialize the constant immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
391 static const bool rematerialize_float_constants;
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // If CPU can load and store mis-aligned doubles directly then no fixup is
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // needed. Else we split the double into 2 integer pieces and move it
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // piece-by-piece. Only happens when passing doubles into C code or when
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // calling i2c adapters as the Java calling convention forces doubles to be
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
398 static const bool misaligned_doubles_ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Perform a platform dependent implicit null fixup. This is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // on windows95 to take care of some unusual register constraints.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 void pd_implicit_null_fixup(MachNode *load, uint idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Advertise here if the CPU requires explicit rounding operations
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // to implement the UseStrictFP mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 static const bool strict_fp_requires_explicit_rounding;
a61af66fc99e Initial load
duke
parents:
diff changeset
407
1274
2883969d09e7 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 1137
diff changeset
408 // Are floats conerted to double when stored to stack during deoptimization?
2883969d09e7 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 1137
diff changeset
409 static bool float_in_double();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Do ints take an entire long register or just half?
a61af66fc99e Initial load
duke
parents:
diff changeset
411 static const bool int_in_long;
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // This routine is run whenever a graph fails to match.
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // If it returns, the compiler should bailout to interpreter without error.
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // In non-product mode, SoftMatchFailure is false to detect non-canonical
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // graphs. Print a message and exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 static void soft_match_failure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if( SoftMatchFailure ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
419 else { fatal("SoftMatchFailure is not allowed except in product"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Used by the DFA in dfa_sparc.cpp. Check for a prior FastLock
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // acting as an Acquire and thus we don't need an Acquire here. We
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // retain the Node to act as a compiler ordering barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
425 static bool prior_fast_lock( const Node *acq );
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // Used by the DFA in dfa_sparc.cpp. Check for a following
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // FastUnLock acting as a Release and thus we don't need a Release
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // here. We retain the Node to act as a compiler ordering barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
430 static bool post_fast_unlock( const Node *rel );
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // Check for a following volatile memory barrier without an
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // intervening load and thus we don't need a barrier here. We
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // retain the Node to act as a compiler ordering barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
435 static bool post_store_load_barrier(const Node* mb);
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
439 void dump_old2new_map(); // machine-independent to machine-dependent
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
440
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
441 Node* find_old_node(Node* new_node) {
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
442 return _new2old_map[new_node->_idx];
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
443 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
444 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
445 };