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