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