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