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