annotate src/share/vm/adlc/formssel.cpp @ 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 c18cbe5936b8
children 2f644f85485d
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: 1541
diff changeset
2 * Copyright (c) 1998, 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: 1541
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1541
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: 1541
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 // FORMS.CPP - Definitions for ADL Parser Forms Classes
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "adlc.hpp"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //==============================Instructions===================================
a61af66fc99e Initial load
duke
parents:
diff changeset
29 //------------------------------InstructForm-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
30 InstructForm::InstructForm(const char *id, bool ideal_only)
a61af66fc99e Initial load
duke
parents:
diff changeset
31 : _ident(id), _ideal_only(ideal_only),
a61af66fc99e Initial load
duke
parents:
diff changeset
32 _localNames(cmpstr, hashstr, Form::arena),
a61af66fc99e Initial load
duke
parents:
diff changeset
33 _effects(cmpstr, hashstr, Form::arena) {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 _ftype = Form::INS;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _matrule = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 _insencode = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 _opcode = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 _size = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 _attribs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 _predicate = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _exprule = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 _rewrule = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 _format = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 _peephole = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _ins_pipe = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _uniq_idx = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _num_uniq = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _cisc_spill_operand = Not_cisc_spillable;// Which operand may cisc-spill
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _cisc_spill_alternate = NULL; // possible cisc replacement
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _cisc_reg_mask_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _is_cisc_alternate = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _is_short_branch = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 _short_branch_form = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 _alignment = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 InstructForm::InstructForm(const char *id, InstructForm *instr, MatchRule *rule)
a61af66fc99e Initial load
duke
parents:
diff changeset
59 : _ident(id), _ideal_only(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _localNames(instr->_localNames),
a61af66fc99e Initial load
duke
parents:
diff changeset
61 _effects(instr->_effects) {
a61af66fc99e Initial load
duke
parents:
diff changeset
62 _ftype = Form::INS;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _matrule = rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _insencode = instr->_insencode;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _opcode = instr->_opcode;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 _size = instr->_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _attribs = instr->_attribs;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _predicate = instr->_predicate;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _exprule = instr->_exprule;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _rewrule = instr->_rewrule;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _format = instr->_format;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _peephole = instr->_peephole;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _ins_pipe = instr->_ins_pipe;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _uniq_idx = instr->_uniq_idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _num_uniq = instr->_num_uniq;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 _cisc_spill_operand = Not_cisc_spillable;// Which operand may cisc-spill
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _cisc_spill_alternate = NULL; // possible cisc replacement
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _cisc_reg_mask_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 _is_cisc_alternate = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _is_short_branch = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 _short_branch_form = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _alignment = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Copy parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
85 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 instr->_parameters.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
87 for (; (name = instr->_parameters.iter()) != NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _parameters.addName(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 InstructForm::~InstructForm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 InstructForm *InstructForm::is_instruction() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
95 return (InstructForm*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 bool InstructForm::ideal_only() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return _ideal_only;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 bool InstructForm::sets_result() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 return (_matrule != NULL && _matrule->sets_result());
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 bool InstructForm::needs_projections() {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 for( Component *comp; (comp = _components.iter()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (comp->isa(Component::KILL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool InstructForm::has_temps() {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 if (_matrule) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Examine each component to see if it is a TEMP
a61af66fc99e Initial load
duke
parents:
diff changeset
120 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Skip the first component, if already handled as (SET dst (...))
a61af66fc99e Initial load
duke
parents:
diff changeset
122 Component *comp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if (sets_result()) comp = _components.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 while ((comp = _components.iter()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 if (comp->isa(Component::TEMP)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 uint InstructForm::num_defs_or_kills() {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 uint defs_or_kills = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 for( Component *comp; (comp = _components.iter()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if( comp->isa(Component::DEF) || comp->isa(Component::KILL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 ++defs_or_kills;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 return defs_or_kills;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // This instruction has an expand rule?
a61af66fc99e Initial load
duke
parents:
diff changeset
148 bool InstructForm::expands() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return ( _exprule != NULL );
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // This instruction has a peephole rule?
a61af66fc99e Initial load
duke
parents:
diff changeset
153 Peephole *InstructForm::peepholes() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 return _peephole;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // This instruction has a peephole rule?
a61af66fc99e Initial load
duke
parents:
diff changeset
158 void InstructForm::append_peephole(Peephole *peephole) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 if( _peephole == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 _peephole = peephole;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 _peephole->append_peephole(peephole);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // ideal opcode enumeration
a61af66fc99e Initial load
duke
parents:
diff changeset
168 const char *InstructForm::ideal_Opcode( FormDict &globalNames ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 if( !_matrule ) return "Node"; // Something weird
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Chain rules do not really have ideal Opcodes; use their source
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // operand ideal Opcode instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 if( is_simple_chain_rule(globalNames) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 const char *src = _matrule->_rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 OperandForm *src_op = globalNames[src]->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
175 assert( src_op, "Not operand class of chain rule" );
a61af66fc99e Initial load
duke
parents:
diff changeset
176 if( !src_op->_matrule ) return "Node";
a61af66fc99e Initial load
duke
parents:
diff changeset
177 return src_op->_matrule->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Operand chain rules do not really have ideal Opcodes
a61af66fc99e Initial load
duke
parents:
diff changeset
180 if( _matrule->is_chain_rule(globalNames) )
a61af66fc99e Initial load
duke
parents:
diff changeset
181 return "Node";
a61af66fc99e Initial load
duke
parents:
diff changeset
182 return strcmp(_matrule->_opType,"Set")
a61af66fc99e Initial load
duke
parents:
diff changeset
183 ? _matrule->_opType
a61af66fc99e Initial load
duke
parents:
diff changeset
184 : _matrule->_rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Recursive check on all operands' match rules in my match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
188 bool InstructForm::is_pinned(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if ( ! _matrule) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
192 if (_matrule->find_type("Goto", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
193 if (_matrule->find_type("If", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (_matrule->find_type("CountedLoopEnd",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 if (_matrule->find_type("Return", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (_matrule->find_type("Rethrow", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
197 if (_matrule->find_type("TailCall", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 if (_matrule->find_type("TailJump", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 if (_matrule->find_type("Halt", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (_matrule->find_type("Jump", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 return is_parm(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Recursive check on all operands' match rules in my match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
206 bool InstructForm::is_projection(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if ( ! _matrule) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (_matrule->find_type("Goto", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 if (_matrule->find_type("Return", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 if (_matrule->find_type("Rethrow", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (_matrule->find_type("TailCall",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 if (_matrule->find_type("TailJump",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (_matrule->find_type("Halt", index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Recursive check on all operands' match rules in my match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bool InstructForm::is_parm(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if ( ! _matrule) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 if (_matrule->find_type("Parm",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Return 'true' if this instruction matches an ideal 'Copy*' node
a61af66fc99e Initial load
duke
parents:
diff changeset
232 int InstructForm::is_ideal_copy() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 return _matrule ? _matrule->is_ideal_copy() : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Return 'true' if this instruction is too complex to rematerialize.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 int InstructForm::is_expensive() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // We can prove it is cheap if it has an empty encoding.
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // This helps with platform-specific nops like ThreadLocal and RoundFloat.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (is_empty_encoding())
a61af66fc99e Initial load
duke
parents:
diff changeset
241 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 if (is_tls_instruction())
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (_matrule == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 return _matrule->is_expensive();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Has an empty encoding if _size is a constant zero or there
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // are no ins_encode tokens.
a61af66fc99e Initial load
duke
parents:
diff changeset
253 int InstructForm::is_empty_encoding() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (_insencode != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 _insencode->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 if (_insencode->encode_class_iter() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 if (_size != NULL && strcmp(_size, "0") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int InstructForm::is_tls_instruction() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 if (_ident != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
268 ( ! strcmp( _ident,"tlsLoadP") ||
a61af66fc99e Initial load
duke
parents:
diff changeset
269 ! strncmp(_ident,"tlsLoadP_",9)) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 if (_matrule != NULL && _insencode != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 const char* opType = _matrule->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 if (strcmp(opType, "Set")==0)
a61af66fc99e Initial load
duke
parents:
diff changeset
276 opType = _matrule->_rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (strcmp(opType,"ThreadLocal")==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 fprintf(stderr, "Warning: ThreadLocal instruction %s should be named 'tlsLoadP_*'\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
279 (_ident == NULL ? "NULL" : _ident));
a61af66fc99e Initial load
duke
parents:
diff changeset
280 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // Return 'true' if this instruction matches an ideal 'Copy*' node
a61af66fc99e Initial load
duke
parents:
diff changeset
289 bool InstructForm::is_ideal_unlock() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return _matrule ? _matrule->is_ideal_unlock() : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 bool InstructForm::is_ideal_call_leaf() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 return _matrule ? _matrule->is_ideal_call_leaf() : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Return 'true' if this instruction matches an ideal 'If' node
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool InstructForm::is_ideal_if() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 return _matrule->is_ideal_if();
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Return 'true' if this instruction matches an ideal 'FastLock' node
a61af66fc99e Initial load
duke
parents:
diff changeset
305 bool InstructForm::is_ideal_fastlock() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 return _matrule->is_ideal_fastlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Return 'true' if this instruction matches an ideal 'MemBarXXX' node
a61af66fc99e Initial load
duke
parents:
diff changeset
312 bool InstructForm::is_ideal_membar() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 return _matrule->is_ideal_membar();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Return 'true' if this instruction matches an ideal 'LoadPC' node
a61af66fc99e Initial load
duke
parents:
diff changeset
319 bool InstructForm::is_ideal_loadPC() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return _matrule->is_ideal_loadPC();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Return 'true' if this instruction matches an ideal 'Box' node
a61af66fc99e Initial load
duke
parents:
diff changeset
326 bool InstructForm::is_ideal_box() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 return _matrule->is_ideal_box();
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Return 'true' if this instruction matches an ideal 'Goto' node
a61af66fc99e Initial load
duke
parents:
diff changeset
333 bool InstructForm::is_ideal_goto() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 return _matrule->is_ideal_goto();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Return 'true' if this instruction matches an ideal 'Jump' node
a61af66fc99e Initial load
duke
parents:
diff changeset
340 bool InstructForm::is_ideal_jump() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 return _matrule->is_ideal_jump();
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // Return 'true' if instruction matches ideal 'If' | 'Goto' |
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // 'CountedLoopEnd' | 'Jump'
a61af66fc99e Initial load
duke
parents:
diff changeset
348 bool InstructForm::is_ideal_branch() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return _matrule->is_ideal_if() || _matrule->is_ideal_goto() || _matrule->is_ideal_jump();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // Return 'true' if this instruction matches an ideal 'Return' node
a61af66fc99e Initial load
duke
parents:
diff changeset
356 bool InstructForm::is_ideal_return() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
357 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // Check MatchRule to see if the first entry is the ideal "Return" node
a61af66fc99e Initial load
duke
parents:
diff changeset
360 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (_matrule->find_type("Return",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (_matrule->find_type("Rethrow",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 if (_matrule->find_type("TailCall",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 if (_matrule->find_type("TailJump",index)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // Return 'true' if this instruction matches an ideal 'Halt' node
a61af66fc99e Initial load
duke
parents:
diff changeset
370 bool InstructForm::is_ideal_halt() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 return _matrule && _matrule->find_type("Halt",index);
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // Return 'true' if this instruction matches an ideal 'SafePoint' node
a61af66fc99e Initial load
duke
parents:
diff changeset
376 bool InstructForm::is_ideal_safepoint() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 return _matrule && _matrule->find_type("SafePoint",index);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // Return 'true' if this instruction matches an ideal 'Nop' node
a61af66fc99e Initial load
duke
parents:
diff changeset
382 bool InstructForm::is_ideal_nop() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 return _ident && _ident[0] == 'N' && _ident[1] == 'o' && _ident[2] == 'p' && _ident[3] == '_';
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 bool InstructForm::is_ideal_control() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if ( ! _matrule) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return is_ideal_return() || is_ideal_branch() || is_ideal_halt();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Return 'true' if this instruction matches an ideal 'Call' node
a61af66fc99e Initial load
duke
parents:
diff changeset
393 Form::CallType InstructForm::is_ideal_call() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if( _matrule == NULL ) return Form::invalid_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // Check MatchRule to see if the first entry is the ideal "Call" node
a61af66fc99e Initial load
duke
parents:
diff changeset
397 int idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if(_matrule->find_type("CallStaticJava",idx)) return Form::JAVA_STATIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
399 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if(_matrule->find_type("Lock",idx)) return Form::JAVA_STATIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if(_matrule->find_type("Unlock",idx)) return Form::JAVA_STATIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if(_matrule->find_type("CallDynamicJava",idx)) return Form::JAVA_DYNAMIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 if(_matrule->find_type("CallRuntime",idx)) return Form::JAVA_RUNTIME;
a61af66fc99e Initial load
duke
parents:
diff changeset
407 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if(_matrule->find_type("CallLeaf",idx)) return Form::JAVA_LEAF;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 if(_matrule->find_type("CallLeafNoFP",idx)) return Form::JAVA_LEAF;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 return Form::invalid_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Return 'true' if this instruction matches an ideal 'Load?' node
a61af66fc99e Initial load
duke
parents:
diff changeset
417 Form::DataType InstructForm::is_ideal_load() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if( _matrule == NULL ) return Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 return _matrule->is_ideal_load();
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
855
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
423 // Return 'true' if this instruction matches an ideal 'LoadKlass' node
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
424 bool InstructForm::skip_antidep_check() const {
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
425 if( _matrule == NULL ) return false;
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
426
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
427 return _matrule->skip_antidep_check();
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
428 }
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
429
0
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // Return 'true' if this instruction matches an ideal 'Load?' node
a61af66fc99e Initial load
duke
parents:
diff changeset
431 Form::DataType InstructForm::is_ideal_store() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 if( _matrule == NULL ) return Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return _matrule->is_ideal_store();
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Return the input register that must match the output register
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // If this is not required, return 0
a61af66fc99e Initial load
duke
parents:
diff changeset
439 uint InstructForm::two_address(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 uint matching_input = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if(_components.count() == 0) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
444 Component *comp = _components.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Check if there is a DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
446 if( comp->isa(Component::DEF) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Check that this is a register
a61af66fc99e Initial load
duke
parents:
diff changeset
448 const char *def_type = comp->_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
449 const Form *form = globals[def_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
450 OperandForm *op = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if( op ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 if( op->constrained_reg_class() != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
453 op->interface_type(globals) == Form::register_interface ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // Remember the local name for equality test later
a61af66fc99e Initial load
duke
parents:
diff changeset
455 const char *def_name = comp->_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Check if a component has the same name and is a USE
a61af66fc99e Initial load
duke
parents:
diff changeset
457 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if( comp->isa(Component::USE) && strcmp(comp->_name,def_name)==0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 return operand_position_format(def_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 } while( (comp = _components.iter()) != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // when chaining a constant to an instruction, returns 'true' and sets opType
a61af66fc99e Initial load
duke
parents:
diff changeset
471 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 const char *dummy = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 const char *dummy2 = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 return is_chain_of_constant(globals, dummy, dummy2);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
476 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
477 const char * &opTypeParam) {
a61af66fc99e Initial load
duke
parents:
diff changeset
478 const char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 return is_chain_of_constant(globals, opTypeParam, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
484 const char * &opTypeParam, const char * &resultParam) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 Form::DataType data_type = Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 if ( ! _matrule) return data_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // The source of the chain rule is 'position = 1'
a61af66fc99e Initial load
duke
parents:
diff changeset
490 uint position = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 const char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
493 const char *opType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // Here base_operand is looking for an ideal type to be returned (opType).
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if ( _matrule->is_chain_rule(globals)
a61af66fc99e Initial load
duke
parents:
diff changeset
496 && _matrule->base_operand(position, globals, result, name, opType) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 data_type = ideal_to_const_type(opType);
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // if it isn't an ideal constant type, just return
a61af66fc99e Initial load
duke
parents:
diff changeset
500 if ( data_type == Form::none ) return data_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // Ideal constant types also adjust the opType parameter.
a61af66fc99e Initial load
duke
parents:
diff changeset
503 resultParam = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 opTypeParam = opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 return data_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 return data_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // Check if a simple chain rule
a61af66fc99e Initial load
duke
parents:
diff changeset
512 bool InstructForm::is_simple_chain_rule(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 if( _matrule && _matrule->sets_result()
a61af66fc99e Initial load
duke
parents:
diff changeset
514 && _matrule->_rChild->_lChild == NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
515 && globals[_matrule->_rChild->_opType]
a61af66fc99e Initial load
duke
parents:
diff changeset
516 && globals[_matrule->_rChild->_opType]->is_opclass() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // check for structural rematerialization
a61af66fc99e Initial load
duke
parents:
diff changeset
523 bool InstructForm::rematerialize(FormDict &globals, RegisterForm *registers ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 bool rematerialize = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 Form::DataType data_type = is_chain_of_constant(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if( data_type != Form::none )
a61af66fc99e Initial load
duke
parents:
diff changeset
528 rematerialize = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if( _components.count() == 1 && _components[0]->is(Component::USE_DEF) )
a61af66fc99e Initial load
duke
parents:
diff changeset
532 rematerialize = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // Pseudo-constants (values easily available to the runtime)
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (is_empty_encoding() && is_tls_instruction())
a61af66fc99e Initial load
duke
parents:
diff changeset
536 rematerialize = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // 1-input, 1-output, such as copies or increments.
a61af66fc99e Initial load
duke
parents:
diff changeset
539 if( _components.count() == 2 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
540 _components[0]->is(Component::DEF) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
541 _components[1]->isa(Component::USE) )
a61af66fc99e Initial load
duke
parents:
diff changeset
542 rematerialize = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // Check for an ideal 'Load?' and eliminate rematerialize option
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if ( is_ideal_load() != Form::none || // Ideal load? Do not rematerialize
a61af66fc99e Initial load
duke
parents:
diff changeset
546 is_ideal_copy() != Form::none || // Ideal copy? Do not rematerialize
a61af66fc99e Initial load
duke
parents:
diff changeset
547 is_expensive() != Form::none) { // Expensive? Do not rematerialize
a61af66fc99e Initial load
duke
parents:
diff changeset
548 rematerialize = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // Always rematerialize the flags. They are more expensive to save &
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // restore than to recompute (and possibly spill the compare's inputs).
a61af66fc99e Initial load
duke
parents:
diff changeset
553 if( _components.count() >= 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 Component *c = _components[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
555 const Form *form = globals[c->_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
556 OperandForm *opform = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if( opform ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // Avoid the special stack_slots register classes
a61af66fc99e Initial load
duke
parents:
diff changeset
559 const char *rc_name = opform->constrained_reg_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
560 if( rc_name ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
561 if( strcmp(rc_name,"stack_slots") ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // Check for ideal_type of RegFlags
a61af66fc99e Initial load
duke
parents:
diff changeset
563 const char *type = opform->ideal_type( globals, registers );
a61af66fc99e Initial load
duke
parents:
diff changeset
564 if( !strcmp(type,"RegFlags") )
a61af66fc99e Initial load
duke
parents:
diff changeset
565 rematerialize = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
566 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
567 rematerialize = false; // Do not rematerialize things target stk
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 return rematerialize;
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // loads from memory, so must check for anti-dependence
a61af66fc99e Initial load
duke
parents:
diff changeset
576 bool InstructForm::needs_anti_dependence_check(FormDict &globals) const {
855
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
577 if ( skip_antidep_check() ) return false;
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
578
0
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // Machine independent loads must be checked for anti-dependences
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if( is_ideal_load() != Form::none ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // !!!!! !!!!! !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // TEMPORARY
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // if( is_simple_chain_rule(globals) ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
585
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
586 // String.(compareTo/equals/indexOf) and Arrays.equals use many memorys edges,
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
587 // but writes none
0
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if( _matrule && _matrule->_rChild &&
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
589 ( strcmp(_matrule->_rChild->_opType,"StrComp" )==0 ||
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
590 strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 ||
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
591 strcmp(_matrule->_rChild->_opType,"StrIndexOf" )==0 ||
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
592 strcmp(_matrule->_rChild->_opType,"AryEq" )==0 ))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
593 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // Check if instruction has a USE of a memory operand class, but no defs
a61af66fc99e Initial load
duke
parents:
diff changeset
596 bool USE_of_memory = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
597 bool DEF_of_memory = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
598 Component *comp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 ComponentList &components = (ComponentList &)_components;
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
602 while( (comp = components.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 const Form *form = globals[comp->_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
604 if( !form ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 OpClassForm *op = form->is_opclass();
a61af66fc99e Initial load
duke
parents:
diff changeset
606 if( !op ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 if( form->interface_type(globals) == Form::memory_interface ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
608 if( comp->isa(Component::USE) ) USE_of_memory = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
609 if( comp->isa(Component::DEF) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 OperandForm *oper = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
611 if( oper && oper->is_user_name_for_sReg() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // Stack slots are unaliased memory handled by allocator
a61af66fc99e Initial load
duke
parents:
diff changeset
613 oper = oper; // debug stopping point !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
614 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
615 DEF_of_memory = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620 return (USE_of_memory && !DEF_of_memory);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 bool InstructForm::is_wide_memory_kill(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
625 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 if( !_matrule->_opType ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 if( strcmp(_matrule->_opType,"MemBarRelease") == 0 ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 if( strcmp(_matrule->_opType,"MemBarAcquire") == 0 ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 int InstructForm::memory_operand(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // Machine independent loads must be checked for anti-dependences
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // Check if instruction has a USE of a memory operand class, or a def.
a61af66fc99e Initial load
duke
parents:
diff changeset
637 int USE_of_memory = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
638 int DEF_of_memory = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
639 const char* last_memory_DEF = NULL; // to test DEF/USE pairing in asserts
a61af66fc99e Initial load
duke
parents:
diff changeset
640 Component *unique = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
641 Component *comp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
642 ComponentList &components = (ComponentList &)_components;
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 while( (comp = components.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 const Form *form = globals[comp->_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
647 if( !form ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 OpClassForm *op = form->is_opclass();
a61af66fc99e Initial load
duke
parents:
diff changeset
649 if( !op ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 if( op->stack_slots_only(globals) ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 if( form->interface_type(globals) == Form::memory_interface ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
652 if( comp->isa(Component::DEF) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 last_memory_DEF = comp->_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 DEF_of_memory++;
a61af66fc99e Initial load
duke
parents:
diff changeset
655 unique = comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
656 } else if( comp->isa(Component::USE) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 if( last_memory_DEF != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 assert(0 == strcmp(last_memory_DEF, comp->_name), "every memory DEF is followed by a USE of the same name");
a61af66fc99e Initial load
duke
parents:
diff changeset
659 last_memory_DEF = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
661 USE_of_memory++;
a61af66fc99e Initial load
duke
parents:
diff changeset
662 if (DEF_of_memory == 0) // defs take precedence
a61af66fc99e Initial load
duke
parents:
diff changeset
663 unique = comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
664 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 assert(last_memory_DEF == NULL, "unpaired memory DEF");
a61af66fc99e Initial load
duke
parents:
diff changeset
666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669 assert(last_memory_DEF == NULL, "unpaired memory DEF");
a61af66fc99e Initial load
duke
parents:
diff changeset
670 assert(USE_of_memory >= DEF_of_memory, "unpaired memory DEF");
a61af66fc99e Initial load
duke
parents:
diff changeset
671 USE_of_memory -= DEF_of_memory; // treat paired DEF/USE as one occurrence
a61af66fc99e Initial load
duke
parents:
diff changeset
672 if( (USE_of_memory + DEF_of_memory) > 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
673 if( is_simple_chain_rule(globals) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 //fprintf(stderr, "Warning: chain rule is not really a memory user.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
675 //((InstructForm*)this)->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // Preceding code prints nothing on sparc and these insns on intel:
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // leaP8 leaP32 leaPIdxOff leaPIdxScale leaPIdxScaleOff leaP8 leaP32
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // leaPIdxOff leaPIdxScale leaPIdxScaleOff
a61af66fc99e Initial load
duke
parents:
diff changeset
679 return NO_MEMORY_OPERAND;
a61af66fc99e Initial load
duke
parents:
diff changeset
680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682 if( DEF_of_memory == 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
683 assert(unique != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
684 if( USE_of_memory == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // unique def, no uses
a61af66fc99e Initial load
duke
parents:
diff changeset
686 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // // unique def, some uses
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // // must return bottom unless all uses match def
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // unique = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
691 } else if( DEF_of_memory > 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // multiple defs, don't care about uses
a61af66fc99e Initial load
duke
parents:
diff changeset
693 unique = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 } else if( USE_of_memory == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 // unique use, no defs
a61af66fc99e Initial load
duke
parents:
diff changeset
696 assert(unique != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
697 } else if( USE_of_memory > 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // multiple uses, no defs
a61af66fc99e Initial load
duke
parents:
diff changeset
699 unique = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 assert(false, "bad case analysis");
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // process the unique DEF or USE, if there is one
a61af66fc99e Initial load
duke
parents:
diff changeset
704 if( unique == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 return MANY_MEMORY_OPERANDS;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 int pos = components.operand_position(unique->_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if( unique->isa(Component::DEF) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 pos += 1; // get corresponding USE from DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711 assert(pos >= 1, "I was just looking at it!");
a61af66fc99e Initial load
duke
parents:
diff changeset
712 return pos;
a61af66fc99e Initial load
duke
parents:
diff changeset
713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // missed the memory op??
a61af66fc99e Initial load
duke
parents:
diff changeset
717 if( true ) { // %%% should not be necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
718 if( is_ideal_store() != Form::none ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 fprintf(stderr, "Warning: cannot find memory opnd in instr.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
720 ((InstructForm*)this)->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // pretend it has multiple defs and uses
a61af66fc99e Initial load
duke
parents:
diff changeset
722 return MANY_MEMORY_OPERANDS;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 if( is_ideal_load() != Form::none ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
725 fprintf(stderr, "Warning: cannot find memory opnd in instr.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
726 ((InstructForm*)this)->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
727 // pretend it has multiple uses and no defs
a61af66fc99e Initial load
duke
parents:
diff changeset
728 return MANY_MEMORY_OPERANDS;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 return NO_MEMORY_OPERAND;
a61af66fc99e Initial load
duke
parents:
diff changeset
733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
734
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // This instruction captures the machine-independent bottom_type
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // Expected use is for pointer vs oop determination for LoadP
1541
b5fdf39b9749 6953576: bottom_type for matched AddPNodes doesn't always agree with ideal
never
parents: 1396
diff changeset
738 bool InstructForm::captures_bottom_type(FormDict &globals) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
739 if( _matrule && _matrule->_rChild &&
a61af66fc99e Initial load
duke
parents:
diff changeset
740 (!strcmp(_matrule->_rChild->_opType,"CastPP") || // new result type
a61af66fc99e Initial load
duke
parents:
diff changeset
741 !strcmp(_matrule->_rChild->_opType,"CastX2P") || // new result type
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
742 !strcmp(_matrule->_rChild->_opType,"DecodeN") ||
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
743 !strcmp(_matrule->_rChild->_opType,"EncodeP") ||
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
744 !strcmp(_matrule->_rChild->_opType,"LoadN") ||
216
8d191a7697e2 6715633: when matching a memory node the adr_type should not change
kvn
parents: 164
diff changeset
745 !strcmp(_matrule->_rChild->_opType,"LoadNKlass") ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
746 !strcmp(_matrule->_rChild->_opType,"CreateEx") || // type of exception
a61af66fc99e Initial load
duke
parents:
diff changeset
747 !strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 else if ( is_ideal_load() == Form::idealP ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 else if ( is_ideal_store() != Form::none ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
750
1541
b5fdf39b9749 6953576: bottom_type for matched AddPNodes doesn't always agree with ideal
never
parents: 1396
diff changeset
751 if (needs_base_oop_edge(globals)) return true;
b5fdf39b9749 6953576: bottom_type for matched AddPNodes doesn't always agree with ideal
never
parents: 1396
diff changeset
752
0
a61af66fc99e Initial load
duke
parents:
diff changeset
753 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // Access instr_cost attribute or return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
758 const char* InstructForm::cost() {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 if( strcmp(cur->_ident,AttributeForm::_ins_cost) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
761 return cur->_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // Return count of top-level operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
768 uint InstructForm::num_opnds() {
a61af66fc99e Initial load
duke
parents:
diff changeset
769 int num_opnds = _components.num_operands();
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // Need special handling for matching some ideal nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // i.e. Matching a return node
a61af66fc99e Initial load
duke
parents:
diff changeset
773 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
774 if( _matrule ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if( strcmp(_matrule->_opType,"Return" )==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
776 strcmp(_matrule->_opType,"Halt" )==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
777 return 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779 */
a61af66fc99e Initial load
duke
parents:
diff changeset
780 return num_opnds;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // Return count of unmatched operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
784 uint InstructForm::num_post_match_opnds() {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 uint num_post_match_opnds = _components.count();
a61af66fc99e Initial load
duke
parents:
diff changeset
786 uint num_match_opnds = _components.match_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
787 num_post_match_opnds = num_post_match_opnds - num_match_opnds;
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 return num_post_match_opnds;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // Return the number of leaves below this complex operand
a61af66fc99e Initial load
duke
parents:
diff changeset
793 uint InstructForm::num_consts(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
794 if ( ! _matrule) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // This is a recursive invocation on all operands in the matchrule
a61af66fc99e Initial load
duke
parents:
diff changeset
797 return _matrule->num_consts(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // Constants in match rule with specified type
a61af66fc99e Initial load
duke
parents:
diff changeset
801 uint InstructForm::num_consts(FormDict &globals, Form::DataType type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 if ( ! _matrule) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // This is a recursive invocation on all operands in the matchrule
a61af66fc99e Initial load
duke
parents:
diff changeset
805 return _matrule->num_consts(globals, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // Return the register class associated with 'leaf'.
a61af66fc99e Initial load
duke
parents:
diff changeset
810 const char *InstructForm::out_reg_class(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 assert( false, "InstructForm::out_reg_class(FormDict &globals); Not Implemented");
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // Lookup the starting position of inputs we are interested in wrt. ideal nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
819 uint InstructForm::oper_input_base(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 if( !_matrule ) return 1; // Skip control for most nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // Need special handling for matching some ideal nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // i.e. Matching a return node
a61af66fc99e Initial load
duke
parents:
diff changeset
824 if( strcmp(_matrule->_opType,"Return" )==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
825 strcmp(_matrule->_opType,"Rethrow" )==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
826 strcmp(_matrule->_opType,"TailCall" )==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
827 strcmp(_matrule->_opType,"TailJump" )==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
828 strcmp(_matrule->_opType,"SafePoint" )==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
829 strcmp(_matrule->_opType,"Halt" )==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
830 return AdlcVMDeps::Parms; // Skip the machine-state edges
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832 if( _matrule->_rChild &&
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 855
diff changeset
833 ( strcmp(_matrule->_rChild->_opType,"AryEq" )==0 ||
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 855
diff changeset
834 strcmp(_matrule->_rChild->_opType,"StrComp" )==0 ||
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
835 strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 ||
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
836 strcmp(_matrule->_rChild->_opType,"StrIndexOf")==0 )) {
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 855
diff changeset
837 // String.(compareTo/equals/indexOf) and Arrays.equals
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 855
diff changeset
838 // take 1 control and 1 memory edges.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 855
diff changeset
839 return 2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // Check for handling of 'Memory' input/edge in the ideal world.
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // The AD file writer is shielded from knowledge of these edges.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 int base = 1; // Skip control
a61af66fc99e Initial load
duke
parents:
diff changeset
845 base += _matrule->needs_ideal_memory_edge(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // Also skip the base-oop value for uses of derived oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // The AD file writer is shielded from knowledge of these edges.
a61af66fc99e Initial load
duke
parents:
diff changeset
849 base += needs_base_oop_edge(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 return base;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // Implementation does not modify state of internal structures
a61af66fc99e Initial load
duke
parents:
diff changeset
855 void InstructForm::build_components() {
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // Add top-level operands to the components
a61af66fc99e Initial load
duke
parents:
diff changeset
857 if (_matrule) _matrule->append_components(_localNames, _components);
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // Add parameters that "do not appear in match rule".
a61af66fc99e Initial load
duke
parents:
diff changeset
860 bool has_temp = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 const char *kill_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
863 for (_parameters.reset(); (name = _parameters.iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 OperandForm *opForm = (OperandForm*)_localNames[name];
a61af66fc99e Initial load
duke
parents:
diff changeset
865
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
866 Effect* e = NULL;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
867 {
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
868 const Form* form = _effects[name];
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
869 e = form ? form->is_effect() : NULL;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
870 }
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
871
0
a61af66fc99e Initial load
duke
parents:
diff changeset
872 if (e != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 has_temp |= e->is(Component::TEMP);
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // KILLs must be declared after any TEMPs because TEMPs are real
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // uses so their operand numbering must directly follow the real
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // inputs from the match rule. Fixing the numbering seems
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // complex so simply enforce the restriction during parse.
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (kill_name != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
880 e->isa(Component::TEMP) && !e->isa(Component::DEF)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 OperandForm* kill = (OperandForm*)_localNames[kill_name];
a61af66fc99e Initial load
duke
parents:
diff changeset
882 globalAD->syntax_err(_linenum, "%s: %s %s must be at the end of the argument list\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
883 _ident, kill->_ident, kill_name);
602
ed6404fac86b 6810855: KILL vs. TEMP ordering restrictions are too strong
never
parents: 599
diff changeset
884 } else if (e->isa(Component::KILL) && !e->isa(Component::USE)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 kill_name = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 const Component *component = _components.search(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 if ( component == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
891 if (e) {
a61af66fc99e Initial load
duke
parents:
diff changeset
892 _components.insert(name, opForm->_ident, e->_use_def, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 component = _components.search(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 if (component->isa(Component::USE) && !component->isa(Component::TEMP) && _matrule) {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 const Form *form = globalAD->globalNames()[component->_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
896 assert( form, "component type must be a defined form");
a61af66fc99e Initial load
duke
parents:
diff changeset
897 OperandForm *op = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
898 if (op->_interface && op->_interface->is_RegInterface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
899 globalAD->syntax_err(_linenum, "%s: illegal USE of non-input: %s %s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
900 _ident, opForm->_ident, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // This would be a nice warning but it triggers in a few places in a benign way
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // if (_matrule != NULL && !expands()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // globalAD->syntax_err(_linenum, "%s: %s %s not mentioned in effect or match rule\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // _ident, opForm->_ident, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
909 _components.insert(name, opForm->_ident, Component::INVALID, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912 else if (e) {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Component was found in the list
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // Check if there is a new effect that requires an extra component.
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // This happens when adding 'USE' to a component that is not yet one.
a61af66fc99e Initial load
duke
parents:
diff changeset
916 if ((!component->isa( Component::USE) && ((e->_use_def & Component::USE) != 0))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
917 if (component->isa(Component::USE) && _matrule) {
a61af66fc99e Initial load
duke
parents:
diff changeset
918 const Form *form = globalAD->globalNames()[component->_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
919 assert( form, "component type must be a defined form");
a61af66fc99e Initial load
duke
parents:
diff changeset
920 OperandForm *op = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
921 if (op->_interface && op->_interface->is_RegInterface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
922 globalAD->syntax_err(_linenum, "%s: illegal USE of non-input: %s %s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
923 _ident, opForm->_ident, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
926 _components.insert(name, opForm->_ident, e->_use_def, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
927 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
928 Component *comp = (Component*)component;
a61af66fc99e Initial load
duke
parents:
diff changeset
929 comp->promote_use_def_info(e->_use_def);
a61af66fc99e Initial load
duke
parents:
diff changeset
930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // Component positions are zero based.
a61af66fc99e Initial load
duke
parents:
diff changeset
932 int pos = _components.operand_position(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 assert( ! (component->isa(Component::DEF) && (pos >= 1)),
a61af66fc99e Initial load
duke
parents:
diff changeset
934 "Component::DEF can only occur in the first position");
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // Resolving the interactions between expand rules and TEMPs would
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // be complex so simply disallow it.
a61af66fc99e Initial load
duke
parents:
diff changeset
940 if (_matrule == NULL && has_temp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 globalAD->syntax_err(_linenum, "%s: TEMPs without match rule isn't supported\n", _ident);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // Return zero-based position in component list; -1 if not in list.
a61af66fc99e Initial load
duke
parents:
diff changeset
948 int InstructForm::operand_position(const char *name, int usedef) {
a61af66fc99e Initial load
duke
parents:
diff changeset
949 return unique_opnds_idx(_components.operand_position(name, usedef));
a61af66fc99e Initial load
duke
parents:
diff changeset
950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 int InstructForm::operand_position_format(const char *name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
953 return unique_opnds_idx(_components.operand_position_format(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // Return zero-based position in component list; -1 if not in list.
a61af66fc99e Initial load
duke
parents:
diff changeset
957 int InstructForm::label_position() {
a61af66fc99e Initial load
duke
parents:
diff changeset
958 return unique_opnds_idx(_components.label_position());
a61af66fc99e Initial load
duke
parents:
diff changeset
959 }
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 int InstructForm::method_position() {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 return unique_opnds_idx(_components.method_position());
a61af66fc99e Initial load
duke
parents:
diff changeset
963 }
a61af66fc99e Initial load
duke
parents:
diff changeset
964
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // Return number of relocation entries needed for this instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
966 uint InstructForm::reloc(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 uint reloc_entries = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // Check for "Call" nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
969 if ( is_ideal_call() ) ++reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
970 if ( is_ideal_return() ) ++reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
971 if ( is_ideal_safepoint() ) ++reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // Check if operands MAYBE oop pointers, by checking for ConP elements
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // Proceed through the leaves of the match-tree and check for ConPs
a61af66fc99e Initial load
duke
parents:
diff changeset
976 if ( _matrule != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
977 uint position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 const char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
979 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
980 const char *opType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
981 while (_matrule->base_operand(position, globals, result, name, opType)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 if ( strcmp(opType,"ConP") == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
983 #ifdef SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
984 reloc_entries += 2; // 1 for sethi + 1 for setlo
a61af66fc99e Initial load
duke
parents:
diff changeset
985 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
986 ++reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
987 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // Above is only a conservative estimate
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // because it did not check contents of operand classes.
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // !!!!! !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // Add 1 to reloc info for each operand class in the component list.
a61af66fc99e Initial load
duke
parents:
diff changeset
997 Component *comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
999 while ( (comp = _components.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 const Form *form = globals[comp->_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 assert( form, "Did not find component's type in global names");
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 const OpClassForm *opc = form->is_opclass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 const OperandForm *oper = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 if ( opc && (oper == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 ++reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 } else if ( oper ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 // floats and doubles loaded out of method's constant pool require reloc info
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 Form::DataType type = oper->is_base_constant(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 if ( (type == Form::idealF) || (type == Form::idealD) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 ++reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1014
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // Float and Double constants may come from the CodeBuffer table
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // and require relocatable addresses for access
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 // Check for any component being an immediate float or double.
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 Form::DataType data_type = is_chain_of_constant(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 if( data_type==idealD || data_type==idealF ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 #ifdef SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // sparc required more relocation entries for floating constants
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 // (expires 9/98)
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 reloc_entries += 6;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 reloc_entries++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 return reloc_entries;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 // Utility function defined in archDesc.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 extern bool is_def(int usedef);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // Return the result of reducing an instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 const char *InstructForm::reduce_result() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 const char* result = "Universe"; // default
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 Component *comp = _components.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 if (comp != NULL && comp->isa(Component::DEF)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 result = comp->_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 // Override this if the rule is a store operation:
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 if (_matrule && _matrule->_rChild &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 is_store_to_memory(_matrule->_rChild->_opType))
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 result = "Universe";
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // Return the name of the operand on the right hand side of the binary match
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // Return NULL if there is no right hand side
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 const char *InstructForm::reduce_right(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 if( _matrule == NULL ) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 return _matrule->reduce_right(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // Similar for left
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 const char *InstructForm::reduce_left(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 if( _matrule == NULL ) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 return _matrule->reduce_left(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // Base class for this instruction, MachNode except for calls
1541
b5fdf39b9749 6953576: bottom_type for matched AddPNodes doesn't always agree with ideal
never
parents: 1396
diff changeset
1066 const char *InstructForm::mach_base_class(FormDict &globals) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 if( is_ideal_call() == Form::JAVA_STATIC ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 return "MachCallStaticJavaNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 else if( is_ideal_call() == Form::JAVA_DYNAMIC ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 return "MachCallDynamicJavaNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 else if( is_ideal_call() == Form::JAVA_RUNTIME ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 return "MachCallRuntimeNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 else if( is_ideal_call() == Form::JAVA_LEAF ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 return "MachCallLeafNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 else if (is_ideal_return()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 return "MachReturnNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 else if (is_ideal_halt()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 return "MachHaltNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 else if (is_ideal_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 return "MachSafePointNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 else if (is_ideal_if()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 return "MachIfNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 else if (is_ideal_fastlock()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 return "MachFastLockNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 else if (is_ideal_nop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 return "MachNopNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
1541
b5fdf39b9749 6953576: bottom_type for matched AddPNodes doesn't always agree with ideal
never
parents: 1396
diff changeset
1097 else if (captures_bottom_type(globals)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 return "MachTypeNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 return "MachNode";
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 assert( false, "ShouldNotReachHere()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // Compare the instruction predicates for textual equality
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 bool equivalent_predicates( const InstructForm *instr1, const InstructForm *instr2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 const Predicate *pred1 = instr1->_predicate;
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 const Predicate *pred2 = instr2->_predicate;
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 if( pred1 == NULL && pred2 == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // no predicates means they are identical
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 if( pred1 != NULL && pred2 != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // compare the predicates
475
284d0af00d53 6771309: debugging AD files is difficult without #line directives in generated code
jrose
parents: 420
diff changeset
1116 if (ADLParser::equivalent_expressions(pred1->_pred, pred2->_pred)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1120
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 // Check if this instruction can cisc-spill to 'alternate'
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 bool InstructForm::cisc_spills_to(ArchDesc &AD, InstructForm *instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 assert( _matrule != NULL && instr->_matrule != NULL, "must have match rules");
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // Do not replace if a cisc-version has been found.
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 if( cisc_spill_operand() != Not_cisc_spillable ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 int cisc_spill_operand = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 char *result2 = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 const char *op_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 const char *reg_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 FormDict &globals = AD.globalNames();
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
1136 cisc_spill_operand = _matrule->matchrule_cisc_spill_match(globals, AD.get_registers(), instr->_matrule, op_name, reg_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 if( (cisc_spill_operand != Not_cisc_spillable) && (op_name != NULL) && equivalent_predicates(this, instr) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 cisc_spill_operand = operand_position(op_name, Component::USE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 int def_oper = operand_position(op_name, Component::DEF);
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 if( def_oper == NameList::Not_in_list && instr->num_opnds() == num_opnds()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 // Do not support cisc-spilling for destination operands and
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // make sure they have the same number of operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 _cisc_spill_alternate = instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 instr->set_cisc_alternate(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 if( AD._cisc_spill_debug ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 fprintf(stderr, "Instruction %s cisc-spills-to %s\n", _ident, instr->_ident);
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 fprintf(stderr, " using operand %s %s at index %d\n", reg_type, op_name, cisc_spill_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // Record that a stack-version of the reg_mask is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 OperandForm *oper = (OperandForm*)(globals[reg_type]->is_operand());
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 assert( oper != NULL, "cisc-spilling non operand");
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 const char *reg_class_name = oper->constrained_reg_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 AD.set_stack_or_reg(reg_class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 const char *reg_mask_name = AD.reg_mask(*oper);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 set_cisc_reg_mask_name(reg_mask_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 const char *stack_or_reg_mask_name = AD.stack_or_reg_mask(*oper);
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 cisc_spill_operand = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 cisc_spill_operand = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 set_cisc_spill_operand(cisc_spill_operand);
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 return (cisc_spill_operand != Not_cisc_spillable);
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // Check to see if this instruction can be replaced with the short branch
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // instruction `short-branch'
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 bool InstructForm::check_branch_variant(ArchDesc &AD, InstructForm *short_branch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 if (_matrule != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 this != short_branch && // Don't match myself
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 !is_short_branch() && // Don't match another short branch variant
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 reduce_result() != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 strcmp(reduce_result(), short_branch->reduce_result()) == 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 _matrule->equivalent(AD.globalNames(), short_branch->_matrule)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // The instructions are equivalent.
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 if (AD._short_branch_debug) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 fprintf(stderr, "Instruction %s has short form %s\n", _ident, short_branch->_ident);
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 _short_branch_form = short_branch;
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // --------------------------- FILE *output_routines
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // Generate the format call for the replacement variable
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 void InstructForm::rep_var_format(FILE *fp, const char *rep_var) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // Find replacement variable's type
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 const Form *form = _localNames[rep_var];
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 if (form == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 fprintf(stderr, "unknown replacement variable in format statement: '%s'\n", rep_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 assert(false, "ShouldNotReachHere()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 OpClassForm *opc = form->is_opclass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 assert( opc, "replacement variable was not found in local names");
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // Lookup the index position of the replacement variable
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 int idx = operand_position_format(rep_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 if ( idx == -1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 assert( strcmp(opc->_ident,"label")==0, "Unimplemented");
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 assert( false, "ShouldNotReachHere()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 if (is_noninput_operand(idx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // This component isn't in the input array. Print out the static
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // name of the register.
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 OperandForm* oper = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 if (oper != NULL && oper->is_bound_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 const RegDef* first = oper->get_RegClass()->find_first_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 fprintf(fp, " tty->print(\"%s\");\n", first->_regname);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 globalAD->syntax_err(_linenum, "In %s can't find format for %s %s", _ident, opc->_ident, rep_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // Output the format call for this operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 fprintf(fp,"opnd_array(%d)->",idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 if (idx == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 fprintf(fp,"int_format(ra, this, st); // %s\n", rep_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 fprintf(fp,"ext_format(ra, this,idx%d, st); // %s\n", idx, rep_var );
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // Seach through operands to determine parameters unique positions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 void InstructForm::set_unique_opnds() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 uint* uniq_idx = NULL;
599
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1231 int nopnds = num_opnds();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 uint num_uniq = nopnds;
599
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1233 int i;
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1234 _uniq_idx_length = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 if ( nopnds > 0 ) {
599
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1236 // Allocate index array. Worst case we're mapping from each
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1237 // component back to an index and any DEF always goes at 0 so the
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1238 // length of the array has to be the number of components + 1.
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1239 _uniq_idx_length = _components.count() + 1;
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1240 uniq_idx = (uint*) malloc(sizeof(uint)*(_uniq_idx_length));
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1241 for( i = 0; i < _uniq_idx_length; i++ ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 uniq_idx[i] = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // Do it only if there is a match rule and no expand rule. With an
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // expand rule it is done by creating new mach node in Expand()
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 if ( nopnds > 0 && _matrule != NULL && _exprule == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 uint count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 bool has_dupl_use = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 _parameters.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 while( (name = _parameters.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 count = 0;
599
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1256 int position = 0;
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1257 int uniq_position = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 Component *comp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 if( sets_result() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 comp = _components.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 position++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 // The next code is copied from the method operand_position().
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 for (; (comp = _components.iter()) != NULL; ++position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // When the first component is not a DEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 // leave space for the result operand!
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 if ( position==0 && (! comp->isa(Component::DEF)) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 if( strcmp(name, comp->_name)==0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 if( ++count > 1 ) {
599
0ad1cb407fa1 6805427: adlc compiler may generate incorrect machnode emission code
never
parents: 558
diff changeset
1273 assert(position < _uniq_idx_length, "out of bounds");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 uniq_idx[position] = uniq_position;
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 has_dupl_use = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 uniq_position = position;
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 if( comp->isa(Component::DEF)
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 && comp->isa(Component::USE) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 if( position != 1 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 --position; // only use two slots for the 1st USE_DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 if( has_dupl_use ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 for( i = 1; i < nopnds; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 if( i != uniq_idx[i] )
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 int j = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 for( ; i < nopnds; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 if( i == uniq_idx[i] )
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 uniq_idx[i] = j++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 num_uniq = j;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 _uniq_idx = uniq_idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 _num_uniq = num_uniq;
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1302
605
98cb887364d3 6810672: Comment typos
twisti
parents: 603
diff changeset
1303 // Generate index values needed for determining the operand position
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 void InstructForm::index_temps(FILE *fp, FormDict &globals, const char *prefix, const char *receiver) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 uint idx = 0; // position of operand in match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 int cur_num_opnds = num_opnds();
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 // Compute the index into vector of operand pointers:
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // idx0=0 is used to indicate that info comes from this same node, not from input edge.
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 // idx1 starts at oper_input_base()
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 if ( cur_num_opnds >= 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 fprintf(fp," // Start at oper_input_base() and count operands\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 fprintf(fp," unsigned %sidx0 = %d;\n", prefix, oper_input_base(globals));
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 fprintf(fp," unsigned %sidx1 = %d;\n", prefix, oper_input_base(globals));
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 // Generate starting points for other unique operands if they exist
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 for ( idx = 2; idx < num_unique_opnds(); ++idx ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 if( *receiver == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 fprintf(fp," unsigned %sidx%d = %sidx%d + opnd_array(%d)->num_edges();\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 prefix, idx, prefix, idx-1, idx-1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 fprintf(fp," unsigned %sidx%d = %sidx%d + %s_opnds[%d]->num_edges();\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 prefix, idx, prefix, idx-1, receiver, idx-1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 if( *receiver != 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // This value is used by generate_peepreplace when copying a node.
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 // Don't emit it in other cases since it can hide bugs with the
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 // use invalid idx's.
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 fprintf(fp," unsigned %sidx%d = %sreq(); \n", prefix, idx, receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1333
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1335
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 // ---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 bool InstructForm::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 // !!!!! !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 // Check that a "label" operand occurs last in the operand list, if present
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1342
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 void InstructForm::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 void InstructForm::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 fprintf(fp,"\nInstruction: %s\n", (_ident?_ident:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 if (_matrule) _matrule->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 if (_insencode) _insencode->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 if (_opcode) _opcode->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 if (_attribs) _attribs->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 if (_predicate) _predicate->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 if (_effects.Size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 fprintf(fp,"Effects\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 _effects.dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 if (_exprule) _exprule->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 if (_rewrule) _rewrule->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 if (_format) _format->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 if (_peephole) _peephole->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1363
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 void MachNodeForm::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1367
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 void MachNodeForm::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 fprintf(fp,"\nMachNode: %s\n", (_ident?_ident:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 //------------------------------build_predicate--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 // Build instruction predicates. If the user uses the same operand name
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // twice, we need to check that the operands are pointer-eequivalent in
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 // the DFA during the labeling process.
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 Predicate *InstructForm::build_predicate() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 char buf[1024], *s=buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 Dict names(cmpstr,hashstr,Form::arena); // Map Names to counts
a61af66fc99e Initial load
duke
parents:
diff changeset
1379
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 MatchNode *mnode =
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 strcmp(_matrule->_opType, "Set") ? _matrule : _matrule->_rChild;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 mnode->count_instr_names(names);
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 uint first = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 // Start with the predicate supplied in the .ad file.
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 if( _predicate ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 if( first ) first=0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 strcpy(s,"("); s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 strcpy(s,_predicate->_pred);
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 strcpy(s,")"); s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 for( DictI i(&names); i.test(); ++i ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 uintptr_t cnt = (uintptr_t)i._value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 if( cnt > 1 ) { // Need a predicate at all?
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 assert( cnt == 2, "Unimplemented" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 // Handle many pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 if( first ) first=0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 else { // All tests must pass, so use '&&'
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 strcpy(s," && ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 // Add predicate to working buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 sprintf(s,"/*%s*/(",(char*)i._key);
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 mnode->build_instr_pred(s,(char*)i._key,0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 strcpy(s," == "); s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 mnode->build_instr_pred(s,(char*)i._key,1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 strcpy(s,")"); s += strlen(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 if( s == buf ) s = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 assert( strlen(buf) < sizeof(buf), "String buffer overflow" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 s = strdup(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 return new Predicate(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 //------------------------------EncodeForm-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 EncodeForm::EncodeForm()
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 : _encClass(cmpstr,hashstr, Form::arena) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 EncodeForm::~EncodeForm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 // record a new register class
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 EncClass *EncodeForm::add_EncClass(const char *className) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 EncClass *encClass = new EncClass(className);
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 _eclasses.addName(className);
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 _encClass.Insert(className,encClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 return encClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 // Lookup the function body for an encoding class
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 EncClass *EncodeForm::encClass(const char *className) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 assert( className != NULL, "Must provide a defined encoding name");
a61af66fc99e Initial load
duke
parents:
diff changeset
1441
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 EncClass *encClass = (EncClass*)_encClass[className];
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 return encClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 // Lookup the function body for an encoding class
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 const char *EncodeForm::encClassBody(const char *className) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 if( className == NULL ) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1449
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 EncClass *encClass = (EncClass*)_encClass[className];
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 assert( encClass != NULL, "Encode Class is missing.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 encClass->_code.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 const char *code = (const char*)encClass->_code.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 assert( code != NULL, "Found an empty encode class body.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 return code;
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1458
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 // Lookup the function body for an encoding class
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 const char *EncodeForm::encClassPrototype(const char *className) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 assert( className != NULL, "Encode class name must be non NULL.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1462
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 return className;
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1465
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 void EncodeForm::dump() { // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1469
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 void EncodeForm::output(FILE *fp) { // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 fprintf(fp,"-------------------- Dump EncodeForm --------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 for (_eclasses.reset(); (name = _eclasses.iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 ((EncClass*)_encClass[name])->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 fprintf(fp,"-------------------- end EncodeForm --------------------\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 //------------------------------EncClass---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 EncClass::EncClass(const char *name)
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 : _localNames(cmpstr,hashstr, Form::arena), _name(name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 EncClass::~EncClass() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1485
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // Add a parameter <type,name> pair
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 void EncClass::add_parameter(const char *parameter_type, const char *parameter_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 _parameter_type.addName( parameter_type );
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 _parameter_name.addName( parameter_name );
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1491
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 // Verify operand types in parameter list
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 bool EncClass::check_parameter_types(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1497
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 // Add the decomposed "code" sections of an encoding's code-block
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 void EncClass::add_code(const char *code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 _code.addName(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1502
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // Add the decomposed "replacement variables" of an encoding's code-block
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 void EncClass::add_rep_var(char *replacement_var) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 _code.addName(NameList::_signal);
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 _rep_vars.addName(replacement_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 // Lookup the function body for an encoding class
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 int EncClass::rep_var_index(const char *rep_var) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 uint position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 _parameter_name.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 while ( (name = _parameter_name.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 if ( strcmp(rep_var,name) == 0 ) return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1522
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 // Check after parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 bool EncClass::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 // 1!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 // Check that each replacement variable, '$name' in architecture description
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 // is actually a local variable for this encode class, or a reserved name
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 // "primary, secondary, tertiary"
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1531
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 void EncClass::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 void EncClass::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 fprintf(fp,"EncClass: %s", (_name ? _name : ""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1539
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 // Output the parameter list
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 _parameter_type.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 _parameter_name.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 const char *type = _parameter_type.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 const char *name = _parameter_name.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 fprintf(fp, " ( ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 for ( ; (type != NULL) && (name != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 (type = _parameter_type.iter()), (name = _parameter_name.iter()) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 fprintf(fp, " %s %s,", type, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 fprintf(fp, " ) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 // Output the code block
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 _code.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 _rep_vars.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 const char *code;
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 while ( (code = _code.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 if ( _code.is_signal(code) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 // A replacement variable
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 const char *rep_var = _rep_vars.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 fprintf(fp,"($%s)", rep_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 // A section of code
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 fprintf(fp,"%s", code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1566
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1568
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 //------------------------------Opcode-----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 Opcode::Opcode(char *primary, char *secondary, char *tertiary)
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 : _primary(primary), _secondary(secondary), _tertiary(tertiary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1573
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 Opcode::~Opcode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1576
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 Opcode::opcode_type Opcode::as_opcode_type(const char *param) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 if( strcmp(param,"primary") == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 return Opcode::PRIMARY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 else if( strcmp(param,"secondary") == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 return Opcode::SECONDARY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 else if( strcmp(param,"tertiary") == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 return Opcode::TERTIARY;
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 return Opcode::NOT_AN_OPCODE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1589
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1590 bool Opcode::print_opcode(FILE *fp, Opcode::opcode_type desired_opcode) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 // Default values previously provided by MachNode::primary()...
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1592 const char *description = NULL;
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1593 const char *value = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 // Check if user provided any opcode definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 if( this != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 // Update 'value' if user provided a definition in the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 switch (desired_opcode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 case PRIMARY:
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 description = "primary()";
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 if( _primary != NULL) { value = _primary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 case SECONDARY:
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 description = "secondary()";
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 if( _secondary != NULL ) { value = _secondary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 case TERTIARY:
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 description = "tertiary()";
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 if( _tertiary != NULL ) { value = _tertiary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 assert( false, "ShouldNotReachHere();");
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 }
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1615 if (value != NULL) {
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1616 fprintf(fp, "(%s /*%s*/)", value, description);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1617 }
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
1618 return value != NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1620
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 void Opcode::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1624
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 void Opcode::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 if (_primary != NULL) fprintf(fp,"Primary opcode: %s\n", _primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 if (_secondary != NULL) fprintf(fp,"Secondary opcode: %s\n", _secondary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 if (_tertiary != NULL) fprintf(fp,"Tertiary opcode: %s\n", _tertiary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1631
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 //------------------------------InsEncode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 InsEncode::InsEncode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 InsEncode::~InsEncode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1637
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 // Add "encode class name" and its parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 NameAndList *InsEncode::add_encode(char *encoding) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 assert( encoding != NULL, "Must provide name for encoding");
a61af66fc99e Initial load
duke
parents:
diff changeset
1641
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 // add_parameter(NameList::_signal);
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 NameAndList *encode = new NameAndList(encoding);
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 _encoding.addName((char*)encode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1645
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 return encode;
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1648
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 // Access the list of encodings
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 void InsEncode::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 _encoding.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 // _parameter.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 const char* InsEncode::encode_class_iter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 NameAndList *encode_class = (NameAndList*)_encoding.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 return ( encode_class != NULL ? encode_class->name() : NULL );
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 // Obtain parameter name from zero based index
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 const char *InsEncode::rep_var_name(InstructForm &inst, uint param_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 NameAndList *params = (NameAndList*)_encoding.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 assert( params != NULL, "Internal Error");
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 const char *param = (*params)[param_no];
a61af66fc99e Initial load
duke
parents:
diff changeset
1663
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 // Remove '$' if parser placed it there.
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 return ( param != NULL && *param == '$') ? (param+1) : param;
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1667
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 void InsEncode::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1671
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 void InsEncode::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 NameAndList *encoding = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 const char *parameter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1676
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 fprintf(fp,"InsEncode: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 _encoding.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1679
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 while ( (encoding = (NameAndList*)_encoding.iter()) != 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 // Output the encoding being used
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 fprintf(fp,"%s(", encoding->name() );
a61af66fc99e Initial load
duke
parents:
diff changeset
1683
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 // Output its parameter list, if any
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 bool first_param = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 encoding->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 while ( (parameter = encoding->iter()) != 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 // Output the ',' between parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 if ( ! first_param ) fprintf(fp,", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 first_param = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // Output the parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 fprintf(fp,"%s", parameter);
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 } // done with parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 fprintf(fp,") ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 } // done with encodings
a61af66fc99e Initial load
duke
parents:
diff changeset
1696
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1699
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 //------------------------------Effect-----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 static int effect_lookup(const char *name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 if(!strcmp(name, "USE")) return Component::USE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 if(!strcmp(name, "DEF")) return Component::DEF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 if(!strcmp(name, "USE_DEF")) return Component::USE_DEF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 if(!strcmp(name, "KILL")) return Component::KILL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 if(!strcmp(name, "USE_KILL")) return Component::USE_KILL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 if(!strcmp(name, "TEMP")) return Component::TEMP;
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 if(!strcmp(name, "INVALID")) return Component::INVALID;
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 assert( false,"Invalid effect name specified\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 return Component::INVALID;
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1712
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 Effect::Effect(const char *name) : _name(name), _use_def(effect_lookup(name)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 _ftype = Form::EFF;
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 Effect::~Effect() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1718
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // Dynamic type check
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 Effect *Effect::is_effect() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 return (Effect*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1723
a61af66fc99e Initial load
duke
parents:
diff changeset
1724
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 // True if this component is equal to the parameter.
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 bool Effect::is(int use_def_kill_enum) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 return (_use_def == use_def_kill_enum ? true : false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 // True if this component is used/def'd/kill'd as the parameter suggests.
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 bool Effect::isa(int use_def_kill_enum) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 return (_use_def & use_def_kill_enum) == use_def_kill_enum;
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 void Effect::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1737
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 void Effect::output(FILE *fp) { // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 fprintf(fp,"Effect: %s\n", (_name?_name:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1741
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 //------------------------------ExpandRule-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 ExpandRule::ExpandRule() : _expand_instrs(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 _newopconst(cmpstr, hashstr, Form::arena) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 _ftype = Form::EXP;
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1747
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 ExpandRule::~ExpandRule() { // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1750
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 void ExpandRule::add_instruction(NameAndList *instruction_name_and_operand_list) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 _expand_instrs.addName((char*)instruction_name_and_operand_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1754
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 void ExpandRule::reset_instructions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 _expand_instrs.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1758
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 NameAndList* ExpandRule::iter_instructions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 return (NameAndList*)_expand_instrs.iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1762
a61af66fc99e Initial load
duke
parents:
diff changeset
1763
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 void ExpandRule::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1767
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 void ExpandRule::output(FILE *fp) { // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 NameAndList *expand_instr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 const char *opid = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1771
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 fprintf(fp,"\nExpand Rule:\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1773
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 // Iterate over the instructions 'node' expands into
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 for(reset_instructions(); (expand_instr = iter_instructions()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 fprintf(fp,"%s(", expand_instr->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1777
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 // iterate over the operand list
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 for( expand_instr->reset(); (opid = expand_instr->iter()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 fprintf(fp,"%s ", opid);
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 fprintf(fp,");\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1785
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 //------------------------------RewriteRule------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 RewriteRule::RewriteRule(char* params, char* block)
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 : _tempParams(params), _tempBlock(block) { }; // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 RewriteRule::~RewriteRule() { // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1791
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 void RewriteRule::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1795
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 void RewriteRule::output(FILE *fp) { // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 fprintf(fp,"\nRewrite Rule:\n%s\n%s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 (_tempParams?_tempParams:""),
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 (_tempBlock?_tempBlock:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1801
a61af66fc99e Initial load
duke
parents:
diff changeset
1802
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 //==============================MachNodes======================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 //------------------------------MachNodeForm-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 MachNodeForm::MachNodeForm(char *id)
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 : _ident(id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1808
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 MachNodeForm::~MachNodeForm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1811
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 MachNodeForm *MachNodeForm::is_machnode() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 return (MachNodeForm*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1815
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 //==============================Operand Classes================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 //------------------------------OpClassForm------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 OpClassForm::OpClassForm(const char* id) : _ident(id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 _ftype = Form::OPCLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1821
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 OpClassForm::~OpClassForm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1824
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 bool OpClassForm::ideal_only() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1826
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 OpClassForm *OpClassForm::is_opclass() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 return (OpClassForm*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1830
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 Form::InterfaceType OpClassForm::interface_type(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 if( _oplst.count() == 0 ) return Form::no_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
1833
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 // Check that my operands have the same interface type
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 Form::InterfaceType interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 bool first = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 NameList &op_list = (NameList &)_oplst;
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 op_list.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 const char *op_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 while( (op_name = op_list.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 const Form *form = globals[op_name];
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 OperandForm *operand = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 assert( operand, "Entry in operand class that is not an operand");
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 if( first ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 first = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 interface = operand->interface_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 interface = (interface == operand->interface_type(globals) ? interface : Form::no_interface);
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 return interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1853
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 bool OpClassForm::stack_slots_only(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 if( _oplst.count() == 0 ) return false; // how?
a61af66fc99e Initial load
duke
parents:
diff changeset
1856
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 NameList &op_list = (NameList &)_oplst;
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 op_list.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 const char *op_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 while( (op_name = op_list.iter()) != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 const Form *form = globals[op_name];
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 OperandForm *operand = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 assert( operand, "Entry in operand class that is not an operand");
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 if( !operand->stack_slots_only(globals) ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1868
a61af66fc99e Initial load
duke
parents:
diff changeset
1869
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 void OpClassForm::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1873
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 void OpClassForm::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 fprintf(fp,"\nOperand Class: %s\n", (_ident?_ident:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 fprintf(fp,"\nCount = %d\n", _oplst.count());
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 for(_oplst.reset(); (name = _oplst.iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 fprintf(fp,"%s, ",name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1883
a61af66fc99e Initial load
duke
parents:
diff changeset
1884
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 //==============================Operands=======================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 //------------------------------OperandForm------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 OperandForm::OperandForm(const char* id)
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 : OpClassForm(id), _ideal_only(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 _localNames(cmpstr, hashstr, Form::arena) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 _ftype = Form::OPER;
a61af66fc99e Initial load
duke
parents:
diff changeset
1891
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 _matrule = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 _interface = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 _attribs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 _predicate = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 _constraint= NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 _construct = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 _format = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 OperandForm::OperandForm(const char* id, bool ideal_only)
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 : OpClassForm(id), _ideal_only(ideal_only),
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 _localNames(cmpstr, hashstr, Form::arena) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 _ftype = Form::OPER;
a61af66fc99e Initial load
duke
parents:
diff changeset
1904
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 _matrule = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 _interface = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 _attribs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 _predicate = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 _constraint= NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 _construct = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 _format = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 OperandForm::~OperandForm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1915
a61af66fc99e Initial load
duke
parents:
diff changeset
1916
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 OperandForm *OperandForm::is_operand() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 return (OperandForm*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1920
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 bool OperandForm::ideal_only() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 return _ideal_only;
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1924
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 Form::InterfaceType OperandForm::interface_type(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 if( _interface == NULL ) return Form::no_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
1927
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 return _interface->interface_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1930
a61af66fc99e Initial load
duke
parents:
diff changeset
1931
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 bool OperandForm::stack_slots_only(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 if( _constraint == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 return _constraint->stack_slots_only();
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1936
a61af66fc99e Initial load
duke
parents:
diff changeset
1937
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 // Access op_cost attribute or return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 const char* OperandForm::cost() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 if( strcmp(cur->_ident,AttributeForm::_op_cost) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 return cur->_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1947
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 // Return the number of leaves below this complex operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 uint OperandForm::num_leaves() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 if ( ! _matrule) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1951
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 int num_leaves = _matrule->_numleaves;
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 return num_leaves;
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1955
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 // Return the number of constants contained within this complex operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 uint OperandForm::num_consts(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 if ( ! _matrule) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1959
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 // This is a recursive invocation on all operands in the matchrule
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 return _matrule->num_consts(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1963
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 // Return the number of constants in match rule with specified type
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 uint OperandForm::num_consts(FormDict &globals, Form::DataType type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 if ( ! _matrule) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1967
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 // This is a recursive invocation on all operands in the matchrule
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 return _matrule->num_consts(globals, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1971
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 // Return the number of pointer constants contained within this complex operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 uint OperandForm::num_const_ptrs(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 if ( ! _matrule) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1975
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 // This is a recursive invocation on all operands in the matchrule
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 return _matrule->num_const_ptrs(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1979
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 uint OperandForm::num_edges(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 uint edges = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 uint leaves = num_leaves();
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 uint consts = num_consts(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
1984
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 // If we are matching a constant directly, there are no leaves.
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 edges = ( leaves > consts ) ? leaves - consts : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1987
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // Special case operands that do not have a corresponding ideal node.
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 if( (edges == 0) && (consts == 0) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 if( constrained_reg_class() != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 edges = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 if( _matrule
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 && (_matrule->_lChild == NULL) && (_matrule->_rChild == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 const Form *form = globals[_matrule->_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 OperandForm *oper = form ? form->is_operand() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 if( oper ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 return oper->num_edges(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 return edges;
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2007
a61af66fc99e Initial load
duke
parents:
diff changeset
2008
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 // Check if this operand is usable for cisc-spilling
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 bool OperandForm::is_cisc_reg(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 const char *ideal = ideal_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 bool is_cisc_reg = (ideal && (ideal_to_Reg_type(ideal) != none));
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 return is_cisc_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2015
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 bool OpClassForm::is_cisc_mem(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 Form::InterfaceType my_interface = interface_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 return (my_interface == memory_interface);
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2020
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 // node matches ideal 'Bool'
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 bool OperandForm::is_ideal_bool() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 if( _matrule == NULL ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2025
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 return _matrule->is_ideal_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2028
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 // Require user's name for an sRegX to be stackSlotX
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 Form::DataType OperandForm::is_user_name_for_sReg() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 DataType data_type = none;
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 if( _ident != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 if( strcmp(_ident,"stackSlotI") == 0 ) data_type = Form::idealI;
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 else if( strcmp(_ident,"stackSlotP") == 0 ) data_type = Form::idealP;
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 else if( strcmp(_ident,"stackSlotD") == 0 ) data_type = Form::idealD;
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 else if( strcmp(_ident,"stackSlotF") == 0 ) data_type = Form::idealF;
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 else if( strcmp(_ident,"stackSlotL") == 0 ) data_type = Form::idealL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 assert((data_type == none) || (_matrule == NULL), "No match-rule for stackSlotX");
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 return data_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2043
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 // Return ideal type, if there is a single ideal type for this operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 const char *OperandForm::ideal_type(FormDict &globals, RegisterForm *registers) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 const char *type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 if (ideal_only()) type = _ident;
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 else if( _matrule == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 // Check for condition code register
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 const char *rc_name = constrained_reg_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 if (rc_name == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 // !!!!! !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 // Check constraints on result's register class
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 if( registers ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 RegClass *reg_class = registers->getRegClass(rc_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 assert( reg_class != NULL, "Register class is not defined");
a61af66fc99e Initial load
duke
parents:
diff changeset
2059
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // Check for ideal type of entries in register class, all are the same type
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 reg_class->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 RegDef *reg_def = reg_class->RegDef_iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 assert( reg_def != NULL, "No entries in register class");
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 assert( reg_def->_idealtype != NULL, "Did not define ideal type for register");
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // Return substring that names the register's ideal type
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 type = reg_def->_idealtype + 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 assert( *(reg_def->_idealtype + 0) == 'O', "Expect Op_ prefix");
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 assert( *(reg_def->_idealtype + 1) == 'p', "Expect Op_ prefix");
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 assert( *(reg_def->_idealtype + 2) == '_', "Expect Op_ prefix");
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 else if( _matrule->_lChild == NULL && _matrule->_rChild == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 // This operand matches a single type, at the top level.
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // Check for ideal type
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 type = _matrule->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 if( strcmp(type,"Bool") == 0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 return "Bool";
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // transitive lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 const Form *frm = globals[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 OperandForm *op = frm->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 type = op->ideal_type(globals, registers);
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 return type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
a61af66fc99e Initial load
duke
parents:
diff changeset
2086
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 // If there is a single ideal type for this interface field, return it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 const char *OperandForm::interface_ideal_type(FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 const char *field) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 const char *ideal_type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 const char *value = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2092
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // Check if "field" is valid for this operand's interface
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 if ( ! is_interface_field(field, value) ) return ideal_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2095
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 // !!!!! !!!!! !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 // If a valid field has a constant value, identify "ConI" or "ConP" or ...
a61af66fc99e Initial load
duke
parents:
diff changeset
2098
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 // Else, lookup type of field's replacement variable
a61af66fc99e Initial load
duke
parents:
diff changeset
2100
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 return ideal_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2103
a61af66fc99e Initial load
duke
parents:
diff changeset
2104
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 RegClass* OperandForm::get_RegClass() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 if (_interface && !_interface->is_RegInterface()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 return globalAD->get_registers()->getRegClass(constrained_reg_class());
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2109
a61af66fc99e Initial load
duke
parents:
diff changeset
2110
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 bool OperandForm::is_bound_register() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 RegClass *reg_class = get_RegClass();
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 if (reg_class == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2114
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 const char * name = ideal_type(globalAD->globalNames());
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 if (name == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2117
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 int size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 if (strcmp(name,"RegFlags")==0) size = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 if (strcmp(name,"RegI")==0) size = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 if (strcmp(name,"RegF")==0) size = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 if (strcmp(name,"RegD")==0) size = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 if (strcmp(name,"RegL")==0) size = 2;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2124 if (strcmp(name,"RegN")==0) size = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 if (strcmp(name,"RegP")==0) size = globalAD->get_preproc_def("_LP64") ? 2 : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 if (size == 0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 return size == reg_class->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2129
a61af66fc99e Initial load
duke
parents:
diff changeset
2130
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 // Check if this is a valid field for this operand,
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 // Return 'true' if valid, and set the value to the string the user provided.
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 bool OperandForm::is_interface_field(const char *field,
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 const char * &value) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2137
a61af66fc99e Initial load
duke
parents:
diff changeset
2138
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 // Return register class name if a constraint specifies the register class.
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 const char *OperandForm::constrained_reg_class() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 const char *reg_class = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 if ( _constraint ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 Constraint *constraint = _constraint;
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 if ( strcmp(_constraint->_func,"ALLOC_IN_RC") == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 reg_class = _constraint->_arg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2149
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 return reg_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2152
a61af66fc99e Initial load
duke
parents:
diff changeset
2153
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 // Return the register class associated with 'leaf'.
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 const char *OperandForm::in_reg_class(uint leaf, FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 const char *reg_class = NULL; // "RegMask::Empty";
a61af66fc99e Initial load
duke
parents:
diff changeset
2157
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 if((_matrule == NULL) || (_matrule->is_chain_rule(globals))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 reg_class = constrained_reg_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 return reg_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 const char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 const char *type = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 // iterate through all base operands
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 // until we reach the register that corresponds to "leaf"
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 // This function is not looking for an ideal type. It needs the first
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 // level user type associated with the leaf.
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 for(uint idx = 0;_matrule->base_operand(idx,globals,result,name,type);++idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 const Form *form = (_localNames[name] ? _localNames[name] : globals[result]);
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 OperandForm *oper = form ? form->is_operand() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 if( oper ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 reg_class = oper->constrained_reg_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 if( reg_class ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 reg_class = reg_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 // ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 // ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2182
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 // Increment our target leaf position if current leaf is not a candidate.
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 if( reg_class == NULL) ++leaf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 // Exit the loop with the value of reg_class when at the correct index
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 if( idx == leaf ) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 // May iterate through all base operands if reg_class for 'leaf' is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 return reg_class;
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2191
a61af66fc99e Initial load
duke
parents:
diff changeset
2192
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 // Recursive call to construct list of top-level operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 // Implementation does not modify state of internal structures
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 void OperandForm::build_components() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 if (_matrule) _matrule->append_components(_localNames, _components);
a61af66fc99e Initial load
duke
parents:
diff changeset
2197
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 // Add parameters that "do not appear in match rule".
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 for (_parameters.reset(); (name = _parameters.iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 OperandForm *opForm = (OperandForm*)_localNames[name];
a61af66fc99e Initial load
duke
parents:
diff changeset
2202
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 if ( _components.operand_position(name) == -1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 _components.insert(name, opForm->_ident, Component::INVALID, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2207
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2210
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 int OperandForm::operand_position(const char *name, int usedef) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 return _components.operand_position(name, usedef);
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2214
a61af66fc99e Initial load
duke
parents:
diff changeset
2215
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 // Return zero-based position in component list, only counting constants;
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 // Return -1 if not in list.
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 int OperandForm::constant_position(FormDict &globals, const Component *last) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 603
diff changeset
2219 // Iterate through components and count constants preceding 'constant'
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
2220 int position = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 Component *comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 while( (comp = _components.iter()) != NULL && (comp != last) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 // Special case for operands that take a single user-defined operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 // Skip the initial definition in the component list.
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 if( strcmp(comp->_name,this->_ident) == 0 ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2227
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 const char *type = comp->_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 // Lookup operand form for replacement variable's type
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 const Form *form = globals[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 assert( form != NULL, "Component's type not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 OperandForm *oper = form ? form->is_operand() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 if( oper ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 if( oper->_matrule->is_base_constant(globals) != Form::none ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2239
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 // Check for being passed a component that was not in the list
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 if( comp != last ) position = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 // Provide position of constant by "name"
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 int OperandForm::constant_position(FormDict &globals, const char *name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 const Component *comp = _components.search(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 int idx = constant_position( globals, comp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2249
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 return idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2252
a61af66fc99e Initial load
duke
parents:
diff changeset
2253
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // Return zero-based position in component list, only counting constants;
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 // Return -1 if not in list.
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 int OperandForm::register_position(FormDict &globals, const char *reg_name) {
605
98cb887364d3 6810672: Comment typos
twisti
parents: 603
diff changeset
2257 // Iterate through components and count registers preceding 'last'
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 uint position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 Component *comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 while( (comp = _components.iter()) != NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 && (strcmp(comp->_name,reg_name) != 0) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 // Special case for operands that take a single user-defined operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 // Skip the initial definition in the component list.
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 if( strcmp(comp->_name,this->_ident) == 0 ) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2266
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 const char *type = comp->_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 // Lookup operand form for component's type
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 const Form *form = globals[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 assert( form != NULL, "Component's type not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 OperandForm *oper = form ? form->is_operand() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 if( oper ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 if( oper->_matrule->is_base_register(globals) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2278
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2281
a61af66fc99e Initial load
duke
parents:
diff changeset
2282
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 const char *OperandForm::reduce_result() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 return _ident;
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 // Return the name of the operand on the right hand side of the binary match
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 // Return NULL if there is no right hand side
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 const char *OperandForm::reduce_right(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 return ( _matrule ? _matrule->reduce_right(globals) : NULL );
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2291
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 // Similar for left
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 const char *OperandForm::reduce_left(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 return ( _matrule ? _matrule->reduce_left(globals) : NULL );
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2296
a61af66fc99e Initial load
duke
parents:
diff changeset
2297
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 // --------------------------- FILE *output_routines
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 // Output code for disp_is_oop, if true.
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 void OperandForm::disp_is_oop(FILE *fp, FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 // Check it is a memory interface with a non-user-constant disp field
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 if ( this->_interface == NULL ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 MemInterface *mem_interface = this->_interface->is_MemInterface();
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 if ( mem_interface == NULL ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 const char *disp = mem_interface->_disp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 if ( *disp != '$' ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2308
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 // Lookup replacement variable in operand's component list
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 const char *rep_var = disp + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 const Component *comp = this->_components.search(rep_var);
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 assert( comp != NULL, "Replacement variable not found in components");
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 // Lookup operand form for replacement variable's type
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 const char *type = comp->_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 Form *form = (Form*)globals[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 assert( form != NULL, "Replacement variable's type not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 OperandForm *op = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 assert( op, "Memory Interface 'disp' can only emit an operand form");
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 // Check if this is a ConP, which may require relocation
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 if ( op->is_base_constant(globals) == Form::idealP ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 // Find the constant's index: _c0, _c1, _c2, ... , _cN
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 uint idx = op->constant_position( globals, rep_var);
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
2323 fprintf(fp," virtual bool disp_is_oop() const {");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 fprintf(fp, " return _c%d->isa_oop_ptr();", idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 fprintf(fp, " }\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 // Generate code for internal and external format methods
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 // internal access to reg# node->_idx
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 // access to subsumed constant _c0, _c1,
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 void OperandForm::int_format(FILE *fp, FormDict &globals, uint index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 Form::DataType dtype;
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 if (_matrule && (_matrule->is_base_register(globals) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 // !!!!! !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 fprintf(fp, "{ char reg_str[128];\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 fprintf(fp," ra->dump_register(node,reg_str);\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 fprintf(fp," tty->print(\"%cs\",reg_str);\n",'%');
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 fprintf(fp," }\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 format_constant( fp, index, dtype );
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 } else if (ideal_to_sReg_type(_ident) != Form::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 // Special format for Stack Slot Register
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 fprintf(fp, "{ char reg_str[128];\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 fprintf(fp," ra->dump_register(node,reg_str);\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 fprintf(fp," tty->print(\"%cs\",reg_str);\n",'%');
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 fprintf(fp," }\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 fprintf(fp,"tty->print(\"No format defined for %s\n\");\n", _ident);
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 fflush(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 fprintf(stderr,"No format defined for %s\n", _ident);
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 assert( false,"Internal error:\n output_internal_operand() attempting to output other than a Register or Constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2358
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 // Similar to "int_format" but for cases where data is external to operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 // external access to reg# node->in(idx)->_idx,
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 void OperandForm::ext_format(FILE *fp, FormDict &globals, uint index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 Form::DataType dtype;
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 if (_matrule && (_matrule->is_base_register(globals) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 fprintf(fp, "{ char reg_str[128];\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 fprintf(fp," ra->dump_register(node->in(idx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 if ( index != 0 ) fprintf(fp, "+%d",index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 fprintf(fp, "),reg_str);\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 fprintf(fp," tty->print(\"%cs\",reg_str);\n",'%');
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 fprintf(fp," }\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 format_constant( fp, index, dtype );
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 } else if (ideal_to_sReg_type(_ident) != Form::none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 // Special format for Stack Slot Register
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 fprintf(fp, "{ char reg_str[128];\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 fprintf(fp," ra->dump_register(node->in(idx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 if ( index != 0 ) fprintf(fp, "+%d",index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 fprintf(fp, "),reg_str);\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 fprintf(fp," tty->print(\"%cs\",reg_str);\n",'%');
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 fprintf(fp," }\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 fprintf(fp,"tty->print(\"No format defined for %s\n\");\n", _ident);
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 assert( false,"Internal error:\n output_external_operand() attempting to output other than a Register or Constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2386
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 void OperandForm::format_constant(FILE *fp, uint const_index, uint const_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 switch(const_type) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2389 case Form::idealI: fprintf(fp,"st->print(\"#%%d\", _c%d);\n", const_index); break;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2390 case Form::idealP: fprintf(fp,"_c%d->dump_on(st);\n", const_index); break;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2391 case Form::idealN: fprintf(fp,"_c%d->dump_on(st);\n", const_index); break;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2392 case Form::idealL: fprintf(fp,"st->print(\"#%%lld\", _c%d);\n", const_index); break;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2393 case Form::idealF: fprintf(fp,"st->print(\"#%%f\", _c%d);\n", const_index); break;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2394 case Form::idealD: fprintf(fp,"st->print(\"#%%f\", _c%d);\n", const_index); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 assert( false, "ShouldNotReachHere()");
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2399
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 // Return the operand form corresponding to the given index, else NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 OperandForm *OperandForm::constant_operand(FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 uint index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 // !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 // Check behavior on complex operands
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 uint n_consts = num_consts(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 if( n_consts > 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 uint i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 const char *type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 Component *comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 _components.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 if ((comp = _components.iter()) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 assert(n_consts == 1, "Bad component list detected.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 // Current operand is THE operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 if ( index == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 return this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 } // end if NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 // Skip the first component, it can not be a DEF of a constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 type = comp->base_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 // Check that "type" is a 'ConI', 'ConP', ...
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 if ( ideal_to_const_type(type) != Form::none ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 // When at correct component, get corresponding Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 if ( index == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 return globals[comp->_type]->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 // Decrement number of constants to go
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 --index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 } while((comp = _components.iter()) != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2434
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 // Did not find a constant for this index.
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2438
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 // If this operand has a single ideal type, return its type
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 Form::DataType OperandForm::simple_type(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 const char *type_name = ideal_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 Form::DataType type = type_name ? ideal_to_const_type( type_name )
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 : Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 return type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2446
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 Form::DataType OperandForm::is_base_constant(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 if ( _matrule == NULL ) return Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
2449
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 return _matrule->is_base_constant(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2452
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 // "true" if this operand is a simple type that is swallowed
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 bool OperandForm::swallowed(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 Form::DataType type = simple_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 if( type != Form::none ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2459
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2462
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 // Output code to access the value of the index'th constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 void OperandForm::access_constant(FILE *fp, FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 uint const_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 OperandForm *oper = constant_operand(globals, const_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 assert( oper, "Index exceeds number of constants in operand");
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 Form::DataType dtype = oper->is_base_constant(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2469
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 switch(dtype) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 case idealI: fprintf(fp,"_c%d", const_index); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 case idealP: fprintf(fp,"_c%d->get_con()",const_index); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 case idealL: fprintf(fp,"_c%d", const_index); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 case idealF: fprintf(fp,"_c%d", const_index); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 case idealD: fprintf(fp,"_c%d", const_index); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 assert( false, "ShouldNotReachHere()");
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2480
a61af66fc99e Initial load
duke
parents:
diff changeset
2481
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 void OperandForm::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2485
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 void OperandForm::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 fprintf(fp,"\nOperand: %s\n", (_ident?_ident:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 if (_matrule) _matrule->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 if (_interface) _interface->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 if (_attribs) _attribs->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 if (_predicate) _predicate->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 if (_constraint) _constraint->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 if (_construct) _construct->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 if (_format) _format->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2496
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 //------------------------------Constraint-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 Constraint::Constraint(const char *func, const char *arg)
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 : _func(func), _arg(arg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 Constraint::~Constraint() { /* not owner of char* */
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2503
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 bool Constraint::stack_slots_only() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 return strcmp(_func, "ALLOC_IN_RC") == 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 && strcmp(_arg, "stack_slots") == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2508
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 void Constraint::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2512
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 void Constraint::output(FILE *fp) { // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 assert((_func != NULL && _arg != NULL),"missing constraint function or arg");
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 fprintf(fp,"Constraint: %s ( %s )\n", _func, _arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2517
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 //------------------------------Predicate--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 Predicate::Predicate(char *pr)
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 : _pred(pr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 Predicate::~Predicate() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2524
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 void Predicate::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2528
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 void Predicate::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 fprintf(fp,"Predicate"); // Write to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 //------------------------------Interface--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 Interface::Interface(const char *name) : _name(name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 Interface::~Interface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2537
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 Form::InterfaceType Interface::interface_type(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 Interface *thsi = (Interface*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 if ( thsi->is_RegInterface() ) return Form::register_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 if ( thsi->is_MemInterface() ) return Form::memory_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 if ( thsi->is_ConstInterface() ) return Form::constant_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 if ( thsi->is_CondInterface() ) return Form::conditional_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
2544
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 return Form::no_interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2547
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 RegInterface *Interface::is_RegInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 if ( strcmp(_name,"REG_INTER") != 0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 return (RegInterface*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 MemInterface *Interface::is_MemInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 if ( strcmp(_name,"MEMORY_INTER") != 0 ) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 return (MemInterface*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 ConstInterface *Interface::is_ConstInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 if ( strcmp(_name,"CONST_INTER") != 0 ) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 return (ConstInterface*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 CondInterface *Interface::is_CondInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 if ( strcmp(_name,"COND_INTER") != 0 ) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 return (CondInterface*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2565
a61af66fc99e Initial load
duke
parents:
diff changeset
2566
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 void Interface::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2570
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 void Interface::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 fprintf(fp,"Interface: %s\n", (_name ? _name : "") );
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2575
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 //------------------------------RegInterface-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 RegInterface::RegInterface() : Interface("REG_INTER") {
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 RegInterface::~RegInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2581
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 void RegInterface::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2585
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 void RegInterface::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 Interface::output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2590
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 //------------------------------ConstInterface---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 ConstInterface::ConstInterface() : Interface("CONST_INTER") {
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 ConstInterface::~ConstInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2596
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 void ConstInterface::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2600
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 void ConstInterface::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 Interface::output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2605
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 //------------------------------MemInterface-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 MemInterface::MemInterface(char *base, char *index, char *scale, char *disp)
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 : Interface("MEMORY_INTER"), _base(base), _index(index), _scale(scale), _disp(disp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 MemInterface::~MemInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 // not owner of any character arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2613
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 void MemInterface::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2617
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 void MemInterface::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 Interface::output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 if ( _base != NULL ) fprintf(fp," base == %s\n", _base);
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 if ( _index != NULL ) fprintf(fp," index == %s\n", _index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 if ( _scale != NULL ) fprintf(fp," scale == %s\n", _scale);
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 if ( _disp != NULL ) fprintf(fp," disp == %s\n", _disp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 // fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2627
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 //------------------------------CondInterface----------------------------------
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2629 CondInterface::CondInterface(const char* equal, const char* equal_format,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2630 const char* not_equal, const char* not_equal_format,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2631 const char* less, const char* less_format,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2632 const char* greater_equal, const char* greater_equal_format,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2633 const char* less_equal, const char* less_equal_format,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2634 const char* greater, const char* greater_format)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 : Interface("COND_INTER"),
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2636 _equal(equal), _equal_format(equal_format),
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2637 _not_equal(not_equal), _not_equal_format(not_equal_format),
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2638 _less(less), _less_format(less_format),
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2639 _greater_equal(greater_equal), _greater_equal_format(greater_equal_format),
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2640 _less_equal(less_equal), _less_equal_format(less_equal_format),
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 356
diff changeset
2641 _greater(greater), _greater_format(greater_format) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 CondInterface::~CondInterface() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 // not owner of any character arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2646
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 void CondInterface::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2650
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 void CondInterface::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 Interface::output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 if ( _equal != NULL ) fprintf(fp," equal == %s\n", _equal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 if ( _not_equal != NULL ) fprintf(fp," not_equal == %s\n", _not_equal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 if ( _less != NULL ) fprintf(fp," less == %s\n", _less);
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 if ( _greater_equal != NULL ) fprintf(fp," greater_equal == %s\n", _greater_equal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 if ( _less_equal != NULL ) fprintf(fp," less_equal == %s\n", _less_equal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 if ( _greater != NULL ) fprintf(fp," greater == %s\n", _greater);
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 // fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2662
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 //------------------------------ConstructRule----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 ConstructRule::ConstructRule(char *cnstr)
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 : _construct(cnstr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 ConstructRule::~ConstructRule() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2669
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 void ConstructRule::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 void ConstructRule::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 fprintf(fp,"\nConstruct Rule\n"); // Write to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2677
a61af66fc99e Initial load
duke
parents:
diff changeset
2678
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 //==============================Shared Forms===================================
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 //------------------------------AttributeForm----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 int AttributeForm::_insId = 0; // start counter at 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 int AttributeForm::_opId = 0; // start counter at 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 const char* AttributeForm::_ins_cost = "ins_cost"; // required name
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 const char* AttributeForm::_ins_pc_relative = "ins_pc_relative";
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 const char* AttributeForm::_op_cost = "op_cost"; // required name
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 AttributeForm::AttributeForm(char *attr, int type, char *attrdef)
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 : Form(Form::ATTR), _attrname(attr), _atype(type), _attrdef(attrdef) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 if (type==OP_ATTR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 id = ++_opId;
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 else if (type==INS_ATTR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 id = ++_insId;
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 else assert( false,"");
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 AttributeForm::~AttributeForm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2699
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 // Dynamic type check
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 AttributeForm *AttributeForm::is_attribute() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 return (AttributeForm*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2704
a61af66fc99e Initial load
duke
parents:
diff changeset
2705
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 // inlined // int AttributeForm::type() { return id;}
a61af66fc99e Initial load
duke
parents:
diff changeset
2707
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 void AttributeForm::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2711
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 void AttributeForm::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 if( _attrname && _attrdef ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 fprintf(fp,"\n// AttributeForm \nstatic const int %s = %s;\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 _attrname, _attrdef);
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 fprintf(fp,"\n// AttributeForm missing name %s or definition %s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 (_attrname?_attrname:""), (_attrdef?_attrdef:"") );
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2722
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 //------------------------------Component--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 Component::Component(const char *name, const char *type, int usedef)
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 : _name(name), _type(type), _usedef(usedef) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 _ftype = Form::COMP;
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 Component::~Component() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2730
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 // True if this component is equal to the parameter.
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 bool Component::is(int use_def_kill_enum) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 return (_usedef == use_def_kill_enum ? true : false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 // True if this component is used/def'd/kill'd as the parameter suggests.
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 bool Component::isa(int use_def_kill_enum) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 return (_usedef & use_def_kill_enum) == use_def_kill_enum;
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2739
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 // Extend this component with additional use/def/kill behavior
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 int Component::promote_use_def_info(int new_use_def) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 _usedef |= new_use_def;
a61af66fc99e Initial load
duke
parents:
diff changeset
2743
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 return _usedef;
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2746
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 // Check the base type of this component, if it has one
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 const char *Component::base_type(FormDict &globals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 const Form *frm = globals[_type];
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 if (frm == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 OperandForm *op = frm->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 if (op == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 if (op->ideal_only()) return op->_ident;
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 return (char *)op->ideal_type(globals);
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2756
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 void Component::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2760
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 void Component::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 fprintf(fp,"Component:"); // Write to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 fprintf(fp, " name = %s", _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 fprintf(fp, ", type = %s", _type);
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 const char * usedef = "Undefined Use/Def info";
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 switch (_usedef) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 case USE: usedef = "USE"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 case USE_DEF: usedef = "USE_DEF"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 case USE_KILL: usedef = "USE_KILL"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 case KILL: usedef = "KILL"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 case TEMP: usedef = "TEMP"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 case DEF: usedef = "DEF"; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 default: assert(false, "unknown effect");
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 fprintf(fp, ", use/def = %s\n", usedef);
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2777
a61af66fc99e Initial load
duke
parents:
diff changeset
2778
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 //------------------------------ComponentList---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 ComponentList::ComponentList() : NameList(), _matchcnt(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 ComponentList::~ComponentList() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 // // This list may not own its elements if copied via assignment
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 // Component *component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 // for (reset(); (component = iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 // delete component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2789
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 void ComponentList::insert(Component *component, bool mflag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 NameList::addName((char *)component);
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 if(mflag) _matchcnt++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 void ComponentList::insert(const char *name, const char *opType, int usedef,
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 bool mflag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 Component * component = new Component(name, opType, usedef);
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 insert(component, mflag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 Component *ComponentList::current() { return (Component*)NameList::current(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 Component *ComponentList::iter() { return (Component*)NameList::iter(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 Component *ComponentList::match_iter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 if(_iter < _matchcnt) return (Component*)NameList::iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 Component *ComponentList::post_match_iter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 Component *comp = iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 // At end of list?
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 if ( comp == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 return comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 // In post-match components?
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 if (_iter > match_count()-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 return comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2815
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 return post_match_iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2818
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 void ComponentList::reset() { NameList::reset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 int ComponentList::count() { return NameList::count(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2821
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 Component *ComponentList::operator[](int position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 // Shortcut complete iteration if there are not enough entries
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 if (position >= count()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2825
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 Component *component = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 for (reset(); (component = iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 if (index == position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 return component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 ++index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2834
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2837
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 const Component *ComponentList::search(const char *name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 for( Component *comp = NULL; ((comp = iter()) != NULL); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 if( strcmp(comp->_name,name) == 0 ) return comp;
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2844
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2847
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 // Return number of USEs + number of DEFs
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 // When there are no components, or the first component is a USE,
a61af66fc99e Initial load
duke
parents:
diff changeset
2850 // then we add '1' to hold a space for the 'result' operand.
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 int ComponentList::num_operands() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 uint count = 1; // result operand
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 uint position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2855
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 Component *component = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 for( reset(); (component = iter()) != NULL; ++position ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 if( component->isa(Component::USE) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 ( position == 0 && (! component->isa(Component::DEF))) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 ++count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2863
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2866
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 // Return zero-based position in list; -1 if not in list.
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 // if parameter 'usedef' is ::USE, it will match USE, USE_DEF, ...
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 int ComponentList::operand_position(const char *name, int usedef) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 int position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 int num_opnds = num_operands();
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 Component *component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 Component* preceding_non_use = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 Component* first_def = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 for (reset(); (component = iter()) != NULL; ++position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 // When the first component is not a DEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 // leave space for the result operand!
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 if ( position==0 && (! component->isa(Component::DEF)) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 ++num_opnds;
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 if (strcmp(name, component->_name)==0 && (component->isa(usedef))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 // When the first entry in the component list is a DEF and a USE
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 // Treat them as being separate, a DEF first, then a USE
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 if( position==0
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 && usedef==Component::USE && component->isa(Component::DEF) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 assert(position+1 < num_opnds, "advertised index in bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 return position+1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 if( preceding_non_use && strcmp(component->_name, preceding_non_use->_name) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 fprintf(stderr, "the name '%s' should not precede the name '%s'\n", preceding_non_use->_name, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 if( position >= num_opnds ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 fprintf(stderr, "the name '%s' is too late in its name list\n", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 assert(position < num_opnds, "advertised index in bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 if( component->isa(Component::DEF)
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 && component->isa(Component::USE) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 if( component->isa(Component::DEF) && !first_def ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 first_def = component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 if( !component->isa(Component::USE) && component != first_def ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 preceding_non_use = component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 } else if( preceding_non_use && !strcmp(component->_name, preceding_non_use->_name) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 preceding_non_use = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 return Not_in_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2917
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 // Find position for this name, regardless of use/def information
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 int ComponentList::operand_position(const char *name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 int position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 Component *component;
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 for (reset(); (component = iter()) != NULL; ++position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 // When the first component is not a DEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 // leave space for the result operand!
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 if ( position==0 && (! component->isa(Component::DEF)) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 if (strcmp(name, component->_name)==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 if( component->isa(Component::DEF)
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 && component->isa(Component::USE) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2938 return Not_in_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2940
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 int ComponentList::operand_position_format(const char *name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 int first_position = operand_position(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 int use_position = operand_position(name, Component::USE);
a61af66fc99e Initial load
duke
parents:
diff changeset
2945
a61af66fc99e Initial load
duke
parents:
diff changeset
2946 return ((first_position < use_position) ? use_position : first_position);
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2948
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 int ComponentList::label_position() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 int position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 for( Component *comp; (comp = iter()) != NULL; ++position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 // When the first component is not a DEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 // leave space for the result operand!
a61af66fc99e Initial load
duke
parents:
diff changeset
2956 if ( position==0 && (! comp->isa(Component::DEF)) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2957 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 if (strcmp(comp->_type, "label")==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 if( comp->isa(Component::DEF)
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 && comp->isa(Component::USE) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2968
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2971
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 int ComponentList::method_position() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 int position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 for( Component *comp; (comp = iter()) != NULL; ++position) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 // When the first component is not a DEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 // leave space for the result operand!
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 if ( position==0 && (! comp->isa(Component::DEF)) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 if (strcmp(comp->_type, "method")==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 return position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 if( comp->isa(Component::DEF)
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 && comp->isa(Component::USE) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2991
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2994
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 void ComponentList::dump() { output(stderr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2996
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 void ComponentList::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 PreserveIter pi(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 fprintf(fp, "\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 Component *component;
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 for (reset(); (component = iter()) != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 component->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 fprintf(fp, "\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3006
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 //------------------------------MatchNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 MatchNode::MatchNode(ArchDesc &ad, const char *result, const char *mexpr,
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 const char *opType, MatchNode *lChild, MatchNode *rChild)
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 : _AD(ad), _result(result), _name(mexpr), _opType(opType),
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 _lChild(lChild), _rChild(rChild), _internalop(0), _numleaves(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 _commutative_id(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 _numleaves = (lChild ? lChild->_numleaves : 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 + (rChild ? rChild->_numleaves : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3016
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode)
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 : _AD(ad), _result(mnode._result), _name(mnode._name),
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 _opType(mnode._opType), _lChild(mnode._lChild), _rChild(mnode._rChild),
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 _internalop(0), _numleaves(mnode._numleaves),
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 _commutative_id(mnode._commutative_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3023
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode, int clone)
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 : _AD(ad), _result(mnode._result), _name(mnode._name),
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 _opType(mnode._opType),
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 _internalop(0), _numleaves(mnode._numleaves),
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 _commutative_id(mnode._commutative_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 if (mnode._lChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 _lChild = new MatchNode(ad, *mnode._lChild, clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 _lChild = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3034 if (mnode._rChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 _rChild = new MatchNode(ad, *mnode._rChild, clone);
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 _rChild = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3040
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 MatchNode::~MatchNode() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 // // This node may not own its children if copied via assignment
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 // if( _lChild ) delete _lChild;
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 // if( _rChild ) delete _rChild;
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3046
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 bool MatchNode::find_type(const char *type, int &position) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 if ( (_lChild != NULL) && (_lChild->find_type(type, position)) ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 if ( (_rChild != NULL) && (_rChild->find_type(type, position)) ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3050
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 if (strcmp(type,_opType)==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 ++position;
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3058
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 // Recursive call collecting info on top-level operands, not transitive.
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 // Implementation does not modify state of internal structures.
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3061 void MatchNode::append_components(FormDict& locals, ComponentList& components,
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3062 bool def_flag) const {
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3063 int usedef = def_flag ? Component::DEF : Component::USE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 FormDict &globals = _AD.globalNames();
a61af66fc99e Initial load
duke
parents:
diff changeset
3065
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 assert (_name != NULL, "MatchNode::build_components encountered empty node\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 // Base case
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 if (_lChild==NULL && _rChild==NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 // If _opType is not an operation, do not build a component for it #####
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 const Form *f = globals[_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3071 if( f != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 // Add non-ideals that are operands, operand-classes,
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 if( ! f->ideal_only()
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 && (f->is_opclass() || f->is_operand()) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 components.insert(_name, _opType, usedef, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 // Promote results of "Set" to DEF
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3081 bool tmpdef_flag = (!strcmp(_opType, "Set")) ? true : false;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3082 if (_lChild) _lChild->append_components(locals, components, tmpdef_flag);
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3083 tmpdef_flag = false; // only applies to component immediately following 'Set'
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3084 if (_rChild) _rChild->append_components(locals, components, tmpdef_flag);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3086
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 // Find the n'th base-operand in the match node,
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 // recursively investigates match rules of user-defined operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 // Implementation does not modify state of internal structures since they
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 // can be shared.
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 bool MatchNode::base_operand(uint &position, FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 const char * &result, const char * &name,
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 const char * &opType) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 assert (_name != NULL, "MatchNode::base_operand encountered empty node\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 // Base case
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 if (_lChild==NULL && _rChild==NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 // Check for special case: "Universe", "label"
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 if (strcmp(_opType,"Universe") == 0 || strcmp(_opType,"label")==0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 if (position == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 result = _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 name = _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 opType = _opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3106 -- position;
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3110
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 const Form *form = globals[_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 MatchNode *matchNode = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3113 // Check for user-defined type
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 if (form) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 // User operand or instruction?
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 OperandForm *opForm = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 InstructForm *inForm = form->is_instruction();
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 if ( opForm ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 matchNode = (MatchNode*)opForm->_matrule;
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 } else if ( inForm ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 matchNode = (MatchNode*)inForm->_matrule;
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 // if this is user-defined, recurse on match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
3125 // User-defined operand and instruction forms have a match-rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 if (matchNode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 return (matchNode->base_operand(position,globals,result,name,opType));
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 // Either not a form, or a system-defined form (no match rule).
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 if (position==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 result = _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 name = _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 opType = _opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 --position;
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3140
a61af66fc99e Initial load
duke
parents:
diff changeset
3141 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 // Examine the left child and right child as well
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 if (_lChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 if (_lChild->base_operand(position, globals, result, name, opType))
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3147
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 if (_rChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3149 if (_rChild->base_operand(position, globals, result, name, opType))
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3153
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3156
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 // Recursive call on all operands' match rules in my match rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 uint MatchNode::num_consts(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 uint index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3160 uint num_consts = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 const char *result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 const char *opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3164
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 for (uint position = index;
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 base_operand(position,globals,result,name,opType); position = index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 ++index;
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 if( ideal_to_const_type(opType) ) num_consts++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3170
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 return num_consts;
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3173
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 // Recursive call on all operands' match rules in my match rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 // Constants in match rule subtree with specified type
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 uint MatchNode::num_consts(FormDict &globals, Form::DataType type) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 uint index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 uint num_consts = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 const char *result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 const char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 const char *opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3182
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 for (uint position = index;
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 base_operand(position,globals,result,name,opType); position = index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 ++index;
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 if( ideal_to_const_type(opType) == type ) num_consts++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3188
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 return num_consts;
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3191
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 // Recursive call on all operands' match rules in my match rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 uint MatchNode::num_const_ptrs(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 return num_consts( globals, Form::idealP );
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3196
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 bool MatchNode::sets_result() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 return ( (strcmp(_name,"Set") == 0) ? true : false );
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3200
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 const char *MatchNode::reduce_right(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 // If there is no right reduction, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 const char *rightStr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3204
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 // If we are a "Set", start from the right child.
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 const MatchNode *const mnode = sets_result() ?
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 (const MatchNode *const)this->_rChild :
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 (const MatchNode *const)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
3209
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 // If our right child exists, it is the right reduction
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 if ( mnode->_rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 rightStr = mnode->_rChild->_internalop ? mnode->_rChild->_internalop
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 : mnode->_rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 // Else, May be simple chain rule: (Set dst operand_form), rightStr=NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 return rightStr;
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3218
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 const char *MatchNode::reduce_left(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 // If there is no left reduction, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 const char *leftStr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3222
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 // If we are a "Set", start from the right child.
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 const MatchNode *const mnode = sets_result() ?
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 (const MatchNode *const)this->_rChild :
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 (const MatchNode *const)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
3227
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 // If our left child exists, it is the left reduction
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 if ( mnode->_lChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 leftStr = mnode->_lChild->_internalop ? mnode->_lChild->_internalop
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 : mnode->_lChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 // May be simple chain rule: (Set dst operand_form_source)
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 if ( sets_result() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 OperandForm *oper = globals[mnode->_opType]->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 if( oper ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 leftStr = mnode->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 return leftStr;
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3243
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 //------------------------------count_instr_names------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 // Count occurrences of operands names in the leaves of the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 // match rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 void MatchNode::count_instr_names( Dict &names ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 if( !this ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 if( _lChild ) _lChild->count_instr_names(names);
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 if( _rChild ) _rChild->count_instr_names(names);
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 if( !_lChild && !_rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 uintptr_t cnt = (uintptr_t)names[_name];
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 cnt++; // One more name found
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 names.Insert(_name,(void*)cnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3257
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 //------------------------------build_instr_pred-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 // Build a path to 'name' in buf. Actually only build if cnt is zero, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 // can skip some leading instances of 'name'.
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 int MatchNode::build_instr_pred( char *buf, const char *name, int cnt ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 if( _lChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 if( !cnt ) strcpy( buf, "_kids[0]->" );
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 cnt = _lChild->build_instr_pred( buf+strlen(buf), name, cnt );
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 if( cnt < 0 ) return cnt; // Found it, all done
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 if( _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 if( !cnt ) strcpy( buf, "_kids[1]->" );
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 cnt = _rChild->build_instr_pred( buf+strlen(buf), name, cnt );
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 if( cnt < 0 ) return cnt; // Found it, all done
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 if( !_lChild && !_rChild ) { // Found a leaf
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 // Wrong name? Give up...
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 if( strcmp(name,_name) ) return cnt;
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 if( !cnt ) strcpy(buf,"_leaf");
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 return cnt-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 return cnt;
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3280
a61af66fc99e Initial load
duke
parents:
diff changeset
3281
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 //------------------------------build_internalop-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 // Build string representation of subtree
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 void MatchNode::build_internalop( ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 char *iop, *subtree;
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 const char *lstr, *rstr;
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 // Build string representation of subtree
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 // Operation lchildType rchildType
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 int len = (int)strlen(_opType) + 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 lstr = (_lChild) ? ((_lChild->_internalop) ?
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 _lChild->_internalop : _lChild->_opType) : "";
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 rstr = (_rChild) ? ((_rChild->_internalop) ?
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 _rChild->_internalop : _rChild->_opType) : "";
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 len += (int)strlen(lstr) + (int)strlen(rstr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 subtree = (char *)malloc(len);
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 // Hash the subtree string in _internalOps; if a name exists, use it
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 iop = (char *)_AD._internalOps[subtree];
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 // Else create a unique name, and add it to the hash table
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 if (iop == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 iop = subtree;
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 _AD._internalOps.Insert(subtree, iop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3303 _AD._internalOpNames.addName(iop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 _AD._internalMatch.Insert(iop, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 // Add the internal operand name to the MatchNode
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 _internalop = iop;
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 _result = iop;
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3310
a61af66fc99e Initial load
duke
parents:
diff changeset
3311
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 void MatchNode::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3315
a61af66fc99e Initial load
duke
parents:
diff changeset
3316 void MatchNode::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 if (_lChild==0 && _rChild==0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 fprintf(fp," %s",_name); // operand
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3321 fprintf(fp," (%s ",_name); // " (opcodeName "
a61af66fc99e Initial load
duke
parents:
diff changeset
3322 if(_lChild) _lChild->output(fp); // left operand
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 if(_rChild) _rChild->output(fp); // right operand
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 fprintf(fp,")"); // ")"
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3327
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 static const char *needs_ideal_memory_list[] = {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3330 "StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" ,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 "StoreB","StoreC","Store" ,"StoreFP",
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3332 "LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" ,
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3333 "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3334 "Store4I","Store2I","Store2L","Store2D","Store4F","Store2F","Store16B",
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 "Store8B","Store4B","Store8C","Store4C","Store2C",
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" ,
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 "Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S",
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 113
diff changeset
3338 "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 "LoadPLocked", "LoadLLocked",
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
3340 "StorePConditional", "StoreIConditional", "StoreLConditional",
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3341 "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 "StoreCM",
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 "ClearArray"
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 if( strcmp(_opType,"PrefetchRead")==0 || strcmp(_opType,"PrefetchWrite")==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3348 if( _lChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 const char *opType = _lChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 for( int i=0; i<cnt; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 if( strcmp(opType,needs_ideal_memory_list[i]) == 0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 if( _lChild->needs_ideal_memory_edge(globals) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3356 if( _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 const char *opType = _rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 for( int i=0; i<cnt; i++ )
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 if( strcmp(opType,needs_ideal_memory_list[i]) == 0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 if( _rChild->needs_ideal_memory_edge(globals) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3364
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3367
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 // TRUE if defines a derived oop, and so needs a base oop edge present
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 // post-matching.
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 int MatchNode::needs_base_oop_edge() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 if( !strcmp(_opType,"AddP") ) return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 if( strcmp(_opType,"Set") ) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 return !strcmp(_rChild->_opType,"AddP");
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3375
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 int InstructForm::needs_base_oop_edge(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 if( is_simple_chain_rule(globals) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 const char *src = _matrule->_rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 OperandForm *src_op = globals[src]->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 assert( src_op, "Not operand class of chain rule" );
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 return src_op->_matrule ? src_op->_matrule->needs_base_oop_edge() : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 } // Else check instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
3383
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 return _matrule ? _matrule->needs_base_oop_edge() : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3386
a61af66fc99e Initial load
duke
parents:
diff changeset
3387
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 //-------------------------cisc spilling methods-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 // helper routines and methods for detecting cisc-spilling instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 //-------------------------cisc_spill_merge------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 int MatchNode::cisc_spill_merge(int left_spillable, int right_spillable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 int cisc_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3393
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 // Combine results of left and right checks
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 if( (left_spillable == Maybe_cisc_spillable) && (right_spillable == Maybe_cisc_spillable) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 // neither side is spillable, nor prevents cisc spilling
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 cisc_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 else if( (left_spillable == Maybe_cisc_spillable) && (right_spillable > Maybe_cisc_spillable) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 // right side is spillable
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 cisc_spillable = right_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 else if( (right_spillable == Maybe_cisc_spillable) && (left_spillable > Maybe_cisc_spillable) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 // left side is spillable
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 cisc_spillable = left_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 else if( (left_spillable == Not_cisc_spillable) || (right_spillable == Not_cisc_spillable) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 // left or right prevents cisc spilling this instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 cisc_spillable = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 // Only allow one to spill
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 cisc_spillable = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3415
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 return cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3418
a61af66fc99e Initial load
duke
parents:
diff changeset
3419 //-------------------------root_ops_match--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 bool static root_ops_match(FormDict &globals, const char *op1, const char *op2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 // Base Case: check that the current operands/operations match
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 assert( op1, "Must have op's name");
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 assert( op2, "Must have op's name");
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 const Form *form1 = globals[op1];
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 const Form *form2 = globals[op2];
a61af66fc99e Initial load
duke
parents:
diff changeset
3426
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 return (form1 == form2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3429
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3430 //-------------------------cisc_spill_match_node-------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 // Recursively check two MatchRules for legal conversion via cisc-spilling
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3432 int MatchNode::cisc_spill_match(FormDict& globals, RegisterForm* registers, MatchNode* mRule2, const char* &operand, const char* &reg_type) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 int cisc_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 int left_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 int right_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3436
a61af66fc99e Initial load
duke
parents:
diff changeset
3437 // Check that each has same number of operands at this level
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 return Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3440
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 // Base Case: check that the current operands/operations match
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 // or are CISC spillable
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 assert( _opType, "Must have _opType");
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 assert( mRule2->_opType, "Must have _opType");
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 const Form *form = globals[_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 const Form *form2 = globals[mRule2->_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 if( form == form2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 cisc_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 const InstructForm *form2_inst = form2 ? form2->is_instruction() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 const char *name_left = mRule2->_lChild ? mRule2->_lChild->_opType : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 const char *name_right = mRule2->_rChild ? mRule2->_rChild->_opType : NULL;
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3453 DataType data_type = Form::none;
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3454 if (form->is_operand()) {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3455 // Make sure the loadX matches the type of the reg
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3456 data_type = form->ideal_to_Reg_type(form->is_operand()->ideal_type(globals));
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3457 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 // Detect reg vs (loadX memory)
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 if( form->is_cisc_reg(globals)
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 && form2_inst
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3461 && data_type != Form::none
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
3462 && (is_load_from_memory(mRule2->_opType) == data_type) // reg vs. (load memory)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 && (name_left != NULL) // NOT (load)
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 && (name_right == NULL) ) { // NOT (load memory foo)
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 const Form *form2_left = name_left ? globals[name_left] : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 if( form2_left && form2_left->is_cisc_mem(globals) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 cisc_spillable = Is_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 operand = _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 reg_type = _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 return Is_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 cisc_spillable = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // Detect reg vs memory
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 else if( form->is_cisc_reg(globals) && form2->is_cisc_mem(globals) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 cisc_spillable = Is_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 operand = _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 reg_type = _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 return Is_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 cisc_spillable = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3485
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 // If cisc is still possible, check rest of tree
a61af66fc99e Initial load
duke
parents:
diff changeset
3487 if( cisc_spillable == Maybe_cisc_spillable ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 // Check that each has same number of operands at this level
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3490
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 // Check left operands
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 if( (_lChild == NULL) && (mRule2->_lChild == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 left_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 left_spillable = _lChild->cisc_spill_match(globals, registers, mRule2->_lChild, operand, reg_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3497
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 // Check right operands
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 if( (_rChild == NULL) && (mRule2->_rChild == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 right_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3504
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 // Combine results of left and right checks
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 cisc_spillable = cisc_spill_merge(left_spillable, right_spillable);
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3508
a61af66fc99e Initial load
duke
parents:
diff changeset
3509 return cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3511
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3512 //---------------------------cisc_spill_match_rule------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 // Recursively check two MatchRules for legal conversion via cisc-spilling
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 // This method handles the root of Match tree,
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 // general recursive checks done in MatchNode
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3516 int MatchRule::matchrule_cisc_spill_match(FormDict& globals, RegisterForm* registers,
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3517 MatchRule* mRule2, const char* &operand,
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3518 const char* &reg_type) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 int cisc_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 int left_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 int right_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3522
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 // Check that each sets a result
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 if( !(sets_result() && mRule2->sets_result()) ) return Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 // Check that each has same number of operands at this level
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3527
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 // Check left operands: at root, must be target of 'Set'
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 if( (_lChild == NULL) || (mRule2->_lChild == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 left_spillable = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 // Do not support cisc-spilling instruction's target location
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 if( root_ops_match(globals, _lChild->_opType, mRule2->_lChild->_opType) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 left_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3536 left_spillable = Not_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3539
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 // Check right operands: recursive walk to identify reg->mem operand
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 if( (_rChild == NULL) && (mRule2->_rChild == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 right_spillable = Maybe_cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3546
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 // Combine results of left and right checks
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 cisc_spillable = cisc_spill_merge(left_spillable, right_spillable);
a61af66fc99e Initial load
duke
parents:
diff changeset
3549
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 return cisc_spillable;
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3552
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 //----------------------------- equivalent ------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 // Recursively check to see if two match rules are equivalent.
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 // This rule handles the root.
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3556 bool MatchRule::equivalent(FormDict &globals, MatchNode *mRule2) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 // Check that each sets a result
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 if (sets_result() != mRule2->sets_result()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3561
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 // Check that the current operands/operations match
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 assert( _opType, "Must have _opType");
a61af66fc99e Initial load
duke
parents:
diff changeset
3564 assert( mRule2->_opType, "Must have _opType");
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 const Form *form = globals[_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3566 const Form *form2 = globals[mRule2->_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 if( form != form2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3570
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 if (_lChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 if( !_lChild->equivalent(globals, mRule2->_lChild) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 } else if (mRule2->_lChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 return false; // I have NULL left child, mRule2 has non-NULL left child.
a61af66fc99e Initial load
duke
parents:
diff changeset
3576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3577
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 if (_rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 if( !_rChild->equivalent(globals, mRule2->_rChild) )
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 } else if (mRule2->_rChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 return false; // I have NULL right child, mRule2 has non-NULL right child.
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3584
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 // We've made it through the gauntlet.
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3588
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 //----------------------------- equivalent ------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 // Recursively check to see if two match rules are equivalent.
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 // This rule handles the operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 bool MatchNode::equivalent(FormDict &globals, MatchNode *mNode2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 if( !mNode2 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3595
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 // Check that the current operands/operations match
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 assert( _opType, "Must have _opType");
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 assert( mNode2->_opType, "Must have _opType");
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 const Form *form = globals[_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 const Form *form2 = globals[mNode2->_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 return (form == form2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3603
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 //-------------------------- has_commutative_op -------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 // Recursively check for commutative operations with subtree operands
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 // which could be swapped.
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 void MatchNode::count_commutative_op(int& count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 static const char *commut_op_list[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 "AddI","AddL","AddF","AddD",
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 "AndI","AndL",
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 "MaxI","MinI",
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 "MulI","MulL","MulF","MulD",
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 "OrI" ,"OrL" ,
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 "XorI","XorL"
a61af66fc99e Initial load
duke
parents:
diff changeset
3615 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 int cnt = sizeof(commut_op_list)/sizeof(char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
3617
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 if( _lChild && _rChild && (_lChild->_lChild || _rChild->_lChild) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 // Don't swap if right operand is an immediate constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 bool is_const = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 if( _rChild->_lChild == NULL && _rChild->_rChild == NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 FormDict &globals = _AD.globalNames();
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 const Form *form = globals[_rChild->_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 if ( form ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 OperandForm *oper = form->is_operand();
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 if( oper && oper->interface_type(globals) == Form::constant_interface )
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 is_const = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 if( !is_const ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 for( int i=0; i<cnt; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 if( strcmp(_opType, commut_op_list[i]) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 _commutative_id = count; // id should be > 0
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 if( _lChild )
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 _lChild->count_commutative_op(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 if( _rChild )
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 _rChild->count_commutative_op(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3645
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 //-------------------------- swap_commutative_op ------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 // Recursively swap specified commutative operation with subtree operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 void MatchNode::swap_commutative_op(bool atroot, int id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 if( _commutative_id == id ) { // id should be > 0
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 assert(_lChild && _rChild && (_lChild->_lChild || _rChild->_lChild ),
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 "not swappable operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 MatchNode* tmp = _lChild;
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 _lChild = _rChild;
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 _rChild = tmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 // Don't exit here since we need to build internalop.
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3657
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 bool is_set = ( strcmp(_opType, "Set") == 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 if( _lChild )
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 _lChild->swap_commutative_op(is_set, id);
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 if( _rChild )
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 _rChild->swap_commutative_op(is_set, id);
a61af66fc99e Initial load
duke
parents:
diff changeset
3663
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 // If not the root, reduce this subtree to an internal operand
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 if( !atroot && (_lChild || _rChild) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 build_internalop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3669
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 //-------------------------- swap_commutative_op ------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 // Recursively swap specified commutative operation with subtree operands.
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3672 void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 assert(match_rules_cnt < 100," too many match rule clones");
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 // Clone
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 MatchRule* clone = new MatchRule(_AD, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 // Swap operands of commutative operation
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 ((MatchNode*)clone)->swap_commutative_op(true, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 char* buf = (char*) malloc(strlen(instr_ident) + 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++);
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 clone->_result = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
3681
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 clone->_next = this->_next;
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 this-> _next = clone;
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 if( (--count) > 0 ) {
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3685 this-> matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3686 clone->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3689
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 //------------------------------MatchRule--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 MatchRule::MatchRule(ArchDesc &ad)
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 : MatchNode(ad), _depth(0), _construct(NULL), _numchilds(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3695
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 MatchRule::MatchRule(ArchDesc &ad, MatchRule* mRule)
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 : MatchNode(ad, *mRule, 0), _depth(mRule->_depth),
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 _construct(mRule->_construct), _numchilds(mRule->_numchilds) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3701
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 MatchRule::MatchRule(ArchDesc &ad, MatchNode* mroot, int depth, char *cnstr,
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 int numleaves)
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 : MatchNode(ad,*mroot), _depth(depth), _construct(cnstr),
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 _numchilds(0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 mroot->_lChild = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 mroot->_rChild = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3709 delete mroot;
a61af66fc99e Initial load
duke
parents:
diff changeset
3710 _numleaves = numleaves;
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 _numchilds = (_lChild ? 1 : 0) + (_rChild ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3712 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 MatchRule::~MatchRule() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3715
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 // Recursive call collecting info on top-level operands, not transitive.
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 // Implementation does not modify state of internal structures.
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 602
diff changeset
3718 void MatchRule::append_components(FormDict& locals, ComponentList& components, bool def_flag) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 assert (_name != NULL, "MatchNode::build_components encountered empty node\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
3720
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 MatchNode::append_components(locals, components,
a61af66fc99e Initial load
duke
parents:
diff changeset
3722 false /* not necessarily a def */);
a61af66fc99e Initial load
duke
parents:
diff changeset
3723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3724
a61af66fc99e Initial load
duke
parents:
diff changeset
3725 // Recursive call on all operands' match rules in my match rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 // Implementation does not modify state of internal structures since they
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 // can be shared.
a61af66fc99e Initial load
duke
parents:
diff changeset
3728 // The MatchNode that is called first treats its
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 bool MatchRule::base_operand(uint &position0, FormDict &globals,
a61af66fc99e Initial load
duke
parents:
diff changeset
3730 const char *&result, const char * &name,
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 const char * &opType)const{
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 uint position = position0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3733
a61af66fc99e Initial load
duke
parents:
diff changeset
3734 return (MatchNode::base_operand( position, globals, result, name, opType));
a61af66fc99e Initial load
duke
parents:
diff changeset
3735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3736
a61af66fc99e Initial load
duke
parents:
diff changeset
3737
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 bool MatchRule::is_base_register(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 uint position = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 const char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3742 const char *opType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 if (!base_operand(position, globals, result, name, opType)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3744 position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 if( base_operand(position, globals, result, name, opType) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 (strcmp(opType,"RegI")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3747 strcmp(opType,"RegP")==0 ||
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3748 strcmp(opType,"RegN")==0 ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3749 strcmp(opType,"RegL")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3750 strcmp(opType,"RegF")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3751 strcmp(opType,"RegD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 strcmp(opType,"Reg" )==0) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3758
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 Form::DataType MatchRule::is_base_constant(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 uint position = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3761 const char *result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 const char *name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3763 const char *opType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 if (!base_operand(position, globals, result, name, opType)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3765 position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 if (base_operand(position, globals, result, name, opType)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 return ideal_to_const_type(opType);
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3770 return Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
3771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3772
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 bool MatchRule::is_chain_rule(FormDict &globals) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3774
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 // Check for chain rule, and do not generate a match list for it
a61af66fc99e Initial load
duke
parents:
diff changeset
3776 if ((_lChild == NULL) && (_rChild == NULL) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 const Form *form = globals[_opType];
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 // If this is ideal, then it is a base match, not a chain rule.
a61af66fc99e Initial load
duke
parents:
diff changeset
3779 if ( form && form->is_operand() && (!form->ideal_only())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 // Check for "Set" form of chain rule, and do not generate a match list
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 if (_rChild) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 const char *rch = _rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3786 const Form *form = globals[rch];
a61af66fc99e Initial load
duke
parents:
diff changeset
3787 if ((!strcmp(_opType,"Set") &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 ((form) && form->is_operand()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3789 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3792 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3794
a61af66fc99e Initial load
duke
parents:
diff changeset
3795 int MatchRule::is_ideal_copy() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3796 if( _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 const char *opType = _rChild->_opType;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3798 #if 1
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3799 if( strcmp(opType,"CastIP")==0 )
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3800 return 1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3801 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 if( strcmp(opType,"CastII")==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 // Do not treat *CastPP this way, because it
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 // may transfer a raw pointer to an oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
3806 // If the register allocator were to coalesce this
a61af66fc99e Initial load
duke
parents:
diff changeset
3807 // into a single LRG, the GC maps would be incorrect.
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 //if( strcmp(opType,"CastPP")==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3809 // return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3810 //if( strcmp(opType,"CheckCastPP")==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3811 // return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 // Do not treat CastX2P or CastP2X this way, because
a61af66fc99e Initial load
duke
parents:
diff changeset
3814 // raw pointers and int types are treated differently
a61af66fc99e Initial load
duke
parents:
diff changeset
3815 // when saving local & stack info for safepoints in
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 // Output().
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 //if( strcmp(opType,"CastX2P")==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3818 // return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 //if( strcmp(opType,"CastP2X")==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 // return 1;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3821 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3823 if( is_chain_rule(_AD.globalNames()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 _lChild && strncmp(_lChild->_opType,"stackSlot",9)==0 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3825 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3828
a61af66fc99e Initial load
duke
parents:
diff changeset
3829
a61af66fc99e Initial load
duke
parents:
diff changeset
3830 int MatchRule::is_expensive() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3831 if( _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 const char *opType = _rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 if( strcmp(opType,"AtanD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3834 strcmp(opType,"CosD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 strcmp(opType,"DivD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 strcmp(opType,"DivF")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 strcmp(opType,"DivI")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 strcmp(opType,"ExpD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3839 strcmp(opType,"LogD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 strcmp(opType,"Log10D")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 strcmp(opType,"ModD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 strcmp(opType,"ModF")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 strcmp(opType,"ModI")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 strcmp(opType,"PowD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 strcmp(opType,"SinD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 strcmp(opType,"SqrtD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3847 strcmp(opType,"TanD")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3848 strcmp(opType,"ConvD2F")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3849 strcmp(opType,"ConvD2I")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 strcmp(opType,"ConvD2L")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 strcmp(opType,"ConvF2D")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3852 strcmp(opType,"ConvF2I")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 strcmp(opType,"ConvF2L")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 strcmp(opType,"ConvI2D")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 strcmp(opType,"ConvI2F")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3856 strcmp(opType,"ConvI2L")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 strcmp(opType,"ConvL2D")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 strcmp(opType,"ConvL2F")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 strcmp(opType,"ConvL2I")==0 ||
247
02a35ad4adf8 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 235
diff changeset
3860 strcmp(opType,"DecodeN")==0 ||
02a35ad4adf8 6723160: Nightly failure: Error: meet not symmetric
kvn
parents: 235
diff changeset
3861 strcmp(opType,"EncodeP")==0 ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 strcmp(opType,"RoundDouble")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 strcmp(opType,"RoundFloat")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 strcmp(opType,"ReverseBytesI")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 strcmp(opType,"ReverseBytesL")==0 ||
1396
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 986
diff changeset
3866 strcmp(opType,"ReverseBytesUS")==0 ||
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 986
diff changeset
3867 strcmp(opType,"ReverseBytesS")==0 ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 strcmp(opType,"Replicate16B")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 strcmp(opType,"Replicate8B")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3870 strcmp(opType,"Replicate4B")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3871 strcmp(opType,"Replicate8C")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 strcmp(opType,"Replicate4C")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 strcmp(opType,"Replicate8S")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 strcmp(opType,"Replicate4S")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3875 strcmp(opType,"Replicate4I")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 strcmp(opType,"Replicate2I")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 strcmp(opType,"Replicate2L")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 strcmp(opType,"Replicate4F")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 strcmp(opType,"Replicate2F")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 strcmp(opType,"Replicate2D")==0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3881 0 /* 0 to line up columns nicely */ )
a61af66fc99e Initial load
duke
parents:
diff changeset
3882 return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3884 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3886
a61af66fc99e Initial load
duke
parents:
diff changeset
3887 bool MatchRule::is_ideal_unlock() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3888 if( !_opType ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3889 return !strcmp(_opType,"Unlock") || !strcmp(_opType,"FastUnlock");
a61af66fc99e Initial load
duke
parents:
diff changeset
3890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3891
a61af66fc99e Initial load
duke
parents:
diff changeset
3892
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 bool MatchRule::is_ideal_call_leaf() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 if( !_opType ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 return !strcmp(_opType,"CallLeaf") ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3896 !strcmp(_opType,"CallLeafNoFP");
a61af66fc99e Initial load
duke
parents:
diff changeset
3897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3898
a61af66fc99e Initial load
duke
parents:
diff changeset
3899
a61af66fc99e Initial load
duke
parents:
diff changeset
3900 bool MatchRule::is_ideal_if() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3901 if( !_opType ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 return
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 !strcmp(_opType,"If" ) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3904 !strcmp(_opType,"CountedLoopEnd");
a61af66fc99e Initial load
duke
parents:
diff changeset
3905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3906
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 bool MatchRule::is_ideal_fastlock() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3908 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 return (strcmp(_rChild->_opType,"FastLock") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3911 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3913
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 bool MatchRule::is_ideal_membar() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3915 if( !_opType ) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3916 return
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 !strcmp(_opType,"MemBarAcquire" ) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3918 !strcmp(_opType,"MemBarRelease" ) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3919 !strcmp(_opType,"MemBarVolatile" ) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3920 !strcmp(_opType,"MemBarCPUOrder" ) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3922
a61af66fc99e Initial load
duke
parents:
diff changeset
3923 bool MatchRule::is_ideal_loadPC() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3924 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 return (strcmp(_rChild->_opType,"LoadPC") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3929
a61af66fc99e Initial load
duke
parents:
diff changeset
3930 bool MatchRule::is_ideal_box() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3931 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 return (strcmp(_rChild->_opType,"Box") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3934 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3936
a61af66fc99e Initial load
duke
parents:
diff changeset
3937 bool MatchRule::is_ideal_goto() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3938 bool ideal_goto = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3939
a61af66fc99e Initial load
duke
parents:
diff changeset
3940 if( _opType && (strcmp(_opType,"Goto") == 0) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 ideal_goto = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 return ideal_goto;
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3945
a61af66fc99e Initial load
duke
parents:
diff changeset
3946 bool MatchRule::is_ideal_jump() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 if( _opType ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 if( !strcmp(_opType,"Jump") )
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3951 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3953
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 bool MatchRule::is_ideal_bool() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3955 if( _opType ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3956 if( !strcmp(_opType,"Bool") )
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3961
a61af66fc99e Initial load
duke
parents:
diff changeset
3962
a61af66fc99e Initial load
duke
parents:
diff changeset
3963 Form::DataType MatchRule::is_ideal_load() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3964 Form::DataType ideal_load = Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
3965
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3967 const char *opType = _rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 ideal_load = is_load_from_memory(opType);
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3970
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 return ideal_load;
a61af66fc99e Initial load
duke
parents:
diff changeset
3972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3973
a61af66fc99e Initial load
duke
parents:
diff changeset
3974
855
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3975 bool MatchRule::skip_antidep_check() const {
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3976 // Some loads operate on what is effectively immutable memory so we
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3977 // should skip the anti dep computations. For some of these nodes
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3978 // the rewritable field keeps the anti dep logic from triggering but
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3979 // for certain kinds of LoadKlass it does not since they are
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3980 // actually reading memory which could be rewritten by the runtime,
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3981 // though never by generated code. This disables it uniformly for
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3982 // the nodes that behave like this: LoadKlass, LoadNKlass and
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3983 // LoadRange.
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3984 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3985 const char *opType = _rChild->_opType;
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3986 if (strcmp("LoadKlass", opType) == 0 ||
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3987 strcmp("LoadNKlass", opType) == 0 ||
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3988 strcmp("LoadRange", opType) == 0) {
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3989 return true;
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3990 }
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3991 }
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3992
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3993 return false;
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3994 }
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3995
f9094a5e1c8a 6857159: local schedule failed with checkcast of Thread.currentThread()
never
parents: 681
diff changeset
3996
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 Form::DataType MatchRule::is_ideal_store() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 Form::DataType ideal_store = Form::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
3999
a61af66fc99e Initial load
duke
parents:
diff changeset
4000 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 const char *opType = _rChild->_opType;
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 ideal_store = is_store_to_memory(opType);
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4004
a61af66fc99e Initial load
duke
parents:
diff changeset
4005 return ideal_store;
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4007
a61af66fc99e Initial load
duke
parents:
diff changeset
4008
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 void MatchRule::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4010 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4012
a61af66fc99e Initial load
duke
parents:
diff changeset
4013 void MatchRule::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4014 fprintf(fp,"MatchRule: ( %s",_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
4015 if (_lChild) _lChild->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
4016 if (_rChild) _rChild->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
4017 fprintf(fp," )\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
4018 fprintf(fp," nesting depth = %d\n", _depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 if (_result) fprintf(fp," Result Type = %s", _result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4020 fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
4021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4022
a61af66fc99e Initial load
duke
parents:
diff changeset
4023 //------------------------------Attribute--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4024 Attribute::Attribute(char *id, char* val, int type)
a61af66fc99e Initial load
duke
parents:
diff changeset
4025 : _ident(id), _val(val), _atype(type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4027 Attribute::~Attribute() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4029
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 int Attribute::int_val(ArchDesc &ad) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 // Make sure it is an integer constant:
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 int result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4033 if (!_val || !ADLParser::is_int_token(_val, result)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 ad.syntax_err(0, "Attribute %s must have an integer value: %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 _ident, _val ? _val : "");
a61af66fc99e Initial load
duke
parents:
diff changeset
4036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4037 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
4038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4039
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 void Attribute::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 } // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
4043
a61af66fc99e Initial load
duke
parents:
diff changeset
4044 // Write to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 void Attribute::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 fprintf(fp,"Attribute: %s %s\n", (_ident?_ident:""), (_val?_val:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
4047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4048
a61af66fc99e Initial load
duke
parents:
diff changeset
4049 //------------------------------FormatRule----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 FormatRule::FormatRule(char *temp)
a61af66fc99e Initial load
duke
parents:
diff changeset
4051 : _temp(temp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 FormatRule::~FormatRule() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4055
a61af66fc99e Initial load
duke
parents:
diff changeset
4056 void FormatRule::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4057 output(stderr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4059
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 // Write to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
4061 void FormatRule::output(FILE *fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 fprintf(fp,"\nFormat Rule: \n%s", (_temp?_temp:""));
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 fprintf(fp,"\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 }