annotate src/share/vm/adlc/forms.hpp @ 1972:f95d63e2154a

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