annotate src/share/vm/adlc/formsopt.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents dbbe28fc66b5
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
2 * Copyright 1998-2009 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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 // FORMSOPT.HPP - ADL Parser Target Specific Optimization Forms Classes
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // Class List
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class Form;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class InstructForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class OperandForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class OpClassForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class AttributeForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class RegisterForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class PipelineForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class SourceForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class EncodeForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class Component;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class Constraint;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class Predicate;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class MatchRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class Attribute;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class Effect;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class ExpandRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class RewriteRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class ConstructRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class FormatRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class Peephole;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class PeepMatch;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class PeepConstraint;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class EncClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class Interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class RegInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class ConstInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class MemInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class CondInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 class Opcode;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class InsEncode;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class RegDef;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 class RegClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class AllocClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class ResourceForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class PipeClassForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class PipeClassOperandForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class PipeClassResourceForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class PeepMatch;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class PeepConstraint;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 class PeepReplace;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class MatchList;
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class ArchDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 //==============================Register Allocation============================
a61af66fc99e Initial load
duke
parents:
diff changeset
73 //------------------------------RegisterForm-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class RegisterForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
76 AllocClass *_current_ac; // State used by iter_RegDefs()
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
80 NameList _rdefs; // List of register definition names
a61af66fc99e Initial load
duke
parents:
diff changeset
81 Dict _regDef; // map register name to RegDef*
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 NameList _rclasses; // List of register class names
a61af66fc99e Initial load
duke
parents:
diff changeset
84 Dict _regClass; // map register class name to RegClass*
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 NameList _aclasses; // List of allocation class names
a61af66fc99e Initial load
duke
parents:
diff changeset
87 Dict _allocClass; // Dictionary of allocation classes
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 static int _reg_ctr; // Register counter
a61af66fc99e Initial load
duke
parents:
diff changeset
90 static int RegMask_Size(); // Compute RegMask size
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
93 RegisterForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
94 ~RegisterForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void addRegDef(char *regName, char *callingConv, char *c_conv,
a61af66fc99e Initial load
duke
parents:
diff changeset
97 char * idealtype, char *encoding, char* concreteName);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 RegClass *addRegClass(const char *className);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 AllocClass *addAllocClass(char *allocName);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void addSpillRegClass();
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Provide iteration over all register definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // in the order used by the register allocator
a61af66fc99e Initial load
duke
parents:
diff changeset
104 void reset_RegDefs();
a61af66fc99e Initial load
duke
parents:
diff changeset
105 RegDef *iter_RegDefs();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 RegDef *getRegDef (const char *regName);
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 RegClass *getRegClass(const char *className);
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Return register mask, compressed chunk and register #
a61af66fc99e Initial load
duke
parents:
diff changeset
111 uint reg_mask(char *register_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Check that register classes are compatible with chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
114 bool verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
118 };
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 //------------------------------RegDef-----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
121 class RegDef : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
122 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
124 const char *_regname; // ADLC (Opto) Register name
a61af66fc99e Initial load
duke
parents:
diff changeset
125 const char *_callconv; // Calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
126 const char *_c_conv; // Native calling convention, 'C'
a61af66fc99e Initial load
duke
parents:
diff changeset
127 const char *_idealtype; // Ideal Type for register save/restore
a61af66fc99e Initial load
duke
parents:
diff changeset
128 const char *_concrete; // concrete register name
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 const char *_register_encode; // The register encoding
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // The chunk and register mask bits define info for register allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
133 uint32 _register_num; // Which register am I
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
137 RegDef(char *regname, char *callconv, char *c_conv,
a61af66fc99e Initial load
duke
parents:
diff changeset
138 char *idealtype, char *encoding, char *concrete);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 ~RegDef(); // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Interface to define/redefine the register number
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void set_register_num(uint32 new_register_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Bit pattern used for generating machine code
a61af66fc99e Initial load
duke
parents:
diff changeset
145 const char *register_encode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Register number used in machine-independent code
a61af66fc99e Initial load
duke
parents:
diff changeset
147 uint32 register_num() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
150 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
151 };
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 //------------------------------RegClass---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
154 class RegClass : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
157 const char *_classid; // Name of class
a61af66fc99e Initial load
duke
parents:
diff changeset
158 NameList _regDefs; // List of registers in class
a61af66fc99e Initial load
duke
parents:
diff changeset
159 Dict _regDef; // Dictionary of registers in class
a61af66fc99e Initial load
duke
parents:
diff changeset
160 bool _stack_or_reg; // Allowed on any stack slot
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
163 RegClass(const char *classid);// Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 void addReg(RegDef *regDef); // Add a register to this class
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 uint size() const; // Number of registers in class
a61af66fc99e Initial load
duke
parents:
diff changeset
168 int regs_in_word( int wordnum, bool stack_also );
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 const RegDef *get_RegDef(const char *regDef_name) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // Returns the lowest numbered register in the mask.
a61af66fc99e Initial load
duke
parents:
diff changeset
173 const RegDef* find_first_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Iteration support
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void reset(); // Reset the following two iterators
a61af66fc99e Initial load
duke
parents:
diff changeset
177 RegDef *RegDef_iter(); // which move jointly,
a61af66fc99e Initial load
duke
parents:
diff changeset
178 const char *rd_name_iter(); // invoking either advances both.
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
182 };
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 //------------------------------AllocClass-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
185 class AllocClass : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
190 char *_classid; // Name of class
a61af66fc99e Initial load
duke
parents:
diff changeset
191 NameList _regDefs; // List of registers in class
a61af66fc99e Initial load
duke
parents:
diff changeset
192 Dict _regDef; // Dictionary of registers in class
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
195 AllocClass(char *classid); // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void addReg(RegDef *regDef); // Add a register to this class
a61af66fc99e Initial load
duke
parents:
diff changeset
198 uint size() {return _regDef.Size();} // Number of registers in class
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
202 };
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 //==============================Frame Handling================================
a61af66fc99e Initial load
duke
parents:
diff changeset
206 //------------------------------FrameForm-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
207 class FrameForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
212 bool _direction; // Direction of stack growth
a61af66fc99e Initial load
duke
parents:
diff changeset
213 char *_sync_stack_slots;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 char *_inline_cache_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 char *_interpreter_method_oop_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
216 char *_interpreter_frame_pointer_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 char *_cisc_spilling_operand_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 char *_frame_pointer;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 char *_c_frame_pointer;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 char *_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bool _return_addr_loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 bool _c_return_addr_loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 char *_return_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 char *_c_return_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 char *_in_preserve_slots;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 char *_varargs_C_out_slots_killed;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 char *_calling_convention;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 char *_c_calling_convention;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 char *_return_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 char *_c_return_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
233 FrameForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
234 ~FrameForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
237 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
238 };
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 //==============================Scheduling=====================================
a61af66fc99e Initial load
duke
parents:
diff changeset
242 //------------------------------PipelineForm-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
243 class PipelineForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
248 NameList _reslist; // List of pipeline resources
a61af66fc99e Initial load
duke
parents:
diff changeset
249 FormDict _resdict; // Resource Name -> ResourceForm mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
250 int _rescount; // Number of resources (ignores OR cases)
a61af66fc99e Initial load
duke
parents:
diff changeset
251 int _maxcycleused; // Largest cycle used relative to beginning of instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 NameList _stages; // List of pipeline stages on architecture
a61af66fc99e Initial load
duke
parents:
diff changeset
254 int _stagecnt; // Number of stages listed
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 NameList _classlist; // List of pipeline classes
a61af66fc99e Initial load
duke
parents:
diff changeset
257 FormDict _classdict; // Class Name -> PipeClassForm mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
258 int _classcnt; // Number of classes
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 NameList _noplist; // List of NOP instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
261 int _nopcnt; // Number of nop instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 bool _variableSizeInstrs; // Indicates if this architecture has variable sized instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
264 bool _branchHasDelaySlot; // Indicates that branches have delay slot instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
265 int _maxInstrsPerBundle; // Indicates the maximum number of instructions for ILP
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int _maxBundlesPerCycle; // Indicates the maximum number of bundles for ILP
a61af66fc99e Initial load
duke
parents:
diff changeset
267 int _instrUnitSize; // The minimum instruction unit size, in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
268 int _bundleUnitSize; // The bundle unit size, in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
269 int _instrFetchUnitSize; // The size of the I-fetch unit, in bytes [must be power of 2]
a61af66fc99e Initial load
duke
parents:
diff changeset
270 int _instrFetchUnits; // The number of I-fetch units processed per cycle
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
273 PipelineForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
274 ~PipelineForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
278 };
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 //------------------------------ResourceForm-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
281 class ResourceForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
283 unsigned mask() const { return _resmask; };
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
287 unsigned _resmask; // Resource Mask (OR of resource specifier bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Virtual Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
292 virtual ResourceForm *is_resource() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
295 ResourceForm(unsigned resmask); // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
296 ~ResourceForm(); // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
300 };
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 //------------------------------PipeClassOperandForm-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
303 class PipeClassOperandForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
308 const char *_stage; // Name of Stage
a61af66fc99e Initial load
duke
parents:
diff changeset
309 unsigned _iswrite; // Read or Write
a61af66fc99e Initial load
duke
parents:
diff changeset
310 unsigned _more_instrs; // Additional Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
313 PipeClassOperandForm(const char *stage, unsigned iswrite, unsigned more_instrs)
a61af66fc99e Initial load
duke
parents:
diff changeset
314 : _stage(stage)
a61af66fc99e Initial load
duke
parents:
diff changeset
315 , _iswrite(iswrite)
a61af66fc99e Initial load
duke
parents:
diff changeset
316 , _more_instrs(more_instrs)
a61af66fc99e Initial load
duke
parents:
diff changeset
317 {};
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 ~PipeClassOperandForm() {}; // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 bool isWrite() const { return _iswrite != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
325 };
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 //------------------------------PipeClassResourceForm--------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
328 class PipeClassResourceForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
333 const char *_resource; // Resource
a61af66fc99e Initial load
duke
parents:
diff changeset
334 const char *_stage; // Stage the resource is used in
a61af66fc99e Initial load
duke
parents:
diff changeset
335 int _cycles; // Number of cycles the resource is used
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
338 PipeClassResourceForm(const char *resource, const char *stage, int cycles)
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
340 : _resource(resource)
a61af66fc99e Initial load
duke
parents:
diff changeset
341 , _stage(stage)
a61af66fc99e Initial load
duke
parents:
diff changeset
342 , _cycles(cycles)
a61af66fc99e Initial load
duke
parents:
diff changeset
343 {};
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 ~PipeClassResourceForm() {}; // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
348 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
349 };
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 //------------------------------PipeClassForm----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
352 class PipeClassForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
358 const char *_ident; // Name of class
a61af66fc99e Initial load
duke
parents:
diff changeset
359 int _num; // Used in name of MachNode subclass
a61af66fc99e Initial load
duke
parents:
diff changeset
360 NameList _parameters; // Locally defined names
a61af66fc99e Initial load
duke
parents:
diff changeset
361 FormDict _localNames; // Table of operands & their types
a61af66fc99e Initial load
duke
parents:
diff changeset
362 FormDict _localUsage; // Table of operand usage
a61af66fc99e Initial load
duke
parents:
diff changeset
363 FormList _resUsage; // List of resource usage
a61af66fc99e Initial load
duke
parents:
diff changeset
364 NameList _instructs; // List of instructions and machine nodes that use this pipeline class
a61af66fc99e Initial load
duke
parents:
diff changeset
365 bool _has_fixed_latency; // Always takes this number of cycles
a61af66fc99e Initial load
duke
parents:
diff changeset
366 int _fixed_latency; // Always takes this number of cycles
a61af66fc99e Initial load
duke
parents:
diff changeset
367 int _instruction_count; // Number of instructions in first bundle
a61af66fc99e Initial load
duke
parents:
diff changeset
368 bool _has_multiple_bundles; // Indicates if 1 or multiple bundles
a61af66fc99e Initial load
duke
parents:
diff changeset
369 bool _has_branch_delay_slot; // Has branch delay slot as last instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
370 bool _force_serialization; // This node serializes relative to surrounding nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool _may_have_no_code; // This node may generate no code based on register allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // Virtual Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
374 virtual PipeClassForm *is_pipeclass() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
377 PipeClassForm(const char *id, int num);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
379 ~PipeClassForm(); // Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 bool hasFixedLatency() { return _has_fixed_latency; }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 int fixedLatency() { return _fixed_latency; }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void setFixedLatency(int fixed_latency) { _has_fixed_latency = 1; _fixed_latency = fixed_latency; }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 void setInstructionCount(int i) { _instruction_count = i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 void setMultipleBundles(bool b) { _has_multiple_bundles = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 void setBranchDelay(bool s) { _has_branch_delay_slot = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 void setForceSerialization(bool s) { _force_serialization = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
390 void setMayHaveNoCode(bool s) { _may_have_no_code = s; }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 int InstructionCount() const { return _instruction_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
393 bool hasMultipleBundles() const { return _has_multiple_bundles; }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 bool hasBranchDelay() const { return _has_branch_delay_slot; }
a61af66fc99e Initial load
duke
parents:
diff changeset
395 bool forceSerialization() const { return _force_serialization; }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 bool mayHaveNoCode() const { return _may_have_no_code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
399 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
400 };
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 //==============================Peephole Optimization==========================
a61af66fc99e Initial load
duke
parents:
diff changeset
404 //------------------------------Peephole---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
405 class Peephole : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
407 static int _peephole_counter;// Incremented by each peephole rule parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
408 int _peephole_number;// Remember my order in architecture description
a61af66fc99e Initial load
duke
parents:
diff changeset
409 PeepMatch *_match; // Instruction pattern to match
a61af66fc99e Initial load
duke
parents:
diff changeset
410 PeepConstraint *_constraint; // List of additional constraints
a61af66fc99e Initial load
duke
parents:
diff changeset
411 PeepReplace *_replace; // Instruction pattern to substitute in
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 Peephole *_next;
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
417 Peephole();
a61af66fc99e Initial load
duke
parents:
diff changeset
418 ~Peephole();
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // Append a peephole rule with the same root instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
421 void append_peephole(Peephole *next_peephole);
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Store the components of this peephole rule
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void add_match(PeepMatch *only_one_match);
a61af66fc99e Initial load
duke
parents:
diff changeset
425 void append_constraint(PeepConstraint *next_constraint);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 void add_replace(PeepReplace *only_one_replacement);
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Access the components of this peephole rule
a61af66fc99e Initial load
duke
parents:
diff changeset
429 int peephole_number() { return _peephole_number; }
a61af66fc99e Initial load
duke
parents:
diff changeset
430 PeepMatch *match() { return _match; }
a61af66fc99e Initial load
duke
parents:
diff changeset
431 PeepConstraint *constraints() { return _constraint; }
a61af66fc99e Initial load
duke
parents:
diff changeset
432 PeepReplace *replacement() { return _replace; }
a61af66fc99e Initial load
duke
parents:
diff changeset
433 Peephole *next() { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
436 void output(FILE *fp); // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
437 };
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 class PeepMatch : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
441 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
442 char *_rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // NameList _depth; // Depth of this instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
444 NameList _parent;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 NameList _position;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 NameList _instrs; // List of instructions in match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
447 NameList _input; // input position in parent's instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
448 int _max_position;
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
452 PeepMatch(char *rule);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 ~PeepMatch();
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Insert info into the match-rule
a61af66fc99e Initial load
duke
parents:
diff changeset
456 void add_instruction(int parent, int position, const char *name, int input);
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Access info about instructions in the peep-match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
459 int max_position();
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
460 const char *instruction_name(int position);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Iterate through all info on matched instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
462 void reset();
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
463 void next_instruction(int &parent, int &position, const char* &name, int &input);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // 'true' if current position in iteration is a placeholder, not matched.
a61af66fc99e Initial load
duke
parents:
diff changeset
465 bool is_placeholder();
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
468 void output(FILE *fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 };
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 class PeepConstraint : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
474 PeepConstraint *_next; // Additional constraints ANDed together
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 public:
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
477 const int _left_inst;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
478 const char* _left_op;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
479 const char* _relation;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
480 const int _right_inst;
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
481 const char* _right_op;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Public Methods
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
485 PeepConstraint(int left_inst, char* left_op, char* relation,
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
486 int right_inst, char* right_op);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
487 ~PeepConstraint();
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // Check if constraints use instruction at position
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
490 bool constrains_instruction(int position);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // Add another constraint
a61af66fc99e Initial load
duke
parents:
diff changeset
493 void append(PeepConstraint *next_peep_constraint);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // Access the next constraint in the list
a61af66fc99e Initial load
duke
parents:
diff changeset
495 PeepConstraint *next();
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
498 void output(FILE *fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 };
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 class PeepReplace : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
504 char *_rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 NameList _instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 NameList _operand_inst_num;
a61af66fc99e Initial load
duke
parents:
diff changeset
507 NameList _operand_op_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
512 PeepReplace(char *rule);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 ~PeepReplace();
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Add contents of peepreplace
a61af66fc99e Initial load
duke
parents:
diff changeset
516 void add_instruction(char *root);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 void add_operand( int inst_num, char *inst_operand );
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // Access contents of peepreplace
a61af66fc99e Initial load
duke
parents:
diff changeset
520 void reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
521 void next_instruction(const char * &root);
603
dbbe28fc66b5 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 0
diff changeset
522 void next_operand(int &inst_num, const char * &inst_operand );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // Utilities
a61af66fc99e Initial load
duke
parents:
diff changeset
525 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 void output(FILE *fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 };
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 class PeepChild : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
532 const int _inst_num; // Number of instruction (-1 if only named)
a61af66fc99e Initial load
duke
parents:
diff changeset
533 const char *_inst_op; // Instruction's operand, NULL if number == -1
a61af66fc99e Initial load
duke
parents:
diff changeset
534 const char *_inst_name; // Name of the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
537 PeepChild(char *inst_name)
a61af66fc99e Initial load
duke
parents:
diff changeset
538 : _inst_num(-1), _inst_op(NULL), _inst_name(inst_name) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
539 PeepChild(int inst_num, char *inst_op, char *inst_name)
a61af66fc99e Initial load
duke
parents:
diff changeset
540 : _inst_num(inst_num), _inst_op(inst_op), _inst_name(inst_name) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
541 ~PeepChild();
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 bool use_leaf_operand() { return _inst_num != -1; };
a61af66fc99e Initial load
duke
parents:
diff changeset
544 bool generate_an_instruction() { return _inst_num == -1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
547 void output(FILE *fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
548 };