annotate src/share/vm/adlc/forms.hpp @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children ba764ed4b6f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
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 // FORMS.HPP - ADL Parser Generic and Utility Forms Classes
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 #define TRUE 1
a61af66fc99e Initial load
duke
parents:
diff changeset
28 #define FALSE 0
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // DEFINITIONS OF LEGAL ATTRIBUTE TYPES
a61af66fc99e Initial load
duke
parents:
diff changeset
31 #define INS_ATTR 0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 #define OP_ATTR 1
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // DEFINITIONS OF LEGAL CONSTRAINT TYPES
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // Class List
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class Form;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class InstructForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class MachNodeForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class OperandForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class OpClassForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class AttributeForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class RegisterForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class PipelineForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class SourceForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class EncodeForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class Component;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class Constraint;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class Predicate;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class MatchRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class Attribute;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class Effect;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class ExpandRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class RewriteRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class ConstructRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 class FormatRule;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class Peephole;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class EncClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 class Interface;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class RegInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class ConstInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class MemInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class CondInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class Opcode;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class InsEncode;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class RegDef;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 class RegClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class AllocClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 class ResourceForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class PipeClassForm;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 class PeepMatch;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 class PeepConstraint;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 class PeepReplace;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class MatchList;
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 class ArchDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 //------------------------------FormDict---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Dictionary containing Forms, and objects derived from forms
a61af66fc99e Initial load
duke
parents:
diff changeset
80 class FormDict {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 Dict _form; // map names, char*, to their Form* or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Disable public use of constructor, copy-ctor, operator =, operator ==
a61af66fc99e Initial load
duke
parents:
diff changeset
85 FormDict( );
a61af66fc99e Initial load
duke
parents:
diff changeset
86 FormDict &operator =( const FormDict & );
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // == compares two dictionaries; they must have the same keys (their keys
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // must match using CmpKey) and they must have the same values (pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // comparison). If so 1 is returned, if not 0 is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 bool operator ==(const FormDict &d) const; // Compare dictionaries for equal
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // cmp is a key comparision routine. hash is a routine to hash a key.
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // FormDict( CmpKey cmp, Hash hash );
a61af66fc99e Initial load
duke
parents:
diff changeset
95 FormDict( CmpKey cmp, Hash hash, Arena *arena );
a61af66fc99e Initial load
duke
parents:
diff changeset
96 FormDict( const FormDict & fd ); // Deep-copy guts
a61af66fc99e Initial load
duke
parents:
diff changeset
97 ~FormDict();
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // Return # of key-value pairs in dict
a61af66fc99e Initial load
duke
parents:
diff changeset
100 int Size(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Insert inserts the given key-value pair into the dictionary. The prior
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // value of the key is returned; NULL if the key was not previously defined.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 const Form *Insert(const char *name, Form *form); // A new key-value
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Find finds the value of a given key; or NULL if not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // The dictionary is NOT changed.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 const Form *operator [](const char *name) const; // Do a lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
111 };
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // ***** Master Class for ADL Parser Forms *****
a61af66fc99e Initial load
duke
parents:
diff changeset
114 //------------------------------Form-------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
115 class Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static Arena *arena; // arena used by forms
a61af66fc99e Initial load
duke
parents:
diff changeset
118 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static Arena *generate_arena(); // allocate arena used by forms
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
122 int _ftype; // Indicator for derived class type
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
126 Form *_next; // Next pointer for form lists
a61af66fc99e Initial load
duke
parents:
diff changeset
127 long _linenum; // Line number for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // Dynamic type check for common forms.
a61af66fc99e Initial load
duke
parents:
diff changeset
130 virtual OpClassForm *is_opclass() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 virtual OperandForm *is_operand() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 virtual InstructForm *is_instruction() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 virtual MachNodeForm *is_machnode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual AttributeForm *is_attribute() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 virtual Effect *is_effect() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 virtual ResourceForm *is_resource() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 virtual PipeClassForm *is_pipeclass() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Check if this form is an operand usable for cisc-spilling
a61af66fc99e Initial load
duke
parents:
diff changeset
140 virtual bool is_cisc_reg(FormDict &globals) const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 virtual bool is_cisc_mem(FormDict &globals) const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
144 Form(int formType=0, int line=0)
a61af66fc99e Initial load
duke
parents:
diff changeset
145 : _next(NULL), _linenum(line), _ftype(formType) { };
a61af66fc99e Initial load
duke
parents:
diff changeset
146 ~Form() {};
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 virtual bool ideal_only() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 assert(0,"Check of ideal status on non-instruction/operand form.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Check constraints after parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
154 virtual bool verify() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 virtual void dump() { output(stderr); } // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Write info to output files
a61af66fc99e Initial load
duke
parents:
diff changeset
158 virtual void output(FILE *fp) { fprintf(fp,"Form Output"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // ADLC types, match the last character on ideal operands and instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
162 enum DataType {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 none = 0, // Not a simple type
a61af66fc99e Initial load
duke
parents:
diff changeset
164 idealI = 1, // Integer type
a61af66fc99e Initial load
duke
parents:
diff changeset
165 idealP = 2, // Pointer types, oop(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
166 idealL = 3, // Long type
a61af66fc99e Initial load
duke
parents:
diff changeset
167 idealF = 4, // Float type
a61af66fc99e Initial load
duke
parents:
diff changeset
168 idealD = 5, // Double type
a61af66fc99e Initial load
duke
parents:
diff changeset
169 idealB = 6, // Byte type
a61af66fc99e Initial load
duke
parents:
diff changeset
170 idealC = 7, // Char type
a61af66fc99e Initial load
duke
parents:
diff changeset
171 idealS = 8 // String type
a61af66fc99e Initial load
duke
parents:
diff changeset
172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Convert ideal name to a DataType, return DataType::none if not a 'ConX'
a61af66fc99e Initial load
duke
parents:
diff changeset
174 Form::DataType ideal_to_const_type(const char *ideal_type_name) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Convert ideal name to a DataType, return DataType::none if not a 'sRegX
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Form::DataType ideal_to_sReg_type(const char *name) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Convert ideal name to a DataType, return DataType::none if not a 'RegX
a61af66fc99e Initial load
duke
parents:
diff changeset
178 Form::DataType ideal_to_Reg_type(const char *name) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Convert ideal name to a DataType, return DataType::none if not a 'LoadX
a61af66fc99e Initial load
duke
parents:
diff changeset
181 Form::DataType is_load_from_memory(const char *opType) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Convert ideal name to a DataType, return DataType::none if not a 'StoreX
a61af66fc99e Initial load
duke
parents:
diff changeset
183 Form::DataType is_store_to_memory(const char *opType) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // ADLC call types, matched with ideal world
a61af66fc99e Initial load
duke
parents:
diff changeset
186 enum CallType {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 invalid_type = 0, // invalid call type
a61af66fc99e Initial load
duke
parents:
diff changeset
188 JAVA_STATIC = 1, // monomorphic entry
a61af66fc99e Initial load
duke
parents:
diff changeset
189 JAVA_DYNAMIC = 2, // possibly megamorphic, inline cache call
a61af66fc99e Initial load
duke
parents:
diff changeset
190 JAVA_COMPILED = 3, // callee will be compiled java
a61af66fc99e Initial load
duke
parents:
diff changeset
191 JAVA_INTERP = 4, // callee will be executed by interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
192 JAVA_NATIVE = 5, // native entrypoint
a61af66fc99e Initial load
duke
parents:
diff changeset
193 JAVA_RUNTIME = 6, // runtime entrypoint
a61af66fc99e Initial load
duke
parents:
diff changeset
194 JAVA_LEAF = 7 // calling leaf
a61af66fc99e Initial load
duke
parents:
diff changeset
195 };
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Interface types for operands and operand classes
a61af66fc99e Initial load
duke
parents:
diff changeset
198 enum InterfaceType {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 no_interface = 0, // unknown or inconsistent interface type
a61af66fc99e Initial load
duke
parents:
diff changeset
200 constant_interface = 1, // interface to constants
a61af66fc99e Initial load
duke
parents:
diff changeset
201 register_interface = 2, // interface to registers
a61af66fc99e Initial load
duke
parents:
diff changeset
202 memory_interface = 3, // interface to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
203 conditional_interface = 4 // interface for condition codes
a61af66fc99e Initial load
duke
parents:
diff changeset
204 };
a61af66fc99e Initial load
duke
parents:
diff changeset
205 virtual Form::InterfaceType interface_type(FormDict &globals) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 enum CiscSpillInfo {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 Not_cisc_spillable = AdlcVMDeps::Not_cisc_spillable,
a61af66fc99e Initial load
duke
parents:
diff changeset
209 Maybe_cisc_spillable = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
210 Is_cisc_spillable = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
212 };
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // LEGAL FORM TYPES
a61af66fc99e Initial load
duke
parents:
diff changeset
215 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 INS,
a61af66fc99e Initial load
duke
parents:
diff changeset
217 OPER,
a61af66fc99e Initial load
duke
parents:
diff changeset
218 OPCLASS,
a61af66fc99e Initial load
duke
parents:
diff changeset
219 SRC,
a61af66fc99e Initial load
duke
parents:
diff changeset
220 ADEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
221 REG,
a61af66fc99e Initial load
duke
parents:
diff changeset
222 PIPE,
a61af66fc99e Initial load
duke
parents:
diff changeset
223 CNST,
a61af66fc99e Initial load
duke
parents:
diff changeset
224 PRED,
a61af66fc99e Initial load
duke
parents:
diff changeset
225 ATTR,
a61af66fc99e Initial load
duke
parents:
diff changeset
226 MAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
227 ENC,
a61af66fc99e Initial load
duke
parents:
diff changeset
228 FOR,
a61af66fc99e Initial load
duke
parents:
diff changeset
229 EXP,
a61af66fc99e Initial load
duke
parents:
diff changeset
230 REW,
a61af66fc99e Initial load
duke
parents:
diff changeset
231 EFF,
a61af66fc99e Initial load
duke
parents:
diff changeset
232 RDEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
233 RCL,
a61af66fc99e Initial load
duke
parents:
diff changeset
234 ACL,
a61af66fc99e Initial load
duke
parents:
diff changeset
235 RES,
a61af66fc99e Initial load
duke
parents:
diff changeset
236 PCL,
a61af66fc99e Initial load
duke
parents:
diff changeset
237 PDEF,
a61af66fc99e Initial load
duke
parents:
diff changeset
238 REGL,
a61af66fc99e Initial load
duke
parents:
diff changeset
239 RESL,
a61af66fc99e Initial load
duke
parents:
diff changeset
240 STAL,
a61af66fc99e Initial load
duke
parents:
diff changeset
241 COMP,
a61af66fc99e Initial load
duke
parents:
diff changeset
242 PEEP,
a61af66fc99e Initial load
duke
parents:
diff changeset
243 RESO
a61af66fc99e Initial load
duke
parents:
diff changeset
244 };
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 };
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 //------------------------------FormList---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
249 class FormList {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
251 Form *_root;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 Form *_tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 Form *_cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 int _justReset; // Set immediately after reset
a61af66fc99e Initial load
duke
parents:
diff changeset
255 Form *_cur2; // Nested iterator
a61af66fc99e Initial load
duke
parents:
diff changeset
256 int _justReset2;
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void addForm(Form * entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 if (_tail==NULL) { _root = _tail = _cur = entry;}
a61af66fc99e Initial load
duke
parents:
diff changeset
261 else { _tail->_next = entry; _tail = entry;}
a61af66fc99e Initial load
duke
parents:
diff changeset
262 };
a61af66fc99e Initial load
duke
parents:
diff changeset
263 Form * current() { return _cur; };
a61af66fc99e Initial load
duke
parents:
diff changeset
264 Form * iter() { if (_justReset) _justReset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 else if (_cur) _cur = _cur->_next;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 return _cur;};
a61af66fc99e Initial load
duke
parents:
diff changeset
267 void reset() { if (_root) {_cur = _root; _justReset = 1;} };
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Second iterator, state is internal
a61af66fc99e Initial load
duke
parents:
diff changeset
270 Form * current2(){ return _cur2; };
a61af66fc99e Initial load
duke
parents:
diff changeset
271 Form * iter2() { if (_justReset2) _justReset2 = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 else if (_cur2) _cur2 = _cur2->_next;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 return _cur2;};
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void reset2() { if (_root) {_cur2 = _root; _justReset2 = 1;} };
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 int count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 int count = 0; reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
278 for( Form *cur; (cur = iter()) != NULL; ) { ++count; };
a61af66fc99e Initial load
duke
parents:
diff changeset
279 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 void dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
284 Form *cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 for(; (cur = iter()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 cur->dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
287 };
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 bool verified = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
294 Form *cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 for(; (cur = iter()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if ( ! cur->verify() ) verified = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 };
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 return verified;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 void output(FILE* fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
304 Form *cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 for( ; (cur = iter()) != NULL; ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 cur->output(fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 };
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 FormList() { _justReset = 1; _justReset2 = 1; _root = NULL; _tail = NULL; _cur = NULL; _cur2 = NULL;};
a61af66fc99e Initial load
duke
parents:
diff changeset
311 ~FormList();
a61af66fc99e Initial load
duke
parents:
diff changeset
312 };
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 //------------------------------NameList---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Extendable list of pointers, <char *>
a61af66fc99e Initial load
duke
parents:
diff changeset
316 class NameList {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 friend class PreserveIter;
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
320 int _cur; // Insert next entry here; count of entries
a61af66fc99e Initial load
duke
parents:
diff changeset
321 int _max; // Number of spaces allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
322 const char **_names; // Array of names
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
325 int _iter; // position during iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
326 bool _justReset; // Set immediately after reset
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
330 static const char *_signal; // reserved user-defined string
a61af66fc99e Initial load
duke
parents:
diff changeset
331 enum { Not_in_list = -1 };
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 void addName(const char *name);
a61af66fc99e Initial load
duke
parents:
diff changeset
334 void add_signal();
a61af66fc99e Initial load
duke
parents:
diff changeset
335 void clear(); // Remove all entries
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 int count() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 void reset(); // Reset iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
340 const char *iter(); // after reset(), first element : else next
a61af66fc99e Initial load
duke
parents:
diff changeset
341 const char *current(); // return current element in iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 bool current_is_signal(); // Return 'true' if current entry is signal
a61af66fc99e Initial load
duke
parents:
diff changeset
344 bool is_signal(const char *entry); // Return true if entry is a signal
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 bool search(const char *); // Search for a name in the list
a61af66fc99e Initial load
duke
parents:
diff changeset
347 int index(const char *); // Return index of name in list
a61af66fc99e Initial load
duke
parents:
diff changeset
348 const char *name (intptr_t index);// Return name at index in list
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 void dump(); // output to stderr
a61af66fc99e Initial load
duke
parents:
diff changeset
351 void output(FILE *fp); // Output list of names to 'fp'
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 NameList();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 ~NameList();
a61af66fc99e Initial load
duke
parents:
diff changeset
355 };
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // Convenience class to preserve iteration state since iterators are
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // internal instead of being external.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 class PreserveIter {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
362 NameList* _list;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 int _iter;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 bool _justReset;
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
367 PreserveIter(NameList* nl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 _list = nl;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 _iter = _list->_iter;
a61af66fc99e Initial load
duke
parents:
diff changeset
370 _justReset = _list->_justReset;
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 ~PreserveIter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 _list->_iter = _iter;
a61af66fc99e Initial load
duke
parents:
diff changeset
374 _list->_justReset = _justReset;
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 };
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 //------------------------------NameAndList------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // Storage for a name and an associated list of names
a61af66fc99e Initial load
duke
parents:
diff changeset
382 class NameAndList {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
384 const char *_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 NameList _list;
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
388 NameAndList(char *name);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 ~NameAndList();
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // Add to entries in list
a61af66fc99e Initial load
duke
parents:
diff changeset
392 void add_entry(const char *entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // Access the name and its associated list.
a61af66fc99e Initial load
duke
parents:
diff changeset
395 const char *name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 void reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 const char *iter();
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 int count() { return _list.count(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Return the "index" entry in the list, zero-based
a61af66fc99e Initial load
duke
parents:
diff changeset
402 const char *operator[](int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 void dump(); // output to stderr
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void output(FILE *fp); // Output list of names to 'fp'
a61af66fc99e Initial load
duke
parents:
diff changeset
407 };
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 //------------------------------ComponentList---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Component lists always have match rule operands first, followed by parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // operands which do not appear in the match list (in order of declaration).
a61af66fc99e Initial load
duke
parents:
diff changeset
412 class ComponentList : private NameList {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
414 int _matchcnt; // Count of match rule operands
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // This is a batch program. (And I have a destructor bug!)
a61af66fc99e Initial load
duke
parents:
diff changeset
419 void operator delete( void *ptr ) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 void insert(Component *component, bool mflag);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 void insert(const char *name, const char *opType, int usedef, bool mflag);
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 int count();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 int match_count() { return _matchcnt; } // Get count of match rule opers
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 Component *iter(); // after reset(), first element : else next
a61af66fc99e Initial load
duke
parents:
diff changeset
428 Component *match_iter(); // after reset(), first element : else next
a61af66fc99e Initial load
duke
parents:
diff changeset
429 Component *post_match_iter(); // after reset(), first element : else next
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void reset(); // Reset iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
431 Component *current(); // return current element in iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // Return element at "position", else NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
434 Component *operator[](int position);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 Component *at(int position) { return (*this)[position]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Return first component having this name.
a61af66fc99e Initial load
duke
parents:
diff changeset
438 const Component *search(const char *name);
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Return number of USEs + number of DEFs
a61af66fc99e Initial load
duke
parents:
diff changeset
441 int num_operands();
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // Return zero-based position in list; -1 if not in list.
a61af66fc99e Initial load
duke
parents:
diff changeset
443 int operand_position(const char *name, int usedef);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // Find position for this name, regardless of use/def information
a61af66fc99e Initial load
duke
parents:
diff changeset
445 int operand_position(const char *name);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Find position for this name when looked up for output via "format"
a61af66fc99e Initial load
duke
parents:
diff changeset
447 int operand_position_format(const char *name);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // Find position for the Label when looked up for output via "format"
a61af66fc99e Initial load
duke
parents:
diff changeset
449 int label_position();
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // Find position for the Method when looked up for output via "format"
a61af66fc99e Initial load
duke
parents:
diff changeset
451 int method_position();
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 void dump(); // output to stderr
a61af66fc99e Initial load
duke
parents:
diff changeset
454 void output(FILE *fp); // Output list of names to 'fp'
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 ComponentList();
a61af66fc99e Initial load
duke
parents:
diff changeset
457 ~ComponentList();
a61af66fc99e Initial load
duke
parents:
diff changeset
458 };
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 //------------------------------SourceForm-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
461 class SourceForm : public Form {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // Public Data
a61af66fc99e Initial load
duke
parents:
diff changeset
466 char *_code; // Buffer for storing code text
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // Public Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
469 SourceForm(char* code);
a61af66fc99e Initial load
duke
parents:
diff changeset
470 ~SourceForm();
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 virtual const char* classname() { return "SourceForm"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 void dump(); // Debug printer
a61af66fc99e Initial load
duke
parents:
diff changeset
475 void output(FILE *fp); // Write output files
a61af66fc99e Initial load
duke
parents:
diff changeset
476 };
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 class HeaderForm : public SourceForm {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
480 HeaderForm(char* code) : SourceForm(code) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 virtual const char* classname() { return "HeaderForm"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
483 };
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 class PreHeaderForm : public SourceForm {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
487 PreHeaderForm(char* code) : SourceForm(code) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 virtual const char* classname() { return "PreHeaderForm"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 };
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 //------------------------------Expr------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
496 #define STRING_BUFFER_LENGTH 2048
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // class Expr represents integer expressions containing constants and addition
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // Value must be in range zero through maximum positive integer. 32bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // Expected use: instruction and operand costs
a61af66fc99e Initial load
duke
parents:
diff changeset
500 class Expr {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
502 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 Zero = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
504 Max = 0x7fffffff
a61af66fc99e Initial load
duke
parents:
diff changeset
505 };
a61af66fc99e Initial load
duke
parents:
diff changeset
506 const char *_external_name; // if !NULL, then print this instead of _expr
a61af66fc99e Initial load
duke
parents:
diff changeset
507 const char *_expr;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 int _min_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 int _max_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 Expr();
a61af66fc99e Initial load
duke
parents:
diff changeset
512 Expr(const char *cost);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 Expr(const char *name, const char *expression, int min_value, int max_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 Expr *clone() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 bool is_unknown() const { return (this == Expr::get_unknown()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
517 bool is_zero() const { return (_min_value == Expr::Zero && _max_value == Expr::Zero); }
a61af66fc99e Initial load
duke
parents:
diff changeset
518 bool less_than_or_equal(const Expr *c) const { return (_max_value <= c->_min_value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 void add(const Expr *c);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 void add(const char *c);
a61af66fc99e Initial load
duke
parents:
diff changeset
522 void add(const char *c, ArchDesc &AD); // check if 'c' is defined in <arch>.ad
a61af66fc99e Initial load
duke
parents:
diff changeset
523 void set_external_name(const char *name) { _external_name = name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 const char *as_string() const { return (_external_name != NULL ? _external_name : _expr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
526 void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 void print_define(FILE *fp) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 void print_assert(FILE *fp) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 static Expr *get_unknown(); // Returns pointer to shared unknown cost instance
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 static char *buffer() { return &external_buffer[0]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
533 static bool init_buffers(); // Fill buffers with 0
a61af66fc99e Initial load
duke
parents:
diff changeset
534 static bool check_buffers(); // if buffer use may have overflowed, assert
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
537 static Expr *_unknown_expr;
a61af66fc99e Initial load
duke
parents:
diff changeset
538 static char string_buffer[STRING_BUFFER_LENGTH];
a61af66fc99e Initial load
duke
parents:
diff changeset
539 static char external_buffer[STRING_BUFFER_LENGTH];
a61af66fc99e Initial load
duke
parents:
diff changeset
540 static bool _init_buffers;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 const char *compute_expr(const Expr *c1, const Expr *c2); // cost as string after adding 'c1' and 'c2'
a61af66fc99e Initial load
duke
parents:
diff changeset
542 int compute_min (const Expr *c1, const Expr *c2); // minimum after adding 'c1' and 'c2'
a61af66fc99e Initial load
duke
parents:
diff changeset
543 int compute_max (const Expr *c1, const Expr *c2); // maximum after adding 'c1' and 'c2'
a61af66fc99e Initial load
duke
parents:
diff changeset
544 const char *compute_external(const Expr *c1, const Expr *c2); // external name after adding 'c1' and 'c2'
a61af66fc99e Initial load
duke
parents:
diff changeset
545 };
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 //------------------------------ExprDict---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // Dictionary containing Exprs
a61af66fc99e Initial load
duke
parents:
diff changeset
549 class ExprDict {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
551 Dict _expr; // map names, char*, to their Expr* or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
552 NameList _defines; // record the order of definitions entered with define call
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // Disable public use of constructor, copy-ctor, operator =, operator ==
a61af66fc99e Initial load
duke
parents:
diff changeset
555 ExprDict( );
a61af66fc99e Initial load
duke
parents:
diff changeset
556 ExprDict( const ExprDict & ); // Deep-copy guts
a61af66fc99e Initial load
duke
parents:
diff changeset
557 ExprDict &operator =( const ExprDict & );
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // == compares two dictionaries; they must have the same keys (their keys
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // must match using CmpKey) and they must have the same values (pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // comparison). If so 1 is returned, if not 0 is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
561 bool operator ==(const ExprDict &d) const; // Compare dictionaries for equal
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // cmp is a key comparision routine. hash is a routine to hash a key.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 ExprDict( CmpKey cmp, Hash hash, Arena *arena );
a61af66fc99e Initial load
duke
parents:
diff changeset
566 ~ExprDict();
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Return # of key-value pairs in dict
a61af66fc99e Initial load
duke
parents:
diff changeset
569 int Size(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // define inserts the given key-value pair into the dictionary,
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // and records the name in order for later output, ...
a61af66fc99e Initial load
duke
parents:
diff changeset
573 const Expr *define(const char *name, Expr *expr);
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // Insert inserts the given key-value pair into the dictionary. The prior
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // value of the key is returned; NULL if the key was not previously defined.
a61af66fc99e Initial load
duke
parents:
diff changeset
577 const Expr *Insert(const char *name, Expr *expr); // A new key-value
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // Find finds the value of a given key; or NULL if not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // The dictionary is NOT changed.
a61af66fc99e Initial load
duke
parents:
diff changeset
581 const Expr *operator [](const char *name) const; // Do a lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 void print_defines(FILE *fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 void print_asserts(FILE *fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
586 };