src/share/vm/adlc/forms.hpp

Wed, 22 Jan 2014 17:42:23 -0800

author
kvn
date
Wed, 22 Jan 2014 17:42:23 -0800
changeset 6503
a9becfeecd1b
parent 5381
b42fe1a8e180
child 6876
710a3c8b516e
child 7853
a1642365d69f
permissions
-rw-r--r--

Merge

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

mercurial