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