1 /*
   2  * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 // FORMS.CPP - Definitions for ADL Parser Forms Classes
  26 #include "adlc.hpp"
  27 
  28 //==============================Instructions===================================
  29 //------------------------------InstructForm-----------------------------------
  30 InstructForm::InstructForm(const char *id, bool ideal_only)
  31   : _ident(id), _ideal_only(ideal_only),
  32     _localNames(cmpstr, hashstr, Form::arena),
  33     _effects(cmpstr, hashstr, Form::arena),
  34     _is_mach_constant(false),
  35     _needs_constant_base(false),
  36     _has_call(false)
  37 {
  38       _ftype = Form::INS;
  39 
  40       _matrule              = NULL;
  41       _insencode            = NULL;
  42       _constant             = NULL;
  43       _is_postalloc_expand  = false;
  44       _opcode               = NULL;
  45       _size                 = NULL;
  46       _attribs              = NULL;
  47       _predicate            = NULL;
  48       _exprule              = NULL;
  49       _rewrule              = NULL;
  50       _format               = NULL;
  51       _peephole             = NULL;
  52       _ins_pipe             = NULL;
  53       _uniq_idx             = NULL;
  54       _num_uniq             = 0;
  55       _cisc_spill_operand   = Not_cisc_spillable;// Which operand may cisc-spill
  56       _cisc_spill_alternate = NULL;            // possible cisc replacement
  57       _cisc_reg_mask_name   = NULL;
  58       _is_cisc_alternate    = false;
  59       _is_short_branch      = false;
  60       _short_branch_form    = NULL;
  61       _alignment            = 1;
  62 }
  63 
  64 InstructForm::InstructForm(const char *id, InstructForm *instr, MatchRule *rule)
  65   : _ident(id), _ideal_only(false),
  66     _localNames(instr->_localNames),
  67     _effects(instr->_effects),
  68     _is_mach_constant(false),
  69     _needs_constant_base(false),
  70     _has_call(false)
  71 {
  72       _ftype = Form::INS;
  73 
  74       _matrule               = rule;
  75       _insencode             = instr->_insencode;
  76       _constant              = instr->_constant;
  77       _is_postalloc_expand   = instr->_is_postalloc_expand;
  78       _opcode                = instr->_opcode;
  79       _size                  = instr->_size;
  80       _attribs               = instr->_attribs;
  81       _predicate             = instr->_predicate;
  82       _exprule               = instr->_exprule;
  83       _rewrule               = instr->_rewrule;
  84       _format                = instr->_format;
  85       _peephole              = instr->_peephole;
  86       _ins_pipe              = instr->_ins_pipe;
  87       _uniq_idx              = instr->_uniq_idx;
  88       _num_uniq              = instr->_num_uniq;
  89       _cisc_spill_operand    = Not_cisc_spillable; // Which operand may cisc-spill
  90       _cisc_spill_alternate  = NULL;               // possible cisc replacement
  91       _cisc_reg_mask_name    = NULL;
  92       _is_cisc_alternate     = false;
  93       _is_short_branch       = false;
  94       _short_branch_form     = NULL;
  95       _alignment             = 1;
  96      // Copy parameters
  97      const char *name;
  98      instr->_parameters.reset();
  99      for (; (name = instr->_parameters.iter()) != NULL;)
 100        _parameters.addName(name);
 101 }
 102 
 103 InstructForm::~InstructForm() {
 104 }
 105 
 106 InstructForm *InstructForm::is_instruction() const {
 107   return (InstructForm*)this;
 108 }
 109 
 110 bool InstructForm::ideal_only() const {
 111   return _ideal_only;
 112 }
 113 
 114 bool InstructForm::sets_result() const {
 115   return (_matrule != NULL && _matrule->sets_result());
 116 }
 117 
 118 bool InstructForm::needs_projections() {
 119   _components.reset();
 120   for( Component *comp; (comp = _components.iter()) != NULL; ) {
 121     if (comp->isa(Component::KILL)) {
 122       return true;
 123     }
 124   }
 125   return false;
 126 }
 127 
 128 
 129 bool InstructForm::has_temps() {
 130   if (_matrule) {
 131     // Examine each component to see if it is a TEMP
 132     _components.reset();
 133     // Skip the first component, if already handled as (SET dst (...))
 134     Component *comp = NULL;
 135     if (sets_result())  comp = _components.iter();
 136     while ((comp = _components.iter()) != NULL) {
 137       if (comp->isa(Component::TEMP)) {
 138         return true;
 139       }
 140     }
 141   }
 142 
 143   return false;
 144 }
 145 
 146 uint InstructForm::num_defs_or_kills() {
 147   uint   defs_or_kills = 0;
 148 
 149   _components.reset();
 150   for( Component *comp; (comp = _components.iter()) != NULL; ) {
 151     if( comp->isa(Component::DEF) || comp->isa(Component::KILL) ) {
 152       ++defs_or_kills;
 153     }
 154   }
 155 
 156   return  defs_or_kills;
 157 }
 158 
 159 // This instruction has an expand rule?
 160 bool InstructForm::expands() const {
 161   return ( _exprule != NULL );
 162 }
 163 
 164 // This instruction has a late expand rule?
 165 bool InstructForm::postalloc_expands() const {
 166   return _is_postalloc_expand;
 167 }
 168 
 169 // This instruction has a peephole rule?
 170 Peephole *InstructForm::peepholes() const {
 171   return _peephole;
 172 }
 173 
 174 // This instruction has a peephole rule?
 175 void InstructForm::append_peephole(Peephole *peephole) {
 176   if( _peephole == NULL ) {
 177     _peephole = peephole;
 178   } else {
 179     _peephole->append_peephole(peephole);
 180   }
 181 }
 182 
 183 
 184 // ideal opcode enumeration
 185 const char *InstructForm::ideal_Opcode( FormDict &globalNames )  const {
 186   if( !_matrule ) return "Node"; // Something weird
 187   // Chain rules do not really have ideal Opcodes; use their source
 188   // operand ideal Opcode instead.
 189   if( is_simple_chain_rule(globalNames) ) {
 190     const char *src = _matrule->_rChild->_opType;
 191     OperandForm *src_op = globalNames[src]->is_operand();
 192     assert( src_op, "Not operand class of chain rule" );
 193     if( !src_op->_matrule ) return "Node";
 194     return src_op->_matrule->_opType;
 195   }
 196   // Operand chain rules do not really have ideal Opcodes
 197   if( _matrule->is_chain_rule(globalNames) )
 198     return "Node";
 199   return strcmp(_matrule->_opType,"Set")
 200     ? _matrule->_opType
 201     : _matrule->_rChild->_opType;
 202 }
 203 
 204 // Recursive check on all operands' match rules in my match rule
 205 bool InstructForm::is_pinned(FormDict &globals) {
 206   if ( ! _matrule)  return false;
 207 
 208   int  index   = 0;
 209   if (_matrule->find_type("Goto",          index)) return true;
 210   if (_matrule->find_type("If",            index)) return true;
 211   if (_matrule->find_type("CountedLoopEnd",index)) return true;
 212   if (_matrule->find_type("Return",        index)) return true;
 213   if (_matrule->find_type("Rethrow",       index)) return true;
 214   if (_matrule->find_type("TailCall",      index)) return true;
 215   if (_matrule->find_type("TailJump",      index)) return true;
 216   if (_matrule->find_type("Halt",          index)) return true;
 217   if (_matrule->find_type("Jump",          index)) return true;
 218 
 219   return is_parm(globals);
 220 }
 221 
 222 // Recursive check on all operands' match rules in my match rule
 223 bool InstructForm::is_projection(FormDict &globals) {
 224   if ( ! _matrule)  return false;
 225 
 226   int  index   = 0;
 227   if (_matrule->find_type("Goto",    index)) return true;
 228   if (_matrule->find_type("Return",  index)) return true;
 229   if (_matrule->find_type("Rethrow", index)) return true;
 230   if (_matrule->find_type("TailCall",index)) return true;
 231   if (_matrule->find_type("TailJump",index)) return true;
 232   if (_matrule->find_type("Halt",    index)) return true;
 233 
 234   return false;
 235 }
 236 
 237 // Recursive check on all operands' match rules in my match rule
 238 bool InstructForm::is_parm(FormDict &globals) {
 239   if ( ! _matrule)  return false;
 240 
 241   int  index   = 0;
 242   if (_matrule->find_type("Parm",index)) return true;
 243 
 244   return false;
 245 }
 246 
 247 bool InstructForm::is_ideal_negD() const {
 248   return (_matrule && _matrule->_rChild && strcmp(_matrule->_rChild->_opType, "NegD") == 0);
 249 }
 250 
 251 // Return 'true' if this instruction matches an ideal 'Copy*' node
 252 int InstructForm::is_ideal_copy() const {
 253   return _matrule ? _matrule->is_ideal_copy() : 0;
 254 }
 255 
 256 // Return 'true' if this instruction is too complex to rematerialize.
 257 int InstructForm::is_expensive() const {
 258   // We can prove it is cheap if it has an empty encoding.
 259   // This helps with platform-specific nops like ThreadLocal and RoundFloat.
 260   if (is_empty_encoding())
 261     return 0;
 262 
 263   if (is_tls_instruction())
 264     return 1;
 265 
 266   if (_matrule == NULL)  return 0;
 267 
 268   return _matrule->is_expensive();
 269 }
 270 
 271 // Has an empty encoding if _size is a constant zero or there
 272 // are no ins_encode tokens.
 273 int InstructForm::is_empty_encoding() const {
 274   if (_insencode != NULL) {
 275     _insencode->reset();
 276     if (_insencode->encode_class_iter() == NULL) {
 277       return 1;
 278     }
 279   }
 280   if (_size != NULL && strcmp(_size, "0") == 0) {
 281     return 1;
 282   }
 283   return 0;
 284 }
 285 
 286 int InstructForm::is_tls_instruction() const {
 287   if (_ident != NULL &&
 288       ( ! strcmp( _ident,"tlsLoadP") ||
 289         ! strncmp(_ident,"tlsLoadP_",9)) ) {
 290     return 1;
 291   }
 292 
 293   if (_matrule != NULL && _insencode != NULL) {
 294     const char* opType = _matrule->_opType;
 295     if (strcmp(opType, "Set")==0)
 296       opType = _matrule->_rChild->_opType;
 297     if (strcmp(opType,"ThreadLocal")==0) {
 298       fprintf(stderr, "Warning: ThreadLocal instruction %s should be named 'tlsLoadP_*'\n",
 299               (_ident == NULL ? "NULL" : _ident));
 300       return 1;
 301     }
 302   }
 303 
 304   return 0;
 305 }
 306 
 307 
 308 // Return 'true' if this instruction matches an ideal 'If' node
 309 bool InstructForm::is_ideal_if() const {
 310   if( _matrule == NULL ) return false;
 311 
 312   return _matrule->is_ideal_if();
 313 }
 314 
 315 // Return 'true' if this instruction matches an ideal 'FastLock' node
 316 bool InstructForm::is_ideal_fastlock() const {
 317   if( _matrule == NULL ) return false;
 318 
 319   return _matrule->is_ideal_fastlock();
 320 }
 321 
 322 // Return 'true' if this instruction matches an ideal 'MemBarXXX' node
 323 bool InstructForm::is_ideal_membar() const {
 324   if( _matrule == NULL ) return false;
 325 
 326   return _matrule->is_ideal_membar();
 327 }
 328 
 329 // Return 'true' if this instruction matches an ideal 'LoadPC' node
 330 bool InstructForm::is_ideal_loadPC() const {
 331   if( _matrule == NULL ) return false;
 332 
 333   return _matrule->is_ideal_loadPC();
 334 }
 335 
 336 // Return 'true' if this instruction matches an ideal 'Box' node
 337 bool InstructForm::is_ideal_box() const {
 338   if( _matrule == NULL ) return false;
 339 
 340   return _matrule->is_ideal_box();
 341 }
 342 
 343 // Return 'true' if this instruction matches an ideal 'Goto' node
 344 bool InstructForm::is_ideal_goto() const {
 345   if( _matrule == NULL ) return false;
 346 
 347   return _matrule->is_ideal_goto();
 348 }
 349 
 350 // Return 'true' if this instruction matches an ideal 'Jump' node
 351 bool InstructForm::is_ideal_jump() const {
 352   if( _matrule == NULL ) return false;
 353 
 354   return _matrule->is_ideal_jump();
 355 }
 356 
 357 // Return 'true' if instruction matches ideal 'If' | 'Goto' | 'CountedLoopEnd'
 358 bool InstructForm::is_ideal_branch() const {
 359   if( _matrule == NULL ) return false;
 360 
 361   return _matrule->is_ideal_if() || _matrule->is_ideal_goto();
 362 }
 363 
 364 
 365 // Return 'true' if this instruction matches an ideal 'Return' node
 366 bool InstructForm::is_ideal_return() const {
 367   if( _matrule == NULL ) return false;
 368 
 369   // Check MatchRule to see if the first entry is the ideal "Return" node
 370   int  index   = 0;
 371   if (_matrule->find_type("Return",index)) return true;
 372   if (_matrule->find_type("Rethrow",index)) return true;
 373   if (_matrule->find_type("TailCall",index)) return true;
 374   if (_matrule->find_type("TailJump",index)) return true;
 375 
 376   return false;
 377 }
 378 
 379 // Return 'true' if this instruction matches an ideal 'Halt' node
 380 bool InstructForm::is_ideal_halt() const {
 381   int  index   = 0;
 382   return _matrule && _matrule->find_type("Halt",index);
 383 }
 384 
 385 // Return 'true' if this instruction matches an ideal 'SafePoint' node
 386 bool InstructForm::is_ideal_safepoint() const {
 387   int  index   = 0;
 388   return _matrule && _matrule->find_type("SafePoint",index);
 389 }
 390 
 391 // Return 'true' if this instruction matches an ideal 'Nop' node
 392 bool InstructForm::is_ideal_nop() const {
 393   return _ident && _ident[0] == 'N' && _ident[1] == 'o' && _ident[2] == 'p' && _ident[3] == '_';
 394 }
 395 
 396 bool InstructForm::is_ideal_control() const {
 397   if ( ! _matrule)  return false;
 398 
 399   return is_ideal_return() || is_ideal_branch() || _matrule->is_ideal_jump() || is_ideal_halt();
 400 }
 401 
 402 // Return 'true' if this instruction matches an ideal 'Call' node
 403 Form::CallType InstructForm::is_ideal_call() const {
 404   if( _matrule == NULL ) return Form::invalid_type;
 405 
 406   // Check MatchRule to see if the first entry is the ideal "Call" node
 407   int  idx   = 0;
 408   if(_matrule->find_type("CallStaticJava",idx))   return Form::JAVA_STATIC;
 409   idx = 0;
 410   if(_matrule->find_type("Lock",idx))             return Form::JAVA_STATIC;
 411   idx = 0;
 412   if(_matrule->find_type("Unlock",idx))           return Form::JAVA_STATIC;
 413   idx = 0;
 414   if(_matrule->find_type("CallDynamicJava",idx))  return Form::JAVA_DYNAMIC;
 415   idx = 0;
 416   if(_matrule->find_type("CallRuntime",idx))      return Form::JAVA_RUNTIME;
 417   idx = 0;
 418   if(_matrule->find_type("CallLeaf",idx))         return Form::JAVA_LEAF;
 419   idx = 0;
 420   if(_matrule->find_type("CallLeafNoFP",idx))     return Form::JAVA_LEAF;
 421   idx = 0;
 422 
 423   return Form::invalid_type;
 424 }
 425 
 426 // Return 'true' if this instruction matches an ideal 'Load?' node
 427 Form::DataType InstructForm::is_ideal_load() const {
 428   if( _matrule == NULL ) return Form::none;
 429 
 430   return  _matrule->is_ideal_load();
 431 }
 432 
 433 // Return 'true' if this instruction matches an ideal 'LoadKlass' node
 434 bool InstructForm::skip_antidep_check() const {
 435   if( _matrule == NULL ) return false;
 436 
 437   return  _matrule->skip_antidep_check();
 438 }
 439 
 440 // Return 'true' if this instruction matches an ideal 'Load?' node
 441 Form::DataType InstructForm::is_ideal_store() const {
 442   if( _matrule == NULL ) return Form::none;
 443 
 444   return  _matrule->is_ideal_store();
 445 }
 446 
 447 // Return 'true' if this instruction matches an ideal vector node
 448 bool InstructForm::is_vector() const {
 449   if( _matrule == NULL ) return false;
 450 
 451   return _matrule->is_vector();
 452 }
 453 
 454 
 455 // Return the input register that must match the output register
 456 // If this is not required, return 0
 457 uint InstructForm::two_address(FormDict &globals) {
 458   uint  matching_input = 0;
 459   if(_components.count() == 0) return 0;
 460 
 461   _components.reset();
 462   Component *comp = _components.iter();
 463   // Check if there is a DEF
 464   if( comp->isa(Component::DEF) ) {
 465     // Check that this is a register
 466     const char  *def_type = comp->_type;
 467     const Form  *form     = globals[def_type];
 468     OperandForm *op       = form->is_operand();
 469     if( op ) {
 470       if( op->constrained_reg_class() != NULL &&
 471           op->interface_type(globals) == Form::register_interface ) {
 472         // Remember the local name for equality test later
 473         const char *def_name = comp->_name;
 474         // Check if a component has the same name and is a USE
 475         do {
 476           if( comp->isa(Component::USE) && strcmp(comp->_name,def_name)==0 ) {
 477             return operand_position_format(def_name);
 478           }
 479         } while( (comp = _components.iter()) != NULL);
 480       }
 481     }
 482   }
 483 
 484   return 0;
 485 }
 486 
 487 
 488 // when chaining a constant to an instruction, returns 'true' and sets opType
 489 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals) {
 490   const char *dummy  = NULL;
 491   const char *dummy2 = NULL;
 492   return is_chain_of_constant(globals, dummy, dummy2);
 493 }
 494 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals,
 495                 const char * &opTypeParam) {
 496   const char *result = NULL;
 497 
 498   return is_chain_of_constant(globals, opTypeParam, result);
 499 }
 500 
 501 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals,
 502                 const char * &opTypeParam, const char * &resultParam) {
 503   Form::DataType  data_type = Form::none;
 504   if ( ! _matrule)  return data_type;
 505 
 506   // !!!!!
 507   // The source of the chain rule is 'position = 1'
 508   uint         position = 1;
 509   const char  *result   = NULL;
 510   const char  *name     = NULL;
 511   const char  *opType   = NULL;
 512   // Here base_operand is looking for an ideal type to be returned (opType).
 513   if ( _matrule->is_chain_rule(globals)
 514        && _matrule->base_operand(position, globals, result, name, opType) ) {
 515     data_type = ideal_to_const_type(opType);
 516 
 517     // if it isn't an ideal constant type, just return
 518     if ( data_type == Form::none ) return data_type;
 519 
 520     // Ideal constant types also adjust the opType parameter.
 521     resultParam = result;
 522     opTypeParam = opType;
 523     return data_type;
 524   }
 525 
 526   return data_type;
 527 }
 528 
 529 // Check if a simple chain rule
 530 bool InstructForm::is_simple_chain_rule(FormDict &globals) const {
 531   if( _matrule && _matrule->sets_result()
 532       && _matrule->_rChild->_lChild == NULL
 533       && globals[_matrule->_rChild->_opType]
 534       && globals[_matrule->_rChild->_opType]->is_opclass() ) {
 535     return true;
 536   }
 537   return false;
 538 }
 539 
 540 // check for structural rematerialization
 541 bool InstructForm::rematerialize(FormDict &globals, RegisterForm *registers ) {
 542   bool   rematerialize = false;
 543 
 544   Form::DataType data_type = is_chain_of_constant(globals);
 545   if( data_type != Form::none )
 546     rematerialize = true;
 547 
 548   // Constants
 549   if( _components.count() == 1 && _components[0]->is(Component::USE_DEF) )
 550     rematerialize = true;
 551 
 552   // Pseudo-constants (values easily available to the runtime)
 553   if (is_empty_encoding() && is_tls_instruction())
 554     rematerialize = true;
 555 
 556   // 1-input, 1-output, such as copies or increments.
 557   if( _components.count() == 2 &&
 558       _components[0]->is(Component::DEF) &&
 559       _components[1]->isa(Component::USE) )
 560     rematerialize = true;
 561 
 562   // Check for an ideal 'Load?' and eliminate rematerialize option
 563   if ( is_ideal_load() != Form::none || // Ideal load?  Do not rematerialize
 564        is_ideal_copy() != Form::none || // Ideal copy?  Do not rematerialize
 565        is_expensive()  != Form::none) { // Expensive?   Do not rematerialize
 566     rematerialize = false;
 567   }
 568 
 569   // Always rematerialize the flags.  They are more expensive to save &
 570   // restore than to recompute (and possibly spill the compare's inputs).
 571   if( _components.count() >= 1 ) {
 572     Component *c = _components[0];
 573     const Form *form = globals[c->_type];
 574     OperandForm *opform = form->is_operand();
 575     if( opform ) {
 576       // Avoid the special stack_slots register classes
 577       const char *rc_name = opform->constrained_reg_class();
 578       if( rc_name ) {
 579         if( strcmp(rc_name,"stack_slots") ) {
 580           // Check for ideal_type of RegFlags
 581           const char *type = opform->ideal_type( globals, registers );
 582           if( (type != NULL) && !strcmp(type, "RegFlags") )
 583             rematerialize = true;
 584         } else
 585           rematerialize = false; // Do not rematerialize things target stk
 586       }
 587     }
 588   }
 589 
 590   return rematerialize;
 591 }
 592 
 593 // loads from memory, so must check for anti-dependence
 594 bool InstructForm::needs_anti_dependence_check(FormDict &globals) const {
 595   if ( skip_antidep_check() ) return false;
 596 
 597   // Machine independent loads must be checked for anti-dependences
 598   if( is_ideal_load() != Form::none )  return true;
 599 
 600   // !!!!! !!!!! !!!!!
 601   // TEMPORARY
 602   // if( is_simple_chain_rule(globals) )  return false;
 603 
 604   // String.(compareTo/equals/indexOf) and Arrays.equals use many memorys edges,
 605   // but writes none
 606   if( _matrule && _matrule->_rChild &&
 607       ( strcmp(_matrule->_rChild->_opType,"StrComp"    )==0 ||
 608         strcmp(_matrule->_rChild->_opType,"StrEquals"  )==0 ||
 609         strcmp(_matrule->_rChild->_opType,"StrIndexOf" )==0 ||
 610         strcmp(_matrule->_rChild->_opType,"StrIndexOfChar" )==0 ||
 611         strcmp(_matrule->_rChild->_opType,"HasNegatives" )==0 ||
 612         strcmp(_matrule->_rChild->_opType,"AryEq"      )==0 ))
 613     return true;
 614 
 615   // Check if instruction has a USE of a memory operand class, but no defs
 616   bool USE_of_memory  = false;
 617   bool DEF_of_memory  = false;
 618   Component     *comp = NULL;
 619   ComponentList &components = (ComponentList &)_components;
 620 
 621   components.reset();
 622   while( (comp = components.iter()) != NULL ) {
 623     const Form  *form = globals[comp->_type];
 624     if( !form ) continue;
 625     OpClassForm *op   = form->is_opclass();
 626     if( !op ) continue;
 627     if( form->interface_type(globals) == Form::memory_interface ) {
 628       if( comp->isa(Component::USE) ) USE_of_memory = true;
 629       if( comp->isa(Component::DEF) ) {
 630         OperandForm *oper = form->is_operand();
 631         if( oper && oper->is_user_name_for_sReg() ) {
 632           // Stack slots are unaliased memory handled by allocator
 633           oper = oper;  // debug stopping point !!!!!
 634         } else {
 635           DEF_of_memory = true;
 636         }
 637       }
 638     }
 639   }
 640   return (USE_of_memory && !DEF_of_memory);
 641 }
 642 
 643 
 644 int InstructForm::memory_operand(FormDict &globals) const {
 645   // Machine independent loads must be checked for anti-dependences
 646   // Check if instruction has a USE of a memory operand class, or a def.
 647   int USE_of_memory  = 0;
 648   int DEF_of_memory  = 0;
 649   const char*    last_memory_DEF = NULL; // to test DEF/USE pairing in asserts
 650   const char*    last_memory_USE = NULL;
 651   Component     *unique          = NULL;
 652   Component     *comp            = NULL;
 653   ComponentList &components      = (ComponentList &)_components;
 654 
 655   components.reset();
 656   while( (comp = components.iter()) != NULL ) {
 657     const Form  *form = globals[comp->_type];
 658     if( !form ) continue;
 659     OpClassForm *op   = form->is_opclass();
 660     if( !op ) continue;
 661     if( op->stack_slots_only(globals) )  continue;
 662     if( form->interface_type(globals) == Form::memory_interface ) {
 663       if( comp->isa(Component::DEF) ) {
 664         last_memory_DEF = comp->_name;
 665         DEF_of_memory++;
 666         unique = comp;
 667       } else if( comp->isa(Component::USE) ) {
 668         if( last_memory_DEF != NULL ) {
 669           assert(0 == strcmp(last_memory_DEF, comp->_name), "every memory DEF is followed by a USE of the same name");
 670           last_memory_DEF = NULL;
 671         }
 672         // Handles same memory being used multiple times in the case of BMI1 instructions.
 673         if (last_memory_USE != NULL) {
 674           if (strcmp(comp->_name, last_memory_USE) != 0) {
 675             USE_of_memory++;
 676           }
 677         } else {
 678           USE_of_memory++;
 679         }
 680         last_memory_USE = comp->_name;
 681 
 682         if (DEF_of_memory == 0)  // defs take precedence
 683           unique = comp;
 684       } else {
 685         assert(last_memory_DEF == NULL, "unpaired memory DEF");
 686       }
 687     }
 688   }
 689   assert(last_memory_DEF == NULL, "unpaired memory DEF");
 690   assert(USE_of_memory >= DEF_of_memory, "unpaired memory DEF");
 691   USE_of_memory -= DEF_of_memory;   // treat paired DEF/USE as one occurrence
 692   if( (USE_of_memory + DEF_of_memory) > 0 ) {
 693     if( is_simple_chain_rule(globals) ) {
 694       //fprintf(stderr, "Warning: chain rule is not really a memory user.\n");
 695       //((InstructForm*)this)->dump();
 696       // Preceding code prints nothing on sparc and these insns on intel:
 697       // leaP8 leaP32 leaPIdxOff leaPIdxScale leaPIdxScaleOff leaP8 leaP32
 698       // leaPIdxOff leaPIdxScale leaPIdxScaleOff
 699       return NO_MEMORY_OPERAND;
 700     }
 701 
 702     if( DEF_of_memory == 1 ) {
 703       assert(unique != NULL, "");
 704       if( USE_of_memory == 0 ) {
 705         // unique def, no uses
 706       } else {
 707         // // unique def, some uses
 708         // // must return bottom unless all uses match def
 709         // unique = NULL;
 710 #ifdef S390
 711         // This case is important for move instructions on s390x.
 712         // On other platforms (e.g. x86), all uses always match the def.
 713         unique = NULL;
 714 #endif
 715       }
 716     } else if( DEF_of_memory > 0 ) {
 717       // multiple defs, don't care about uses
 718       unique = NULL;
 719     } else if( USE_of_memory == 1) {
 720       // unique use, no defs
 721       assert(unique != NULL, "");
 722     } else if( USE_of_memory > 0 ) {
 723       // multiple uses, no defs
 724       unique = NULL;
 725     } else {
 726       assert(false, "bad case analysis");
 727     }
 728     // process the unique DEF or USE, if there is one
 729     if( unique == NULL ) {
 730       return MANY_MEMORY_OPERANDS;
 731     } else {
 732       int pos = components.operand_position(unique->_name);
 733       if( unique->isa(Component::DEF) ) {
 734         pos += 1;                // get corresponding USE from DEF
 735       }
 736       assert(pos >= 1, "I was just looking at it!");
 737       return pos;
 738     }
 739   }
 740 
 741   // missed the memory op??
 742   if( true ) {  // %%% should not be necessary
 743     if( is_ideal_store() != Form::none ) {
 744       fprintf(stderr, "Warning: cannot find memory opnd in instr.\n");
 745       ((InstructForm*)this)->dump();
 746       // pretend it has multiple defs and uses
 747       return MANY_MEMORY_OPERANDS;
 748     }
 749     if( is_ideal_load()  != Form::none ) {
 750       fprintf(stderr, "Warning: cannot find memory opnd in instr.\n");
 751       ((InstructForm*)this)->dump();
 752       // pretend it has multiple uses and no defs
 753       return MANY_MEMORY_OPERANDS;
 754     }
 755   }
 756 
 757   return NO_MEMORY_OPERAND;
 758 }
 759 
 760 // This instruction captures the machine-independent bottom_type
 761 // Expected use is for pointer vs oop determination for LoadP
 762 bool InstructForm::captures_bottom_type(FormDict &globals) const {
 763   if (_matrule && _matrule->_rChild &&
 764       (!strcmp(_matrule->_rChild->_opType,"CastPP")       ||  // new result type
 765        !strcmp(_matrule->_rChild->_opType,"CastX2P")      ||  // new result type
 766        !strcmp(_matrule->_rChild->_opType,"DecodeN")      ||
 767        !strcmp(_matrule->_rChild->_opType,"EncodeP")      ||
 768        !strcmp(_matrule->_rChild->_opType,"DecodeNKlass") ||
 769        !strcmp(_matrule->_rChild->_opType,"EncodePKlass") ||
 770        !strcmp(_matrule->_rChild->_opType,"LoadN")        ||
 771        !strcmp(_matrule->_rChild->_opType,"LoadNKlass")   ||
 772        !strcmp(_matrule->_rChild->_opType,"CreateEx")     ||  // type of exception
 773        !strcmp(_matrule->_rChild->_opType,"CheckCastPP")  ||
 774        !strcmp(_matrule->_rChild->_opType,"GetAndSetP")   ||
 775        !strcmp(_matrule->_rChild->_opType,"GetAndSetN")   ||
 776 #if INCLUDE_ZGC
 777        !strcmp(_matrule->_rChild->_opType,"ZGetAndSetP") ||
 778        !strcmp(_matrule->_rChild->_opType,"ZCompareAndExchangeP") ||
 779        !strcmp(_matrule->_rChild->_opType,"LoadBarrierSlowReg") ||
 780 #endif
 781 #if INCLUDE_SHENANDOAHGC
 782        !strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeP") ||
 783        !strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeN") ||
 784 #endif
 785        !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeP") ||
 786        !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeN"))) return true;
 787   else if ( is_ideal_load() == Form::idealP )                return true;
 788   else if ( is_ideal_store() != Form::none  )                return true;
 789 
 790   if (needs_base_oop_edge(globals)) return true;
 791 
 792   if (is_vector()) return true;
 793   if (is_mach_constant()) return true;
 794 
 795   return  false;
 796 }
 797 
 798 
 799 // Access instr_cost attribute or return NULL.
 800 const char* InstructForm::cost() {
 801   for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) {
 802     if( strcmp(cur->_ident,AttributeForm::_ins_cost) == 0 ) {
 803       return cur->_val;
 804     }
 805   }
 806   return NULL;
 807 }
 808 
 809 // Return count of top-level operands.
 810 uint InstructForm::num_opnds() {
 811   int  num_opnds = _components.num_operands();
 812 
 813   // Need special handling for matching some ideal nodes
 814   // i.e. Matching a return node
 815   /*
 816   if( _matrule ) {
 817     if( strcmp(_matrule->_opType,"Return"   )==0 ||
 818         strcmp(_matrule->_opType,"Halt"     )==0 )
 819       return 3;
 820   }
 821     */
 822   return num_opnds;
 823 }
 824 
 825 const char* InstructForm::opnd_ident(int idx) {
 826   return _components.at(idx)->_name;
 827 }
 828 
 829 const char* InstructForm::unique_opnd_ident(uint idx) {
 830   uint i;
 831   for (i = 1; i < num_opnds(); ++i) {
 832     if (unique_opnds_idx(i) == idx) {
 833       break;
 834     }
 835   }
 836   return (_components.at(i) != NULL) ? _components.at(i)->_name : "";
 837 }
 838 
 839 // Return count of unmatched operands.
 840 uint InstructForm::num_post_match_opnds() {
 841   uint  num_post_match_opnds = _components.count();
 842   uint  num_match_opnds = _components.match_count();
 843   num_post_match_opnds = num_post_match_opnds - num_match_opnds;
 844 
 845   return num_post_match_opnds;
 846 }
 847 
 848 // Return the number of leaves below this complex operand
 849 uint InstructForm::num_consts(FormDict &globals) const {
 850   if ( ! _matrule) return 0;
 851 
 852   // This is a recursive invocation on all operands in the matchrule
 853   return _matrule->num_consts(globals);
 854 }
 855 
 856 // Constants in match rule with specified type
 857 uint InstructForm::num_consts(FormDict &globals, Form::DataType type) const {
 858   if ( ! _matrule) return 0;
 859 
 860   // This is a recursive invocation on all operands in the matchrule
 861   return _matrule->num_consts(globals, type);
 862 }
 863 
 864 
 865 // Return the register class associated with 'leaf'.
 866 const char *InstructForm::out_reg_class(FormDict &globals) {
 867   assert( false, "InstructForm::out_reg_class(FormDict &globals); Not Implemented");
 868 
 869   return NULL;
 870 }
 871 
 872 
 873 
 874 // Lookup the starting position of inputs we are interested in wrt. ideal nodes
 875 uint InstructForm::oper_input_base(FormDict &globals) {
 876   if( !_matrule ) return 1;     // Skip control for most nodes
 877 
 878   // Need special handling for matching some ideal nodes
 879   // i.e. Matching a return node
 880   if( strcmp(_matrule->_opType,"Return"    )==0 ||
 881       strcmp(_matrule->_opType,"Rethrow"   )==0 ||
 882       strcmp(_matrule->_opType,"TailCall"  )==0 ||
 883       strcmp(_matrule->_opType,"TailJump"  )==0 ||
 884       strcmp(_matrule->_opType,"SafePoint" )==0 ||
 885       strcmp(_matrule->_opType,"Halt"      )==0 )
 886     return AdlcVMDeps::Parms;   // Skip the machine-state edges
 887 
 888   if( _matrule->_rChild &&
 889       ( strcmp(_matrule->_rChild->_opType,"AryEq"     )==0 ||
 890         strcmp(_matrule->_rChild->_opType,"StrComp"   )==0 ||
 891         strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 ||
 892         strcmp(_matrule->_rChild->_opType,"StrInflatedCopy"   )==0 ||
 893         strcmp(_matrule->_rChild->_opType,"StrCompressedCopy" )==0 ||
 894         strcmp(_matrule->_rChild->_opType,"StrIndexOf")==0 ||
 895         strcmp(_matrule->_rChild->_opType,"StrIndexOfChar")==0 ||
 896         strcmp(_matrule->_rChild->_opType,"HasNegatives")==0 ||
 897         strcmp(_matrule->_rChild->_opType,"EncodeISOArray")==0)) {
 898         // String.(compareTo/equals/indexOf) and Arrays.equals
 899         // and sun.nio.cs.iso8859_1$Encoder.EncodeISOArray
 900         // take 1 control and 1 memory edges.
 901         // Also String.(compressedCopy/inflatedCopy).
 902     return 2;
 903   }
 904 
 905   // Check for handling of 'Memory' input/edge in the ideal world.
 906   // The AD file writer is shielded from knowledge of these edges.
 907   int base = 1;                 // Skip control
 908   base += _matrule->needs_ideal_memory_edge(globals);
 909 
 910   // Also skip the base-oop value for uses of derived oops.
 911   // The AD file writer is shielded from knowledge of these edges.
 912   base += needs_base_oop_edge(globals);
 913 
 914   return base;
 915 }
 916 
 917 // This function determines the order of the MachOper in _opnds[]
 918 // by writing the operand names into the _components list.
 919 //
 920 // Implementation does not modify state of internal structures
 921 void InstructForm::build_components() {
 922   // Add top-level operands to the components
 923   if (_matrule)  _matrule->append_components(_localNames, _components);
 924 
 925   // Add parameters that "do not appear in match rule".
 926   bool has_temp = false;
 927   const char *name;
 928   const char *kill_name = NULL;
 929   for (_parameters.reset(); (name = _parameters.iter()) != NULL;) {
 930     OpClassForm *opForm = _localNames[name]->is_opclass();
 931     assert(opForm != NULL, "sanity");
 932 
 933     Effect* e = NULL;
 934     {
 935       const Form* form = _effects[name];
 936       e = form ? form->is_effect() : NULL;
 937     }
 938 
 939     if (e != NULL) {
 940       has_temp |= e->is(Component::TEMP);
 941 
 942       // KILLs must be declared after any TEMPs because TEMPs are real
 943       // uses so their operand numbering must directly follow the real
 944       // inputs from the match rule.  Fixing the numbering seems
 945       // complex so simply enforce the restriction during parse.
 946       if (kill_name != NULL &&
 947           e->isa(Component::TEMP) && !e->isa(Component::DEF)) {
 948         OpClassForm* kill = _localNames[kill_name]->is_opclass();
 949         assert(kill != NULL, "sanity");
 950         globalAD->syntax_err(_linenum, "%s: %s %s must be at the end of the argument list\n",
 951                              _ident, kill->_ident, kill_name);
 952       } else if (e->isa(Component::KILL) && !e->isa(Component::USE)) {
 953         kill_name = name;
 954       }
 955     }
 956 
 957     const Component *component  = _components.search(name);
 958     if ( component  == NULL ) {
 959       if (e) {
 960         _components.insert(name, opForm->_ident, e->_use_def, false);
 961         component = _components.search(name);
 962         if (component->isa(Component::USE) && !component->isa(Component::TEMP) && _matrule) {
 963           const Form *form = globalAD->globalNames()[component->_type];
 964           assert( form, "component type must be a defined form");
 965           OperandForm *op   = form->is_operand();
 966           if (op->_interface && op->_interface->is_RegInterface()) {
 967             globalAD->syntax_err(_linenum, "%s: illegal USE of non-input: %s %s\n",
 968                                  _ident, opForm->_ident, name);
 969           }
 970         }
 971       } else {
 972         // This would be a nice warning but it triggers in a few places in a benign way
 973         // if (_matrule != NULL && !expands()) {
 974         //   globalAD->syntax_err(_linenum, "%s: %s %s not mentioned in effect or match rule\n",
 975         //                        _ident, opForm->_ident, name);
 976         // }
 977         _components.insert(name, opForm->_ident, Component::INVALID, false);
 978       }
 979     }
 980     else if (e) {
 981       // Component was found in the list
 982       // Check if there is a new effect that requires an extra component.
 983       // This happens when adding 'USE' to a component that is not yet one.
 984       if ((!component->isa( Component::USE) && ((e->_use_def & Component::USE) != 0))) {
 985         if (component->isa(Component::USE) && _matrule) {
 986           const Form *form = globalAD->globalNames()[component->_type];
 987           assert( form, "component type must be a defined form");
 988           OperandForm *op   = form->is_operand();
 989           if (op->_interface && op->_interface->is_RegInterface()) {
 990             globalAD->syntax_err(_linenum, "%s: illegal USE of non-input: %s %s\n",
 991                                  _ident, opForm->_ident, name);
 992           }
 993         }
 994         _components.insert(name, opForm->_ident, e->_use_def, false);
 995       } else {
 996         Component  *comp = (Component*)component;
 997         comp->promote_use_def_info(e->_use_def);
 998       }
 999       // Component positions are zero based.
1000       int  pos  = _components.operand_position(name);
1001       assert( ! (component->isa(Component::DEF) && (pos >= 1)),
1002               "Component::DEF can only occur in the first position");
1003     }
1004   }
1005 
1006   // Resolving the interactions between expand rules and TEMPs would
1007   // be complex so simply disallow it.
1008   if (_matrule == NULL && has_temp) {
1009     globalAD->syntax_err(_linenum, "%s: TEMPs without match rule isn't supported\n", _ident);
1010   }
1011 
1012   return;
1013 }
1014 
1015 // Return zero-based position in component list;  -1 if not in list.
1016 int   InstructForm::operand_position(const char *name, int usedef) {
1017   return unique_opnds_idx(_components.operand_position(name, usedef, this));
1018 }
1019 
1020 int   InstructForm::operand_position_format(const char *name) {
1021   return unique_opnds_idx(_components.operand_position_format(name, this));
1022 }
1023 
1024 // Return zero-based position in component list; -1 if not in list.
1025 int   InstructForm::label_position() {
1026   return unique_opnds_idx(_components.label_position());
1027 }
1028 
1029 int   InstructForm::method_position() {
1030   return unique_opnds_idx(_components.method_position());
1031 }
1032 
1033 // Return number of relocation entries needed for this instruction.
1034 uint  InstructForm::reloc(FormDict &globals) {
1035   uint reloc_entries  = 0;
1036   // Check for "Call" nodes
1037   if ( is_ideal_call() )      ++reloc_entries;
1038   if ( is_ideal_return() )    ++reloc_entries;
1039   if ( is_ideal_safepoint() ) ++reloc_entries;
1040 
1041 
1042   // Check if operands MAYBE oop pointers, by checking for ConP elements
1043   // Proceed through the leaves of the match-tree and check for ConPs
1044   if ( _matrule != NULL ) {
1045     uint         position = 0;
1046     const char  *result   = NULL;
1047     const char  *name     = NULL;
1048     const char  *opType   = NULL;
1049     while (_matrule->base_operand(position, globals, result, name, opType)) {
1050       if ( strcmp(opType,"ConP") == 0 ) {
1051 #ifdef SPARC
1052         reloc_entries += 2; // 1 for sethi + 1 for setlo
1053 #else
1054         ++reloc_entries;
1055 #endif
1056       }
1057       ++position;
1058     }
1059   }
1060 
1061   // Above is only a conservative estimate
1062   // because it did not check contents of operand classes.
1063   // !!!!! !!!!!
1064   // Add 1 to reloc info for each operand class in the component list.
1065   Component  *comp;
1066   _components.reset();
1067   while ( (comp = _components.iter()) != NULL ) {
1068     const Form        *form = globals[comp->_type];
1069     assert( form, "Did not find component's type in global names");
1070     const OpClassForm *opc  = form->is_opclass();
1071     const OperandForm *oper = form->is_operand();
1072     if ( opc && (oper == NULL) ) {
1073       ++reloc_entries;
1074     } else if ( oper ) {
1075       // floats and doubles loaded out of method's constant pool require reloc info
1076       Form::DataType type = oper->is_base_constant(globals);
1077       if ( (type == Form::idealF) || (type == Form::idealD) ) {
1078         ++reloc_entries;
1079       }
1080     }
1081   }
1082 
1083   // Float and Double constants may come from the CodeBuffer table
1084   // and require relocatable addresses for access
1085   // !!!!!
1086   // Check for any component being an immediate float or double.
1087   Form::DataType data_type = is_chain_of_constant(globals);
1088   if( data_type==idealD || data_type==idealF ) {
1089 #ifdef SPARC
1090     // sparc required more relocation entries for floating constants
1091     // (expires 9/98)
1092     reloc_entries += 6;
1093 #else
1094     reloc_entries++;
1095 #endif
1096   }
1097 
1098   return reloc_entries;
1099 }
1100 
1101 // Utility function defined in archDesc.cpp
1102 extern bool is_def(int usedef);
1103 
1104 // Return the result of reducing an instruction
1105 const char *InstructForm::reduce_result() {
1106   const char* result = "Universe";  // default
1107   _components.reset();
1108   Component *comp = _components.iter();
1109   if (comp != NULL && comp->isa(Component::DEF)) {
1110     result = comp->_type;
1111     // Override this if the rule is a store operation:
1112     if (_matrule && _matrule->_rChild &&
1113         is_store_to_memory(_matrule->_rChild->_opType))
1114       result = "Universe";
1115   }
1116   return result;
1117 }
1118 
1119 // Return the name of the operand on the right hand side of the binary match
1120 // Return NULL if there is no right hand side
1121 const char *InstructForm::reduce_right(FormDict &globals)  const {
1122   if( _matrule == NULL ) return NULL;
1123   return  _matrule->reduce_right(globals);
1124 }
1125 
1126 // Similar for left
1127 const char *InstructForm::reduce_left(FormDict &globals)   const {
1128   if( _matrule == NULL ) return NULL;
1129   return  _matrule->reduce_left(globals);
1130 }
1131 
1132 
1133 // Base class for this instruction, MachNode except for calls
1134 const char *InstructForm::mach_base_class(FormDict &globals)  const {
1135   if( is_ideal_call() == Form::JAVA_STATIC ) {
1136     return "MachCallStaticJavaNode";
1137   }
1138   else if( is_ideal_call() == Form::JAVA_DYNAMIC ) {
1139     return "MachCallDynamicJavaNode";
1140   }
1141   else if( is_ideal_call() == Form::JAVA_RUNTIME ) {
1142     return "MachCallRuntimeNode";
1143   }
1144   else if( is_ideal_call() == Form::JAVA_LEAF ) {
1145     return "MachCallLeafNode";
1146   }
1147   else if (is_ideal_return()) {
1148     return "MachReturnNode";
1149   }
1150   else if (is_ideal_halt()) {
1151     return "MachHaltNode";
1152   }
1153   else if (is_ideal_safepoint()) {
1154     return "MachSafePointNode";
1155   }
1156   else if (is_ideal_if()) {
1157     return "MachIfNode";
1158   }
1159   else if (is_ideal_goto()) {
1160     return "MachGotoNode";
1161   }
1162   else if (is_ideal_fastlock()) {
1163     return "MachFastLockNode";
1164   }
1165   else if (is_ideal_nop()) {
1166     return "MachNopNode";
1167   }
1168   else if( is_ideal_membar()) {
1169     return "MachMemBarNode";
1170   }
1171   else if (is_ideal_jump()) {
1172     return "MachJumpNode";
1173   }
1174   else if (is_mach_constant()) {
1175     return "MachConstantNode";
1176   }
1177   else if (captures_bottom_type(globals)) {
1178     return "MachTypeNode";
1179   } else {
1180     return "MachNode";
1181   }
1182   assert( false, "ShouldNotReachHere()");
1183   return NULL;
1184 }
1185 
1186 // Compare the instruction predicates for textual equality
1187 bool equivalent_predicates( const InstructForm *instr1, const InstructForm *instr2 ) {
1188   const Predicate *pred1  = instr1->_predicate;
1189   const Predicate *pred2  = instr2->_predicate;
1190   if( pred1 == NULL && pred2 == NULL ) {
1191     // no predicates means they are identical
1192     return true;
1193   }
1194   if( pred1 != NULL && pred2 != NULL ) {
1195     // compare the predicates
1196     if (ADLParser::equivalent_expressions(pred1->_pred, pred2->_pred)) {
1197       return true;
1198     }
1199   }
1200 
1201   return false;
1202 }
1203 
1204 // Check if this instruction can cisc-spill to 'alternate'
1205 bool InstructForm::cisc_spills_to(ArchDesc &AD, InstructForm *instr) {
1206   assert( _matrule != NULL && instr->_matrule != NULL, "must have match rules");
1207   // Do not replace if a cisc-version has been found.
1208   if( cisc_spill_operand() != Not_cisc_spillable ) return false;
1209 
1210   int         cisc_spill_operand = Maybe_cisc_spillable;
1211   char       *result             = NULL;
1212   char       *result2            = NULL;
1213   const char *op_name            = NULL;
1214   const char *reg_type           = NULL;
1215   FormDict   &globals            = AD.globalNames();
1216   cisc_spill_operand = _matrule->matchrule_cisc_spill_match(globals, AD.get_registers(), instr->_matrule, op_name, reg_type);
1217   if( (cisc_spill_operand != Not_cisc_spillable) && (op_name != NULL) && equivalent_predicates(this, instr) ) {
1218     cisc_spill_operand = operand_position(op_name, Component::USE);
1219     int def_oper  = operand_position(op_name, Component::DEF);
1220     if( def_oper == NameList::Not_in_list && instr->num_opnds() == num_opnds()) {
1221       // Do not support cisc-spilling for destination operands and
1222       // make sure they have the same number of operands.
1223       _cisc_spill_alternate = instr;
1224       instr->set_cisc_alternate(true);
1225       if( AD._cisc_spill_debug ) {
1226         fprintf(stderr, "Instruction %s cisc-spills-to %s\n", _ident, instr->_ident);
1227         fprintf(stderr, "   using operand %s %s at index %d\n", reg_type, op_name, cisc_spill_operand);
1228       }
1229       // Record that a stack-version of the reg_mask is needed
1230       // !!!!!
1231       OperandForm *oper = (OperandForm*)(globals[reg_type]->is_operand());
1232       assert( oper != NULL, "cisc-spilling non operand");
1233       const char *reg_class_name = oper->constrained_reg_class();
1234       AD.set_stack_or_reg(reg_class_name);
1235       const char *reg_mask_name  = AD.reg_mask(*oper);
1236       set_cisc_reg_mask_name(reg_mask_name);
1237       const char *stack_or_reg_mask_name = AD.stack_or_reg_mask(*oper);
1238     } else {
1239       cisc_spill_operand = Not_cisc_spillable;
1240     }
1241   } else {
1242     cisc_spill_operand = Not_cisc_spillable;
1243   }
1244 
1245   set_cisc_spill_operand(cisc_spill_operand);
1246   return (cisc_spill_operand != Not_cisc_spillable);
1247 }
1248 
1249 // Check to see if this instruction can be replaced with the short branch
1250 // instruction `short-branch'
1251 bool InstructForm::check_branch_variant(ArchDesc &AD, InstructForm *short_branch) {
1252   if (_matrule != NULL &&
1253       this != short_branch &&   // Don't match myself
1254       !is_short_branch() &&     // Don't match another short branch variant
1255       reduce_result() != NULL &&
1256       strstr(_ident, "restoreMask") == NULL && // Don't match side effects
1257       strcmp(reduce_result(), short_branch->reduce_result()) == 0 &&
1258       _matrule->equivalent(AD.globalNames(), short_branch->_matrule)) {
1259     // The instructions are equivalent.
1260 
1261     // Now verify that both instructions have the same parameters and
1262     // the same effects. Both branch forms should have the same inputs
1263     // and resulting projections to correctly replace a long branch node
1264     // with corresponding short branch node during code generation.
1265 
1266     bool different = false;
1267     if (short_branch->_components.count() != _components.count()) {
1268        different = true;
1269     } else if (_components.count() > 0) {
1270       short_branch->_components.reset();
1271       _components.reset();
1272       Component *comp;
1273       while ((comp = _components.iter()) != NULL) {
1274         Component *short_comp = short_branch->_components.iter();
1275         if (short_comp == NULL ||
1276             short_comp->_type != comp->_type ||
1277             short_comp->_usedef != comp->_usedef) {
1278           different = true;
1279           break;
1280         }
1281       }
1282       if (short_branch->_components.iter() != NULL)
1283         different = true;
1284     }
1285     if (different) {
1286       globalAD->syntax_err(short_branch->_linenum, "Instruction %s and its short form %s have different parameters\n", _ident, short_branch->_ident);
1287     }
1288     if (AD._adl_debug > 1 || AD._short_branch_debug) {
1289       fprintf(stderr, "Instruction %s has short form %s\n", _ident, short_branch->_ident);
1290     }
1291     _short_branch_form = short_branch;
1292     return true;
1293   }
1294   return false;
1295 }
1296 
1297 
1298 // --------------------------- FILE *output_routines
1299 //
1300 // Generate the format call for the replacement variable
1301 void InstructForm::rep_var_format(FILE *fp, const char *rep_var) {
1302   // Handle special constant table variables.
1303   if (strcmp(rep_var, "constanttablebase") == 0) {
1304     fprintf(fp, "char reg[128];  ra->dump_register(in(mach_constant_base_node_input()), reg);\n");
1305     fprintf(fp, "    st->print(\"%%s\", reg);\n");
1306     return;
1307   }
1308   if (strcmp(rep_var, "constantoffset") == 0) {
1309     fprintf(fp, "st->print(\"#%%d\", constant_offset_unchecked());\n");
1310     return;
1311   }
1312   if (strcmp(rep_var, "constantaddress") == 0) {
1313     fprintf(fp, "st->print(\"constant table base + #%%d\", constant_offset_unchecked());\n");
1314     return;
1315   }
1316 
1317   // Find replacement variable's type
1318   const Form *form   = _localNames[rep_var];
1319   if (form == NULL) {
1320     globalAD->syntax_err(_linenum, "Unknown replacement variable %s in format statement of %s.",
1321                          rep_var, _ident);
1322     return;
1323   }
1324   OpClassForm *opc   = form->is_opclass();
1325   assert( opc, "replacement variable was not found in local names");
1326   // Lookup the index position of the replacement variable
1327   int idx  = operand_position_format(rep_var);
1328   if ( idx == -1 ) {
1329     globalAD->syntax_err(_linenum, "Could not find replacement variable %s in format statement of %s.\n",
1330                          rep_var, _ident);
1331     assert(strcmp(opc->_ident, "label") == 0, "Unimplemented");
1332     return;
1333   }
1334 
1335   if (is_noninput_operand(idx)) {
1336     // This component isn't in the input array.  Print out the static
1337     // name of the register.
1338     OperandForm* oper = form->is_operand();
1339     if (oper != NULL && oper->is_bound_register()) {
1340       const RegDef* first = oper->get_RegClass()->find_first_elem();
1341       fprintf(fp, "    st->print_raw(\"%s\");\n", first->_regname);
1342     } else {
1343       globalAD->syntax_err(_linenum, "In %s can't find format for %s %s", _ident, opc->_ident, rep_var);
1344     }
1345   } else {
1346     // Output the format call for this operand
1347     fprintf(fp,"opnd_array(%d)->",idx);
1348     if (idx == 0)
1349       fprintf(fp,"int_format(ra, this, st); // %s\n", rep_var);
1350     else
1351       fprintf(fp,"ext_format(ra, this,idx%d, st); // %s\n", idx, rep_var );
1352   }
1353 }
1354 
1355 // Seach through operands to determine parameters unique positions.
1356 void InstructForm::set_unique_opnds() {
1357   uint* uniq_idx = NULL;
1358   uint  nopnds = num_opnds();
1359   uint  num_uniq = nopnds;
1360   uint i;
1361   _uniq_idx_length = 0;
1362   if (nopnds > 0) {
1363     // Allocate index array.  Worst case we're mapping from each
1364     // component back to an index and any DEF always goes at 0 so the
1365     // length of the array has to be the number of components + 1.
1366     _uniq_idx_length = _components.count() + 1;
1367     uniq_idx = (uint*) AllocateHeap(sizeof(uint) * _uniq_idx_length);
1368     for (i = 0; i < _uniq_idx_length; i++) {
1369       uniq_idx[i] = i;
1370     }
1371   }
1372   // Do it only if there is a match rule and no expand rule.  With an
1373   // expand rule it is done by creating new mach node in Expand()
1374   // method.
1375   if (nopnds > 0 && _matrule != NULL && _exprule == NULL) {
1376     const char *name;
1377     uint count;
1378     bool has_dupl_use = false;
1379 
1380     _parameters.reset();
1381     while ((name = _parameters.iter()) != NULL) {
1382       count = 0;
1383       uint position = 0;
1384       uint uniq_position = 0;
1385       _components.reset();
1386       Component *comp = NULL;
1387       if (sets_result()) {
1388         comp = _components.iter();
1389         position++;
1390       }
1391       // The next code is copied from the method operand_position().
1392       for (; (comp = _components.iter()) != NULL; ++position) {
1393         // When the first component is not a DEF,
1394         // leave space for the result operand!
1395         if (position==0 && (!comp->isa(Component::DEF))) {
1396           ++position;
1397         }
1398         if (strcmp(name, comp->_name) == 0) {
1399           if (++count > 1) {
1400             assert(position < _uniq_idx_length, "out of bounds");
1401             uniq_idx[position] = uniq_position;
1402             has_dupl_use = true;
1403           } else {
1404             uniq_position = position;
1405           }
1406         }
1407         if (comp->isa(Component::DEF) && comp->isa(Component::USE)) {
1408           ++position;
1409           if (position != 1)
1410             --position;   // only use two slots for the 1st USE_DEF
1411         }
1412       }
1413     }
1414     if (has_dupl_use) {
1415       for (i = 1; i < nopnds; i++) {
1416         if (i != uniq_idx[i]) {
1417           break;
1418         }
1419       }
1420       uint j = i;
1421       for (; i < nopnds; i++) {
1422         if (i == uniq_idx[i]) {
1423           uniq_idx[i] = j++;
1424         }
1425       }
1426       num_uniq = j;
1427     }
1428   }
1429   _uniq_idx = uniq_idx;
1430   _num_uniq = num_uniq;
1431 }
1432 
1433 // Generate index values needed for determining the operand position
1434 void InstructForm::index_temps(FILE *fp, FormDict &globals, const char *prefix, const char *receiver) {
1435   uint  idx = 0;                  // position of operand in match rule
1436   int   cur_num_opnds = num_opnds();
1437 
1438   // Compute the index into vector of operand pointers:
1439   // idx0=0 is used to indicate that info comes from this same node, not from input edge.
1440   // idx1 starts at oper_input_base()
1441   if ( cur_num_opnds >= 1 ) {
1442     fprintf(fp,"  // Start at oper_input_base() and count operands\n");
1443     fprintf(fp,"  unsigned %sidx0 = %d;\n", prefix, oper_input_base(globals));
1444     fprintf(fp,"  unsigned %sidx1 = %d;", prefix, oper_input_base(globals));
1445     fprintf(fp," \t// %s\n", unique_opnd_ident(1));
1446 
1447     // Generate starting points for other unique operands if they exist
1448     for ( idx = 2; idx < num_unique_opnds(); ++idx ) {
1449       if( *receiver == 0 ) {
1450         fprintf(fp,"  unsigned %sidx%d = %sidx%d + opnd_array(%d)->num_edges();",
1451                 prefix, idx, prefix, idx-1, idx-1 );
1452       } else {
1453         fprintf(fp,"  unsigned %sidx%d = %sidx%d + %s_opnds[%d]->num_edges();",
1454                 prefix, idx, prefix, idx-1, receiver, idx-1 );
1455       }
1456       fprintf(fp," \t// %s\n", unique_opnd_ident(idx));
1457     }
1458   }
1459   if( *receiver != 0 ) {
1460     // This value is used by generate_peepreplace when copying a node.
1461     // Don't emit it in other cases since it can hide bugs with the
1462     // use invalid idx's.
1463     fprintf(fp,"  unsigned %sidx%d = %sreq(); \n", prefix, idx, receiver);
1464   }
1465 
1466 }
1467 
1468 // ---------------------------
1469 bool InstructForm::verify() {
1470   // !!!!! !!!!!
1471   // Check that a "label" operand occurs last in the operand list, if present
1472   return true;
1473 }
1474 
1475 void InstructForm::dump() {
1476   output(stderr);
1477 }
1478 
1479 void InstructForm::output(FILE *fp) {
1480   fprintf(fp,"\nInstruction: %s\n", (_ident?_ident:""));
1481   if (_matrule)   _matrule->output(fp);
1482   if (_insencode) _insencode->output(fp);
1483   if (_constant)  _constant->output(fp);
1484   if (_opcode)    _opcode->output(fp);
1485   if (_attribs)   _attribs->output(fp);
1486   if (_predicate) _predicate->output(fp);
1487   if (_effects.Size()) {
1488     fprintf(fp,"Effects\n");
1489     _effects.dump();
1490   }
1491   if (_exprule)   _exprule->output(fp);
1492   if (_rewrule)   _rewrule->output(fp);
1493   if (_format)    _format->output(fp);
1494   if (_peephole)  _peephole->output(fp);
1495 }
1496 
1497 void MachNodeForm::dump() {
1498   output(stderr);
1499 }
1500 
1501 void MachNodeForm::output(FILE *fp) {
1502   fprintf(fp,"\nMachNode: %s\n", (_ident?_ident:""));
1503 }
1504 
1505 //------------------------------build_predicate--------------------------------
1506 // Build instruction predicates.  If the user uses the same operand name
1507 // twice, we need to check that the operands are pointer-eequivalent in
1508 // the DFA during the labeling process.
1509 Predicate *InstructForm::build_predicate() {
1510   const int buflen = 1024;
1511   char buf[buflen], *s=buf;
1512   Dict names(cmpstr,hashstr,Form::arena);       // Map Names to counts
1513 
1514   MatchNode *mnode =
1515     strcmp(_matrule->_opType, "Set") ? _matrule : _matrule->_rChild;
1516   mnode->count_instr_names(names);
1517 
1518   uint first = 1;
1519   // Start with the predicate supplied in the .ad file.
1520   if (_predicate) {
1521     if (first) first = 0;
1522     strcpy(s, "("); s += strlen(s);
1523     strncpy(s, _predicate->_pred, buflen - strlen(s) - 1);
1524     s += strlen(s);
1525     strcpy(s, ")"); s += strlen(s);
1526   }
1527   for( DictI i(&names); i.test(); ++i ) {
1528     uintptr_t cnt = (uintptr_t)i._value;
1529     if( cnt > 1 ) {             // Need a predicate at all?
1530       assert( cnt == 2, "Unimplemented" );
1531       // Handle many pairs
1532       if( first ) first=0;
1533       else {                    // All tests must pass, so use '&&'
1534         strcpy(s," && ");
1535         s += strlen(s);
1536       }
1537       // Add predicate to working buffer
1538       sprintf(s,"/*%s*/(",(char*)i._key);
1539       s += strlen(s);
1540       mnode->build_instr_pred(s,(char*)i._key,0);
1541       s += strlen(s);
1542       strcpy(s," == "); s += strlen(s);
1543       mnode->build_instr_pred(s,(char*)i._key,1);
1544       s += strlen(s);
1545       strcpy(s,")"); s += strlen(s);
1546     }
1547   }
1548   if( s == buf ) s = NULL;
1549   else {
1550     assert( strlen(buf) < sizeof(buf), "String buffer overflow" );
1551     s = strdup(buf);
1552   }
1553   return new Predicate(s);
1554 }
1555 
1556 //------------------------------EncodeForm-------------------------------------
1557 // Constructor
1558 EncodeForm::EncodeForm()
1559   : _encClass(cmpstr,hashstr, Form::arena) {
1560 }
1561 EncodeForm::~EncodeForm() {
1562 }
1563 
1564 // record a new register class
1565 EncClass *EncodeForm::add_EncClass(const char *className) {
1566   EncClass *encClass = new EncClass(className);
1567   _eclasses.addName(className);
1568   _encClass.Insert(className,encClass);
1569   return encClass;
1570 }
1571 
1572 // Lookup the function body for an encoding class
1573 EncClass  *EncodeForm::encClass(const char *className) {
1574   assert( className != NULL, "Must provide a defined encoding name");
1575 
1576   EncClass *encClass = (EncClass*)_encClass[className];
1577   return encClass;
1578 }
1579 
1580 // Lookup the function body for an encoding class
1581 const char *EncodeForm::encClassBody(const char *className) {
1582   if( className == NULL ) return NULL;
1583 
1584   EncClass *encClass = (EncClass*)_encClass[className];
1585   assert( encClass != NULL, "Encode Class is missing.");
1586   encClass->_code.reset();
1587   const char *code = (const char*)encClass->_code.iter();
1588   assert( code != NULL, "Found an empty encode class body.");
1589 
1590   return code;
1591 }
1592 
1593 // Lookup the function body for an encoding class
1594 const char *EncodeForm::encClassPrototype(const char *className) {
1595   assert( className != NULL, "Encode class name must be non NULL.");
1596 
1597   return className;
1598 }
1599 
1600 void EncodeForm::dump() {                  // Debug printer
1601   output(stderr);
1602 }
1603 
1604 void EncodeForm::output(FILE *fp) {          // Write info to output files
1605   const char *name;
1606   fprintf(fp,"\n");
1607   fprintf(fp,"-------------------- Dump EncodeForm --------------------\n");
1608   for (_eclasses.reset(); (name = _eclasses.iter()) != NULL;) {
1609     ((EncClass*)_encClass[name])->output(fp);
1610   }
1611   fprintf(fp,"-------------------- end  EncodeForm --------------------\n");
1612 }
1613 //------------------------------EncClass---------------------------------------
1614 EncClass::EncClass(const char *name)
1615   : _localNames(cmpstr,hashstr, Form::arena), _name(name) {
1616 }
1617 EncClass::~EncClass() {
1618 }
1619 
1620 // Add a parameter <type,name> pair
1621 void EncClass::add_parameter(const char *parameter_type, const char *parameter_name) {
1622   _parameter_type.addName( parameter_type );
1623   _parameter_name.addName( parameter_name );
1624 }
1625 
1626 // Verify operand types in parameter list
1627 bool EncClass::check_parameter_types(FormDict &globals) {
1628   // !!!!!
1629   return false;
1630 }
1631 
1632 // Add the decomposed "code" sections of an encoding's code-block
1633 void EncClass::add_code(const char *code) {
1634   _code.addName(code);
1635 }
1636 
1637 // Add the decomposed "replacement variables" of an encoding's code-block
1638 void EncClass::add_rep_var(char *replacement_var) {
1639   _code.addName(NameList::_signal);
1640   _rep_vars.addName(replacement_var);
1641 }
1642 
1643 // Lookup the function body for an encoding class
1644 int EncClass::rep_var_index(const char *rep_var) {
1645   uint        position = 0;
1646   const char *name     = NULL;
1647 
1648   _parameter_name.reset();
1649   while ( (name = _parameter_name.iter()) != NULL ) {
1650     if ( strcmp(rep_var,name) == 0 ) return position;
1651     ++position;
1652   }
1653 
1654   return -1;
1655 }
1656 
1657 // Check after parsing
1658 bool EncClass::verify() {
1659   // 1!!!!
1660   // Check that each replacement variable, '$name' in architecture description
1661   // is actually a local variable for this encode class, or a reserved name
1662   // "primary, secondary, tertiary"
1663   return true;
1664 }
1665 
1666 void EncClass::dump() {
1667   output(stderr);
1668 }
1669 
1670 // Write info to output files
1671 void EncClass::output(FILE *fp) {
1672   fprintf(fp,"EncClass: %s", (_name ? _name : ""));
1673 
1674   // Output the parameter list
1675   _parameter_type.reset();
1676   _parameter_name.reset();
1677   const char *type = _parameter_type.iter();
1678   const char *name = _parameter_name.iter();
1679   fprintf(fp, " ( ");
1680   for ( ; (type != NULL) && (name != NULL);
1681         (type = _parameter_type.iter()), (name = _parameter_name.iter()) ) {
1682     fprintf(fp, " %s %s,", type, name);
1683   }
1684   fprintf(fp, " ) ");
1685 
1686   // Output the code block
1687   _code.reset();
1688   _rep_vars.reset();
1689   const char *code;
1690   while ( (code = _code.iter()) != NULL ) {
1691     if ( _code.is_signal(code) ) {
1692       // A replacement variable
1693       const char *rep_var = _rep_vars.iter();
1694       fprintf(fp,"($%s)", rep_var);
1695     } else {
1696       // A section of code
1697       fprintf(fp,"%s", code);
1698     }
1699   }
1700 
1701 }
1702 
1703 //------------------------------Opcode-----------------------------------------
1704 Opcode::Opcode(char *primary, char *secondary, char *tertiary)
1705   : _primary(primary), _secondary(secondary), _tertiary(tertiary) {
1706 }
1707 
1708 Opcode::~Opcode() {
1709 }
1710 
1711 Opcode::opcode_type Opcode::as_opcode_type(const char *param) {
1712   if( strcmp(param,"primary") == 0 ) {
1713     return Opcode::PRIMARY;
1714   }
1715   else if( strcmp(param,"secondary") == 0 ) {
1716     return Opcode::SECONDARY;
1717   }
1718   else if( strcmp(param,"tertiary") == 0 ) {
1719     return Opcode::TERTIARY;
1720   }
1721   return Opcode::NOT_AN_OPCODE;
1722 }
1723 
1724 bool Opcode::print_opcode(FILE *fp, Opcode::opcode_type desired_opcode) {
1725   // Default values previously provided by MachNode::primary()...
1726   const char *description = NULL;
1727   const char *value       = NULL;
1728   // Check if user provided any opcode definitions
1729   if( this != NULL ) {
1730     // Update 'value' if user provided a definition in the instruction
1731     switch (desired_opcode) {
1732     case PRIMARY:
1733       description = "primary()";
1734       if( _primary   != NULL)  { value = _primary;     }
1735       break;
1736     case SECONDARY:
1737       description = "secondary()";
1738       if( _secondary != NULL ) { value = _secondary;   }
1739       break;
1740     case TERTIARY:
1741       description = "tertiary()";
1742       if( _tertiary  != NULL ) { value = _tertiary;    }
1743       break;
1744     default:
1745       assert( false, "ShouldNotReachHere();");
1746       break;
1747     }
1748   }
1749   if (value != NULL) {
1750     fprintf(fp, "(%s /*%s*/)", value, description);
1751   }
1752   return value != NULL;
1753 }
1754 
1755 void Opcode::dump() {
1756   output(stderr);
1757 }
1758 
1759 // Write info to output files
1760 void Opcode::output(FILE *fp) {
1761   if (_primary   != NULL) fprintf(fp,"Primary   opcode: %s\n", _primary);
1762   if (_secondary != NULL) fprintf(fp,"Secondary opcode: %s\n", _secondary);
1763   if (_tertiary  != NULL) fprintf(fp,"Tertiary  opcode: %s\n", _tertiary);
1764 }
1765 
1766 //------------------------------InsEncode--------------------------------------
1767 InsEncode::InsEncode() {
1768 }
1769 InsEncode::~InsEncode() {
1770 }
1771 
1772 // Add "encode class name" and its parameters
1773 NameAndList *InsEncode::add_encode(char *encoding) {
1774   assert( encoding != NULL, "Must provide name for encoding");
1775 
1776   // add_parameter(NameList::_signal);
1777   NameAndList *encode = new NameAndList(encoding);
1778   _encoding.addName((char*)encode);
1779 
1780   return encode;
1781 }
1782 
1783 // Access the list of encodings
1784 void InsEncode::reset() {
1785   _encoding.reset();
1786   // _parameter.reset();
1787 }
1788 const char* InsEncode::encode_class_iter() {
1789   NameAndList  *encode_class = (NameAndList*)_encoding.iter();
1790   return  ( encode_class != NULL ? encode_class->name() : NULL );
1791 }
1792 // Obtain parameter name from zero based index
1793 const char *InsEncode::rep_var_name(InstructForm &inst, uint param_no) {
1794   NameAndList *params = (NameAndList*)_encoding.current();
1795   assert( params != NULL, "Internal Error");
1796   const char *param = (*params)[param_no];
1797 
1798   // Remove '$' if parser placed it there.
1799   return ( param != NULL && *param == '$') ? (param+1) : param;
1800 }
1801 
1802 void InsEncode::dump() {
1803   output(stderr);
1804 }
1805 
1806 // Write info to output files
1807 void InsEncode::output(FILE *fp) {
1808   NameAndList *encoding  = NULL;
1809   const char  *parameter = NULL;
1810 
1811   fprintf(fp,"InsEncode: ");
1812   _encoding.reset();
1813 
1814   while ( (encoding = (NameAndList*)_encoding.iter()) != 0 ) {
1815     // Output the encoding being used
1816     fprintf(fp,"%s(", encoding->name() );
1817 
1818     // Output its parameter list, if any
1819     bool first_param = true;
1820     encoding->reset();
1821     while (  (parameter = encoding->iter()) != 0 ) {
1822       // Output the ',' between parameters
1823       if ( ! first_param )  fprintf(fp,", ");
1824       first_param = false;
1825       // Output the parameter
1826       fprintf(fp,"%s", parameter);
1827     } // done with parameters
1828     fprintf(fp,")  ");
1829   } // done with encodings
1830 
1831   fprintf(fp,"\n");
1832 }
1833 
1834 //------------------------------Effect-----------------------------------------
1835 static int effect_lookup(const char *name) {
1836   if (!strcmp(name, "USE")) return Component::USE;
1837   if (!strcmp(name, "DEF")) return Component::DEF;
1838   if (!strcmp(name, "USE_DEF")) return Component::USE_DEF;
1839   if (!strcmp(name, "KILL")) return Component::KILL;
1840   if (!strcmp(name, "USE_KILL")) return Component::USE_KILL;
1841   if (!strcmp(name, "TEMP")) return Component::TEMP;
1842   if (!strcmp(name, "TEMP_DEF")) return Component::TEMP_DEF;
1843   if (!strcmp(name, "INVALID")) return Component::INVALID;
1844   if (!strcmp(name, "CALL")) return Component::CALL;
1845   assert(false,"Invalid effect name specified\n");
1846   return Component::INVALID;
1847 }
1848 
1849 const char *Component::getUsedefName() {
1850   switch (_usedef) {
1851     case Component::INVALID:  return "INVALID";  break;
1852     case Component::USE:      return "USE";      break;
1853     case Component::USE_DEF:  return "USE_DEF";  break;
1854     case Component::USE_KILL: return "USE_KILL"; break;
1855     case Component::KILL:     return "KILL";     break;
1856     case Component::TEMP:     return "TEMP";     break;
1857     case Component::TEMP_DEF: return "TEMP_DEF"; break;
1858     case Component::DEF:      return "DEF";      break;
1859     case Component::CALL:     return "CALL";     break;
1860     default: assert(false, "unknown effect");
1861   }
1862   return "Undefined Use/Def info";
1863 }
1864 
1865 Effect::Effect(const char *name) : _name(name), _use_def(effect_lookup(name)) {
1866   _ftype = Form::EFF;
1867 }
1868 
1869 Effect::~Effect() {
1870 }
1871 
1872 // Dynamic type check
1873 Effect *Effect::is_effect() const {
1874   return (Effect*)this;
1875 }
1876 
1877 
1878 // True if this component is equal to the parameter.
1879 bool Effect::is(int use_def_kill_enum) const {
1880   return (_use_def == use_def_kill_enum ? true : false);
1881 }
1882 // True if this component is used/def'd/kill'd as the parameter suggests.
1883 bool Effect::isa(int use_def_kill_enum) const {
1884   return (_use_def & use_def_kill_enum) == use_def_kill_enum;
1885 }
1886 
1887 void Effect::dump() {
1888   output(stderr);
1889 }
1890 
1891 void Effect::output(FILE *fp) {          // Write info to output files
1892   fprintf(fp,"Effect: %s\n", (_name?_name:""));
1893 }
1894 
1895 //------------------------------ExpandRule-------------------------------------
1896 ExpandRule::ExpandRule() : _expand_instrs(),
1897                            _newopconst(cmpstr, hashstr, Form::arena) {
1898   _ftype = Form::EXP;
1899 }
1900 
1901 ExpandRule::~ExpandRule() {                  // Destructor
1902 }
1903 
1904 void ExpandRule::add_instruction(NameAndList *instruction_name_and_operand_list) {
1905   _expand_instrs.addName((char*)instruction_name_and_operand_list);
1906 }
1907 
1908 void ExpandRule::reset_instructions() {
1909   _expand_instrs.reset();
1910 }
1911 
1912 NameAndList* ExpandRule::iter_instructions() {
1913   return (NameAndList*)_expand_instrs.iter();
1914 }
1915 
1916 
1917 void ExpandRule::dump() {
1918   output(stderr);
1919 }
1920 
1921 void ExpandRule::output(FILE *fp) {         // Write info to output files
1922   NameAndList *expand_instr = NULL;
1923   const char *opid = NULL;
1924 
1925   fprintf(fp,"\nExpand Rule:\n");
1926 
1927   // Iterate over the instructions 'node' expands into
1928   for(reset_instructions(); (expand_instr = iter_instructions()) != NULL; ) {
1929     fprintf(fp,"%s(", expand_instr->name());
1930 
1931     // iterate over the operand list
1932     for( expand_instr->reset(); (opid = expand_instr->iter()) != NULL; ) {
1933       fprintf(fp,"%s ", opid);
1934     }
1935     fprintf(fp,");\n");
1936   }
1937 }
1938 
1939 //------------------------------RewriteRule------------------------------------
1940 RewriteRule::RewriteRule(char* params, char* block)
1941   : _tempParams(params), _tempBlock(block) { };  // Constructor
1942 RewriteRule::~RewriteRule() {                 // Destructor
1943 }
1944 
1945 void RewriteRule::dump() {
1946   output(stderr);
1947 }
1948 
1949 void RewriteRule::output(FILE *fp) {         // Write info to output files
1950   fprintf(fp,"\nRewrite Rule:\n%s\n%s\n",
1951           (_tempParams?_tempParams:""),
1952           (_tempBlock?_tempBlock:""));
1953 }
1954 
1955 
1956 //==============================MachNodes======================================
1957 //------------------------------MachNodeForm-----------------------------------
1958 MachNodeForm::MachNodeForm(char *id)
1959   : _ident(id) {
1960 }
1961 
1962 MachNodeForm::~MachNodeForm() {
1963 }
1964 
1965 MachNodeForm *MachNodeForm::is_machnode() const {
1966   return (MachNodeForm*)this;
1967 }
1968 
1969 //==============================Operand Classes================================
1970 //------------------------------OpClassForm------------------------------------
1971 OpClassForm::OpClassForm(const char* id) : _ident(id) {
1972   _ftype = Form::OPCLASS;
1973 }
1974 
1975 OpClassForm::~OpClassForm() {
1976 }
1977 
1978 bool OpClassForm::ideal_only() const { return 0; }
1979 
1980 OpClassForm *OpClassForm::is_opclass() const {
1981   return (OpClassForm*)this;
1982 }
1983 
1984 Form::InterfaceType OpClassForm::interface_type(FormDict &globals) const {
1985   if( _oplst.count() == 0 ) return Form::no_interface;
1986 
1987   // Check that my operands have the same interface type
1988   Form::InterfaceType  interface;
1989   bool  first = true;
1990   NameList &op_list = (NameList &)_oplst;
1991   op_list.reset();
1992   const char *op_name;
1993   while( (op_name = op_list.iter()) != NULL ) {
1994     const Form  *form    = globals[op_name];
1995     OperandForm *operand = form->is_operand();
1996     assert( operand, "Entry in operand class that is not an operand");
1997     if( first ) {
1998       first     = false;
1999       interface = operand->interface_type(globals);
2000     } else {
2001       interface = (interface == operand->interface_type(globals) ? interface : Form::no_interface);
2002     }
2003   }
2004   return interface;
2005 }
2006 
2007 bool OpClassForm::stack_slots_only(FormDict &globals) const {
2008   if( _oplst.count() == 0 ) return false;  // how?
2009 
2010   NameList &op_list = (NameList &)_oplst;
2011   op_list.reset();
2012   const char *op_name;
2013   while( (op_name = op_list.iter()) != NULL ) {
2014     const Form  *form    = globals[op_name];
2015     OperandForm *operand = form->is_operand();
2016     assert( operand, "Entry in operand class that is not an operand");
2017     if( !operand->stack_slots_only(globals) )  return false;
2018   }
2019   return true;
2020 }
2021 
2022 
2023 void OpClassForm::dump() {
2024   output(stderr);
2025 }
2026 
2027 void OpClassForm::output(FILE *fp) {
2028   const char *name;
2029   fprintf(fp,"\nOperand Class: %s\n", (_ident?_ident:""));
2030   fprintf(fp,"\nCount = %d\n", _oplst.count());
2031   for(_oplst.reset(); (name = _oplst.iter()) != NULL;) {
2032     fprintf(fp,"%s, ",name);
2033   }
2034   fprintf(fp,"\n");
2035 }
2036 
2037 
2038 //==============================Operands=======================================
2039 //------------------------------OperandForm------------------------------------
2040 OperandForm::OperandForm(const char* id)
2041   : OpClassForm(id), _ideal_only(false),
2042     _localNames(cmpstr, hashstr, Form::arena) {
2043       _ftype = Form::OPER;
2044 
2045       _matrule   = NULL;
2046       _interface = NULL;
2047       _attribs   = NULL;
2048       _predicate = NULL;
2049       _constraint= NULL;
2050       _construct = NULL;
2051       _format    = NULL;
2052 }
2053 OperandForm::OperandForm(const char* id, bool ideal_only)
2054   : OpClassForm(id), _ideal_only(ideal_only),
2055     _localNames(cmpstr, hashstr, Form::arena) {
2056       _ftype = Form::OPER;
2057 
2058       _matrule   = NULL;
2059       _interface = NULL;
2060       _attribs   = NULL;
2061       _predicate = NULL;
2062       _constraint= NULL;
2063       _construct = NULL;
2064       _format    = NULL;
2065 }
2066 OperandForm::~OperandForm() {
2067 }
2068 
2069 
2070 OperandForm *OperandForm::is_operand() const {
2071   return (OperandForm*)this;
2072 }
2073 
2074 bool OperandForm::ideal_only() const {
2075   return _ideal_only;
2076 }
2077 
2078 Form::InterfaceType OperandForm::interface_type(FormDict &globals) const {
2079   if( _interface == NULL )  return Form::no_interface;
2080 
2081   return _interface->interface_type(globals);
2082 }
2083 
2084 
2085 bool OperandForm::stack_slots_only(FormDict &globals) const {
2086   if( _constraint == NULL )  return false;
2087   return _constraint->stack_slots_only();
2088 }
2089 
2090 
2091 // Access op_cost attribute or return NULL.
2092 const char* OperandForm::cost() {
2093   for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) {
2094     if( strcmp(cur->_ident,AttributeForm::_op_cost) == 0 ) {
2095       return cur->_val;
2096     }
2097   }
2098   return NULL;
2099 }
2100 
2101 // Return the number of leaves below this complex operand
2102 uint OperandForm::num_leaves() const {
2103   if ( ! _matrule) return 0;
2104 
2105   int num_leaves = _matrule->_numleaves;
2106   return num_leaves;
2107 }
2108 
2109 // Return the number of constants contained within this complex operand
2110 uint OperandForm::num_consts(FormDict &globals) const {
2111   if ( ! _matrule) return 0;
2112 
2113   // This is a recursive invocation on all operands in the matchrule
2114   return _matrule->num_consts(globals);
2115 }
2116 
2117 // Return the number of constants in match rule with specified type
2118 uint OperandForm::num_consts(FormDict &globals, Form::DataType type) const {
2119   if ( ! _matrule) return 0;
2120 
2121   // This is a recursive invocation on all operands in the matchrule
2122   return _matrule->num_consts(globals, type);
2123 }
2124 
2125 // Return the number of pointer constants contained within this complex operand
2126 uint OperandForm::num_const_ptrs(FormDict &globals) const {
2127   if ( ! _matrule) return 0;
2128 
2129   // This is a recursive invocation on all operands in the matchrule
2130   return _matrule->num_const_ptrs(globals);
2131 }
2132 
2133 uint OperandForm::num_edges(FormDict &globals) const {
2134   uint edges  = 0;
2135   uint leaves = num_leaves();
2136   uint consts = num_consts(globals);
2137 
2138   // If we are matching a constant directly, there are no leaves.
2139   edges = ( leaves > consts ) ? leaves - consts : 0;
2140 
2141   // !!!!!
2142   // Special case operands that do not have a corresponding ideal node.
2143   if( (edges == 0) && (consts == 0) ) {
2144     if( constrained_reg_class() != NULL ) {
2145       edges = 1;
2146     } else {
2147       if( _matrule
2148           && (_matrule->_lChild == NULL) && (_matrule->_rChild == NULL) ) {
2149         const Form *form = globals[_matrule->_opType];
2150         OperandForm *oper = form ? form->is_operand() : NULL;
2151         if( oper ) {
2152           return oper->num_edges(globals);
2153         }
2154       }
2155     }
2156   }
2157 
2158   return edges;
2159 }
2160 
2161 
2162 // Check if this operand is usable for cisc-spilling
2163 bool  OperandForm::is_cisc_reg(FormDict &globals) const {
2164   const char *ideal = ideal_type(globals);
2165   bool is_cisc_reg = (ideal && (ideal_to_Reg_type(ideal) != none));
2166   return is_cisc_reg;
2167 }
2168 
2169 bool  OpClassForm::is_cisc_mem(FormDict &globals) const {
2170   Form::InterfaceType my_interface = interface_type(globals);
2171   return (my_interface == memory_interface);
2172 }
2173 
2174 
2175 // node matches ideal 'Bool'
2176 bool OperandForm::is_ideal_bool() const {
2177   if( _matrule == NULL ) return false;
2178 
2179   return _matrule->is_ideal_bool();
2180 }
2181 
2182 // Require user's name for an sRegX to be stackSlotX
2183 Form::DataType OperandForm::is_user_name_for_sReg() const {
2184   DataType data_type = none;
2185   if( _ident != NULL ) {
2186     if(      strcmp(_ident,"stackSlotI") == 0 ) data_type = Form::idealI;
2187     else if( strcmp(_ident,"stackSlotP") == 0 ) data_type = Form::idealP;
2188     else if( strcmp(_ident,"stackSlotD") == 0 ) data_type = Form::idealD;
2189     else if( strcmp(_ident,"stackSlotF") == 0 ) data_type = Form::idealF;
2190     else if( strcmp(_ident,"stackSlotL") == 0 ) data_type = Form::idealL;
2191   }
2192   assert((data_type == none) || (_matrule == NULL), "No match-rule for stackSlotX");
2193 
2194   return data_type;
2195 }
2196 
2197 
2198 // Return ideal type, if there is a single ideal type for this operand
2199 const char *OperandForm::ideal_type(FormDict &globals, RegisterForm *registers) const {
2200   const char *type = NULL;
2201   if (ideal_only()) type = _ident;
2202   else if( _matrule == NULL ) {
2203     // Check for condition code register
2204     const char *rc_name = constrained_reg_class();
2205     // !!!!!
2206     if (rc_name == NULL) return NULL;
2207     // !!!!! !!!!!
2208     // Check constraints on result's register class
2209     if( registers ) {
2210       RegClass *reg_class  = registers->getRegClass(rc_name);
2211       assert( reg_class != NULL, "Register class is not defined");
2212 
2213       // Check for ideal type of entries in register class, all are the same type
2214       reg_class->reset();
2215       RegDef *reg_def = reg_class->RegDef_iter();
2216       assert( reg_def != NULL, "No entries in register class");
2217       assert( reg_def->_idealtype != NULL, "Did not define ideal type for register");
2218       // Return substring that names the register's ideal type
2219       type = reg_def->_idealtype + 3;
2220       assert( *(reg_def->_idealtype + 0) == 'O', "Expect Op_ prefix");
2221       assert( *(reg_def->_idealtype + 1) == 'p', "Expect Op_ prefix");
2222       assert( *(reg_def->_idealtype + 2) == '_', "Expect Op_ prefix");
2223     }
2224   }
2225   else if( _matrule->_lChild == NULL && _matrule->_rChild == NULL ) {
2226     // This operand matches a single type, at the top level.
2227     // Check for ideal type
2228     type = _matrule->_opType;
2229     if( strcmp(type,"Bool") == 0 )
2230       return "Bool";
2231     // transitive lookup
2232     const Form *frm = globals[type];
2233     OperandForm *op = frm->is_operand();
2234     type = op->ideal_type(globals, registers);
2235   }
2236   return type;
2237 }
2238 
2239 
2240 // If there is a single ideal type for this interface field, return it.
2241 const char *OperandForm::interface_ideal_type(FormDict &globals,
2242                                               const char *field) const {
2243   const char  *ideal_type = NULL;
2244   const char  *value      = NULL;
2245 
2246   // Check if "field" is valid for this operand's interface
2247   if ( ! is_interface_field(field, value) )   return ideal_type;
2248 
2249   // !!!!! !!!!! !!!!!
2250   // If a valid field has a constant value, identify "ConI" or "ConP" or ...
2251 
2252   // Else, lookup type of field's replacement variable
2253 
2254   return ideal_type;
2255 }
2256 
2257 
2258 RegClass* OperandForm::get_RegClass() const {
2259   if (_interface && !_interface->is_RegInterface()) return NULL;
2260   return globalAD->get_registers()->getRegClass(constrained_reg_class());
2261 }
2262 
2263 
2264 bool OperandForm::is_bound_register() const {
2265   RegClass* reg_class = get_RegClass();
2266   if (reg_class == NULL) {
2267     return false;
2268   }
2269 
2270   const char* name = ideal_type(globalAD->globalNames());
2271   if (name == NULL) {
2272     return false;
2273   }
2274 
2275   uint size = 0;
2276   if (strcmp(name, "RegFlags") == 0) size = 1;
2277   if (strcmp(name, "RegI") == 0) size = 1;
2278   if (strcmp(name, "RegF") == 0) size = 1;
2279   if (strcmp(name, "RegD") == 0) size = 2;
2280   if (strcmp(name, "RegL") == 0) size = 2;
2281   if (strcmp(name, "RegN") == 0) size = 1;
2282   if (strcmp(name, "VecX") == 0) size = 4;
2283   if (strcmp(name, "VecY") == 0) size = 8;
2284   if (strcmp(name, "VecZ") == 0) size = 16;
2285   if (strcmp(name, "RegP") == 0) size = globalAD->get_preproc_def("_LP64") ? 2 : 1;
2286   if (size == 0) {
2287     return false;
2288   }
2289   return size == reg_class->size();
2290 }
2291 
2292 
2293 // Check if this is a valid field for this operand,
2294 // Return 'true' if valid, and set the value to the string the user provided.
2295 bool  OperandForm::is_interface_field(const char *field,
2296                                       const char * &value) const {
2297   return false;
2298 }
2299 
2300 
2301 // Return register class name if a constraint specifies the register class.
2302 const char *OperandForm::constrained_reg_class() const {
2303   const char *reg_class  = NULL;
2304   if ( _constraint ) {
2305     // !!!!!
2306     Constraint *constraint = _constraint;
2307     if ( strcmp(_constraint->_func,"ALLOC_IN_RC") == 0 ) {
2308       reg_class = _constraint->_arg;
2309     }
2310   }
2311 
2312   return reg_class;
2313 }
2314 
2315 
2316 // Return the register class associated with 'leaf'.
2317 const char *OperandForm::in_reg_class(uint leaf, FormDict &globals) {
2318   const char *reg_class = NULL; // "RegMask::Empty";
2319 
2320   if((_matrule == NULL) || (_matrule->is_chain_rule(globals))) {
2321     reg_class = constrained_reg_class();
2322     return reg_class;
2323   }
2324   const char *result   = NULL;
2325   const char *name     = NULL;
2326   const char *type     = NULL;
2327   // iterate through all base operands
2328   // until we reach the register that corresponds to "leaf"
2329   // This function is not looking for an ideal type.  It needs the first
2330   // level user type associated with the leaf.
2331   for(uint idx = 0;_matrule->base_operand(idx,globals,result,name,type);++idx) {
2332     const Form *form = (_localNames[name] ? _localNames[name] : globals[result]);
2333     OperandForm *oper = form ? form->is_operand() : NULL;
2334     if( oper ) {
2335       reg_class = oper->constrained_reg_class();
2336       if( reg_class ) {
2337         reg_class = reg_class;
2338       } else {
2339         // ShouldNotReachHere();
2340       }
2341     } else {
2342       // ShouldNotReachHere();
2343     }
2344 
2345     // Increment our target leaf position if current leaf is not a candidate.
2346     if( reg_class == NULL)    ++leaf;
2347     // Exit the loop with the value of reg_class when at the correct index
2348     if( idx == leaf )         break;
2349     // May iterate through all base operands if reg_class for 'leaf' is NULL
2350   }
2351   return reg_class;
2352 }
2353 
2354 
2355 // Recursive call to construct list of top-level operands.
2356 // Implementation does not modify state of internal structures
2357 void OperandForm::build_components() {
2358   if (_matrule)  _matrule->append_components(_localNames, _components);
2359 
2360   // Add parameters that "do not appear in match rule".
2361   const char *name;
2362   for (_parameters.reset(); (name = _parameters.iter()) != NULL;) {
2363     OpClassForm *opForm = _localNames[name]->is_opclass();
2364     assert(opForm != NULL, "sanity");
2365 
2366     if ( _components.operand_position(name) == -1 ) {
2367       _components.insert(name, opForm->_ident, Component::INVALID, false);
2368     }
2369   }
2370 
2371   return;
2372 }
2373 
2374 int OperandForm::operand_position(const char *name, int usedef) {
2375   return _components.operand_position(name, usedef, this);
2376 }
2377 
2378 
2379 // Return zero-based position in component list, only counting constants;
2380 // Return -1 if not in list.
2381 int OperandForm::constant_position(FormDict &globals, const Component *last) {
2382   // Iterate through components and count constants preceding 'constant'
2383   int position = 0;
2384   Component *comp;
2385   _components.reset();
2386   while( (comp = _components.iter()) != NULL  && (comp != last) ) {
2387     // Special case for operands that take a single user-defined operand
2388     // Skip the initial definition in the component list.
2389     if( strcmp(comp->_name,this->_ident) == 0 ) continue;
2390 
2391     const char *type = comp->_type;
2392     // Lookup operand form for replacement variable's type
2393     const Form *form = globals[type];
2394     assert( form != NULL, "Component's type not found");
2395     OperandForm *oper = form ? form->is_operand() : NULL;
2396     if( oper ) {
2397       if( oper->_matrule->is_base_constant(globals) != Form::none ) {
2398         ++position;
2399       }
2400     }
2401   }
2402 
2403   // Check for being passed a component that was not in the list
2404   if( comp != last )  position = -1;
2405 
2406   return position;
2407 }
2408 // Provide position of constant by "name"
2409 int OperandForm::constant_position(FormDict &globals, const char *name) {
2410   const Component *comp = _components.search(name);
2411   int idx = constant_position( globals, comp );
2412 
2413   return idx;
2414 }
2415 
2416 
2417 // Return zero-based position in component list, only counting constants;
2418 // Return -1 if not in list.
2419 int OperandForm::register_position(FormDict &globals, const char *reg_name) {
2420   // Iterate through components and count registers preceding 'last'
2421   uint  position = 0;
2422   Component *comp;
2423   _components.reset();
2424   while( (comp = _components.iter()) != NULL
2425          && (strcmp(comp->_name,reg_name) != 0) ) {
2426     // Special case for operands that take a single user-defined operand
2427     // Skip the initial definition in the component list.
2428     if( strcmp(comp->_name,this->_ident) == 0 ) continue;
2429 
2430     const char *type = comp->_type;
2431     // Lookup operand form for component's type
2432     const Form *form = globals[type];
2433     assert( form != NULL, "Component's type not found");
2434     OperandForm *oper = form ? form->is_operand() : NULL;
2435     if( oper ) {
2436       if( oper->_matrule->is_base_register(globals) ) {
2437         ++position;
2438       }
2439     }
2440   }
2441 
2442   return position;
2443 }
2444 
2445 
2446 const char *OperandForm::reduce_result()  const {
2447   return _ident;
2448 }
2449 // Return the name of the operand on the right hand side of the binary match
2450 // Return NULL if there is no right hand side
2451 const char *OperandForm::reduce_right(FormDict &globals)  const {
2452   return  ( _matrule ? _matrule->reduce_right(globals) : NULL );
2453 }
2454 
2455 // Similar for left
2456 const char *OperandForm::reduce_left(FormDict &globals)   const {
2457   return  ( _matrule ? _matrule->reduce_left(globals) : NULL );
2458 }
2459 
2460 
2461 // --------------------------- FILE *output_routines
2462 //
2463 // Output code for disp_is_oop, if true.
2464 void OperandForm::disp_is_oop(FILE *fp, FormDict &globals) {
2465   //  Check it is a memory interface with a non-user-constant disp field
2466   if ( this->_interface == NULL ) return;
2467   MemInterface *mem_interface = this->_interface->is_MemInterface();
2468   if ( mem_interface == NULL )    return;
2469   const char   *disp  = mem_interface->_disp;
2470   if ( *disp != '$' )             return;
2471 
2472   // Lookup replacement variable in operand's component list
2473   const char   *rep_var = disp + 1;
2474   const Component *comp = this->_components.search(rep_var);
2475   assert( comp != NULL, "Replacement variable not found in components");
2476   // Lookup operand form for replacement variable's type
2477   const char      *type = comp->_type;
2478   Form            *form = (Form*)globals[type];
2479   assert( form != NULL, "Replacement variable's type not found");
2480   OperandForm     *op   = form->is_operand();
2481   assert( op, "Memory Interface 'disp' can only emit an operand form");
2482   // Check if this is a ConP, which may require relocation
2483   if ( op->is_base_constant(globals) == Form::idealP ) {
2484     // Find the constant's index:  _c0, _c1, _c2, ... , _cN
2485     uint idx  = op->constant_position( globals, rep_var);
2486     fprintf(fp,"  virtual relocInfo::relocType disp_reloc() const {");
2487     fprintf(fp,  "  return _c%d->reloc();", idx);
2488     fprintf(fp, " }\n");
2489   }
2490 }
2491 
2492 // Generate code for internal and external format methods
2493 //
2494 // internal access to reg# node->_idx
2495 // access to subsumed constant _c0, _c1,
2496 void  OperandForm::int_format(FILE *fp, FormDict &globals, uint index) {
2497   Form::DataType dtype;
2498   if (_matrule && (_matrule->is_base_register(globals) ||
2499                    strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
2500     // !!!!! !!!!!
2501     fprintf(fp,"  { char reg_str[128];\n");
2502     fprintf(fp,"    ra->dump_register(node,reg_str);\n");
2503     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2504     fprintf(fp,"  }\n");
2505   } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
2506     format_constant( fp, index, dtype );
2507   } else if (ideal_to_sReg_type(_ident) != Form::none) {
2508     // Special format for Stack Slot Register
2509     fprintf(fp,"  { char reg_str[128];\n");
2510     fprintf(fp,"    ra->dump_register(node,reg_str);\n");
2511     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2512     fprintf(fp,"  }\n");
2513   } else {
2514     fprintf(fp,"  st->print(\"No format defined for %s\n\");\n", _ident);
2515     fflush(fp);
2516     fprintf(stderr,"No format defined for %s\n", _ident);
2517     dump();
2518     assert( false,"Internal error:\n  output_internal_operand() attempting to output other than a Register or Constant");
2519   }
2520 }
2521 
2522 // Similar to "int_format" but for cases where data is external to operand
2523 // external access to reg# node->in(idx)->_idx,
2524 void  OperandForm::ext_format(FILE *fp, FormDict &globals, uint index) {
2525   Form::DataType dtype;
2526   if (_matrule && (_matrule->is_base_register(globals) ||
2527                    strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
2528     fprintf(fp,"  { char reg_str[128];\n");
2529     fprintf(fp,"    ra->dump_register(node->in(idx");
2530     if ( index != 0 ) fprintf(fp,              "+%d",index);
2531     fprintf(fp,                                      "),reg_str);\n");
2532     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2533     fprintf(fp,"  }\n");
2534   } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
2535     format_constant( fp, index, dtype );
2536   } else if (ideal_to_sReg_type(_ident) != Form::none) {
2537     // Special format for Stack Slot Register
2538     fprintf(fp,"  { char reg_str[128];\n");
2539     fprintf(fp,"    ra->dump_register(node->in(idx");
2540     if ( index != 0 ) fprintf(fp,                  "+%d",index);
2541     fprintf(fp,                                       "),reg_str);\n");
2542     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2543     fprintf(fp,"  }\n");
2544   } else {
2545     fprintf(fp,"  st->print(\"No format defined for %s\n\");\n", _ident);
2546     assert( false,"Internal error:\n  output_external_operand() attempting to output other than a Register or Constant");
2547   }
2548 }
2549 
2550 void OperandForm::format_constant(FILE *fp, uint const_index, uint const_type) {
2551   switch(const_type) {
2552   case Form::idealI: fprintf(fp,"  st->print(\"#%%d\", _c%d);\n", const_index); break;
2553   case Form::idealP: fprintf(fp,"  if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break;
2554   case Form::idealNKlass:
2555   case Form::idealN: fprintf(fp,"  if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break;
2556   case Form::idealL: fprintf(fp,"  st->print(\"#\" INT64_FORMAT, (int64_t)_c%d);\n", const_index); break;
2557   case Form::idealF: fprintf(fp,"  st->print(\"#%%f\", _c%d);\n", const_index); break;
2558   case Form::idealD: fprintf(fp,"  st->print(\"#%%f\", _c%d);\n", const_index); break;
2559   default:
2560     assert( false, "ShouldNotReachHere()");
2561   }
2562 }
2563 
2564 // Return the operand form corresponding to the given index, else NULL.
2565 OperandForm *OperandForm::constant_operand(FormDict &globals,
2566                                            uint      index) {
2567   // !!!!!
2568   // Check behavior on complex operands
2569   uint n_consts = num_consts(globals);
2570   if( n_consts > 0 ) {
2571     uint i = 0;
2572     const char *type;
2573     Component  *comp;
2574     _components.reset();
2575     if ((comp = _components.iter()) == NULL) {
2576       assert(n_consts == 1, "Bad component list detected.\n");
2577       // Current operand is THE operand
2578       if ( index == 0 ) {
2579         return this;
2580       }
2581     } // end if NULL
2582     else {
2583       // Skip the first component, it can not be a DEF of a constant
2584       do {
2585         type = comp->base_type(globals);
2586         // Check that "type" is a 'ConI', 'ConP', ...
2587         if ( ideal_to_const_type(type) != Form::none ) {
2588           // When at correct component, get corresponding Operand
2589           if ( index == 0 ) {
2590             return globals[comp->_type]->is_operand();
2591           }
2592           // Decrement number of constants to go
2593           --index;
2594         }
2595       } while((comp = _components.iter()) != NULL);
2596     }
2597   }
2598 
2599   // Did not find a constant for this index.
2600   return NULL;
2601 }
2602 
2603 // If this operand has a single ideal type, return its type
2604 Form::DataType OperandForm::simple_type(FormDict &globals) const {
2605   const char *type_name = ideal_type(globals);
2606   Form::DataType type   = type_name ? ideal_to_const_type( type_name )
2607                                     : Form::none;
2608   return type;
2609 }
2610 
2611 Form::DataType OperandForm::is_base_constant(FormDict &globals) const {
2612   if ( _matrule == NULL )    return Form::none;
2613 
2614   return _matrule->is_base_constant(globals);
2615 }
2616 
2617 // "true" if this operand is a simple type that is swallowed
2618 bool  OperandForm::swallowed(FormDict &globals) const {
2619   Form::DataType type   = simple_type(globals);
2620   if( type != Form::none ) {
2621     return true;
2622   }
2623 
2624   return false;
2625 }
2626 
2627 // Output code to access the value of the index'th constant
2628 void OperandForm::access_constant(FILE *fp, FormDict &globals,
2629                                   uint const_index) {
2630   OperandForm *oper = constant_operand(globals, const_index);
2631   assert( oper, "Index exceeds number of constants in operand");
2632   Form::DataType dtype = oper->is_base_constant(globals);
2633 
2634   switch(dtype) {
2635   case idealI: fprintf(fp,"_c%d",           const_index); break;
2636   case idealP: fprintf(fp,"_c%d->get_con()",const_index); break;
2637   case idealL: fprintf(fp,"_c%d",           const_index); break;
2638   case idealF: fprintf(fp,"_c%d",           const_index); break;
2639   case idealD: fprintf(fp,"_c%d",           const_index); break;
2640   default:
2641     assert( false, "ShouldNotReachHere()");
2642   }
2643 }
2644 
2645 
2646 void OperandForm::dump() {
2647   output(stderr);
2648 }
2649 
2650 void OperandForm::output(FILE *fp) {
2651   fprintf(fp,"\nOperand: %s\n", (_ident?_ident:""));
2652   if (_matrule)    _matrule->dump();
2653   if (_interface)  _interface->dump();
2654   if (_attribs)    _attribs->dump();
2655   if (_predicate)  _predicate->dump();
2656   if (_constraint) _constraint->dump();
2657   if (_construct)  _construct->dump();
2658   if (_format)     _format->dump();
2659 }
2660 
2661 //------------------------------Constraint-------------------------------------
2662 Constraint::Constraint(const char *func, const char *arg)
2663   : _func(func), _arg(arg) {
2664 }
2665 Constraint::~Constraint() { /* not owner of char* */
2666 }
2667 
2668 bool Constraint::stack_slots_only() const {
2669   return strcmp(_func, "ALLOC_IN_RC") == 0
2670       && strcmp(_arg,  "stack_slots") == 0;
2671 }
2672 
2673 void Constraint::dump() {
2674   output(stderr);
2675 }
2676 
2677 void Constraint::output(FILE *fp) {           // Write info to output files
2678   assert((_func != NULL && _arg != NULL),"missing constraint function or arg");
2679   fprintf(fp,"Constraint: %s ( %s )\n", _func, _arg);
2680 }
2681 
2682 //------------------------------Predicate--------------------------------------
2683 Predicate::Predicate(char *pr)
2684   : _pred(pr) {
2685 }
2686 Predicate::~Predicate() {
2687 }
2688 
2689 void Predicate::dump() {
2690   output(stderr);
2691 }
2692 
2693 void Predicate::output(FILE *fp) {
2694   fprintf(fp,"Predicate");  // Write to output files
2695 }
2696 //------------------------------Interface--------------------------------------
2697 Interface::Interface(const char *name) : _name(name) {
2698 }
2699 Interface::~Interface() {
2700 }
2701 
2702 Form::InterfaceType Interface::interface_type(FormDict &globals) const {
2703   Interface *thsi = (Interface*)this;
2704   if ( thsi->is_RegInterface()   ) return Form::register_interface;
2705   if ( thsi->is_MemInterface()   ) return Form::memory_interface;
2706   if ( thsi->is_ConstInterface() ) return Form::constant_interface;
2707   if ( thsi->is_CondInterface()  ) return Form::conditional_interface;
2708 
2709   return Form::no_interface;
2710 }
2711 
2712 RegInterface   *Interface::is_RegInterface() {
2713   if ( strcmp(_name,"REG_INTER") != 0 )
2714     return NULL;
2715   return (RegInterface*)this;
2716 }
2717 MemInterface   *Interface::is_MemInterface() {
2718   if ( strcmp(_name,"MEMORY_INTER") != 0 )  return NULL;
2719   return (MemInterface*)this;
2720 }
2721 ConstInterface *Interface::is_ConstInterface() {
2722   if ( strcmp(_name,"CONST_INTER") != 0 )  return NULL;
2723   return (ConstInterface*)this;
2724 }
2725 CondInterface  *Interface::is_CondInterface() {
2726   if ( strcmp(_name,"COND_INTER") != 0 )  return NULL;
2727   return (CondInterface*)this;
2728 }
2729 
2730 
2731 void Interface::dump() {
2732   output(stderr);
2733 }
2734 
2735 // Write info to output files
2736 void Interface::output(FILE *fp) {
2737   fprintf(fp,"Interface: %s\n", (_name ? _name : "") );
2738 }
2739 
2740 //------------------------------RegInterface-----------------------------------
2741 RegInterface::RegInterface() : Interface("REG_INTER") {
2742 }
2743 RegInterface::~RegInterface() {
2744 }
2745 
2746 void RegInterface::dump() {
2747   output(stderr);
2748 }
2749 
2750 // Write info to output files
2751 void RegInterface::output(FILE *fp) {
2752   Interface::output(fp);
2753 }
2754 
2755 //------------------------------ConstInterface---------------------------------
2756 ConstInterface::ConstInterface() : Interface("CONST_INTER") {
2757 }
2758 ConstInterface::~ConstInterface() {
2759 }
2760 
2761 void ConstInterface::dump() {
2762   output(stderr);
2763 }
2764 
2765 // Write info to output files
2766 void ConstInterface::output(FILE *fp) {
2767   Interface::output(fp);
2768 }
2769 
2770 //------------------------------MemInterface-----------------------------------
2771 MemInterface::MemInterface(char *base, char *index, char *scale, char *disp)
2772   : Interface("MEMORY_INTER"), _base(base), _index(index), _scale(scale), _disp(disp) {
2773 }
2774 MemInterface::~MemInterface() {
2775   // not owner of any character arrays
2776 }
2777 
2778 void MemInterface::dump() {
2779   output(stderr);
2780 }
2781 
2782 // Write info to output files
2783 void MemInterface::output(FILE *fp) {
2784   Interface::output(fp);
2785   if ( _base  != NULL ) fprintf(fp,"  base  == %s\n", _base);
2786   if ( _index != NULL ) fprintf(fp,"  index == %s\n", _index);
2787   if ( _scale != NULL ) fprintf(fp,"  scale == %s\n", _scale);
2788   if ( _disp  != NULL ) fprintf(fp,"  disp  == %s\n", _disp);
2789   // fprintf(fp,"\n");
2790 }
2791 
2792 //------------------------------CondInterface----------------------------------
2793 CondInterface::CondInterface(const char* equal,         const char* equal_format,
2794                              const char* not_equal,     const char* not_equal_format,
2795                              const char* less,          const char* less_format,
2796                              const char* greater_equal, const char* greater_equal_format,
2797                              const char* less_equal,    const char* less_equal_format,
2798                              const char* greater,       const char* greater_format,
2799                              const char* overflow,      const char* overflow_format,
2800                              const char* no_overflow,   const char* no_overflow_format)
2801   : Interface("COND_INTER"),
2802     _equal(equal),                 _equal_format(equal_format),
2803     _not_equal(not_equal),         _not_equal_format(not_equal_format),
2804     _less(less),                   _less_format(less_format),
2805     _greater_equal(greater_equal), _greater_equal_format(greater_equal_format),
2806     _less_equal(less_equal),       _less_equal_format(less_equal_format),
2807     _greater(greater),             _greater_format(greater_format),
2808     _overflow(overflow),           _overflow_format(overflow_format),
2809     _no_overflow(no_overflow),     _no_overflow_format(no_overflow_format) {
2810 }
2811 CondInterface::~CondInterface() {
2812   // not owner of any character arrays
2813 }
2814 
2815 void CondInterface::dump() {
2816   output(stderr);
2817 }
2818 
2819 // Write info to output files
2820 void CondInterface::output(FILE *fp) {
2821   Interface::output(fp);
2822   if ( _equal  != NULL )     fprintf(fp," equal        == %s\n", _equal);
2823   if ( _not_equal  != NULL ) fprintf(fp," not_equal    == %s\n", _not_equal);
2824   if ( _less  != NULL )      fprintf(fp," less         == %s\n", _less);
2825   if ( _greater_equal  != NULL ) fprintf(fp," greater_equal    == %s\n", _greater_equal);
2826   if ( _less_equal  != NULL ) fprintf(fp," less_equal   == %s\n", _less_equal);
2827   if ( _greater  != NULL )    fprintf(fp," greater      == %s\n", _greater);
2828   if ( _overflow != NULL )    fprintf(fp," overflow     == %s\n", _overflow);
2829   if ( _no_overflow != NULL ) fprintf(fp," no_overflow  == %s\n", _no_overflow);
2830   // fprintf(fp,"\n");
2831 }
2832 
2833 //------------------------------ConstructRule----------------------------------
2834 ConstructRule::ConstructRule(char *cnstr)
2835   : _construct(cnstr) {
2836 }
2837 ConstructRule::~ConstructRule() {
2838 }
2839 
2840 void ConstructRule::dump() {
2841   output(stderr);
2842 }
2843 
2844 void ConstructRule::output(FILE *fp) {
2845   fprintf(fp,"\nConstruct Rule\n");  // Write to output files
2846 }
2847 
2848 
2849 //==============================Shared Forms===================================
2850 //------------------------------AttributeForm----------------------------------
2851 int         AttributeForm::_insId   = 0;           // start counter at 0
2852 int         AttributeForm::_opId    = 0;           // start counter at 0
2853 const char* AttributeForm::_ins_cost = "ins_cost"; // required name
2854 const char* AttributeForm::_op_cost  = "op_cost";  // required name
2855 
2856 AttributeForm::AttributeForm(char *attr, int type, char *attrdef)
2857   : Form(Form::ATTR), _attrname(attr), _atype(type), _attrdef(attrdef) {
2858     if (type==OP_ATTR) {
2859       id = ++_opId;
2860     }
2861     else if (type==INS_ATTR) {
2862       id = ++_insId;
2863     }
2864     else assert( false,"");
2865 }
2866 AttributeForm::~AttributeForm() {
2867 }
2868 
2869 // Dynamic type check
2870 AttributeForm *AttributeForm::is_attribute() const {
2871   return (AttributeForm*)this;
2872 }
2873 
2874 
2875 // inlined  // int  AttributeForm::type() { return id;}
2876 
2877 void AttributeForm::dump() {
2878   output(stderr);
2879 }
2880 
2881 void AttributeForm::output(FILE *fp) {
2882   if( _attrname && _attrdef ) {
2883     fprintf(fp,"\n// AttributeForm \nstatic const int %s = %s;\n",
2884             _attrname, _attrdef);
2885   }
2886   else {
2887     fprintf(fp,"\n// AttributeForm missing name %s or definition %s\n",
2888             (_attrname?_attrname:""), (_attrdef?_attrdef:"") );
2889   }
2890 }
2891 
2892 //------------------------------Component--------------------------------------
2893 Component::Component(const char *name, const char *type, int usedef)
2894   : _name(name), _type(type), _usedef(usedef) {
2895     _ftype = Form::COMP;
2896 }
2897 Component::~Component() {
2898 }
2899 
2900 // True if this component is equal to the parameter.
2901 bool Component::is(int use_def_kill_enum) const {
2902   return (_usedef == use_def_kill_enum ? true : false);
2903 }
2904 // True if this component is used/def'd/kill'd as the parameter suggests.
2905 bool Component::isa(int use_def_kill_enum) const {
2906   return (_usedef & use_def_kill_enum) == use_def_kill_enum;
2907 }
2908 
2909 // Extend this component with additional use/def/kill behavior
2910 int Component::promote_use_def_info(int new_use_def) {
2911   _usedef |= new_use_def;
2912 
2913   return _usedef;
2914 }
2915 
2916 // Check the base type of this component, if it has one
2917 const char *Component::base_type(FormDict &globals) {
2918   const Form *frm = globals[_type];
2919   if (frm == NULL) return NULL;
2920   OperandForm *op = frm->is_operand();
2921   if (op == NULL) return NULL;
2922   if (op->ideal_only()) return op->_ident;
2923   return (char *)op->ideal_type(globals);
2924 }
2925 
2926 void Component::dump() {
2927   output(stderr);
2928 }
2929 
2930 void Component::output(FILE *fp) {
2931   fprintf(fp,"Component:");  // Write to output files
2932   fprintf(fp, "  name = %s", _name);
2933   fprintf(fp, ", type = %s", _type);
2934   assert(_usedef != 0, "unknown effect");
2935   fprintf(fp, ", use/def = %s\n", getUsedefName());
2936 }
2937 
2938 
2939 //------------------------------ComponentList---------------------------------
2940 ComponentList::ComponentList() : NameList(), _matchcnt(0) {
2941 }
2942 ComponentList::~ComponentList() {
2943   // // This list may not own its elements if copied via assignment
2944   // Component *component;
2945   // for (reset(); (component = iter()) != NULL;) {
2946   //   delete component;
2947   // }
2948 }
2949 
2950 void   ComponentList::insert(Component *component, bool mflag) {
2951   NameList::addName((char *)component);
2952   if(mflag) _matchcnt++;
2953 }
2954 void   ComponentList::insert(const char *name, const char *opType, int usedef,
2955                              bool mflag) {
2956   Component * component = new Component(name, opType, usedef);
2957   insert(component, mflag);
2958 }
2959 Component *ComponentList::current() { return (Component*)NameList::current(); }
2960 Component *ComponentList::iter()    { return (Component*)NameList::iter(); }
2961 Component *ComponentList::match_iter() {
2962   if(_iter < _matchcnt) return (Component*)NameList::iter();
2963   return NULL;
2964 }
2965 Component *ComponentList::post_match_iter() {
2966   Component *comp = iter();
2967   // At end of list?
2968   if ( comp == NULL ) {
2969     return comp;
2970   }
2971   // In post-match components?
2972   if (_iter > match_count()-1) {
2973     return comp;
2974   }
2975 
2976   return post_match_iter();
2977 }
2978 
2979 void       ComponentList::reset()   { NameList::reset(); }
2980 int        ComponentList::count()   { return NameList::count(); }
2981 
2982 Component *ComponentList::operator[](int position) {
2983   // Shortcut complete iteration if there are not enough entries
2984   if (position >= count()) return NULL;
2985 
2986   int        index     = 0;
2987   Component *component = NULL;
2988   for (reset(); (component = iter()) != NULL;) {
2989     if (index == position) {
2990       return component;
2991     }
2992     ++index;
2993   }
2994 
2995   return NULL;
2996 }
2997 
2998 const Component *ComponentList::search(const char *name) {
2999   PreserveIter pi(this);
3000   reset();
3001   for( Component *comp = NULL; ((comp = iter()) != NULL); ) {
3002     if( strcmp(comp->_name,name) == 0 ) return comp;
3003   }
3004 
3005   return NULL;
3006 }
3007 
3008 // Return number of USEs + number of DEFs
3009 // When there are no components, or the first component is a USE,
3010 // then we add '1' to hold a space for the 'result' operand.
3011 int ComponentList::num_operands() {
3012   PreserveIter pi(this);
3013   uint       count = 1;           // result operand
3014   uint       position = 0;
3015 
3016   Component *component  = NULL;
3017   for( reset(); (component = iter()) != NULL; ++position ) {
3018     if( component->isa(Component::USE) ||
3019         ( position == 0 && (! component->isa(Component::DEF))) ) {
3020       ++count;
3021     }
3022   }
3023 
3024   return count;
3025 }
3026 
3027 // Return zero-based position of operand 'name' in list;  -1 if not in list.
3028 // if parameter 'usedef' is ::USE, it will match USE, USE_DEF, ...
3029 int ComponentList::operand_position(const char *name, int usedef, Form *fm) {
3030   PreserveIter pi(this);
3031   int position = 0;
3032   int num_opnds = num_operands();
3033   Component *component;
3034   Component* preceding_non_use = NULL;
3035   Component* first_def = NULL;
3036   for (reset(); (component = iter()) != NULL; ++position) {
3037     // When the first component is not a DEF,
3038     // leave space for the result operand!
3039     if ( position==0 && (! component->isa(Component::DEF)) ) {
3040       ++position;
3041       ++num_opnds;
3042     }
3043     if (strcmp(name, component->_name)==0 && (component->isa(usedef))) {
3044       // When the first entry in the component list is a DEF and a USE
3045       // Treat them as being separate, a DEF first, then a USE
3046       if( position==0
3047           && usedef==Component::USE && component->isa(Component::DEF) ) {
3048         assert(position+1 < num_opnds, "advertised index in bounds");
3049         return position+1;
3050       } else {
3051         if( preceding_non_use && strcmp(component->_name, preceding_non_use->_name) ) {
3052           fprintf(stderr, "the name '%s(%s)' should not precede the name '%s(%s)'",
3053                   preceding_non_use->_name, preceding_non_use->getUsedefName(),
3054                   name, component->getUsedefName());
3055           if (fm && fm->is_instruction()) fprintf(stderr,  "in form '%s'", fm->is_instruction()->_ident);
3056           if (fm && fm->is_operand()) fprintf(stderr,  "in form '%s'", fm->is_operand()->_ident);
3057           fprintf(stderr,  "\n");
3058         }
3059         if( position >= num_opnds ) {
3060           fprintf(stderr, "the name '%s' is too late in its name list", name);
3061           if (fm && fm->is_instruction()) fprintf(stderr,  "in form '%s'", fm->is_instruction()->_ident);
3062           if (fm && fm->is_operand()) fprintf(stderr,  "in form '%s'", fm->is_operand()->_ident);
3063           fprintf(stderr,  "\n");
3064         }
3065         assert(position < num_opnds, "advertised index in bounds");
3066         return position;
3067       }
3068     }
3069     if( component->isa(Component::DEF)
3070         && component->isa(Component::USE) ) {
3071       ++position;
3072       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3073     }
3074     if( component->isa(Component::DEF) && !first_def ) {
3075       first_def = component;
3076     }
3077     if( !component->isa(Component::USE) && component != first_def ) {
3078       preceding_non_use = component;
3079     } else if( preceding_non_use && !strcmp(component->_name, preceding_non_use->_name) ) {
3080       preceding_non_use = NULL;
3081     }
3082   }
3083   return Not_in_list;
3084 }
3085 
3086 // Find position for this name, regardless of use/def information
3087 int ComponentList::operand_position(const char *name) {
3088   PreserveIter pi(this);
3089   int position = 0;
3090   Component *component;
3091   for (reset(); (component = iter()) != NULL; ++position) {
3092     // When the first component is not a DEF,
3093     // leave space for the result operand!
3094     if ( position==0 && (! component->isa(Component::DEF)) ) {
3095       ++position;
3096     }
3097     if (strcmp(name, component->_name)==0) {
3098       return position;
3099     }
3100     if( component->isa(Component::DEF)
3101         && component->isa(Component::USE) ) {
3102       ++position;
3103       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3104     }
3105   }
3106   return Not_in_list;
3107 }
3108 
3109 int ComponentList::operand_position_format(const char *name, Form *fm) {
3110   PreserveIter pi(this);
3111   int  first_position = operand_position(name);
3112   int  use_position   = operand_position(name, Component::USE, fm);
3113 
3114   return ((first_position < use_position) ? use_position : first_position);
3115 }
3116 
3117 int ComponentList::label_position() {
3118   PreserveIter pi(this);
3119   int position = 0;
3120   reset();
3121   for( Component *comp; (comp = iter()) != NULL; ++position) {
3122     // When the first component is not a DEF,
3123     // leave space for the result operand!
3124     if ( position==0 && (! comp->isa(Component::DEF)) ) {
3125       ++position;
3126     }
3127     if (strcmp(comp->_type, "label")==0) {
3128       return position;
3129     }
3130     if( comp->isa(Component::DEF)
3131         && comp->isa(Component::USE) ) {
3132       ++position;
3133       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3134     }
3135   }
3136 
3137   return -1;
3138 }
3139 
3140 int ComponentList::method_position() {
3141   PreserveIter pi(this);
3142   int position = 0;
3143   reset();
3144   for( Component *comp; (comp = iter()) != NULL; ++position) {
3145     // When the first component is not a DEF,
3146     // leave space for the result operand!
3147     if ( position==0 && (! comp->isa(Component::DEF)) ) {
3148       ++position;
3149     }
3150     if (strcmp(comp->_type, "method")==0) {
3151       return position;
3152     }
3153     if( comp->isa(Component::DEF)
3154         && comp->isa(Component::USE) ) {
3155       ++position;
3156       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3157     }
3158   }
3159 
3160   return -1;
3161 }
3162 
3163 void ComponentList::dump() { output(stderr); }
3164 
3165 void ComponentList::output(FILE *fp) {
3166   PreserveIter pi(this);
3167   fprintf(fp, "\n");
3168   Component *component;
3169   for (reset(); (component = iter()) != NULL;) {
3170     component->output(fp);
3171   }
3172   fprintf(fp, "\n");
3173 }
3174 
3175 //------------------------------MatchNode--------------------------------------
3176 MatchNode::MatchNode(ArchDesc &ad, const char *result, const char *mexpr,
3177                      const char *opType, MatchNode *lChild, MatchNode *rChild)
3178   : _AD(ad), _result(result), _name(mexpr), _opType(opType),
3179     _lChild(lChild), _rChild(rChild), _internalop(0), _numleaves(0),
3180     _commutative_id(0) {
3181   _numleaves = (lChild ? lChild->_numleaves : 0)
3182                + (rChild ? rChild->_numleaves : 0);
3183 }
3184 
3185 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode)
3186   : _AD(ad), _result(mnode._result), _name(mnode._name),
3187     _opType(mnode._opType), _lChild(mnode._lChild), _rChild(mnode._rChild),
3188     _internalop(0), _numleaves(mnode._numleaves),
3189     _commutative_id(mnode._commutative_id) {
3190 }
3191 
3192 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode, int clone)
3193   : _AD(ad), _result(mnode._result), _name(mnode._name),
3194     _opType(mnode._opType),
3195     _internalop(0), _numleaves(mnode._numleaves),
3196     _commutative_id(mnode._commutative_id) {
3197   if (mnode._lChild) {
3198     _lChild = new MatchNode(ad, *mnode._lChild, clone);
3199   } else {
3200     _lChild = NULL;
3201   }
3202   if (mnode._rChild) {
3203     _rChild = new MatchNode(ad, *mnode._rChild, clone);
3204   } else {
3205     _rChild = NULL;
3206   }
3207 }
3208 
3209 MatchNode::~MatchNode() {
3210   // // This node may not own its children if copied via assignment
3211   // if( _lChild ) delete _lChild;
3212   // if( _rChild ) delete _rChild;
3213 }
3214 
3215 bool  MatchNode::find_type(const char *type, int &position) const {
3216   if ( (_lChild != NULL) && (_lChild->find_type(type, position)) ) return true;
3217   if ( (_rChild != NULL) && (_rChild->find_type(type, position)) ) return true;
3218 
3219   if (strcmp(type,_opType)==0)  {
3220     return true;
3221   } else {
3222     ++position;
3223   }
3224   return false;
3225 }
3226 
3227 // Recursive call collecting info on top-level operands, not transitive.
3228 // Implementation does not modify state of internal structures.
3229 void MatchNode::append_components(FormDict& locals, ComponentList& components,
3230                                   bool def_flag) const {
3231   int usedef = def_flag ? Component::DEF : Component::USE;
3232   FormDict &globals = _AD.globalNames();
3233 
3234   assert (_name != NULL, "MatchNode::build_components encountered empty node\n");
3235   // Base case
3236   if (_lChild==NULL && _rChild==NULL) {
3237     // If _opType is not an operation, do not build a component for it #####
3238     const Form *f = globals[_opType];
3239     if( f != NULL ) {
3240       // Add non-ideals that are operands, operand-classes,
3241       if( ! f->ideal_only()
3242           && (f->is_opclass() || f->is_operand()) ) {
3243         components.insert(_name, _opType, usedef, true);
3244       }
3245     }
3246     return;
3247   }
3248   // Promote results of "Set" to DEF
3249   bool tmpdef_flag = (!strcmp(_opType, "Set")) ? true : false;
3250   if (_lChild) _lChild->append_components(locals, components, tmpdef_flag);
3251   tmpdef_flag = false;   // only applies to component immediately following 'Set'
3252   if (_rChild) _rChild->append_components(locals, components, tmpdef_flag);
3253 }
3254 
3255 // Find the n'th base-operand in the match node,
3256 // recursively investigates match rules of user-defined operands.
3257 //
3258 // Implementation does not modify state of internal structures since they
3259 // can be shared.
3260 bool MatchNode::base_operand(uint &position, FormDict &globals,
3261                              const char * &result, const char * &name,
3262                              const char * &opType) const {
3263   assert (_name != NULL, "MatchNode::base_operand encountered empty node\n");
3264   // Base case
3265   if (_lChild==NULL && _rChild==NULL) {
3266     // Check for special case: "Universe", "label"
3267     if (strcmp(_opType,"Universe") == 0 || strcmp(_opType,"label")==0 ) {
3268       if (position == 0) {
3269         result = _result;
3270         name   = _name;
3271         opType = _opType;
3272         return 1;
3273       } else {
3274         -- position;
3275         return 0;
3276       }
3277     }
3278 
3279     const Form *form = globals[_opType];
3280     MatchNode *matchNode = NULL;
3281     // Check for user-defined type
3282     if (form) {
3283       // User operand or instruction?
3284       OperandForm  *opForm = form->is_operand();
3285       InstructForm *inForm = form->is_instruction();
3286       if ( opForm ) {
3287         matchNode = (MatchNode*)opForm->_matrule;
3288       } else if ( inForm ) {
3289         matchNode = (MatchNode*)inForm->_matrule;
3290       }
3291     }
3292     // if this is user-defined, recurse on match rule
3293     // User-defined operand and instruction forms have a match-rule.
3294     if (matchNode) {
3295       return (matchNode->base_operand(position,globals,result,name,opType));
3296     } else {
3297       // Either not a form, or a system-defined form (no match rule).
3298       if (position==0) {
3299         result = _result;
3300         name   = _name;
3301         opType = _opType;
3302         return 1;
3303       } else {
3304         --position;
3305         return 0;
3306       }
3307     }
3308 
3309   } else {
3310     // Examine the left child and right child as well
3311     if (_lChild) {
3312       if (_lChild->base_operand(position, globals, result, name, opType))
3313         return 1;
3314     }
3315 
3316     if (_rChild) {
3317       if (_rChild->base_operand(position, globals, result, name, opType))
3318         return 1;
3319     }
3320   }
3321 
3322   return 0;
3323 }
3324 
3325 // Recursive call on all operands' match rules in my match rule.
3326 uint  MatchNode::num_consts(FormDict &globals) const {
3327   uint        index      = 0;
3328   uint        num_consts = 0;
3329   const char *result;
3330   const char *name;
3331   const char *opType;
3332 
3333   for (uint position = index;
3334        base_operand(position,globals,result,name,opType); position = index) {
3335     ++index;
3336     if( ideal_to_const_type(opType) )        num_consts++;
3337   }
3338 
3339   return num_consts;
3340 }
3341 
3342 // Recursive call on all operands' match rules in my match rule.
3343 // Constants in match rule subtree with specified type
3344 uint  MatchNode::num_consts(FormDict &globals, Form::DataType type) const {
3345   uint        index      = 0;
3346   uint        num_consts = 0;
3347   const char *result;
3348   const char *name;
3349   const char *opType;
3350 
3351   for (uint position = index;
3352        base_operand(position,globals,result,name,opType); position = index) {
3353     ++index;
3354     if( ideal_to_const_type(opType) == type ) num_consts++;
3355   }
3356 
3357   return num_consts;
3358 }
3359 
3360 // Recursive call on all operands' match rules in my match rule.
3361 uint  MatchNode::num_const_ptrs(FormDict &globals) const {
3362   return  num_consts( globals, Form::idealP );
3363 }
3364 
3365 bool  MatchNode::sets_result() const {
3366   return   ( (strcmp(_name,"Set") == 0) ? true : false );
3367 }
3368 
3369 const char *MatchNode::reduce_right(FormDict &globals) const {
3370   // If there is no right reduction, return NULL.
3371   const char      *rightStr    = NULL;
3372 
3373   // If we are a "Set", start from the right child.
3374   const MatchNode *const mnode = sets_result() ?
3375     (const MatchNode *)this->_rChild :
3376     (const MatchNode *)this;
3377 
3378   // If our right child exists, it is the right reduction
3379   if ( mnode->_rChild ) {
3380     rightStr = mnode->_rChild->_internalop ? mnode->_rChild->_internalop
3381       : mnode->_rChild->_opType;
3382   }
3383   // Else, May be simple chain rule: (Set dst operand_form), rightStr=NULL;
3384   return rightStr;
3385 }
3386 
3387 const char *MatchNode::reduce_left(FormDict &globals) const {
3388   // If there is no left reduction, return NULL.
3389   const char  *leftStr  = NULL;
3390 
3391   // If we are a "Set", start from the right child.
3392   const MatchNode *const mnode = sets_result() ?
3393     (const MatchNode *)this->_rChild :
3394     (const MatchNode *)this;
3395 
3396   // If our left child exists, it is the left reduction
3397   if ( mnode->_lChild ) {
3398     leftStr = mnode->_lChild->_internalop ? mnode->_lChild->_internalop
3399       : mnode->_lChild->_opType;
3400   } else {
3401     // May be simple chain rule: (Set dst operand_form_source)
3402     if ( sets_result() ) {
3403       OperandForm *oper = globals[mnode->_opType]->is_operand();
3404       if( oper ) {
3405         leftStr = mnode->_opType;
3406       }
3407     }
3408   }
3409   return leftStr;
3410 }
3411 
3412 //------------------------------count_instr_names------------------------------
3413 // Count occurrences of operands names in the leaves of the instruction
3414 // match rule.
3415 void MatchNode::count_instr_names( Dict &names ) {
3416   if( this == NULL ) return;
3417   if( _lChild ) _lChild->count_instr_names(names);
3418   if( _rChild ) _rChild->count_instr_names(names);
3419   if( !_lChild && !_rChild ) {
3420     uintptr_t cnt = (uintptr_t)names[_name];
3421     cnt++;                      // One more name found
3422     names.Insert(_name,(void*)cnt);
3423   }
3424 }
3425 
3426 //------------------------------build_instr_pred-------------------------------
3427 // Build a path to 'name' in buf.  Actually only build if cnt is zero, so we
3428 // can skip some leading instances of 'name'.
3429 int MatchNode::build_instr_pred( char *buf, const char *name, int cnt ) {
3430   if( _lChild ) {
3431     if( !cnt ) strcpy( buf, "_kids[0]->" );
3432     cnt = _lChild->build_instr_pred( buf+strlen(buf), name, cnt );
3433     if( cnt < 0 ) return cnt;   // Found it, all done
3434   }
3435   if( _rChild ) {
3436     if( !cnt ) strcpy( buf, "_kids[1]->" );
3437     cnt = _rChild->build_instr_pred( buf+strlen(buf), name, cnt );
3438     if( cnt < 0 ) return cnt;   // Found it, all done
3439   }
3440   if( !_lChild && !_rChild ) {  // Found a leaf
3441     // Wrong name?  Give up...
3442     if( strcmp(name,_name) ) return cnt;
3443     if( !cnt ) strcpy(buf,"_leaf");
3444     return cnt-1;
3445   }
3446   return cnt;
3447 }
3448 
3449 
3450 //------------------------------build_internalop-------------------------------
3451 // Build string representation of subtree
3452 void MatchNode::build_internalop( ) {
3453   char *iop, *subtree;
3454   const char *lstr, *rstr;
3455   // Build string representation of subtree
3456   // Operation lchildType rchildType
3457   int len = (int)strlen(_opType) + 4;
3458   lstr = (_lChild) ? ((_lChild->_internalop) ?
3459                        _lChild->_internalop : _lChild->_opType) : "";
3460   rstr = (_rChild) ? ((_rChild->_internalop) ?
3461                        _rChild->_internalop : _rChild->_opType) : "";
3462   len += (int)strlen(lstr) + (int)strlen(rstr);
3463   subtree = (char *)AllocateHeap(len);
3464   sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
3465   // Hash the subtree string in _internalOps; if a name exists, use it
3466   iop = (char *)_AD._internalOps[subtree];
3467   // Else create a unique name, and add it to the hash table
3468   if (iop == NULL) {
3469     iop = subtree;
3470     _AD._internalOps.Insert(subtree, iop);
3471     _AD._internalOpNames.addName(iop);
3472     _AD._internalMatch.Insert(iop, this);
3473   }
3474   // Add the internal operand name to the MatchNode
3475   _internalop = iop;
3476   _result = iop;
3477 }
3478 
3479 
3480 void MatchNode::dump() {
3481   output(stderr);
3482 }
3483 
3484 void MatchNode::output(FILE *fp) {
3485   if (_lChild==0 && _rChild==0) {
3486     fprintf(fp," %s",_name);    // operand
3487   }
3488   else {
3489     fprintf(fp," (%s ",_name);  // " (opcodeName "
3490     if(_lChild) _lChild->output(fp); //               left operand
3491     if(_rChild) _rChild->output(fp); //                    right operand
3492     fprintf(fp,")");                 //                                 ")"
3493   }
3494 }
3495 
3496 int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
3497   static const char *needs_ideal_memory_list[] = {
3498     "StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" ,
3499     "StoreB","StoreC","Store" ,"StoreFP",
3500     "LoadI", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF"  ,
3501     "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
3502     "StoreVector", "LoadVector",
3503     "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
3504     "LoadPLocked",
3505     "StorePConditional", "StoreIConditional", "StoreLConditional",
3506     "CompareAndSwapB", "CompareAndSwapS", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN",
3507     "WeakCompareAndSwapB", "WeakCompareAndSwapS", "WeakCompareAndSwapI", "WeakCompareAndSwapL", "WeakCompareAndSwapP", "WeakCompareAndSwapN",
3508     "CompareAndExchangeB", "CompareAndExchangeS", "CompareAndExchangeI", "CompareAndExchangeL", "CompareAndExchangeP", "CompareAndExchangeN",
3509 #if INCLUDE_SHENANDOAHGC
3510     "ShenandoahCompareAndSwapN", "ShenandoahCompareAndSwapP", "ShenandoahWeakCompareAndSwapP", "ShenandoahWeakCompareAndSwapN", "ShenandoahCompareAndExchangeP", "ShenandoahCompareAndExchangeN",
3511 #endif
3512     "StoreCM",
3513     "GetAndSetB", "GetAndSetS", "GetAndAddI", "GetAndSetI", "GetAndSetP",
3514     "GetAndAddB", "GetAndAddS", "GetAndAddL", "GetAndSetL", "GetAndSetN",
3515 #if INCLUDE_ZGC
3516     "LoadBarrierSlowReg", "ZGetAndSetP", "ZCompareAndSwapP", "ZCompareAndExchangeP", "ZWeakCompareAndSwapP",
3517 #endif
3518     "ClearArray"
3519   };
3520   int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*);
3521   if( strcmp(_opType,"PrefetchAllocation")==0 )
3522     return 1;
3523   if( _lChild ) {
3524     const char *opType = _lChild->_opType;
3525     for( int i=0; i<cnt; i++ )
3526       if( strcmp(opType,needs_ideal_memory_list[i]) == 0 )
3527         return 1;
3528     if( _lChild->needs_ideal_memory_edge(globals) )
3529       return 1;
3530   }
3531   if( _rChild ) {
3532     const char *opType = _rChild->_opType;
3533     for( int i=0; i<cnt; i++ )
3534       if( strcmp(opType,needs_ideal_memory_list[i]) == 0 )
3535         return 1;
3536     if( _rChild->needs_ideal_memory_edge(globals) )
3537       return 1;
3538   }
3539 
3540   return 0;
3541 }
3542 
3543 // TRUE if defines a derived oop, and so needs a base oop edge present
3544 // post-matching.
3545 int MatchNode::needs_base_oop_edge() const {
3546   if( !strcmp(_opType,"AddP") ) return 1;
3547   if( strcmp(_opType,"Set") ) return 0;
3548   return !strcmp(_rChild->_opType,"AddP");
3549 }
3550 
3551 int InstructForm::needs_base_oop_edge(FormDict &globals) const {
3552   if( is_simple_chain_rule(globals) ) {
3553     const char *src = _matrule->_rChild->_opType;
3554     OperandForm *src_op = globals[src]->is_operand();
3555     assert( src_op, "Not operand class of chain rule" );
3556     return src_op->_matrule ? src_op->_matrule->needs_base_oop_edge() : 0;
3557   }                             // Else check instruction
3558 
3559   return _matrule ? _matrule->needs_base_oop_edge() : 0;
3560 }
3561 
3562 
3563 //-------------------------cisc spilling methods-------------------------------
3564 // helper routines and methods for detecting cisc-spilling instructions
3565 //-------------------------cisc_spill_merge------------------------------------
3566 int MatchNode::cisc_spill_merge(int left_spillable, int right_spillable) {
3567   int cisc_spillable  = Maybe_cisc_spillable;
3568 
3569   // Combine results of left and right checks
3570   if( (left_spillable == Maybe_cisc_spillable) && (right_spillable == Maybe_cisc_spillable) ) {
3571     // neither side is spillable, nor prevents cisc spilling
3572     cisc_spillable = Maybe_cisc_spillable;
3573   }
3574   else if( (left_spillable == Maybe_cisc_spillable) && (right_spillable > Maybe_cisc_spillable) ) {
3575     // right side is spillable
3576     cisc_spillable = right_spillable;
3577   }
3578   else if( (right_spillable == Maybe_cisc_spillable) && (left_spillable > Maybe_cisc_spillable) ) {
3579     // left side is spillable
3580     cisc_spillable = left_spillable;
3581   }
3582   else if( (left_spillable == Not_cisc_spillable) || (right_spillable == Not_cisc_spillable) ) {
3583     // left or right prevents cisc spilling this instruction
3584     cisc_spillable = Not_cisc_spillable;
3585   }
3586   else {
3587     // Only allow one to spill
3588     cisc_spillable = Not_cisc_spillable;
3589   }
3590 
3591   return cisc_spillable;
3592 }
3593 
3594 //-------------------------root_ops_match--------------------------------------
3595 bool static root_ops_match(FormDict &globals, const char *op1, const char *op2) {
3596   // Base Case: check that the current operands/operations match
3597   assert( op1, "Must have op's name");
3598   assert( op2, "Must have op's name");
3599   const Form *form1 = globals[op1];
3600   const Form *form2 = globals[op2];
3601 
3602   return (form1 == form2);
3603 }
3604 
3605 //-------------------------cisc_spill_match_node-------------------------------
3606 // Recursively check two MatchRules for legal conversion via cisc-spilling
3607 int MatchNode::cisc_spill_match(FormDict& globals, RegisterForm* registers, MatchNode* mRule2, const char* &operand, const char* &reg_type) {
3608   int cisc_spillable  = Maybe_cisc_spillable;
3609   int left_spillable  = Maybe_cisc_spillable;
3610   int right_spillable = Maybe_cisc_spillable;
3611 
3612   // Check that each has same number of operands at this level
3613   if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) )
3614     return Not_cisc_spillable;
3615 
3616   // Base Case: check that the current operands/operations match
3617   // or are CISC spillable
3618   assert( _opType, "Must have _opType");
3619   assert( mRule2->_opType, "Must have _opType");
3620   const Form *form  = globals[_opType];
3621   const Form *form2 = globals[mRule2->_opType];
3622   if( form == form2 ) {
3623     cisc_spillable = Maybe_cisc_spillable;
3624   } else {
3625     const InstructForm *form2_inst = form2 ? form2->is_instruction() : NULL;
3626     const char *name_left  = mRule2->_lChild ? mRule2->_lChild->_opType : NULL;
3627     const char *name_right = mRule2->_rChild ? mRule2->_rChild->_opType : NULL;
3628     DataType data_type = Form::none;
3629     if (form->is_operand()) {
3630       // Make sure the loadX matches the type of the reg
3631       data_type = form->ideal_to_Reg_type(form->is_operand()->ideal_type(globals));
3632     }
3633     // Detect reg vs (loadX memory)
3634     if( form->is_cisc_reg(globals)
3635         && form2_inst
3636         && data_type != Form::none
3637         && (is_load_from_memory(mRule2->_opType) == data_type) // reg vs. (load memory)
3638         && (name_left != NULL)       // NOT (load)
3639         && (name_right == NULL) ) {  // NOT (load memory foo)
3640       const Form *form2_left = globals[name_left];
3641       if( form2_left && form2_left->is_cisc_mem(globals) ) {
3642         cisc_spillable = Is_cisc_spillable;
3643         operand        = _name;
3644         reg_type       = _result;
3645         return Is_cisc_spillable;
3646       } else {
3647         cisc_spillable = Not_cisc_spillable;
3648       }
3649     }
3650     // Detect reg vs memory
3651     else if (form->is_cisc_reg(globals) && form2 != NULL && form2->is_cisc_mem(globals)) {
3652       cisc_spillable = Is_cisc_spillable;
3653       operand        = _name;
3654       reg_type       = _result;
3655       return Is_cisc_spillable;
3656     } else {
3657       cisc_spillable = Not_cisc_spillable;
3658     }
3659   }
3660 
3661   // If cisc is still possible, check rest of tree
3662   if( cisc_spillable == Maybe_cisc_spillable ) {
3663     // Check that each has same number of operands at this level
3664     if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable;
3665 
3666     // Check left operands
3667     if( (_lChild == NULL) && (mRule2->_lChild == NULL) ) {
3668       left_spillable = Maybe_cisc_spillable;
3669     } else  if (_lChild != NULL) {
3670       left_spillable = _lChild->cisc_spill_match(globals, registers, mRule2->_lChild, operand, reg_type);
3671     }
3672 
3673     // Check right operands
3674     if( (_rChild == NULL) && (mRule2->_rChild == NULL) ) {
3675       right_spillable =  Maybe_cisc_spillable;
3676     } else if (_rChild != NULL) {
3677       right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type);
3678     }
3679 
3680     // Combine results of left and right checks
3681     cisc_spillable = cisc_spill_merge(left_spillable, right_spillable);
3682   }
3683 
3684   return cisc_spillable;
3685 }
3686 
3687 //---------------------------cisc_spill_match_rule------------------------------
3688 // Recursively check two MatchRules for legal conversion via cisc-spilling
3689 // This method handles the root of Match tree,
3690 // general recursive checks done in MatchNode
3691 int  MatchRule::matchrule_cisc_spill_match(FormDict& globals, RegisterForm* registers,
3692                                            MatchRule* mRule2, const char* &operand,
3693                                            const char* &reg_type) {
3694   int cisc_spillable  = Maybe_cisc_spillable;
3695   int left_spillable  = Maybe_cisc_spillable;
3696   int right_spillable = Maybe_cisc_spillable;
3697 
3698   // Check that each sets a result
3699   if( !(sets_result() && mRule2->sets_result()) ) return Not_cisc_spillable;
3700   // Check that each has same number of operands at this level
3701   if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable;
3702 
3703   // Check left operands: at root, must be target of 'Set'
3704   if( (_lChild == NULL) || (mRule2->_lChild == NULL) ) {
3705     left_spillable = Not_cisc_spillable;
3706   } else {
3707     // Do not support cisc-spilling instruction's target location
3708     if( root_ops_match(globals, _lChild->_opType, mRule2->_lChild->_opType) ) {
3709       left_spillable = Maybe_cisc_spillable;
3710     } else {
3711       left_spillable = Not_cisc_spillable;
3712     }
3713   }
3714 
3715   // Check right operands: recursive walk to identify reg->mem operand
3716   if (_rChild == NULL) {
3717     if (mRule2->_rChild == NULL) {
3718       right_spillable =  Maybe_cisc_spillable;
3719     } else {
3720       assert(0, "_rChild should not be NULL");
3721     }
3722   } else {
3723     right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type);
3724   }
3725 
3726   // Combine results of left and right checks
3727   cisc_spillable = cisc_spill_merge(left_spillable, right_spillable);
3728 
3729   return cisc_spillable;
3730 }
3731 
3732 //----------------------------- equivalent ------------------------------------
3733 // Recursively check to see if two match rules are equivalent.
3734 // This rule handles the root.
3735 bool MatchRule::equivalent(FormDict &globals, MatchNode *mRule2) {
3736   // Check that each sets a result
3737   if (sets_result() != mRule2->sets_result()) {
3738     return false;
3739   }
3740 
3741   // Check that the current operands/operations match
3742   assert( _opType, "Must have _opType");
3743   assert( mRule2->_opType, "Must have _opType");
3744   const Form *form  = globals[_opType];
3745   const Form *form2 = globals[mRule2->_opType];
3746   if( form != form2 ) {
3747     return false;
3748   }
3749 
3750   if (_lChild ) {
3751     if( !_lChild->equivalent(globals, mRule2->_lChild) )
3752       return false;
3753   } else if (mRule2->_lChild) {
3754     return false; // I have NULL left child, mRule2 has non-NULL left child.
3755   }
3756 
3757   if (_rChild ) {
3758     if( !_rChild->equivalent(globals, mRule2->_rChild) )
3759       return false;
3760   } else if (mRule2->_rChild) {
3761     return false; // I have NULL right child, mRule2 has non-NULL right child.
3762   }
3763 
3764   // We've made it through the gauntlet.
3765   return true;
3766 }
3767 
3768 //----------------------------- equivalent ------------------------------------
3769 // Recursively check to see if two match rules are equivalent.
3770 // This rule handles the operands.
3771 bool MatchNode::equivalent(FormDict &globals, MatchNode *mNode2) {
3772   if( !mNode2 )
3773     return false;
3774 
3775   // Check that the current operands/operations match
3776   assert( _opType, "Must have _opType");
3777   assert( mNode2->_opType, "Must have _opType");
3778   const Form *form  = globals[_opType];
3779   const Form *form2 = globals[mNode2->_opType];
3780   if( form != form2 ) {
3781     return false;
3782   }
3783 
3784   // Check that their children also match
3785   if (_lChild ) {
3786     if( !_lChild->equivalent(globals, mNode2->_lChild) )
3787       return false;
3788   } else if (mNode2->_lChild) {
3789     return false; // I have NULL left child, mNode2 has non-NULL left child.
3790   }
3791 
3792   if (_rChild ) {
3793     if( !_rChild->equivalent(globals, mNode2->_rChild) )
3794       return false;
3795   } else if (mNode2->_rChild) {
3796     return false; // I have NULL right child, mNode2 has non-NULL right child.
3797   }
3798 
3799   // We've made it through the gauntlet.
3800   return true;
3801 }
3802 
3803 //-------------------------- has_commutative_op -------------------------------
3804 // Recursively check for commutative operations with subtree operands
3805 // which could be swapped.
3806 void MatchNode::count_commutative_op(int& count) {
3807   static const char *commut_op_list[] = {
3808     "AddI","AddL","AddF","AddD",
3809     "AddVB","AddVS","AddVI","AddVL","AddVF","AddVD",
3810     "AndI","AndL",
3811     "AndV",
3812     "MaxI","MinI","MaxF","MinF","MaxD","MinD",
3813     "MaxV", "MinV",
3814     "MulI","MulL","MulF","MulD",
3815     "MulVB","MulVS","MulVI","MulVL","MulVF","MulVD",
3816     "OrI","OrL",
3817     "OrV",
3818     "XorI","XorL",
3819     "XorV"
3820   };
3821   int cnt = sizeof(commut_op_list)/sizeof(char*);
3822 
3823   if( _lChild && _rChild && (_lChild->_lChild || _rChild->_lChild) ) {
3824     // Don't swap if right operand is an immediate constant.
3825     bool is_const = false;
3826     if( _rChild->_lChild == NULL && _rChild->_rChild == NULL ) {
3827       FormDict &globals = _AD.globalNames();
3828       const Form *form = globals[_rChild->_opType];
3829       if ( form ) {
3830         OperandForm  *oper = form->is_operand();
3831         if( oper && oper->interface_type(globals) == Form::constant_interface )
3832           is_const = true;
3833       }
3834     }
3835     if( !is_const ) {
3836       for( int i=0; i<cnt; i++ ) {
3837         if( strcmp(_opType, commut_op_list[i]) == 0 ) {
3838           count++;
3839           _commutative_id = count; // id should be > 0
3840           break;
3841         }
3842       }
3843     }
3844   }
3845   if( _lChild )
3846     _lChild->count_commutative_op(count);
3847   if( _rChild )
3848     _rChild->count_commutative_op(count);
3849 }
3850 
3851 //-------------------------- swap_commutative_op ------------------------------
3852 // Recursively swap specified commutative operation with subtree operands.
3853 void MatchNode::swap_commutative_op(bool atroot, int id) {
3854   if( _commutative_id == id ) { // id should be > 0
3855     assert(_lChild && _rChild && (_lChild->_lChild || _rChild->_lChild ),
3856             "not swappable operation");
3857     MatchNode* tmp = _lChild;
3858     _lChild = _rChild;
3859     _rChild = tmp;
3860     // Don't exit here since we need to build internalop.
3861   }
3862 
3863   bool is_set = ( strcmp(_opType, "Set") == 0 );
3864   if( _lChild )
3865     _lChild->swap_commutative_op(is_set, id);
3866   if( _rChild )
3867     _rChild->swap_commutative_op(is_set, id);
3868 
3869   // If not the root, reduce this subtree to an internal operand
3870   if( !atroot && (_lChild || _rChild) ) {
3871     build_internalop();
3872   }
3873 }
3874 
3875 //-------------------------- swap_commutative_op ------------------------------
3876 // Recursively swap specified commutative operation with subtree operands.
3877 void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt) {
3878   assert(match_rules_cnt < 100," too many match rule clones");
3879   // Clone
3880   MatchRule* clone = new MatchRule(_AD, this);
3881   // Swap operands of commutative operation
3882   ((MatchNode*)clone)->swap_commutative_op(true, count);
3883   char* buf = (char*) AllocateHeap(strlen(instr_ident) + 4);
3884   sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++);
3885   clone->_result = buf;
3886 
3887   clone->_next = this->_next;
3888   this-> _next = clone;
3889   if( (--count) > 0 ) {
3890     this-> matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
3891     clone->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
3892   }
3893 }
3894 
3895 //------------------------------MatchRule--------------------------------------
3896 MatchRule::MatchRule(ArchDesc &ad)
3897   : MatchNode(ad), _depth(0), _construct(NULL), _numchilds(0) {
3898     _next = NULL;
3899 }
3900 
3901 MatchRule::MatchRule(ArchDesc &ad, MatchRule* mRule)
3902   : MatchNode(ad, *mRule, 0), _depth(mRule->_depth),
3903     _construct(mRule->_construct), _numchilds(mRule->_numchilds) {
3904     _next = NULL;
3905 }
3906 
3907 MatchRule::MatchRule(ArchDesc &ad, MatchNode* mroot, int depth, char *cnstr,
3908                      int numleaves)
3909   : MatchNode(ad,*mroot), _depth(depth), _construct(cnstr),
3910     _numchilds(0) {
3911       _next = NULL;
3912       mroot->_lChild = NULL;
3913       mroot->_rChild = NULL;
3914       delete mroot;
3915       _numleaves = numleaves;
3916       _numchilds = (_lChild ? 1 : 0) + (_rChild ? 1 : 0);
3917 }
3918 MatchRule::~MatchRule() {
3919 }
3920 
3921 // Recursive call collecting info on top-level operands, not transitive.
3922 // Implementation does not modify state of internal structures.
3923 void MatchRule::append_components(FormDict& locals, ComponentList& components, bool def_flag) const {
3924   assert (_name != NULL, "MatchNode::build_components encountered empty node\n");
3925 
3926   MatchNode::append_components(locals, components,
3927                                false /* not necessarily a def */);
3928 }
3929 
3930 // Recursive call on all operands' match rules in my match rule.
3931 // Implementation does not modify state of internal structures  since they
3932 // can be shared.
3933 // The MatchNode that is called first treats its
3934 bool MatchRule::base_operand(uint &position0, FormDict &globals,
3935                              const char *&result, const char * &name,
3936                              const char * &opType)const{
3937   uint position = position0;
3938 
3939   return (MatchNode::base_operand( position, globals, result, name, opType));
3940 }
3941 
3942 
3943 bool MatchRule::is_base_register(FormDict &globals) const {
3944   uint   position = 1;
3945   const char  *result   = NULL;
3946   const char  *name     = NULL;
3947   const char  *opType   = NULL;
3948   if (!base_operand(position, globals, result, name, opType)) {
3949     position = 0;
3950     if( base_operand(position, globals, result, name, opType) &&
3951         (strcmp(opType,"RegI")==0 ||
3952          strcmp(opType,"RegP")==0 ||
3953          strcmp(opType,"RegN")==0 ||
3954          strcmp(opType,"RegL")==0 ||
3955          strcmp(opType,"RegF")==0 ||
3956          strcmp(opType,"RegD")==0 ||
3957          strcmp(opType,"VecS")==0 ||
3958          strcmp(opType,"VecD")==0 ||
3959          strcmp(opType,"VecX")==0 ||
3960          strcmp(opType,"VecY")==0 ||
3961          strcmp(opType,"VecZ")==0 ||
3962          strcmp(opType,"Reg" )==0) ) {
3963       return 1;
3964     }
3965   }
3966   return 0;
3967 }
3968 
3969 Form::DataType MatchRule::is_base_constant(FormDict &globals) const {
3970   uint         position = 1;
3971   const char  *result   = NULL;
3972   const char  *name     = NULL;
3973   const char  *opType   = NULL;
3974   if (!base_operand(position, globals, result, name, opType)) {
3975     position = 0;
3976     if (base_operand(position, globals, result, name, opType)) {
3977       return ideal_to_const_type(opType);
3978     }
3979   }
3980   return Form::none;
3981 }
3982 
3983 bool MatchRule::is_chain_rule(FormDict &globals) const {
3984 
3985   // Check for chain rule, and do not generate a match list for it
3986   if ((_lChild == NULL) && (_rChild == NULL) ) {
3987     const Form *form = globals[_opType];
3988     // If this is ideal, then it is a base match, not a chain rule.
3989     if ( form && form->is_operand() && (!form->ideal_only())) {
3990       return true;
3991     }
3992   }
3993   // Check for "Set" form of chain rule, and do not generate a match list
3994   if (_rChild) {
3995     const char *rch = _rChild->_opType;
3996     const Form *form = globals[rch];
3997     if ((!strcmp(_opType,"Set") &&
3998          ((form) && form->is_operand()))) {
3999       return true;
4000     }
4001   }
4002   return false;
4003 }
4004 
4005 int MatchRule::is_ideal_copy() const {
4006   if( _rChild ) {
4007     const char  *opType = _rChild->_opType;
4008 #if 1
4009     if( strcmp(opType,"CastIP")==0 )
4010       return 1;
4011 #else
4012     if( strcmp(opType,"CastII")==0 )
4013       return 1;
4014     // Do not treat *CastPP this way, because it
4015     // may transfer a raw pointer to an oop.
4016     // If the register allocator were to coalesce this
4017     // into a single LRG, the GC maps would be incorrect.
4018     //if( strcmp(opType,"CastPP")==0 )
4019     //  return 1;
4020     //if( strcmp(opType,"CheckCastPP")==0 )
4021     //  return 1;
4022     //
4023     // Do not treat CastX2P or CastP2X this way, because
4024     // raw pointers and int types are treated differently
4025     // when saving local & stack info for safepoints in
4026     // Output().
4027     //if( strcmp(opType,"CastX2P")==0 )
4028     //  return 1;
4029     //if( strcmp(opType,"CastP2X")==0 )
4030     //  return 1;
4031 #endif
4032   }
4033   if( is_chain_rule(_AD.globalNames()) &&
4034       _lChild && strncmp(_lChild->_opType,"stackSlot",9)==0 )
4035     return 1;
4036   return 0;
4037 }
4038 
4039 
4040 int MatchRule::is_expensive() const {
4041   if( _rChild ) {
4042     const char  *opType = _rChild->_opType;
4043     if( strcmp(opType,"AtanD")==0 ||
4044         strcmp(opType,"DivD")==0 ||
4045         strcmp(opType,"DivF")==0 ||
4046         strcmp(opType,"DivI")==0 ||
4047         strcmp(opType,"Log10D")==0 ||
4048         strcmp(opType,"ModD")==0 ||
4049         strcmp(opType,"ModF")==0 ||
4050         strcmp(opType,"ModI")==0 ||
4051         strcmp(opType,"SqrtD")==0 ||
4052         strcmp(opType,"SqrtF")==0 ||
4053         strcmp(opType,"TanD")==0 ||
4054         strcmp(opType,"ConvD2F")==0 ||
4055         strcmp(opType,"ConvD2I")==0 ||
4056         strcmp(opType,"ConvD2L")==0 ||
4057         strcmp(opType,"ConvF2D")==0 ||
4058         strcmp(opType,"ConvF2I")==0 ||
4059         strcmp(opType,"ConvF2L")==0 ||
4060         strcmp(opType,"ConvI2D")==0 ||
4061         strcmp(opType,"ConvI2F")==0 ||
4062         strcmp(opType,"ConvI2L")==0 ||
4063         strcmp(opType,"ConvL2D")==0 ||
4064         strcmp(opType,"ConvL2F")==0 ||
4065         strcmp(opType,"ConvL2I")==0 ||
4066         strcmp(opType,"DecodeN")==0 ||
4067         strcmp(opType,"EncodeP")==0 ||
4068         strcmp(opType,"EncodePKlass")==0 ||
4069         strcmp(opType,"DecodeNKlass")==0 ||
4070         strcmp(opType,"FmaD") == 0 ||
4071         strcmp(opType,"FmaF") == 0 ||
4072         strcmp(opType,"RoundDouble")==0 ||
4073         strcmp(opType,"RoundFloat")==0 ||
4074         strcmp(opType,"ReverseBytesI")==0 ||
4075         strcmp(opType,"ReverseBytesL")==0 ||
4076         strcmp(opType,"ReverseBytesUS")==0 ||
4077         strcmp(opType,"ReverseBytesS")==0 ||
4078         strcmp(opType,"ReplicateB")==0 ||
4079         strcmp(opType,"ReplicateS")==0 ||
4080         strcmp(opType,"ReplicateI")==0 ||
4081         strcmp(opType,"ReplicateL")==0 ||
4082         strcmp(opType,"ReplicateF")==0 ||
4083         strcmp(opType,"ReplicateD")==0 ||
4084         strcmp(opType,"AddReductionVI")==0 ||
4085         strcmp(opType,"AddReductionVL")==0 ||
4086         strcmp(opType,"AddReductionVF")==0 ||
4087         strcmp(opType,"AddReductionVD")==0 ||
4088         strcmp(opType,"MulReductionVI")==0 ||
4089         strcmp(opType,"MulReductionVL")==0 ||
4090         strcmp(opType,"MulReductionVF")==0 ||
4091         strcmp(opType,"MulReductionVD")==0 ||
4092         0 /* 0 to line up columns nicely */ )
4093       return 1;
4094   }
4095   return 0;
4096 }
4097 
4098 bool MatchRule::is_ideal_if() const {
4099   if( !_opType ) return false;
4100   return
4101     !strcmp(_opType,"If"            ) ||
4102     !strcmp(_opType,"CountedLoopEnd");
4103 }
4104 
4105 bool MatchRule::is_ideal_fastlock() const {
4106   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4107     return (strcmp(_rChild->_opType,"FastLock") == 0);
4108   }
4109   return false;
4110 }
4111 
4112 bool MatchRule::is_ideal_membar() const {
4113   if( !_opType ) return false;
4114   return
4115     !strcmp(_opType,"MemBarAcquire") ||
4116     !strcmp(_opType,"MemBarRelease") ||
4117     !strcmp(_opType,"MemBarAcquireLock") ||
4118     !strcmp(_opType,"MemBarReleaseLock") ||
4119     !strcmp(_opType,"LoadFence" ) ||
4120     !strcmp(_opType,"StoreFence") ||
4121     !strcmp(_opType,"MemBarVolatile") ||
4122     !strcmp(_opType,"MemBarCPUOrder") ||
4123     !strcmp(_opType,"MemBarStoreStore") ||
4124     !strcmp(_opType,"OnSpinWait");
4125 }
4126 
4127 bool MatchRule::is_ideal_loadPC() const {
4128   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4129     return (strcmp(_rChild->_opType,"LoadPC") == 0);
4130   }
4131   return false;
4132 }
4133 
4134 bool MatchRule::is_ideal_box() const {
4135   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4136     return (strcmp(_rChild->_opType,"Box") == 0);
4137   }
4138   return false;
4139 }
4140 
4141 bool MatchRule::is_ideal_goto() const {
4142   bool   ideal_goto = false;
4143 
4144   if( _opType && (strcmp(_opType,"Goto") == 0) ) {
4145     ideal_goto = true;
4146   }
4147   return ideal_goto;
4148 }
4149 
4150 bool MatchRule::is_ideal_jump() const {
4151   if( _opType ) {
4152     if( !strcmp(_opType,"Jump") )
4153       return true;
4154   }
4155   return false;
4156 }
4157 
4158 bool MatchRule::is_ideal_bool() const {
4159   if( _opType ) {
4160     if( !strcmp(_opType,"Bool") )
4161       return true;
4162   }
4163   return false;
4164 }
4165 
4166 
4167 Form::DataType MatchRule::is_ideal_load() const {
4168   Form::DataType ideal_load = Form::none;
4169 
4170   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4171     const char *opType = _rChild->_opType;
4172     ideal_load = is_load_from_memory(opType);
4173   }
4174 
4175   return ideal_load;
4176 }
4177 
4178 bool MatchRule::is_vector() const {
4179   static const char *vector_list[] = {
4180     "AddVB","AddVS","AddVI","AddVL","AddVF","AddVD",
4181     "SubVB","SubVS","SubVI","SubVL","SubVF","SubVD",
4182     "MulVB","MulVS","MulVI","MulVL","MulVF","MulVD",
4183     "CMoveVD", "CMoveVF",
4184     "DivVF","DivVD",
4185     "AbsVB","AbsVS","AbsVI","AbsVL","AbsVF","AbsVD",
4186     "NegVF","NegVD",
4187     "SqrtVD","SqrtVF",
4188     "AndV" ,"XorV" ,"OrV",
4189     "MaxV", "MinV",
4190     "AddReductionVI", "AddReductionVL",
4191     "AddReductionVF", "AddReductionVD",
4192     "MulReductionVI", "MulReductionVL",
4193     "MulReductionVF", "MulReductionVD",
4194     "MulAddVS2VI",
4195     "LShiftCntV","RShiftCntV",
4196     "LShiftVB","LShiftVS","LShiftVI","LShiftVL",
4197     "RShiftVB","RShiftVS","RShiftVI","RShiftVL",
4198     "URShiftVB","URShiftVS","URShiftVI","URShiftVL",
4199     "MaxReductionV", "MinReductionV",
4200     "ReplicateB","ReplicateS","ReplicateI","ReplicateL","ReplicateF","ReplicateD",
4201     "LoadVector","StoreVector",
4202     "FmaVD", "FmaVF","PopCountVI",
4203     // Next are not supported currently.
4204     "PackB","PackS","PackI","PackL","PackF","PackD","Pack2L","Pack2D",
4205     "ExtractB","ExtractUB","ExtractC","ExtractS","ExtractI","ExtractL","ExtractF","ExtractD"
4206   };
4207   int cnt = sizeof(vector_list)/sizeof(char*);
4208   if (_rChild) {
4209     const char  *opType = _rChild->_opType;
4210     for (int i=0; i<cnt; i++)
4211       if (strcmp(opType,vector_list[i]) == 0)
4212         return true;
4213   }
4214   return false;
4215 }
4216 
4217 
4218 bool MatchRule::skip_antidep_check() const {
4219   // Some loads operate on what is effectively immutable memory so we
4220   // should skip the anti dep computations.  For some of these nodes
4221   // the rewritable field keeps the anti dep logic from triggering but
4222   // for certain kinds of LoadKlass it does not since they are
4223   // actually reading memory which could be rewritten by the runtime,
4224   // though never by generated code.  This disables it uniformly for
4225   // the nodes that behave like this: LoadKlass, LoadNKlass and
4226   // LoadRange.
4227   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4228     const char *opType = _rChild->_opType;
4229     if (strcmp("LoadKlass", opType) == 0 ||
4230         strcmp("LoadNKlass", opType) == 0 ||
4231         strcmp("LoadRange", opType) == 0) {
4232       return true;
4233     }
4234   }
4235 
4236   return false;
4237 }
4238 
4239 
4240 Form::DataType MatchRule::is_ideal_store() const {
4241   Form::DataType ideal_store = Form::none;
4242 
4243   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4244     const char *opType = _rChild->_opType;
4245     ideal_store = is_store_to_memory(opType);
4246   }
4247 
4248   return ideal_store;
4249 }
4250 
4251 
4252 void MatchRule::dump() {
4253   output(stderr);
4254 }
4255 
4256 // Write just one line.
4257 void MatchRule::output_short(FILE *fp) {
4258   fprintf(fp,"MatchRule: ( %s",_name);
4259   if (_lChild) _lChild->output(fp);
4260   if (_rChild) _rChild->output(fp);
4261   fprintf(fp," )");
4262 }
4263 
4264 void MatchRule::output(FILE *fp) {
4265   output_short(fp);
4266   fprintf(fp,"\n   nesting depth = %d\n", _depth);
4267   if (_result) fprintf(fp,"   Result Type = %s", _result);
4268   fprintf(fp,"\n");
4269 }
4270 
4271 //------------------------------Attribute--------------------------------------
4272 Attribute::Attribute(char *id, char* val, int type)
4273   : _ident(id), _val(val), _atype(type) {
4274 }
4275 Attribute::~Attribute() {
4276 }
4277 
4278 int Attribute::int_val(ArchDesc &ad) {
4279   // Make sure it is an integer constant:
4280   int result = 0;
4281   if (!_val || !ADLParser::is_int_token(_val, result)) {
4282     ad.syntax_err(0, "Attribute %s must have an integer value: %s",
4283                   _ident, _val ? _val : "");
4284   }
4285   return result;
4286 }
4287 
4288 void Attribute::dump() {
4289   output(stderr);
4290 } // Debug printer
4291 
4292 // Write to output files
4293 void Attribute::output(FILE *fp) {
4294   fprintf(fp,"Attribute: %s  %s\n", (_ident?_ident:""), (_val?_val:""));
4295 }
4296 
4297 //------------------------------FormatRule----------------------------------
4298 FormatRule::FormatRule(char *temp)
4299   : _temp(temp) {
4300 }
4301 FormatRule::~FormatRule() {
4302 }
4303 
4304 void FormatRule::dump() {
4305   output(stderr);
4306 }
4307 
4308 // Write to output files
4309 void FormatRule::output(FILE *fp) {
4310   fprintf(fp,"\nFormat Rule: \n%s", (_temp?_temp:""));
4311   fprintf(fp,"\n");
4312 }