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