1 /*
   2  * Copyright (c) 1998, 2019, 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   if (mnode != NULL) 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   // Update 'value' if user provided a definition in the instruction
1730   switch (desired_opcode) {
1731   case PRIMARY:
1732     description = "primary()";
1733     if( _primary   != NULL)  { value = _primary;     }
1734     break;
1735   case SECONDARY:
1736     description = "secondary()";
1737     if( _secondary != NULL ) { value = _secondary;   }
1738     break;
1739   case TERTIARY:
1740     description = "tertiary()";
1741     if( _tertiary  != NULL ) { value = _tertiary;    }
1742     break;
1743   default:
1744     assert( false, "ShouldNotReachHere();");
1745     break;
1746   }
1747 
1748   if (value != NULL) {
1749     fprintf(fp, "(%s /*%s*/)", value, description);
1750   }
1751   return value != NULL;
1752 }
1753 
1754 void Opcode::dump() {
1755   output(stderr);
1756 }
1757 
1758 // Write info to output files
1759 void Opcode::output(FILE *fp) {
1760   if (_primary   != NULL) fprintf(fp,"Primary   opcode: %s\n", _primary);
1761   if (_secondary != NULL) fprintf(fp,"Secondary opcode: %s\n", _secondary);
1762   if (_tertiary  != NULL) fprintf(fp,"Tertiary  opcode: %s\n", _tertiary);
1763 }
1764 
1765 //------------------------------InsEncode--------------------------------------
1766 InsEncode::InsEncode() {
1767 }
1768 InsEncode::~InsEncode() {
1769 }
1770 
1771 // Add "encode class name" and its parameters
1772 NameAndList *InsEncode::add_encode(char *encoding) {
1773   assert( encoding != NULL, "Must provide name for encoding");
1774 
1775   // add_parameter(NameList::_signal);
1776   NameAndList *encode = new NameAndList(encoding);
1777   _encoding.addName((char*)encode);
1778 
1779   return encode;
1780 }
1781 
1782 // Access the list of encodings
1783 void InsEncode::reset() {
1784   _encoding.reset();
1785   // _parameter.reset();
1786 }
1787 const char* InsEncode::encode_class_iter() {
1788   NameAndList  *encode_class = (NameAndList*)_encoding.iter();
1789   return  ( encode_class != NULL ? encode_class->name() : NULL );
1790 }
1791 // Obtain parameter name from zero based index
1792 const char *InsEncode::rep_var_name(InstructForm &inst, uint param_no) {
1793   NameAndList *params = (NameAndList*)_encoding.current();
1794   assert( params != NULL, "Internal Error");
1795   const char *param = (*params)[param_no];
1796 
1797   // Remove '$' if parser placed it there.
1798   return ( param != NULL && *param == '$') ? (param+1) : param;
1799 }
1800 
1801 void InsEncode::dump() {
1802   output(stderr);
1803 }
1804 
1805 // Write info to output files
1806 void InsEncode::output(FILE *fp) {
1807   NameAndList *encoding  = NULL;
1808   const char  *parameter = NULL;
1809 
1810   fprintf(fp,"InsEncode: ");
1811   _encoding.reset();
1812 
1813   while ( (encoding = (NameAndList*)_encoding.iter()) != 0 ) {
1814     // Output the encoding being used
1815     fprintf(fp,"%s(", encoding->name() );
1816 
1817     // Output its parameter list, if any
1818     bool first_param = true;
1819     encoding->reset();
1820     while (  (parameter = encoding->iter()) != 0 ) {
1821       // Output the ',' between parameters
1822       if ( ! first_param )  fprintf(fp,", ");
1823       first_param = false;
1824       // Output the parameter
1825       fprintf(fp,"%s", parameter);
1826     } // done with parameters
1827     fprintf(fp,")  ");
1828   } // done with encodings
1829 
1830   fprintf(fp,"\n");
1831 }
1832 
1833 //------------------------------Effect-----------------------------------------
1834 static int effect_lookup(const char *name) {
1835   if (!strcmp(name, "USE")) return Component::USE;
1836   if (!strcmp(name, "DEF")) return Component::DEF;
1837   if (!strcmp(name, "USE_DEF")) return Component::USE_DEF;
1838   if (!strcmp(name, "KILL")) return Component::KILL;
1839   if (!strcmp(name, "USE_KILL")) return Component::USE_KILL;
1840   if (!strcmp(name, "TEMP")) return Component::TEMP;
1841   if (!strcmp(name, "TEMP_DEF")) return Component::TEMP_DEF;
1842   if (!strcmp(name, "INVALID")) return Component::INVALID;
1843   if (!strcmp(name, "CALL")) return Component::CALL;
1844   assert(false,"Invalid effect name specified\n");
1845   return Component::INVALID;
1846 }
1847 
1848 const char *Component::getUsedefName() {
1849   switch (_usedef) {
1850     case Component::INVALID:  return "INVALID";  break;
1851     case Component::USE:      return "USE";      break;
1852     case Component::USE_DEF:  return "USE_DEF";  break;
1853     case Component::USE_KILL: return "USE_KILL"; break;
1854     case Component::KILL:     return "KILL";     break;
1855     case Component::TEMP:     return "TEMP";     break;
1856     case Component::TEMP_DEF: return "TEMP_DEF"; break;
1857     case Component::DEF:      return "DEF";      break;
1858     case Component::CALL:     return "CALL";     break;
1859     default: assert(false, "unknown effect");
1860   }
1861   return "Undefined Use/Def info";
1862 }
1863 
1864 Effect::Effect(const char *name) : _name(name), _use_def(effect_lookup(name)) {
1865   _ftype = Form::EFF;
1866 }
1867 
1868 Effect::~Effect() {
1869 }
1870 
1871 // Dynamic type check
1872 Effect *Effect::is_effect() const {
1873   return (Effect*)this;
1874 }
1875 
1876 
1877 // True if this component is equal to the parameter.
1878 bool Effect::is(int use_def_kill_enum) const {
1879   return (_use_def == use_def_kill_enum ? true : false);
1880 }
1881 // True if this component is used/def'd/kill'd as the parameter suggests.
1882 bool Effect::isa(int use_def_kill_enum) const {
1883   return (_use_def & use_def_kill_enum) == use_def_kill_enum;
1884 }
1885 
1886 void Effect::dump() {
1887   output(stderr);
1888 }
1889 
1890 void Effect::output(FILE *fp) {          // Write info to output files
1891   fprintf(fp,"Effect: %s\n", (_name?_name:""));
1892 }
1893 
1894 //------------------------------ExpandRule-------------------------------------
1895 ExpandRule::ExpandRule() : _expand_instrs(),
1896                            _newopconst(cmpstr, hashstr, Form::arena) {
1897   _ftype = Form::EXP;
1898 }
1899 
1900 ExpandRule::~ExpandRule() {                  // Destructor
1901 }
1902 
1903 void ExpandRule::add_instruction(NameAndList *instruction_name_and_operand_list) {
1904   _expand_instrs.addName((char*)instruction_name_and_operand_list);
1905 }
1906 
1907 void ExpandRule::reset_instructions() {
1908   _expand_instrs.reset();
1909 }
1910 
1911 NameAndList* ExpandRule::iter_instructions() {
1912   return (NameAndList*)_expand_instrs.iter();
1913 }
1914 
1915 
1916 void ExpandRule::dump() {
1917   output(stderr);
1918 }
1919 
1920 void ExpandRule::output(FILE *fp) {         // Write info to output files
1921   NameAndList *expand_instr = NULL;
1922   const char *opid = NULL;
1923 
1924   fprintf(fp,"\nExpand Rule:\n");
1925 
1926   // Iterate over the instructions 'node' expands into
1927   for(reset_instructions(); (expand_instr = iter_instructions()) != NULL; ) {
1928     fprintf(fp,"%s(", expand_instr->name());
1929 
1930     // iterate over the operand list
1931     for( expand_instr->reset(); (opid = expand_instr->iter()) != NULL; ) {
1932       fprintf(fp,"%s ", opid);
1933     }
1934     fprintf(fp,");\n");
1935   }
1936 }
1937 
1938 //------------------------------RewriteRule------------------------------------
1939 RewriteRule::RewriteRule(char* params, char* block)
1940   : _tempParams(params), _tempBlock(block) { };  // Constructor
1941 RewriteRule::~RewriteRule() {                 // Destructor
1942 }
1943 
1944 void RewriteRule::dump() {
1945   output(stderr);
1946 }
1947 
1948 void RewriteRule::output(FILE *fp) {         // Write info to output files
1949   fprintf(fp,"\nRewrite Rule:\n%s\n%s\n",
1950           (_tempParams?_tempParams:""),
1951           (_tempBlock?_tempBlock:""));
1952 }
1953 
1954 
1955 //==============================MachNodes======================================
1956 //------------------------------MachNodeForm-----------------------------------
1957 MachNodeForm::MachNodeForm(char *id)
1958   : _ident(id) {
1959 }
1960 
1961 MachNodeForm::~MachNodeForm() {
1962 }
1963 
1964 MachNodeForm *MachNodeForm::is_machnode() const {
1965   return (MachNodeForm*)this;
1966 }
1967 
1968 //==============================Operand Classes================================
1969 //------------------------------OpClassForm------------------------------------
1970 OpClassForm::OpClassForm(const char* id) : _ident(id) {
1971   _ftype = Form::OPCLASS;
1972 }
1973 
1974 OpClassForm::~OpClassForm() {
1975 }
1976 
1977 bool OpClassForm::ideal_only() const { return 0; }
1978 
1979 OpClassForm *OpClassForm::is_opclass() const {
1980   return (OpClassForm*)this;
1981 }
1982 
1983 Form::InterfaceType OpClassForm::interface_type(FormDict &globals) const {
1984   if( _oplst.count() == 0 ) return Form::no_interface;
1985 
1986   // Check that my operands have the same interface type
1987   Form::InterfaceType  interface;
1988   bool  first = true;
1989   NameList &op_list = (NameList &)_oplst;
1990   op_list.reset();
1991   const char *op_name;
1992   while( (op_name = op_list.iter()) != NULL ) {
1993     const Form  *form    = globals[op_name];
1994     OperandForm *operand = form->is_operand();
1995     assert( operand, "Entry in operand class that is not an operand");
1996     if( first ) {
1997       first     = false;
1998       interface = operand->interface_type(globals);
1999     } else {
2000       interface = (interface == operand->interface_type(globals) ? interface : Form::no_interface);
2001     }
2002   }
2003   return interface;
2004 }
2005 
2006 bool OpClassForm::stack_slots_only(FormDict &globals) const {
2007   if( _oplst.count() == 0 ) return false;  // how?
2008 
2009   NameList &op_list = (NameList &)_oplst;
2010   op_list.reset();
2011   const char *op_name;
2012   while( (op_name = op_list.iter()) != NULL ) {
2013     const Form  *form    = globals[op_name];
2014     OperandForm *operand = form->is_operand();
2015     assert( operand, "Entry in operand class that is not an operand");
2016     if( !operand->stack_slots_only(globals) )  return false;
2017   }
2018   return true;
2019 }
2020 
2021 
2022 void OpClassForm::dump() {
2023   output(stderr);
2024 }
2025 
2026 void OpClassForm::output(FILE *fp) {
2027   const char *name;
2028   fprintf(fp,"\nOperand Class: %s\n", (_ident?_ident:""));
2029   fprintf(fp,"\nCount = %d\n", _oplst.count());
2030   for(_oplst.reset(); (name = _oplst.iter()) != NULL;) {
2031     fprintf(fp,"%s, ",name);
2032   }
2033   fprintf(fp,"\n");
2034 }
2035 
2036 
2037 //==============================Operands=======================================
2038 //------------------------------OperandForm------------------------------------
2039 OperandForm::OperandForm(const char* id)
2040   : OpClassForm(id), _ideal_only(false),
2041     _localNames(cmpstr, hashstr, Form::arena) {
2042       _ftype = Form::OPER;
2043 
2044       _matrule   = NULL;
2045       _interface = NULL;
2046       _attribs   = NULL;
2047       _predicate = NULL;
2048       _constraint= NULL;
2049       _construct = NULL;
2050       _format    = NULL;
2051 }
2052 OperandForm::OperandForm(const char* id, bool ideal_only)
2053   : OpClassForm(id), _ideal_only(ideal_only),
2054     _localNames(cmpstr, hashstr, Form::arena) {
2055       _ftype = Form::OPER;
2056 
2057       _matrule   = NULL;
2058       _interface = NULL;
2059       _attribs   = NULL;
2060       _predicate = NULL;
2061       _constraint= NULL;
2062       _construct = NULL;
2063       _format    = NULL;
2064 }
2065 OperandForm::~OperandForm() {
2066 }
2067 
2068 
2069 OperandForm *OperandForm::is_operand() const {
2070   return (OperandForm*)this;
2071 }
2072 
2073 bool OperandForm::ideal_only() const {
2074   return _ideal_only;
2075 }
2076 
2077 Form::InterfaceType OperandForm::interface_type(FormDict &globals) const {
2078   if( _interface == NULL )  return Form::no_interface;
2079 
2080   return _interface->interface_type(globals);
2081 }
2082 
2083 
2084 bool OperandForm::stack_slots_only(FormDict &globals) const {
2085   if( _constraint == NULL )  return false;
2086   return _constraint->stack_slots_only();
2087 }
2088 
2089 
2090 // Access op_cost attribute or return NULL.
2091 const char* OperandForm::cost() {
2092   for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) {
2093     if( strcmp(cur->_ident,AttributeForm::_op_cost) == 0 ) {
2094       return cur->_val;
2095     }
2096   }
2097   return NULL;
2098 }
2099 
2100 // Return the number of leaves below this complex operand
2101 uint OperandForm::num_leaves() const {
2102   if ( ! _matrule) return 0;
2103 
2104   int num_leaves = _matrule->_numleaves;
2105   return num_leaves;
2106 }
2107 
2108 // Return the number of constants contained within this complex operand
2109 uint OperandForm::num_consts(FormDict &globals) const {
2110   if ( ! _matrule) return 0;
2111 
2112   // This is a recursive invocation on all operands in the matchrule
2113   return _matrule->num_consts(globals);
2114 }
2115 
2116 // Return the number of constants in match rule with specified type
2117 uint OperandForm::num_consts(FormDict &globals, Form::DataType type) const {
2118   if ( ! _matrule) return 0;
2119 
2120   // This is a recursive invocation on all operands in the matchrule
2121   return _matrule->num_consts(globals, type);
2122 }
2123 
2124 // Return the number of pointer constants contained within this complex operand
2125 uint OperandForm::num_const_ptrs(FormDict &globals) const {
2126   if ( ! _matrule) return 0;
2127 
2128   // This is a recursive invocation on all operands in the matchrule
2129   return _matrule->num_const_ptrs(globals);
2130 }
2131 
2132 uint OperandForm::num_edges(FormDict &globals) const {
2133   uint edges  = 0;
2134   uint leaves = num_leaves();
2135   uint consts = num_consts(globals);
2136 
2137   // If we are matching a constant directly, there are no leaves.
2138   edges = ( leaves > consts ) ? leaves - consts : 0;
2139 
2140   // !!!!!
2141   // Special case operands that do not have a corresponding ideal node.
2142   if( (edges == 0) && (consts == 0) ) {
2143     if( constrained_reg_class() != NULL ) {
2144       edges = 1;
2145     } else {
2146       if( _matrule
2147           && (_matrule->_lChild == NULL) && (_matrule->_rChild == NULL) ) {
2148         const Form *form = globals[_matrule->_opType];
2149         OperandForm *oper = form ? form->is_operand() : NULL;
2150         if( oper ) {
2151           return oper->num_edges(globals);
2152         }
2153       }
2154     }
2155   }
2156 
2157   return edges;
2158 }
2159 
2160 
2161 // Check if this operand is usable for cisc-spilling
2162 bool  OperandForm::is_cisc_reg(FormDict &globals) const {
2163   const char *ideal = ideal_type(globals);
2164   bool is_cisc_reg = (ideal && (ideal_to_Reg_type(ideal) != none));
2165   return is_cisc_reg;
2166 }
2167 
2168 bool  OpClassForm::is_cisc_mem(FormDict &globals) const {
2169   Form::InterfaceType my_interface = interface_type(globals);
2170   return (my_interface == memory_interface);
2171 }
2172 
2173 
2174 // node matches ideal 'Bool'
2175 bool OperandForm::is_ideal_bool() const {
2176   if( _matrule == NULL ) return false;
2177 
2178   return _matrule->is_ideal_bool();
2179 }
2180 
2181 // Require user's name for an sRegX to be stackSlotX
2182 Form::DataType OperandForm::is_user_name_for_sReg() const {
2183   DataType data_type = none;
2184   if( _ident != NULL ) {
2185     if(      strcmp(_ident,"stackSlotI") == 0 ) data_type = Form::idealI;
2186     else if( strcmp(_ident,"stackSlotP") == 0 ) data_type = Form::idealP;
2187     else if( strcmp(_ident,"stackSlotD") == 0 ) data_type = Form::idealD;
2188     else if( strcmp(_ident,"stackSlotF") == 0 ) data_type = Form::idealF;
2189     else if( strcmp(_ident,"stackSlotL") == 0 ) data_type = Form::idealL;
2190   }
2191   assert((data_type == none) || (_matrule == NULL), "No match-rule for stackSlotX");
2192 
2193   return data_type;
2194 }
2195 
2196 
2197 // Return ideal type, if there is a single ideal type for this operand
2198 const char *OperandForm::ideal_type(FormDict &globals, RegisterForm *registers) const {
2199   const char *type = NULL;
2200   if (ideal_only()) type = _ident;
2201   else if( _matrule == NULL ) {
2202     // Check for condition code register
2203     const char *rc_name = constrained_reg_class();
2204     // !!!!!
2205     if (rc_name == NULL) return NULL;
2206     // !!!!! !!!!!
2207     // Check constraints on result's register class
2208     if( registers ) {
2209       RegClass *reg_class  = registers->getRegClass(rc_name);
2210       assert( reg_class != NULL, "Register class is not defined");
2211 
2212       // Check for ideal type of entries in register class, all are the same type
2213       reg_class->reset();
2214       RegDef *reg_def = reg_class->RegDef_iter();
2215       assert( reg_def != NULL, "No entries in register class");
2216       assert( reg_def->_idealtype != NULL, "Did not define ideal type for register");
2217       // Return substring that names the register's ideal type
2218       type = reg_def->_idealtype + 3;
2219       assert( *(reg_def->_idealtype + 0) == 'O', "Expect Op_ prefix");
2220       assert( *(reg_def->_idealtype + 1) == 'p', "Expect Op_ prefix");
2221       assert( *(reg_def->_idealtype + 2) == '_', "Expect Op_ prefix");
2222     }
2223   }
2224   else if( _matrule->_lChild == NULL && _matrule->_rChild == NULL ) {
2225     // This operand matches a single type, at the top level.
2226     // Check for ideal type
2227     type = _matrule->_opType;
2228     if( strcmp(type,"Bool") == 0 )
2229       return "Bool";
2230     // transitive lookup
2231     const Form *frm = globals[type];
2232     OperandForm *op = frm->is_operand();
2233     type = op->ideal_type(globals, registers);
2234   }
2235   return type;
2236 }
2237 
2238 
2239 // If there is a single ideal type for this interface field, return it.
2240 const char *OperandForm::interface_ideal_type(FormDict &globals,
2241                                               const char *field) const {
2242   const char  *ideal_type = NULL;
2243   const char  *value      = NULL;
2244 
2245   // Check if "field" is valid for this operand's interface
2246   if ( ! is_interface_field(field, value) )   return ideal_type;
2247 
2248   // !!!!! !!!!! !!!!!
2249   // If a valid field has a constant value, identify "ConI" or "ConP" or ...
2250 
2251   // Else, lookup type of field's replacement variable
2252 
2253   return ideal_type;
2254 }
2255 
2256 
2257 RegClass* OperandForm::get_RegClass() const {
2258   if (_interface && !_interface->is_RegInterface()) return NULL;
2259   return globalAD->get_registers()->getRegClass(constrained_reg_class());
2260 }
2261 
2262 
2263 bool OperandForm::is_bound_register() const {
2264   RegClass* reg_class = get_RegClass();
2265   if (reg_class == NULL) {
2266     return false;
2267   }
2268 
2269   const char* name = ideal_type(globalAD->globalNames());
2270   if (name == NULL) {
2271     return false;
2272   }
2273 
2274   uint size = 0;
2275   if (strcmp(name, "RegFlags") == 0) size = 1;
2276   if (strcmp(name, "RegI") == 0) size = 1;
2277   if (strcmp(name, "RegF") == 0) size = 1;
2278   if (strcmp(name, "RegD") == 0) size = 2;
2279   if (strcmp(name, "RegL") == 0) size = 2;
2280   if (strcmp(name, "RegN") == 0) size = 1;
2281   if (strcmp(name, "VecX") == 0) size = 4;
2282   if (strcmp(name, "VecY") == 0) size = 8;
2283   if (strcmp(name, "VecZ") == 0) size = 16;
2284   if (strcmp(name, "RegP") == 0) size = globalAD->get_preproc_def("_LP64") ? 2 : 1;
2285   if (size == 0) {
2286     return false;
2287   }
2288   return size == reg_class->size();
2289 }
2290 
2291 
2292 // Check if this is a valid field for this operand,
2293 // Return 'true' if valid, and set the value to the string the user provided.
2294 bool  OperandForm::is_interface_field(const char *field,
2295                                       const char * &value) const {
2296   return false;
2297 }
2298 
2299 
2300 // Return register class name if a constraint specifies the register class.
2301 const char *OperandForm::constrained_reg_class() const {
2302   const char *reg_class  = NULL;
2303   if ( _constraint ) {
2304     // !!!!!
2305     Constraint *constraint = _constraint;
2306     if ( strcmp(_constraint->_func,"ALLOC_IN_RC") == 0 ) {
2307       reg_class = _constraint->_arg;
2308     }
2309   }
2310 
2311   return reg_class;
2312 }
2313 
2314 
2315 // Return the register class associated with 'leaf'.
2316 const char *OperandForm::in_reg_class(uint leaf, FormDict &globals) {
2317   const char *reg_class = NULL; // "RegMask::Empty";
2318 
2319   if((_matrule == NULL) || (_matrule->is_chain_rule(globals))) {
2320     reg_class = constrained_reg_class();
2321     return reg_class;
2322   }
2323   const char *result   = NULL;
2324   const char *name     = NULL;
2325   const char *type     = NULL;
2326   // iterate through all base operands
2327   // until we reach the register that corresponds to "leaf"
2328   // This function is not looking for an ideal type.  It needs the first
2329   // level user type associated with the leaf.
2330   for(uint idx = 0;_matrule->base_operand(idx,globals,result,name,type);++idx) {
2331     const Form *form = (_localNames[name] ? _localNames[name] : globals[result]);
2332     OperandForm *oper = form ? form->is_operand() : NULL;
2333     if( oper ) {
2334       reg_class = oper->constrained_reg_class();
2335       if( reg_class ) {
2336         reg_class = reg_class;
2337       } else {
2338         // ShouldNotReachHere();
2339       }
2340     } else {
2341       // ShouldNotReachHere();
2342     }
2343 
2344     // Increment our target leaf position if current leaf is not a candidate.
2345     if( reg_class == NULL)    ++leaf;
2346     // Exit the loop with the value of reg_class when at the correct index
2347     if( idx == leaf )         break;
2348     // May iterate through all base operands if reg_class for 'leaf' is NULL
2349   }
2350   return reg_class;
2351 }
2352 
2353 
2354 // Recursive call to construct list of top-level operands.
2355 // Implementation does not modify state of internal structures
2356 void OperandForm::build_components() {
2357   if (_matrule)  _matrule->append_components(_localNames, _components);
2358 
2359   // Add parameters that "do not appear in match rule".
2360   const char *name;
2361   for (_parameters.reset(); (name = _parameters.iter()) != NULL;) {
2362     OpClassForm *opForm = _localNames[name]->is_opclass();
2363     assert(opForm != NULL, "sanity");
2364 
2365     if ( _components.operand_position(name) == -1 ) {
2366       _components.insert(name, opForm->_ident, Component::INVALID, false);
2367     }
2368   }
2369 
2370   return;
2371 }
2372 
2373 int OperandForm::operand_position(const char *name, int usedef) {
2374   return _components.operand_position(name, usedef, this);
2375 }
2376 
2377 
2378 // Return zero-based position in component list, only counting constants;
2379 // Return -1 if not in list.
2380 int OperandForm::constant_position(FormDict &globals, const Component *last) {
2381   // Iterate through components and count constants preceding 'constant'
2382   int position = 0;
2383   Component *comp;
2384   _components.reset();
2385   while( (comp = _components.iter()) != NULL  && (comp != last) ) {
2386     // Special case for operands that take a single user-defined operand
2387     // Skip the initial definition in the component list.
2388     if( strcmp(comp->_name,this->_ident) == 0 ) continue;
2389 
2390     const char *type = comp->_type;
2391     // Lookup operand form for replacement variable's type
2392     const Form *form = globals[type];
2393     assert( form != NULL, "Component's type not found");
2394     OperandForm *oper = form ? form->is_operand() : NULL;
2395     if( oper ) {
2396       if( oper->_matrule->is_base_constant(globals) != Form::none ) {
2397         ++position;
2398       }
2399     }
2400   }
2401 
2402   // Check for being passed a component that was not in the list
2403   if( comp != last )  position = -1;
2404 
2405   return position;
2406 }
2407 // Provide position of constant by "name"
2408 int OperandForm::constant_position(FormDict &globals, const char *name) {
2409   const Component *comp = _components.search(name);
2410   int idx = constant_position( globals, comp );
2411 
2412   return idx;
2413 }
2414 
2415 
2416 // Return zero-based position in component list, only counting constants;
2417 // Return -1 if not in list.
2418 int OperandForm::register_position(FormDict &globals, const char *reg_name) {
2419   // Iterate through components and count registers preceding 'last'
2420   uint  position = 0;
2421   Component *comp;
2422   _components.reset();
2423   while( (comp = _components.iter()) != NULL
2424          && (strcmp(comp->_name,reg_name) != 0) ) {
2425     // Special case for operands that take a single user-defined operand
2426     // Skip the initial definition in the component list.
2427     if( strcmp(comp->_name,this->_ident) == 0 ) continue;
2428 
2429     const char *type = comp->_type;
2430     // Lookup operand form for component's type
2431     const Form *form = globals[type];
2432     assert( form != NULL, "Component's type not found");
2433     OperandForm *oper = form ? form->is_operand() : NULL;
2434     if( oper ) {
2435       if( oper->_matrule->is_base_register(globals) ) {
2436         ++position;
2437       }
2438     }
2439   }
2440 
2441   return position;
2442 }
2443 
2444 
2445 const char *OperandForm::reduce_result()  const {
2446   return _ident;
2447 }
2448 // Return the name of the operand on the right hand side of the binary match
2449 // Return NULL if there is no right hand side
2450 const char *OperandForm::reduce_right(FormDict &globals)  const {
2451   return  ( _matrule ? _matrule->reduce_right(globals) : NULL );
2452 }
2453 
2454 // Similar for left
2455 const char *OperandForm::reduce_left(FormDict &globals)   const {
2456   return  ( _matrule ? _matrule->reduce_left(globals) : NULL );
2457 }
2458 
2459 
2460 // --------------------------- FILE *output_routines
2461 //
2462 // Output code for disp_is_oop, if true.
2463 void OperandForm::disp_is_oop(FILE *fp, FormDict &globals) {
2464   //  Check it is a memory interface with a non-user-constant disp field
2465   if ( this->_interface == NULL ) return;
2466   MemInterface *mem_interface = this->_interface->is_MemInterface();
2467   if ( mem_interface == NULL )    return;
2468   const char   *disp  = mem_interface->_disp;
2469   if ( *disp != '$' )             return;
2470 
2471   // Lookup replacement variable in operand's component list
2472   const char   *rep_var = disp + 1;
2473   const Component *comp = this->_components.search(rep_var);
2474   assert( comp != NULL, "Replacement variable not found in components");
2475   // Lookup operand form for replacement variable's type
2476   const char      *type = comp->_type;
2477   Form            *form = (Form*)globals[type];
2478   assert( form != NULL, "Replacement variable's type not found");
2479   OperandForm     *op   = form->is_operand();
2480   assert( op, "Memory Interface 'disp' can only emit an operand form");
2481   // Check if this is a ConP, which may require relocation
2482   if ( op->is_base_constant(globals) == Form::idealP ) {
2483     // Find the constant's index:  _c0, _c1, _c2, ... , _cN
2484     uint idx  = op->constant_position( globals, rep_var);
2485     fprintf(fp,"  virtual relocInfo::relocType disp_reloc() const {");
2486     fprintf(fp,  "  return _c%d->reloc();", idx);
2487     fprintf(fp, " }\n");
2488   }
2489 }
2490 
2491 // Generate code for internal and external format methods
2492 //
2493 // internal access to reg# node->_idx
2494 // access to subsumed constant _c0, _c1,
2495 void  OperandForm::int_format(FILE *fp, FormDict &globals, uint index) {
2496   Form::DataType dtype;
2497   if (_matrule && (_matrule->is_base_register(globals) ||
2498                    strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
2499     // !!!!! !!!!!
2500     fprintf(fp,"  { char reg_str[128];\n");
2501     fprintf(fp,"    ra->dump_register(node,reg_str);\n");
2502     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2503     fprintf(fp,"  }\n");
2504   } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
2505     format_constant( fp, index, dtype );
2506   } else if (ideal_to_sReg_type(_ident) != Form::none) {
2507     // Special format for Stack Slot Register
2508     fprintf(fp,"  { char reg_str[128];\n");
2509     fprintf(fp,"    ra->dump_register(node,reg_str);\n");
2510     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2511     fprintf(fp,"  }\n");
2512   } else {
2513     fprintf(fp,"  st->print(\"No format defined for %s\n\");\n", _ident);
2514     fflush(fp);
2515     fprintf(stderr,"No format defined for %s\n", _ident);
2516     dump();
2517     assert( false,"Internal error:\n  output_internal_operand() attempting to output other than a Register or Constant");
2518   }
2519 }
2520 
2521 // Similar to "int_format" but for cases where data is external to operand
2522 // external access to reg# node->in(idx)->_idx,
2523 void  OperandForm::ext_format(FILE *fp, FormDict &globals, uint index) {
2524   Form::DataType dtype;
2525   if (_matrule && (_matrule->is_base_register(globals) ||
2526                    strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) {
2527     fprintf(fp,"  { char reg_str[128];\n");
2528     fprintf(fp,"    ra->dump_register(node->in(idx");
2529     if ( index != 0 ) fprintf(fp,              "+%d",index);
2530     fprintf(fp,                                      "),reg_str);\n");
2531     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2532     fprintf(fp,"  }\n");
2533   } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) {
2534     format_constant( fp, index, dtype );
2535   } else if (ideal_to_sReg_type(_ident) != Form::none) {
2536     // Special format for Stack Slot Register
2537     fprintf(fp,"  { char reg_str[128];\n");
2538     fprintf(fp,"    ra->dump_register(node->in(idx");
2539     if ( index != 0 ) fprintf(fp,                  "+%d",index);
2540     fprintf(fp,                                       "),reg_str);\n");
2541     fprintf(fp,"    st->print(\"%cs\",reg_str);\n",'%');
2542     fprintf(fp,"  }\n");
2543   } else {
2544     fprintf(fp,"  st->print(\"No format defined for %s\n\");\n", _ident);
2545     assert( false,"Internal error:\n  output_external_operand() attempting to output other than a Register or Constant");
2546   }
2547 }
2548 
2549 void OperandForm::format_constant(FILE *fp, uint const_index, uint const_type) {
2550   switch(const_type) {
2551   case Form::idealI: fprintf(fp,"  st->print(\"#%%d\", _c%d);\n", const_index); break;
2552   case Form::idealP: fprintf(fp,"  if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break;
2553   case Form::idealNKlass:
2554   case Form::idealN: fprintf(fp,"  if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break;
2555   case Form::idealL: fprintf(fp,"  st->print(\"#\" INT64_FORMAT, (int64_t)_c%d);\n", const_index); break;
2556   case Form::idealF: fprintf(fp,"  st->print(\"#%%f\", _c%d);\n", const_index); break;
2557   case Form::idealD: fprintf(fp,"  st->print(\"#%%f\", _c%d);\n", const_index); break;
2558   default:
2559     assert( false, "ShouldNotReachHere()");
2560   }
2561 }
2562 
2563 // Return the operand form corresponding to the given index, else NULL.
2564 OperandForm *OperandForm::constant_operand(FormDict &globals,
2565                                            uint      index) {
2566   // !!!!!
2567   // Check behavior on complex operands
2568   uint n_consts = num_consts(globals);
2569   if( n_consts > 0 ) {
2570     uint i = 0;
2571     const char *type;
2572     Component  *comp;
2573     _components.reset();
2574     if ((comp = _components.iter()) == NULL) {
2575       assert(n_consts == 1, "Bad component list detected.\n");
2576       // Current operand is THE operand
2577       if ( index == 0 ) {
2578         return this;
2579       }
2580     } // end if NULL
2581     else {
2582       // Skip the first component, it can not be a DEF of a constant
2583       do {
2584         type = comp->base_type(globals);
2585         // Check that "type" is a 'ConI', 'ConP', ...
2586         if ( ideal_to_const_type(type) != Form::none ) {
2587           // When at correct component, get corresponding Operand
2588           if ( index == 0 ) {
2589             return globals[comp->_type]->is_operand();
2590           }
2591           // Decrement number of constants to go
2592           --index;
2593         }
2594       } while((comp = _components.iter()) != NULL);
2595     }
2596   }
2597 
2598   // Did not find a constant for this index.
2599   return NULL;
2600 }
2601 
2602 // If this operand has a single ideal type, return its type
2603 Form::DataType OperandForm::simple_type(FormDict &globals) const {
2604   const char *type_name = ideal_type(globals);
2605   Form::DataType type   = type_name ? ideal_to_const_type( type_name )
2606                                     : Form::none;
2607   return type;
2608 }
2609 
2610 Form::DataType OperandForm::is_base_constant(FormDict &globals) const {
2611   if ( _matrule == NULL )    return Form::none;
2612 
2613   return _matrule->is_base_constant(globals);
2614 }
2615 
2616 // "true" if this operand is a simple type that is swallowed
2617 bool  OperandForm::swallowed(FormDict &globals) const {
2618   Form::DataType type   = simple_type(globals);
2619   if( type != Form::none ) {
2620     return true;
2621   }
2622 
2623   return false;
2624 }
2625 
2626 // Output code to access the value of the index'th constant
2627 void OperandForm::access_constant(FILE *fp, FormDict &globals,
2628                                   uint const_index) {
2629   OperandForm *oper = constant_operand(globals, const_index);
2630   assert( oper, "Index exceeds number of constants in operand");
2631   Form::DataType dtype = oper->is_base_constant(globals);
2632 
2633   switch(dtype) {
2634   case idealI: fprintf(fp,"_c%d",           const_index); break;
2635   case idealP: fprintf(fp,"_c%d->get_con()",const_index); break;
2636   case idealL: fprintf(fp,"_c%d",           const_index); break;
2637   case idealF: fprintf(fp,"_c%d",           const_index); break;
2638   case idealD: fprintf(fp,"_c%d",           const_index); break;
2639   default:
2640     assert( false, "ShouldNotReachHere()");
2641   }
2642 }
2643 
2644 
2645 void OperandForm::dump() {
2646   output(stderr);
2647 }
2648 
2649 void OperandForm::output(FILE *fp) {
2650   fprintf(fp,"\nOperand: %s\n", (_ident?_ident:""));
2651   if (_matrule)    _matrule->dump();
2652   if (_interface)  _interface->dump();
2653   if (_attribs)    _attribs->dump();
2654   if (_predicate)  _predicate->dump();
2655   if (_constraint) _constraint->dump();
2656   if (_construct)  _construct->dump();
2657   if (_format)     _format->dump();
2658 }
2659 
2660 //------------------------------Constraint-------------------------------------
2661 Constraint::Constraint(const char *func, const char *arg)
2662   : _func(func), _arg(arg) {
2663 }
2664 Constraint::~Constraint() { /* not owner of char* */
2665 }
2666 
2667 bool Constraint::stack_slots_only() const {
2668   return strcmp(_func, "ALLOC_IN_RC") == 0
2669       && strcmp(_arg,  "stack_slots") == 0;
2670 }
2671 
2672 void Constraint::dump() {
2673   output(stderr);
2674 }
2675 
2676 void Constraint::output(FILE *fp) {           // Write info to output files
2677   assert((_func != NULL && _arg != NULL),"missing constraint function or arg");
2678   fprintf(fp,"Constraint: %s ( %s )\n", _func, _arg);
2679 }
2680 
2681 //------------------------------Predicate--------------------------------------
2682 Predicate::Predicate(char *pr)
2683   : _pred(pr) {
2684 }
2685 Predicate::~Predicate() {
2686 }
2687 
2688 void Predicate::dump() {
2689   output(stderr);
2690 }
2691 
2692 void Predicate::output(FILE *fp) {
2693   fprintf(fp,"Predicate");  // Write to output files
2694 }
2695 //------------------------------Interface--------------------------------------
2696 Interface::Interface(const char *name) : _name(name) {
2697 }
2698 Interface::~Interface() {
2699 }
2700 
2701 Form::InterfaceType Interface::interface_type(FormDict &globals) const {
2702   Interface *thsi = (Interface*)this;
2703   if ( thsi->is_RegInterface()   ) return Form::register_interface;
2704   if ( thsi->is_MemInterface()   ) return Form::memory_interface;
2705   if ( thsi->is_ConstInterface() ) return Form::constant_interface;
2706   if ( thsi->is_CondInterface()  ) return Form::conditional_interface;
2707 
2708   return Form::no_interface;
2709 }
2710 
2711 RegInterface   *Interface::is_RegInterface() {
2712   if ( strcmp(_name,"REG_INTER") != 0 )
2713     return NULL;
2714   return (RegInterface*)this;
2715 }
2716 MemInterface   *Interface::is_MemInterface() {
2717   if ( strcmp(_name,"MEMORY_INTER") != 0 )  return NULL;
2718   return (MemInterface*)this;
2719 }
2720 ConstInterface *Interface::is_ConstInterface() {
2721   if ( strcmp(_name,"CONST_INTER") != 0 )  return NULL;
2722   return (ConstInterface*)this;
2723 }
2724 CondInterface  *Interface::is_CondInterface() {
2725   if ( strcmp(_name,"COND_INTER") != 0 )  return NULL;
2726   return (CondInterface*)this;
2727 }
2728 
2729 
2730 void Interface::dump() {
2731   output(stderr);
2732 }
2733 
2734 // Write info to output files
2735 void Interface::output(FILE *fp) {
2736   fprintf(fp,"Interface: %s\n", (_name ? _name : "") );
2737 }
2738 
2739 //------------------------------RegInterface-----------------------------------
2740 RegInterface::RegInterface() : Interface("REG_INTER") {
2741 }
2742 RegInterface::~RegInterface() {
2743 }
2744 
2745 void RegInterface::dump() {
2746   output(stderr);
2747 }
2748 
2749 // Write info to output files
2750 void RegInterface::output(FILE *fp) {
2751   Interface::output(fp);
2752 }
2753 
2754 //------------------------------ConstInterface---------------------------------
2755 ConstInterface::ConstInterface() : Interface("CONST_INTER") {
2756 }
2757 ConstInterface::~ConstInterface() {
2758 }
2759 
2760 void ConstInterface::dump() {
2761   output(stderr);
2762 }
2763 
2764 // Write info to output files
2765 void ConstInterface::output(FILE *fp) {
2766   Interface::output(fp);
2767 }
2768 
2769 //------------------------------MemInterface-----------------------------------
2770 MemInterface::MemInterface(char *base, char *index, char *scale, char *disp)
2771   : Interface("MEMORY_INTER"), _base(base), _index(index), _scale(scale), _disp(disp) {
2772 }
2773 MemInterface::~MemInterface() {
2774   // not owner of any character arrays
2775 }
2776 
2777 void MemInterface::dump() {
2778   output(stderr);
2779 }
2780 
2781 // Write info to output files
2782 void MemInterface::output(FILE *fp) {
2783   Interface::output(fp);
2784   if ( _base  != NULL ) fprintf(fp,"  base  == %s\n", _base);
2785   if ( _index != NULL ) fprintf(fp,"  index == %s\n", _index);
2786   if ( _scale != NULL ) fprintf(fp,"  scale == %s\n", _scale);
2787   if ( _disp  != NULL ) fprintf(fp,"  disp  == %s\n", _disp);
2788   // fprintf(fp,"\n");
2789 }
2790 
2791 //------------------------------CondInterface----------------------------------
2792 CondInterface::CondInterface(const char* equal,         const char* equal_format,
2793                              const char* not_equal,     const char* not_equal_format,
2794                              const char* less,          const char* less_format,
2795                              const char* greater_equal, const char* greater_equal_format,
2796                              const char* less_equal,    const char* less_equal_format,
2797                              const char* greater,       const char* greater_format,
2798                              const char* overflow,      const char* overflow_format,
2799                              const char* no_overflow,   const char* no_overflow_format)
2800   : Interface("COND_INTER"),
2801     _equal(equal),                 _equal_format(equal_format),
2802     _not_equal(not_equal),         _not_equal_format(not_equal_format),
2803     _less(less),                   _less_format(less_format),
2804     _greater_equal(greater_equal), _greater_equal_format(greater_equal_format),
2805     _less_equal(less_equal),       _less_equal_format(less_equal_format),
2806     _greater(greater),             _greater_format(greater_format),
2807     _overflow(overflow),           _overflow_format(overflow_format),
2808     _no_overflow(no_overflow),     _no_overflow_format(no_overflow_format) {
2809 }
2810 CondInterface::~CondInterface() {
2811   // not owner of any character arrays
2812 }
2813 
2814 void CondInterface::dump() {
2815   output(stderr);
2816 }
2817 
2818 // Write info to output files
2819 void CondInterface::output(FILE *fp) {
2820   Interface::output(fp);
2821   if ( _equal  != NULL )     fprintf(fp," equal        == %s\n", _equal);
2822   if ( _not_equal  != NULL ) fprintf(fp," not_equal    == %s\n", _not_equal);
2823   if ( _less  != NULL )      fprintf(fp," less         == %s\n", _less);
2824   if ( _greater_equal  != NULL ) fprintf(fp," greater_equal    == %s\n", _greater_equal);
2825   if ( _less_equal  != NULL ) fprintf(fp," less_equal   == %s\n", _less_equal);
2826   if ( _greater  != NULL )    fprintf(fp," greater      == %s\n", _greater);
2827   if ( _overflow != NULL )    fprintf(fp," overflow     == %s\n", _overflow);
2828   if ( _no_overflow != NULL ) fprintf(fp," no_overflow  == %s\n", _no_overflow);
2829   // fprintf(fp,"\n");
2830 }
2831 
2832 //------------------------------ConstructRule----------------------------------
2833 ConstructRule::ConstructRule(char *cnstr)
2834   : _construct(cnstr) {
2835 }
2836 ConstructRule::~ConstructRule() {
2837 }
2838 
2839 void ConstructRule::dump() {
2840   output(stderr);
2841 }
2842 
2843 void ConstructRule::output(FILE *fp) {
2844   fprintf(fp,"\nConstruct Rule\n");  // Write to output files
2845 }
2846 
2847 
2848 //==============================Shared Forms===================================
2849 //------------------------------AttributeForm----------------------------------
2850 int         AttributeForm::_insId   = 0;           // start counter at 0
2851 int         AttributeForm::_opId    = 0;           // start counter at 0
2852 const char* AttributeForm::_ins_cost = "ins_cost"; // required name
2853 const char* AttributeForm::_op_cost  = "op_cost";  // required name
2854 
2855 AttributeForm::AttributeForm(char *attr, int type, char *attrdef)
2856   : Form(Form::ATTR), _attrname(attr), _atype(type), _attrdef(attrdef) {
2857     if (type==OP_ATTR) {
2858       id = ++_opId;
2859     }
2860     else if (type==INS_ATTR) {
2861       id = ++_insId;
2862     }
2863     else assert( false,"");
2864 }
2865 AttributeForm::~AttributeForm() {
2866 }
2867 
2868 // Dynamic type check
2869 AttributeForm *AttributeForm::is_attribute() const {
2870   return (AttributeForm*)this;
2871 }
2872 
2873 
2874 // inlined  // int  AttributeForm::type() { return id;}
2875 
2876 void AttributeForm::dump() {
2877   output(stderr);
2878 }
2879 
2880 void AttributeForm::output(FILE *fp) {
2881   if( _attrname && _attrdef ) {
2882     fprintf(fp,"\n// AttributeForm \nstatic const int %s = %s;\n",
2883             _attrname, _attrdef);
2884   }
2885   else {
2886     fprintf(fp,"\n// AttributeForm missing name %s or definition %s\n",
2887             (_attrname?_attrname:""), (_attrdef?_attrdef:"") );
2888   }
2889 }
2890 
2891 //------------------------------Component--------------------------------------
2892 Component::Component(const char *name, const char *type, int usedef)
2893   : _name(name), _type(type), _usedef(usedef) {
2894     _ftype = Form::COMP;
2895 }
2896 Component::~Component() {
2897 }
2898 
2899 // True if this component is equal to the parameter.
2900 bool Component::is(int use_def_kill_enum) const {
2901   return (_usedef == use_def_kill_enum ? true : false);
2902 }
2903 // True if this component is used/def'd/kill'd as the parameter suggests.
2904 bool Component::isa(int use_def_kill_enum) const {
2905   return (_usedef & use_def_kill_enum) == use_def_kill_enum;
2906 }
2907 
2908 // Extend this component with additional use/def/kill behavior
2909 int Component::promote_use_def_info(int new_use_def) {
2910   _usedef |= new_use_def;
2911 
2912   return _usedef;
2913 }
2914 
2915 // Check the base type of this component, if it has one
2916 const char *Component::base_type(FormDict &globals) {
2917   const Form *frm = globals[_type];
2918   if (frm == NULL) return NULL;
2919   OperandForm *op = frm->is_operand();
2920   if (op == NULL) return NULL;
2921   if (op->ideal_only()) return op->_ident;
2922   return (char *)op->ideal_type(globals);
2923 }
2924 
2925 void Component::dump() {
2926   output(stderr);
2927 }
2928 
2929 void Component::output(FILE *fp) {
2930   fprintf(fp,"Component:");  // Write to output files
2931   fprintf(fp, "  name = %s", _name);
2932   fprintf(fp, ", type = %s", _type);
2933   assert(_usedef != 0, "unknown effect");
2934   fprintf(fp, ", use/def = %s\n", getUsedefName());
2935 }
2936 
2937 
2938 //------------------------------ComponentList---------------------------------
2939 ComponentList::ComponentList() : NameList(), _matchcnt(0) {
2940 }
2941 ComponentList::~ComponentList() {
2942   // // This list may not own its elements if copied via assignment
2943   // Component *component;
2944   // for (reset(); (component = iter()) != NULL;) {
2945   //   delete component;
2946   // }
2947 }
2948 
2949 void   ComponentList::insert(Component *component, bool mflag) {
2950   NameList::addName((char *)component);
2951   if(mflag) _matchcnt++;
2952 }
2953 void   ComponentList::insert(const char *name, const char *opType, int usedef,
2954                              bool mflag) {
2955   Component * component = new Component(name, opType, usedef);
2956   insert(component, mflag);
2957 }
2958 Component *ComponentList::current() { return (Component*)NameList::current(); }
2959 Component *ComponentList::iter()    { return (Component*)NameList::iter(); }
2960 Component *ComponentList::match_iter() {
2961   if(_iter < _matchcnt) return (Component*)NameList::iter();
2962   return NULL;
2963 }
2964 Component *ComponentList::post_match_iter() {
2965   Component *comp = iter();
2966   // At end of list?
2967   if ( comp == NULL ) {
2968     return comp;
2969   }
2970   // In post-match components?
2971   if (_iter > match_count()-1) {
2972     return comp;
2973   }
2974 
2975   return post_match_iter();
2976 }
2977 
2978 void       ComponentList::reset()   { NameList::reset(); }
2979 int        ComponentList::count()   { return NameList::count(); }
2980 
2981 Component *ComponentList::operator[](int position) {
2982   // Shortcut complete iteration if there are not enough entries
2983   if (position >= count()) return NULL;
2984 
2985   int        index     = 0;
2986   Component *component = NULL;
2987   for (reset(); (component = iter()) != NULL;) {
2988     if (index == position) {
2989       return component;
2990     }
2991     ++index;
2992   }
2993 
2994   return NULL;
2995 }
2996 
2997 const Component *ComponentList::search(const char *name) {
2998   PreserveIter pi(this);
2999   reset();
3000   for( Component *comp = NULL; ((comp = iter()) != NULL); ) {
3001     if( strcmp(comp->_name,name) == 0 ) return comp;
3002   }
3003 
3004   return NULL;
3005 }
3006 
3007 // Return number of USEs + number of DEFs
3008 // When there are no components, or the first component is a USE,
3009 // then we add '1' to hold a space for the 'result' operand.
3010 int ComponentList::num_operands() {
3011   PreserveIter pi(this);
3012   uint       count = 1;           // result operand
3013   uint       position = 0;
3014 
3015   Component *component  = NULL;
3016   for( reset(); (component = iter()) != NULL; ++position ) {
3017     if( component->isa(Component::USE) ||
3018         ( position == 0 && (! component->isa(Component::DEF))) ) {
3019       ++count;
3020     }
3021   }
3022 
3023   return count;
3024 }
3025 
3026 // Return zero-based position of operand 'name' in list;  -1 if not in list.
3027 // if parameter 'usedef' is ::USE, it will match USE, USE_DEF, ...
3028 int ComponentList::operand_position(const char *name, int usedef, Form *fm) {
3029   PreserveIter pi(this);
3030   int position = 0;
3031   int num_opnds = num_operands();
3032   Component *component;
3033   Component* preceding_non_use = NULL;
3034   Component* first_def = NULL;
3035   for (reset(); (component = iter()) != NULL; ++position) {
3036     // When the first component is not a DEF,
3037     // leave space for the result operand!
3038     if ( position==0 && (! component->isa(Component::DEF)) ) {
3039       ++position;
3040       ++num_opnds;
3041     }
3042     if (strcmp(name, component->_name)==0 && (component->isa(usedef))) {
3043       // When the first entry in the component list is a DEF and a USE
3044       // Treat them as being separate, a DEF first, then a USE
3045       if( position==0
3046           && usedef==Component::USE && component->isa(Component::DEF) ) {
3047         assert(position+1 < num_opnds, "advertised index in bounds");
3048         return position+1;
3049       } else {
3050         if( preceding_non_use && strcmp(component->_name, preceding_non_use->_name) ) {
3051           fprintf(stderr, "the name '%s(%s)' should not precede the name '%s(%s)'",
3052                   preceding_non_use->_name, preceding_non_use->getUsedefName(),
3053                   name, component->getUsedefName());
3054           if (fm && fm->is_instruction()) fprintf(stderr,  "in form '%s'", fm->is_instruction()->_ident);
3055           if (fm && fm->is_operand()) fprintf(stderr,  "in form '%s'", fm->is_operand()->_ident);
3056           fprintf(stderr,  "\n");
3057         }
3058         if( position >= num_opnds ) {
3059           fprintf(stderr, "the name '%s' is too late in its name list", name);
3060           if (fm && fm->is_instruction()) fprintf(stderr,  "in form '%s'", fm->is_instruction()->_ident);
3061           if (fm && fm->is_operand()) fprintf(stderr,  "in form '%s'", fm->is_operand()->_ident);
3062           fprintf(stderr,  "\n");
3063         }
3064         assert(position < num_opnds, "advertised index in bounds");
3065         return position;
3066       }
3067     }
3068     if( component->isa(Component::DEF)
3069         && component->isa(Component::USE) ) {
3070       ++position;
3071       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3072     }
3073     if( component->isa(Component::DEF) && !first_def ) {
3074       first_def = component;
3075     }
3076     if( !component->isa(Component::USE) && component != first_def ) {
3077       preceding_non_use = component;
3078     } else if( preceding_non_use && !strcmp(component->_name, preceding_non_use->_name) ) {
3079       preceding_non_use = NULL;
3080     }
3081   }
3082   return Not_in_list;
3083 }
3084 
3085 // Find position for this name, regardless of use/def information
3086 int ComponentList::operand_position(const char *name) {
3087   PreserveIter pi(this);
3088   int position = 0;
3089   Component *component;
3090   for (reset(); (component = iter()) != NULL; ++position) {
3091     // When the first component is not a DEF,
3092     // leave space for the result operand!
3093     if ( position==0 && (! component->isa(Component::DEF)) ) {
3094       ++position;
3095     }
3096     if (strcmp(name, component->_name)==0) {
3097       return position;
3098     }
3099     if( component->isa(Component::DEF)
3100         && component->isa(Component::USE) ) {
3101       ++position;
3102       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3103     }
3104   }
3105   return Not_in_list;
3106 }
3107 
3108 int ComponentList::operand_position_format(const char *name, Form *fm) {
3109   PreserveIter pi(this);
3110   int  first_position = operand_position(name);
3111   int  use_position   = operand_position(name, Component::USE, fm);
3112 
3113   return ((first_position < use_position) ? use_position : first_position);
3114 }
3115 
3116 int ComponentList::label_position() {
3117   PreserveIter pi(this);
3118   int position = 0;
3119   reset();
3120   for( Component *comp; (comp = iter()) != NULL; ++position) {
3121     // When the first component is not a DEF,
3122     // leave space for the result operand!
3123     if ( position==0 && (! comp->isa(Component::DEF)) ) {
3124       ++position;
3125     }
3126     if (strcmp(comp->_type, "label")==0) {
3127       return position;
3128     }
3129     if( comp->isa(Component::DEF)
3130         && comp->isa(Component::USE) ) {
3131       ++position;
3132       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3133     }
3134   }
3135 
3136   return -1;
3137 }
3138 
3139 int ComponentList::method_position() {
3140   PreserveIter pi(this);
3141   int position = 0;
3142   reset();
3143   for( Component *comp; (comp = iter()) != NULL; ++position) {
3144     // When the first component is not a DEF,
3145     // leave space for the result operand!
3146     if ( position==0 && (! comp->isa(Component::DEF)) ) {
3147       ++position;
3148     }
3149     if (strcmp(comp->_type, "method")==0) {
3150       return position;
3151     }
3152     if( comp->isa(Component::DEF)
3153         && comp->isa(Component::USE) ) {
3154       ++position;
3155       if( position != 1 )  --position;   // only use two slots for the 1st USE_DEF
3156     }
3157   }
3158 
3159   return -1;
3160 }
3161 
3162 void ComponentList::dump() { output(stderr); }
3163 
3164 void ComponentList::output(FILE *fp) {
3165   PreserveIter pi(this);
3166   fprintf(fp, "\n");
3167   Component *component;
3168   for (reset(); (component = iter()) != NULL;) {
3169     component->output(fp);
3170   }
3171   fprintf(fp, "\n");
3172 }
3173 
3174 //------------------------------MatchNode--------------------------------------
3175 MatchNode::MatchNode(ArchDesc &ad, const char *result, const char *mexpr,
3176                      const char *opType, MatchNode *lChild, MatchNode *rChild)
3177   : _AD(ad), _result(result), _name(mexpr), _opType(opType),
3178     _lChild(lChild), _rChild(rChild), _internalop(0), _numleaves(0),
3179     _commutative_id(0) {
3180   _numleaves = (lChild ? lChild->_numleaves : 0)
3181                + (rChild ? rChild->_numleaves : 0);
3182 }
3183 
3184 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode)
3185   : _AD(ad), _result(mnode._result), _name(mnode._name),
3186     _opType(mnode._opType), _lChild(mnode._lChild), _rChild(mnode._rChild),
3187     _internalop(0), _numleaves(mnode._numleaves),
3188     _commutative_id(mnode._commutative_id) {
3189 }
3190 
3191 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode, int clone)
3192   : _AD(ad), _result(mnode._result), _name(mnode._name),
3193     _opType(mnode._opType),
3194     _internalop(0), _numleaves(mnode._numleaves),
3195     _commutative_id(mnode._commutative_id) {
3196   if (mnode._lChild) {
3197     _lChild = new MatchNode(ad, *mnode._lChild, clone);
3198   } else {
3199     _lChild = NULL;
3200   }
3201   if (mnode._rChild) {
3202     _rChild = new MatchNode(ad, *mnode._rChild, clone);
3203   } else {
3204     _rChild = NULL;
3205   }
3206 }
3207 
3208 MatchNode::~MatchNode() {
3209   // // This node may not own its children if copied via assignment
3210   // if( _lChild ) delete _lChild;
3211   // if( _rChild ) delete _rChild;
3212 }
3213 
3214 bool  MatchNode::find_type(const char *type, int &position) const {
3215   if ( (_lChild != NULL) && (_lChild->find_type(type, position)) ) return true;
3216   if ( (_rChild != NULL) && (_rChild->find_type(type, position)) ) return true;
3217 
3218   if (strcmp(type,_opType)==0)  {
3219     return true;
3220   } else {
3221     ++position;
3222   }
3223   return false;
3224 }
3225 
3226 // Recursive call collecting info on top-level operands, not transitive.
3227 // Implementation does not modify state of internal structures.
3228 void MatchNode::append_components(FormDict& locals, ComponentList& components,
3229                                   bool def_flag) const {
3230   int usedef = def_flag ? Component::DEF : Component::USE;
3231   FormDict &globals = _AD.globalNames();
3232 
3233   assert (_name != NULL, "MatchNode::build_components encountered empty node\n");
3234   // Base case
3235   if (_lChild==NULL && _rChild==NULL) {
3236     // If _opType is not an operation, do not build a component for it #####
3237     const Form *f = globals[_opType];
3238     if( f != NULL ) {
3239       // Add non-ideals that are operands, operand-classes,
3240       if( ! f->ideal_only()
3241           && (f->is_opclass() || f->is_operand()) ) {
3242         components.insert(_name, _opType, usedef, true);
3243       }
3244     }
3245     return;
3246   }
3247   // Promote results of "Set" to DEF
3248   bool tmpdef_flag = (!strcmp(_opType, "Set")) ? true : false;
3249   if (_lChild) _lChild->append_components(locals, components, tmpdef_flag);
3250   tmpdef_flag = false;   // only applies to component immediately following 'Set'
3251   if (_rChild) _rChild->append_components(locals, components, tmpdef_flag);
3252 }
3253 
3254 // Find the n'th base-operand in the match node,
3255 // recursively investigates match rules of user-defined operands.
3256 //
3257 // Implementation does not modify state of internal structures since they
3258 // can be shared.
3259 bool MatchNode::base_operand(uint &position, FormDict &globals,
3260                              const char * &result, const char * &name,
3261                              const char * &opType) const {
3262   assert (_name != NULL, "MatchNode::base_operand encountered empty node\n");
3263   // Base case
3264   if (_lChild==NULL && _rChild==NULL) {
3265     // Check for special case: "Universe", "label"
3266     if (strcmp(_opType,"Universe") == 0 || strcmp(_opType,"label")==0 ) {
3267       if (position == 0) {
3268         result = _result;
3269         name   = _name;
3270         opType = _opType;
3271         return 1;
3272       } else {
3273         -- position;
3274         return 0;
3275       }
3276     }
3277 
3278     const Form *form = globals[_opType];
3279     MatchNode *matchNode = NULL;
3280     // Check for user-defined type
3281     if (form) {
3282       // User operand or instruction?
3283       OperandForm  *opForm = form->is_operand();
3284       InstructForm *inForm = form->is_instruction();
3285       if ( opForm ) {
3286         matchNode = (MatchNode*)opForm->_matrule;
3287       } else if ( inForm ) {
3288         matchNode = (MatchNode*)inForm->_matrule;
3289       }
3290     }
3291     // if this is user-defined, recurse on match rule
3292     // User-defined operand and instruction forms have a match-rule.
3293     if (matchNode) {
3294       return (matchNode->base_operand(position,globals,result,name,opType));
3295     } else {
3296       // Either not a form, or a system-defined form (no match rule).
3297       if (position==0) {
3298         result = _result;
3299         name   = _name;
3300         opType = _opType;
3301         return 1;
3302       } else {
3303         --position;
3304         return 0;
3305       }
3306     }
3307 
3308   } else {
3309     // Examine the left child and right child as well
3310     if (_lChild) {
3311       if (_lChild->base_operand(position, globals, result, name, opType))
3312         return 1;
3313     }
3314 
3315     if (_rChild) {
3316       if (_rChild->base_operand(position, globals, result, name, opType))
3317         return 1;
3318     }
3319   }
3320 
3321   return 0;
3322 }
3323 
3324 // Recursive call on all operands' match rules in my match rule.
3325 uint  MatchNode::num_consts(FormDict &globals) const {
3326   uint        index      = 0;
3327   uint        num_consts = 0;
3328   const char *result;
3329   const char *name;
3330   const char *opType;
3331 
3332   for (uint position = index;
3333        base_operand(position,globals,result,name,opType); position = index) {
3334     ++index;
3335     if( ideal_to_const_type(opType) )        num_consts++;
3336   }
3337 
3338   return num_consts;
3339 }
3340 
3341 // Recursive call on all operands' match rules in my match rule.
3342 // Constants in match rule subtree with specified type
3343 uint  MatchNode::num_consts(FormDict &globals, Form::DataType type) const {
3344   uint        index      = 0;
3345   uint        num_consts = 0;
3346   const char *result;
3347   const char *name;
3348   const char *opType;
3349 
3350   for (uint position = index;
3351        base_operand(position,globals,result,name,opType); position = index) {
3352     ++index;
3353     if( ideal_to_const_type(opType) == type ) num_consts++;
3354   }
3355 
3356   return num_consts;
3357 }
3358 
3359 // Recursive call on all operands' match rules in my match rule.
3360 uint  MatchNode::num_const_ptrs(FormDict &globals) const {
3361   return  num_consts( globals, Form::idealP );
3362 }
3363 
3364 bool  MatchNode::sets_result() const {
3365   return   ( (strcmp(_name,"Set") == 0) ? true : false );
3366 }
3367 
3368 const char *MatchNode::reduce_right(FormDict &globals) const {
3369   // If there is no right reduction, return NULL.
3370   const char      *rightStr    = NULL;
3371 
3372   // If we are a "Set", start from the right child.
3373   const MatchNode *const mnode = sets_result() ?
3374     (const MatchNode *)this->_rChild :
3375     (const MatchNode *)this;
3376 
3377   // If our right child exists, it is the right reduction
3378   if ( mnode->_rChild ) {
3379     rightStr = mnode->_rChild->_internalop ? mnode->_rChild->_internalop
3380       : mnode->_rChild->_opType;
3381   }
3382   // Else, May be simple chain rule: (Set dst operand_form), rightStr=NULL;
3383   return rightStr;
3384 }
3385 
3386 const char *MatchNode::reduce_left(FormDict &globals) const {
3387   // If there is no left reduction, return NULL.
3388   const char  *leftStr  = NULL;
3389 
3390   // If we are a "Set", start from the right child.
3391   const MatchNode *const mnode = sets_result() ?
3392     (const MatchNode *)this->_rChild :
3393     (const MatchNode *)this;
3394 
3395   // If our left child exists, it is the left reduction
3396   if ( mnode->_lChild ) {
3397     leftStr = mnode->_lChild->_internalop ? mnode->_lChild->_internalop
3398       : mnode->_lChild->_opType;
3399   } else {
3400     // May be simple chain rule: (Set dst operand_form_source)
3401     if ( sets_result() ) {
3402       OperandForm *oper = globals[mnode->_opType]->is_operand();
3403       if( oper ) {
3404         leftStr = mnode->_opType;
3405       }
3406     }
3407   }
3408   return leftStr;
3409 }
3410 
3411 //------------------------------count_instr_names------------------------------
3412 // Count occurrences of operands names in the leaves of the instruction
3413 // match rule.
3414 void MatchNode::count_instr_names( Dict &names ) {
3415   if( _lChild ) _lChild->count_instr_names(names);
3416   if( _rChild ) _rChild->count_instr_names(names);
3417   if( !_lChild && !_rChild ) {
3418     uintptr_t cnt = (uintptr_t)names[_name];
3419     cnt++;                      // One more name found
3420     names.Insert(_name,(void*)cnt);
3421   }
3422 }
3423 
3424 //------------------------------build_instr_pred-------------------------------
3425 // Build a path to 'name' in buf.  Actually only build if cnt is zero, so we
3426 // can skip some leading instances of 'name'.
3427 int MatchNode::build_instr_pred( char *buf, const char *name, int cnt ) {
3428   if( _lChild ) {
3429     if( !cnt ) strcpy( buf, "_kids[0]->" );
3430     cnt = _lChild->build_instr_pred( buf+strlen(buf), name, cnt );
3431     if( cnt < 0 ) return cnt;   // Found it, all done
3432   }
3433   if( _rChild ) {
3434     if( !cnt ) strcpy( buf, "_kids[1]->" );
3435     cnt = _rChild->build_instr_pred( buf+strlen(buf), name, cnt );
3436     if( cnt < 0 ) return cnt;   // Found it, all done
3437   }
3438   if( !_lChild && !_rChild ) {  // Found a leaf
3439     // Wrong name?  Give up...
3440     if( strcmp(name,_name) ) return cnt;
3441     if( !cnt ) strcpy(buf,"_leaf");
3442     return cnt-1;
3443   }
3444   return cnt;
3445 }
3446 
3447 
3448 //------------------------------build_internalop-------------------------------
3449 // Build string representation of subtree
3450 void MatchNode::build_internalop( ) {
3451   char *iop, *subtree;
3452   const char *lstr, *rstr;
3453   // Build string representation of subtree
3454   // Operation lchildType rchildType
3455   int len = (int)strlen(_opType) + 4;
3456   lstr = (_lChild) ? ((_lChild->_internalop) ?
3457                        _lChild->_internalop : _lChild->_opType) : "";
3458   rstr = (_rChild) ? ((_rChild->_internalop) ?
3459                        _rChild->_internalop : _rChild->_opType) : "";
3460   len += (int)strlen(lstr) + (int)strlen(rstr);
3461   subtree = (char *)AllocateHeap(len);
3462   sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
3463   // Hash the subtree string in _internalOps; if a name exists, use it
3464   iop = (char *)_AD._internalOps[subtree];
3465   // Else create a unique name, and add it to the hash table
3466   if (iop == NULL) {
3467     iop = subtree;
3468     _AD._internalOps.Insert(subtree, iop);
3469     _AD._internalOpNames.addName(iop);
3470     _AD._internalMatch.Insert(iop, this);
3471   }
3472   // Add the internal operand name to the MatchNode
3473   _internalop = iop;
3474   _result = iop;
3475 }
3476 
3477 
3478 void MatchNode::dump() {
3479   output(stderr);
3480 }
3481 
3482 void MatchNode::output(FILE *fp) {
3483   if (_lChild==0 && _rChild==0) {
3484     fprintf(fp," %s",_name);    // operand
3485   }
3486   else {
3487     fprintf(fp," (%s ",_name);  // " (opcodeName "
3488     if(_lChild) _lChild->output(fp); //               left operand
3489     if(_rChild) _rChild->output(fp); //                    right operand
3490     fprintf(fp,")");                 //                                 ")"
3491   }
3492 }
3493 
3494 int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
3495   static const char *needs_ideal_memory_list[] = {
3496     "StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" ,
3497     "StoreB","StoreC","Store" ,"StoreFP",
3498     "LoadI", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF"  ,
3499     "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
3500     "StoreVector", "LoadVector",
3501     "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
3502     "LoadPLocked",
3503     "StorePConditional", "StoreIConditional", "StoreLConditional",
3504     "CompareAndSwapB", "CompareAndSwapS", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN",
3505     "WeakCompareAndSwapB", "WeakCompareAndSwapS", "WeakCompareAndSwapI", "WeakCompareAndSwapL", "WeakCompareAndSwapP", "WeakCompareAndSwapN",
3506     "CompareAndExchangeB", "CompareAndExchangeS", "CompareAndExchangeI", "CompareAndExchangeL", "CompareAndExchangeP", "CompareAndExchangeN",
3507 #if INCLUDE_SHENANDOAHGC
3508     "ShenandoahCompareAndSwapN", "ShenandoahCompareAndSwapP", "ShenandoahWeakCompareAndSwapP", "ShenandoahWeakCompareAndSwapN", "ShenandoahCompareAndExchangeP", "ShenandoahCompareAndExchangeN",
3509 #endif
3510     "StoreCM",
3511     "GetAndSetB", "GetAndSetS", "GetAndAddI", "GetAndSetI", "GetAndSetP",
3512     "GetAndAddB", "GetAndAddS", "GetAndAddL", "GetAndSetL", "GetAndSetN",
3513 #if INCLUDE_ZGC
3514     "ZGetAndSetP", "ZCompareAndSwapP", "ZCompareAndExchangeP", "ZWeakCompareAndSwapP",
3515 #endif
3516     "ClearArray"
3517   };
3518   int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*);
3519   if( strcmp(_opType,"PrefetchAllocation")==0 )
3520     return 1;
3521   if( strcmp(_opType,"CacheWB")==0 )
3522     return 1;
3523   if( strcmp(_opType,"CacheWBPreSync")==0 )
3524     return 1;
3525   if( strcmp(_opType,"CacheWBPostSync")==0 )
3526     return 1;
3527   if( _lChild ) {
3528     const char *opType = _lChild->_opType;
3529     for( int i=0; i<cnt; i++ )
3530       if( strcmp(opType,needs_ideal_memory_list[i]) == 0 )
3531         return 1;
3532     if( _lChild->needs_ideal_memory_edge(globals) )
3533       return 1;
3534   }
3535   if( _rChild ) {
3536     const char *opType = _rChild->_opType;
3537     for( int i=0; i<cnt; i++ )
3538       if( strcmp(opType,needs_ideal_memory_list[i]) == 0 )
3539         return 1;
3540     if( _rChild->needs_ideal_memory_edge(globals) )
3541       return 1;
3542   }
3543 
3544   return 0;
3545 }
3546 
3547 // TRUE if defines a derived oop, and so needs a base oop edge present
3548 // post-matching.
3549 int MatchNode::needs_base_oop_edge() const {
3550   if( !strcmp(_opType,"AddP") ) return 1;
3551   if( strcmp(_opType,"Set") ) return 0;
3552   return !strcmp(_rChild->_opType,"AddP");
3553 }
3554 
3555 int InstructForm::needs_base_oop_edge(FormDict &globals) const {
3556   if( is_simple_chain_rule(globals) ) {
3557     const char *src = _matrule->_rChild->_opType;
3558     OperandForm *src_op = globals[src]->is_operand();
3559     assert( src_op, "Not operand class of chain rule" );
3560     return src_op->_matrule ? src_op->_matrule->needs_base_oop_edge() : 0;
3561   }                             // Else check instruction
3562 
3563   return _matrule ? _matrule->needs_base_oop_edge() : 0;
3564 }
3565 
3566 
3567 //-------------------------cisc spilling methods-------------------------------
3568 // helper routines and methods for detecting cisc-spilling instructions
3569 //-------------------------cisc_spill_merge------------------------------------
3570 int MatchNode::cisc_spill_merge(int left_spillable, int right_spillable) {
3571   int cisc_spillable  = Maybe_cisc_spillable;
3572 
3573   // Combine results of left and right checks
3574   if( (left_spillable == Maybe_cisc_spillable) && (right_spillable == Maybe_cisc_spillable) ) {
3575     // neither side is spillable, nor prevents cisc spilling
3576     cisc_spillable = Maybe_cisc_spillable;
3577   }
3578   else if( (left_spillable == Maybe_cisc_spillable) && (right_spillable > Maybe_cisc_spillable) ) {
3579     // right side is spillable
3580     cisc_spillable = right_spillable;
3581   }
3582   else if( (right_spillable == Maybe_cisc_spillable) && (left_spillable > Maybe_cisc_spillable) ) {
3583     // left side is spillable
3584     cisc_spillable = left_spillable;
3585   }
3586   else if( (left_spillable == Not_cisc_spillable) || (right_spillable == Not_cisc_spillable) ) {
3587     // left or right prevents cisc spilling this instruction
3588     cisc_spillable = Not_cisc_spillable;
3589   }
3590   else {
3591     // Only allow one to spill
3592     cisc_spillable = Not_cisc_spillable;
3593   }
3594 
3595   return cisc_spillable;
3596 }
3597 
3598 //-------------------------root_ops_match--------------------------------------
3599 bool static root_ops_match(FormDict &globals, const char *op1, const char *op2) {
3600   // Base Case: check that the current operands/operations match
3601   assert( op1, "Must have op's name");
3602   assert( op2, "Must have op's name");
3603   const Form *form1 = globals[op1];
3604   const Form *form2 = globals[op2];
3605 
3606   return (form1 == form2);
3607 }
3608 
3609 //-------------------------cisc_spill_match_node-------------------------------
3610 // Recursively check two MatchRules for legal conversion via cisc-spilling
3611 int MatchNode::cisc_spill_match(FormDict& globals, RegisterForm* registers, MatchNode* mRule2, const char* &operand, const char* &reg_type) {
3612   int cisc_spillable  = Maybe_cisc_spillable;
3613   int left_spillable  = Maybe_cisc_spillable;
3614   int right_spillable = Maybe_cisc_spillable;
3615 
3616   // Check that each has same number of operands at this level
3617   if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) )
3618     return Not_cisc_spillable;
3619 
3620   // Base Case: check that the current operands/operations match
3621   // or are CISC spillable
3622   assert( _opType, "Must have _opType");
3623   assert( mRule2->_opType, "Must have _opType");
3624   const Form *form  = globals[_opType];
3625   const Form *form2 = globals[mRule2->_opType];
3626   if( form == form2 ) {
3627     cisc_spillable = Maybe_cisc_spillable;
3628   } else {
3629     const InstructForm *form2_inst = form2 ? form2->is_instruction() : NULL;
3630     const char *name_left  = mRule2->_lChild ? mRule2->_lChild->_opType : NULL;
3631     const char *name_right = mRule2->_rChild ? mRule2->_rChild->_opType : NULL;
3632     DataType data_type = Form::none;
3633     if (form->is_operand()) {
3634       // Make sure the loadX matches the type of the reg
3635       data_type = form->ideal_to_Reg_type(form->is_operand()->ideal_type(globals));
3636     }
3637     // Detect reg vs (loadX memory)
3638     if( form->is_cisc_reg(globals)
3639         && form2_inst
3640         && data_type != Form::none
3641         && (is_load_from_memory(mRule2->_opType) == data_type) // reg vs. (load memory)
3642         && (name_left != NULL)       // NOT (load)
3643         && (name_right == NULL) ) {  // NOT (load memory foo)
3644       const Form *form2_left = globals[name_left];
3645       if( form2_left && form2_left->is_cisc_mem(globals) ) {
3646         cisc_spillable = Is_cisc_spillable;
3647         operand        = _name;
3648         reg_type       = _result;
3649         return Is_cisc_spillable;
3650       } else {
3651         cisc_spillable = Not_cisc_spillable;
3652       }
3653     }
3654     // Detect reg vs memory
3655     else if (form->is_cisc_reg(globals) && form2 != NULL && form2->is_cisc_mem(globals)) {
3656       cisc_spillable = Is_cisc_spillable;
3657       operand        = _name;
3658       reg_type       = _result;
3659       return Is_cisc_spillable;
3660     } else {
3661       cisc_spillable = Not_cisc_spillable;
3662     }
3663   }
3664 
3665   // If cisc is still possible, check rest of tree
3666   if( cisc_spillable == Maybe_cisc_spillable ) {
3667     // Check that each has same number of operands at this level
3668     if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable;
3669 
3670     // Check left operands
3671     if( (_lChild == NULL) && (mRule2->_lChild == NULL) ) {
3672       left_spillable = Maybe_cisc_spillable;
3673     } else  if (_lChild != NULL) {
3674       left_spillable = _lChild->cisc_spill_match(globals, registers, mRule2->_lChild, operand, reg_type);
3675     }
3676 
3677     // Check right operands
3678     if( (_rChild == NULL) && (mRule2->_rChild == NULL) ) {
3679       right_spillable =  Maybe_cisc_spillable;
3680     } else if (_rChild != NULL) {
3681       right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type);
3682     }
3683 
3684     // Combine results of left and right checks
3685     cisc_spillable = cisc_spill_merge(left_spillable, right_spillable);
3686   }
3687 
3688   return cisc_spillable;
3689 }
3690 
3691 //---------------------------cisc_spill_match_rule------------------------------
3692 // Recursively check two MatchRules for legal conversion via cisc-spilling
3693 // This method handles the root of Match tree,
3694 // general recursive checks done in MatchNode
3695 int  MatchRule::matchrule_cisc_spill_match(FormDict& globals, RegisterForm* registers,
3696                                            MatchRule* mRule2, const char* &operand,
3697                                            const char* &reg_type) {
3698   int cisc_spillable  = Maybe_cisc_spillable;
3699   int left_spillable  = Maybe_cisc_spillable;
3700   int right_spillable = Maybe_cisc_spillable;
3701 
3702   // Check that each sets a result
3703   if( !(sets_result() && mRule2->sets_result()) ) return Not_cisc_spillable;
3704   // Check that each has same number of operands at this level
3705   if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable;
3706 
3707   // Check left operands: at root, must be target of 'Set'
3708   if( (_lChild == NULL) || (mRule2->_lChild == NULL) ) {
3709     left_spillable = Not_cisc_spillable;
3710   } else {
3711     // Do not support cisc-spilling instruction's target location
3712     if( root_ops_match(globals, _lChild->_opType, mRule2->_lChild->_opType) ) {
3713       left_spillable = Maybe_cisc_spillable;
3714     } else {
3715       left_spillable = Not_cisc_spillable;
3716     }
3717   }
3718 
3719   // Check right operands: recursive walk to identify reg->mem operand
3720   if (_rChild == NULL) {
3721     if (mRule2->_rChild == NULL) {
3722       right_spillable =  Maybe_cisc_spillable;
3723     } else {
3724       assert(0, "_rChild should not be NULL");
3725     }
3726   } else {
3727     right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type);
3728   }
3729 
3730   // Combine results of left and right checks
3731   cisc_spillable = cisc_spill_merge(left_spillable, right_spillable);
3732 
3733   return cisc_spillable;
3734 }
3735 
3736 //----------------------------- equivalent ------------------------------------
3737 // Recursively check to see if two match rules are equivalent.
3738 // This rule handles the root.
3739 bool MatchRule::equivalent(FormDict &globals, MatchNode *mRule2) {
3740   // Check that each sets a result
3741   if (sets_result() != mRule2->sets_result()) {
3742     return false;
3743   }
3744 
3745   // Check that the current operands/operations match
3746   assert( _opType, "Must have _opType");
3747   assert( mRule2->_opType, "Must have _opType");
3748   const Form *form  = globals[_opType];
3749   const Form *form2 = globals[mRule2->_opType];
3750   if( form != form2 ) {
3751     return false;
3752   }
3753 
3754   if (_lChild ) {
3755     if( !_lChild->equivalent(globals, mRule2->_lChild) )
3756       return false;
3757   } else if (mRule2->_lChild) {
3758     return false; // I have NULL left child, mRule2 has non-NULL left child.
3759   }
3760 
3761   if (_rChild ) {
3762     if( !_rChild->equivalent(globals, mRule2->_rChild) )
3763       return false;
3764   } else if (mRule2->_rChild) {
3765     return false; // I have NULL right child, mRule2 has non-NULL right child.
3766   }
3767 
3768   // We've made it through the gauntlet.
3769   return true;
3770 }
3771 
3772 //----------------------------- equivalent ------------------------------------
3773 // Recursively check to see if two match rules are equivalent.
3774 // This rule handles the operands.
3775 bool MatchNode::equivalent(FormDict &globals, MatchNode *mNode2) {
3776   if( !mNode2 )
3777     return false;
3778 
3779   // Check that the current operands/operations match
3780   assert( _opType, "Must have _opType");
3781   assert( mNode2->_opType, "Must have _opType");
3782   const Form *form  = globals[_opType];
3783   const Form *form2 = globals[mNode2->_opType];
3784   if( form != form2 ) {
3785     return false;
3786   }
3787 
3788   // Check that their children also match
3789   if (_lChild ) {
3790     if( !_lChild->equivalent(globals, mNode2->_lChild) )
3791       return false;
3792   } else if (mNode2->_lChild) {
3793     return false; // I have NULL left child, mNode2 has non-NULL left child.
3794   }
3795 
3796   if (_rChild ) {
3797     if( !_rChild->equivalent(globals, mNode2->_rChild) )
3798       return false;
3799   } else if (mNode2->_rChild) {
3800     return false; // I have NULL right child, mNode2 has non-NULL right child.
3801   }
3802 
3803   // We've made it through the gauntlet.
3804   return true;
3805 }
3806 
3807 //-------------------------- has_commutative_op -------------------------------
3808 // Recursively check for commutative operations with subtree operands
3809 // which could be swapped.
3810 void MatchNode::count_commutative_op(int& count) {
3811   static const char *commut_op_list[] = {
3812     "AddI","AddL","AddF","AddD",
3813     "AddVB","AddVS","AddVI","AddVL","AddVF","AddVD",
3814     "AndI","AndL",
3815     "AndV",
3816     "MaxI","MinI","MaxF","MinF","MaxD","MinD",
3817     "MaxV", "MinV",
3818     "MulI","MulL","MulF","MulD",
3819     "MulVB","MulVS","MulVI","MulVL","MulVF","MulVD",
3820     "OrI","OrL",
3821     "OrV",
3822     "XorI","XorL",
3823     "XorV"
3824   };
3825   int cnt = sizeof(commut_op_list)/sizeof(char*);
3826 
3827   if( _lChild && _rChild && (_lChild->_lChild || _rChild->_lChild) ) {
3828     // Don't swap if right operand is an immediate constant.
3829     bool is_const = false;
3830     if( _rChild->_lChild == NULL && _rChild->_rChild == NULL ) {
3831       FormDict &globals = _AD.globalNames();
3832       const Form *form = globals[_rChild->_opType];
3833       if ( form ) {
3834         OperandForm  *oper = form->is_operand();
3835         if( oper && oper->interface_type(globals) == Form::constant_interface )
3836           is_const = true;
3837       }
3838     }
3839     if( !is_const ) {
3840       for( int i=0; i<cnt; i++ ) {
3841         if( strcmp(_opType, commut_op_list[i]) == 0 ) {
3842           count++;
3843           _commutative_id = count; // id should be > 0
3844           break;
3845         }
3846       }
3847     }
3848   }
3849   if( _lChild )
3850     _lChild->count_commutative_op(count);
3851   if( _rChild )
3852     _rChild->count_commutative_op(count);
3853 }
3854 
3855 //-------------------------- swap_commutative_op ------------------------------
3856 // Recursively swap specified commutative operation with subtree operands.
3857 void MatchNode::swap_commutative_op(bool atroot, int id) {
3858   if( _commutative_id == id ) { // id should be > 0
3859     assert(_lChild && _rChild && (_lChild->_lChild || _rChild->_lChild ),
3860             "not swappable operation");
3861     MatchNode* tmp = _lChild;
3862     _lChild = _rChild;
3863     _rChild = tmp;
3864     // Don't exit here since we need to build internalop.
3865   }
3866 
3867   bool is_set = ( strcmp(_opType, "Set") == 0 );
3868   if( _lChild )
3869     _lChild->swap_commutative_op(is_set, id);
3870   if( _rChild )
3871     _rChild->swap_commutative_op(is_set, id);
3872 
3873   // If not the root, reduce this subtree to an internal operand
3874   if( !atroot && (_lChild || _rChild) ) {
3875     build_internalop();
3876   }
3877 }
3878 
3879 //-------------------------- swap_commutative_op ------------------------------
3880 // Recursively swap specified commutative operation with subtree operands.
3881 void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt) {
3882   assert(match_rules_cnt < 100," too many match rule clones");
3883   // Clone
3884   MatchRule* clone = new MatchRule(_AD, this);
3885   // Swap operands of commutative operation
3886   ((MatchNode*)clone)->swap_commutative_op(true, count);
3887   char* buf = (char*) AllocateHeap(strlen(instr_ident) + 4);
3888   sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++);
3889   clone->_result = buf;
3890 
3891   clone->_next = this->_next;
3892   this-> _next = clone;
3893   if( (--count) > 0 ) {
3894     this-> matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
3895     clone->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
3896   }
3897 }
3898 
3899 //------------------------------MatchRule--------------------------------------
3900 MatchRule::MatchRule(ArchDesc &ad)
3901   : MatchNode(ad), _depth(0), _construct(NULL), _numchilds(0) {
3902     _next = NULL;
3903 }
3904 
3905 MatchRule::MatchRule(ArchDesc &ad, MatchRule* mRule)
3906   : MatchNode(ad, *mRule, 0), _depth(mRule->_depth),
3907     _construct(mRule->_construct), _numchilds(mRule->_numchilds) {
3908     _next = NULL;
3909 }
3910 
3911 MatchRule::MatchRule(ArchDesc &ad, MatchNode* mroot, int depth, char *cnstr,
3912                      int numleaves)
3913   : MatchNode(ad,*mroot), _depth(depth), _construct(cnstr),
3914     _numchilds(0) {
3915       _next = NULL;
3916       mroot->_lChild = NULL;
3917       mroot->_rChild = NULL;
3918       delete mroot;
3919       _numleaves = numleaves;
3920       _numchilds = (_lChild ? 1 : 0) + (_rChild ? 1 : 0);
3921 }
3922 MatchRule::~MatchRule() {
3923 }
3924 
3925 // Recursive call collecting info on top-level operands, not transitive.
3926 // Implementation does not modify state of internal structures.
3927 void MatchRule::append_components(FormDict& locals, ComponentList& components, bool def_flag) const {
3928   assert (_name != NULL, "MatchNode::build_components encountered empty node\n");
3929 
3930   MatchNode::append_components(locals, components,
3931                                false /* not necessarily a def */);
3932 }
3933 
3934 // Recursive call on all operands' match rules in my match rule.
3935 // Implementation does not modify state of internal structures  since they
3936 // can be shared.
3937 // The MatchNode that is called first treats its
3938 bool MatchRule::base_operand(uint &position0, FormDict &globals,
3939                              const char *&result, const char * &name,
3940                              const char * &opType)const{
3941   uint position = position0;
3942 
3943   return (MatchNode::base_operand( position, globals, result, name, opType));
3944 }
3945 
3946 
3947 bool MatchRule::is_base_register(FormDict &globals) const {
3948   uint   position = 1;
3949   const char  *result   = NULL;
3950   const char  *name     = NULL;
3951   const char  *opType   = NULL;
3952   if (!base_operand(position, globals, result, name, opType)) {
3953     position = 0;
3954     if( base_operand(position, globals, result, name, opType) &&
3955         (strcmp(opType,"RegI")==0 ||
3956          strcmp(opType,"RegP")==0 ||
3957          strcmp(opType,"RegN")==0 ||
3958          strcmp(opType,"RegL")==0 ||
3959          strcmp(opType,"RegF")==0 ||
3960          strcmp(opType,"RegD")==0 ||
3961          strcmp(opType,"VecS")==0 ||
3962          strcmp(opType,"VecD")==0 ||
3963          strcmp(opType,"VecX")==0 ||
3964          strcmp(opType,"VecY")==0 ||
3965          strcmp(opType,"VecZ")==0 ||
3966          strcmp(opType,"Reg" )==0) ) {
3967       return 1;
3968     }
3969   }
3970   return 0;
3971 }
3972 
3973 Form::DataType MatchRule::is_base_constant(FormDict &globals) const {
3974   uint         position = 1;
3975   const char  *result   = NULL;
3976   const char  *name     = NULL;
3977   const char  *opType   = NULL;
3978   if (!base_operand(position, globals, result, name, opType)) {
3979     position = 0;
3980     if (base_operand(position, globals, result, name, opType)) {
3981       return ideal_to_const_type(opType);
3982     }
3983   }
3984   return Form::none;
3985 }
3986 
3987 bool MatchRule::is_chain_rule(FormDict &globals) const {
3988 
3989   // Check for chain rule, and do not generate a match list for it
3990   if ((_lChild == NULL) && (_rChild == NULL) ) {
3991     const Form *form = globals[_opType];
3992     // If this is ideal, then it is a base match, not a chain rule.
3993     if ( form && form->is_operand() && (!form->ideal_only())) {
3994       return true;
3995     }
3996   }
3997   // Check for "Set" form of chain rule, and do not generate a match list
3998   if (_rChild) {
3999     const char *rch = _rChild->_opType;
4000     const Form *form = globals[rch];
4001     if ((!strcmp(_opType,"Set") &&
4002          ((form) && form->is_operand()))) {
4003       return true;
4004     }
4005   }
4006   return false;
4007 }
4008 
4009 int MatchRule::is_ideal_copy() const {
4010   if (is_chain_rule(_AD.globalNames()) &&
4011       _lChild && strncmp(_lChild->_opType, "stackSlot", 9) == 0) {
4012     return 1;
4013   }
4014   return 0;
4015 }
4016 
4017 int MatchRule::is_expensive() const {
4018   if( _rChild ) {
4019     const char  *opType = _rChild->_opType;
4020     if( strcmp(opType,"AtanD")==0 ||
4021         strcmp(opType,"DivD")==0 ||
4022         strcmp(opType,"DivF")==0 ||
4023         strcmp(opType,"DivI")==0 ||
4024         strcmp(opType,"Log10D")==0 ||
4025         strcmp(opType,"ModD")==0 ||
4026         strcmp(opType,"ModF")==0 ||
4027         strcmp(opType,"ModI")==0 ||
4028         strcmp(opType,"SqrtD")==0 ||
4029         strcmp(opType,"SqrtF")==0 ||
4030         strcmp(opType,"TanD")==0 ||
4031         strcmp(opType,"ConvD2F")==0 ||
4032         strcmp(opType,"ConvD2I")==0 ||
4033         strcmp(opType,"ConvD2L")==0 ||
4034         strcmp(opType,"ConvF2D")==0 ||
4035         strcmp(opType,"ConvF2I")==0 ||
4036         strcmp(opType,"ConvF2L")==0 ||
4037         strcmp(opType,"ConvI2D")==0 ||
4038         strcmp(opType,"ConvI2F")==0 ||
4039         strcmp(opType,"ConvI2L")==0 ||
4040         strcmp(opType,"ConvL2D")==0 ||
4041         strcmp(opType,"ConvL2F")==0 ||
4042         strcmp(opType,"ConvL2I")==0 ||
4043         strcmp(opType,"DecodeN")==0 ||
4044         strcmp(opType,"EncodeP")==0 ||
4045         strcmp(opType,"EncodePKlass")==0 ||
4046         strcmp(opType,"DecodeNKlass")==0 ||
4047         strcmp(opType,"FmaD") == 0 ||
4048         strcmp(opType,"FmaF") == 0 ||
4049         strcmp(opType,"RoundDouble")==0 ||
4050         strcmp(opType,"RoundDoubleMode")==0 ||
4051         strcmp(opType,"RoundFloat")==0 ||
4052         strcmp(opType,"ReverseBytesI")==0 ||
4053         strcmp(opType,"ReverseBytesL")==0 ||
4054         strcmp(opType,"ReverseBytesUS")==0 ||
4055         strcmp(opType,"ReverseBytesS")==0 ||
4056         strcmp(opType,"ReplicateB")==0 ||
4057         strcmp(opType,"ReplicateS")==0 ||
4058         strcmp(opType,"ReplicateI")==0 ||
4059         strcmp(opType,"ReplicateL")==0 ||
4060         strcmp(opType,"ReplicateF")==0 ||
4061         strcmp(opType,"ReplicateD")==0 ||
4062         strcmp(opType,"AddReductionVI")==0 ||
4063         strcmp(opType,"AddReductionVL")==0 ||
4064         strcmp(opType,"AddReductionVF")==0 ||
4065         strcmp(opType,"AddReductionVD")==0 ||
4066         strcmp(opType,"MulReductionVI")==0 ||
4067         strcmp(opType,"MulReductionVL")==0 ||
4068         strcmp(opType,"MulReductionVF")==0 ||
4069         strcmp(opType,"MulReductionVD")==0 ||
4070         0 /* 0 to line up columns nicely */ )
4071       return 1;
4072   }
4073   return 0;
4074 }
4075 
4076 bool MatchRule::is_ideal_if() const {
4077   if( !_opType ) return false;
4078   return
4079     !strcmp(_opType,"If"            ) ||
4080     !strcmp(_opType,"CountedLoopEnd");
4081 }
4082 
4083 bool MatchRule::is_ideal_fastlock() const {
4084   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4085     return (strcmp(_rChild->_opType,"FastLock") == 0);
4086   }
4087   return false;
4088 }
4089 
4090 bool MatchRule::is_ideal_membar() const {
4091   if( !_opType ) return false;
4092   return
4093     !strcmp(_opType,"MemBarAcquire") ||
4094     !strcmp(_opType,"MemBarRelease") ||
4095     !strcmp(_opType,"MemBarAcquireLock") ||
4096     !strcmp(_opType,"MemBarReleaseLock") ||
4097     !strcmp(_opType,"LoadFence" ) ||
4098     !strcmp(_opType,"StoreFence") ||
4099     !strcmp(_opType,"MemBarVolatile") ||
4100     !strcmp(_opType,"MemBarCPUOrder") ||
4101     !strcmp(_opType,"MemBarStoreStore") ||
4102     !strcmp(_opType,"OnSpinWait");
4103 }
4104 
4105 bool MatchRule::is_ideal_loadPC() const {
4106   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4107     return (strcmp(_rChild->_opType,"LoadPC") == 0);
4108   }
4109   return false;
4110 }
4111 
4112 bool MatchRule::is_ideal_box() const {
4113   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4114     return (strcmp(_rChild->_opType,"Box") == 0);
4115   }
4116   return false;
4117 }
4118 
4119 bool MatchRule::is_ideal_goto() const {
4120   bool   ideal_goto = false;
4121 
4122   if( _opType && (strcmp(_opType,"Goto") == 0) ) {
4123     ideal_goto = true;
4124   }
4125   return ideal_goto;
4126 }
4127 
4128 bool MatchRule::is_ideal_jump() const {
4129   if( _opType ) {
4130     if( !strcmp(_opType,"Jump") )
4131       return true;
4132   }
4133   return false;
4134 }
4135 
4136 bool MatchRule::is_ideal_bool() const {
4137   if( _opType ) {
4138     if( !strcmp(_opType,"Bool") )
4139       return true;
4140   }
4141   return false;
4142 }
4143 
4144 
4145 Form::DataType MatchRule::is_ideal_load() const {
4146   Form::DataType ideal_load = Form::none;
4147 
4148   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4149     const char *opType = _rChild->_opType;
4150     ideal_load = is_load_from_memory(opType);
4151   }
4152 
4153   return ideal_load;
4154 }
4155 
4156 bool MatchRule::is_vector() const {
4157   static const char *vector_list[] = {
4158     "AddVB","AddVS","AddVI","AddVL","AddVF","AddVD",
4159     "SubVB","SubVS","SubVI","SubVL","SubVF","SubVD",
4160     "MulVB","MulVS","MulVI","MulVL","MulVF","MulVD",
4161     "CMoveVD", "CMoveVF",
4162     "DivVF","DivVD",
4163     "AbsVB","AbsVS","AbsVI","AbsVL","AbsVF","AbsVD",
4164     "NegVF","NegVD",
4165     "SqrtVD","SqrtVF",
4166     "AndV" ,"XorV" ,"OrV",
4167     "MaxV", "MinV",
4168     "AddReductionVI", "AddReductionVL",
4169     "AddReductionVF", "AddReductionVD",
4170     "MulReductionVI", "MulReductionVL",
4171     "MulReductionVF", "MulReductionVD",
4172     "MulAddVS2VI",
4173     "LShiftCntV","RShiftCntV",
4174     "LShiftVB","LShiftVS","LShiftVI","LShiftVL",
4175     "RShiftVB","RShiftVS","RShiftVI","RShiftVL",
4176     "URShiftVB","URShiftVS","URShiftVI","URShiftVL",
4177     "MaxReductionV", "MinReductionV",
4178     "ReplicateB","ReplicateS","ReplicateI","ReplicateL","ReplicateF","ReplicateD",
4179     "RoundDoubleModeV","LoadVector","StoreVector",
4180     "FmaVD", "FmaVF","PopCountVI",
4181     // Next are not supported currently.
4182     "PackB","PackS","PackI","PackL","PackF","PackD","Pack2L","Pack2D",
4183     "ExtractB","ExtractUB","ExtractC","ExtractS","ExtractI","ExtractL","ExtractF","ExtractD"
4184   };
4185   int cnt = sizeof(vector_list)/sizeof(char*);
4186   if (_rChild) {
4187     const char  *opType = _rChild->_opType;
4188     for (int i=0; i<cnt; i++)
4189       if (strcmp(opType,vector_list[i]) == 0)
4190         return true;
4191   }
4192   return false;
4193 }
4194 
4195 
4196 bool MatchRule::skip_antidep_check() const {
4197   // Some loads operate on what is effectively immutable memory so we
4198   // should skip the anti dep computations.  For some of these nodes
4199   // the rewritable field keeps the anti dep logic from triggering but
4200   // for certain kinds of LoadKlass it does not since they are
4201   // actually reading memory which could be rewritten by the runtime,
4202   // though never by generated code.  This disables it uniformly for
4203   // the nodes that behave like this: LoadKlass, LoadNKlass and
4204   // LoadRange.
4205   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4206     const char *opType = _rChild->_opType;
4207     if (strcmp("LoadKlass", opType) == 0 ||
4208         strcmp("LoadNKlass", opType) == 0 ||
4209         strcmp("LoadRange", opType) == 0) {
4210       return true;
4211     }
4212   }
4213 
4214   return false;
4215 }
4216 
4217 
4218 Form::DataType MatchRule::is_ideal_store() const {
4219   Form::DataType ideal_store = Form::none;
4220 
4221   if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) {
4222     const char *opType = _rChild->_opType;
4223     ideal_store = is_store_to_memory(opType);
4224   }
4225 
4226   return ideal_store;
4227 }
4228 
4229 
4230 void MatchRule::dump() {
4231   output(stderr);
4232 }
4233 
4234 // Write just one line.
4235 void MatchRule::output_short(FILE *fp) {
4236   fprintf(fp,"MatchRule: ( %s",_name);
4237   if (_lChild) _lChild->output(fp);
4238   if (_rChild) _rChild->output(fp);
4239   fprintf(fp," )");
4240 }
4241 
4242 void MatchRule::output(FILE *fp) {
4243   output_short(fp);
4244   fprintf(fp,"\n   nesting depth = %d\n", _depth);
4245   if (_result) fprintf(fp,"   Result Type = %s", _result);
4246   fprintf(fp,"\n");
4247 }
4248 
4249 //------------------------------Attribute--------------------------------------
4250 Attribute::Attribute(char *id, char* val, int type)
4251   : _ident(id), _val(val), _atype(type) {
4252 }
4253 Attribute::~Attribute() {
4254 }
4255 
4256 int Attribute::int_val(ArchDesc &ad) {
4257   // Make sure it is an integer constant:
4258   int result = 0;
4259   if (!_val || !ADLParser::is_int_token(_val, result)) {
4260     ad.syntax_err(0, "Attribute %s must have an integer value: %s",
4261                   _ident, _val ? _val : "");
4262   }
4263   return result;
4264 }
4265 
4266 void Attribute::dump() {
4267   output(stderr);
4268 } // Debug printer
4269 
4270 // Write to output files
4271 void Attribute::output(FILE *fp) {
4272   fprintf(fp,"Attribute: %s  %s\n", (_ident?_ident:""), (_val?_val:""));
4273 }
4274 
4275 //------------------------------FormatRule----------------------------------
4276 FormatRule::FormatRule(char *temp)
4277   : _temp(temp) {
4278 }
4279 FormatRule::~FormatRule() {
4280 }
4281 
4282 void FormatRule::dump() {
4283   output(stderr);
4284 }
4285 
4286 // Write to output files
4287 void FormatRule::output(FILE *fp) {
4288   fprintf(fp,"\nFormat Rule: \n%s", (_temp?_temp:""));
4289   fprintf(fp,"\n");
4290 }