src/share/vm/adlc/forms.hpp

Wed, 31 Jan 2018 19:24:57 -0500

author
dbuck
date
Wed, 31 Jan 2018 19:24:57 -0500
changeset 9289
427b2fb1944f
parent 7853
a1642365d69f
child 7994
04ff2f6cd0eb
permissions
-rw-r--r--

8189170: Add option to disable stack overflow checking in primordial thread for use with JNI_CreateJavaJVM
Reviewed-by: dcubed

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

mercurial