output_c.cpp revision 3724:8e47bac5643a
1/*
2 * Copyright (c) 1998, 2012, 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// output_c.cpp - Class CPP file output routines for architecture definition
26
27#include "adlc.hpp"
28
29// Utilities to characterize effect statements
30static bool is_def(int usedef) {
31  switch(usedef) {
32  case Component::DEF:
33  case Component::USE_DEF: return true; break;
34  }
35  return false;
36}
37
38static bool is_use(int usedef) {
39  switch(usedef) {
40  case Component::USE:
41  case Component::USE_DEF:
42  case Component::USE_KILL: return true; break;
43  }
44  return false;
45}
46
47static bool is_kill(int usedef) {
48  switch(usedef) {
49  case Component::KILL:
50  case Component::USE_KILL: return true; break;
51  }
52  return false;
53}
54
55// Define  an array containing the machine register names, strings.
56static void defineRegNames(FILE *fp, RegisterForm *registers) {
57  if (registers) {
58    fprintf(fp,"\n");
59    fprintf(fp,"// An array of character pointers to machine register names.\n");
60    fprintf(fp,"const char *Matcher::regName[REG_COUNT] = {\n");
61
62    // Output the register name for each register in the allocation classes
63    RegDef *reg_def = NULL;
64    RegDef *next = NULL;
65    registers->reset_RegDefs();
66    for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
67      next = registers->iter_RegDefs();
68      const char *comma = (next != NULL) ? "," : " // no trailing comma";
69      fprintf(fp,"  \"%s\"%s\n",
70                 reg_def->_regname, comma );
71    }
72
73    // Finish defining enumeration
74    fprintf(fp,"};\n");
75
76    fprintf(fp,"\n");
77    fprintf(fp,"// An array of character pointers to machine register names.\n");
78    fprintf(fp,"const VMReg OptoReg::opto2vm[REG_COUNT] = {\n");
79    reg_def = NULL;
80    next = NULL;
81    registers->reset_RegDefs();
82    for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
83      next = registers->iter_RegDefs();
84      const char *comma = (next != NULL) ? "," : " // no trailing comma";
85      fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma );
86    }
87    // Finish defining array
88    fprintf(fp,"\t};\n");
89    fprintf(fp,"\n");
90
91    fprintf(fp," OptoReg::Name OptoReg::vm2opto[ConcreteRegisterImpl::number_of_registers];\n");
92
93  }
94}
95
96// Define an array containing the machine register encoding values
97static void defineRegEncodes(FILE *fp, RegisterForm *registers) {
98  if (registers) {
99    fprintf(fp,"\n");
100    fprintf(fp,"// An array of the machine register encode values\n");
101    fprintf(fp,"const unsigned char Matcher::_regEncode[REG_COUNT] = {\n");
102
103    // Output the register encoding for each register in the allocation classes
104    RegDef *reg_def = NULL;
105    RegDef *next    = NULL;
106    registers->reset_RegDefs();
107    for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
108      next = registers->iter_RegDefs();
109      const char* register_encode = reg_def->register_encode();
110      const char *comma = (next != NULL) ? "," : " // no trailing comma";
111      int encval;
112      if (!ADLParser::is_int_token(register_encode, encval)) {
113        fprintf(fp,"  %s%s  // %s\n",
114                register_encode, comma, reg_def->_regname );
115      } else {
116        // Output known constants in hex char format (backward compatibility).
117        assert(encval < 256, "Exceeded supported width for register encoding");
118        fprintf(fp,"  (unsigned char)'\\x%X'%s  // %s\n",
119                encval,          comma, reg_def->_regname );
120      }
121    }
122    // Finish defining enumeration
123    fprintf(fp,"};\n");
124
125  } // Done defining array
126}
127
128// Output an enumeration of register class names
129static void defineRegClassEnum(FILE *fp, RegisterForm *registers) {
130  if (registers) {
131    // Output an enumeration of register class names
132    fprintf(fp,"\n");
133    fprintf(fp,"// Enumeration of register class names\n");
134    fprintf(fp, "enum machRegisterClass {\n");
135    registers->_rclasses.reset();
136    for( const char *class_name = NULL;
137         (class_name = registers->_rclasses.iter()) != NULL; ) {
138      fprintf(fp,"  %s,\n", toUpper( class_name ));
139    }
140    // Finish defining enumeration
141    fprintf(fp, "  _last_Mach_Reg_Class\n");
142    fprintf(fp, "};\n");
143  }
144}
145
146// Declare an enumeration of user-defined register classes
147// and a list of register masks, one for each class.
148void ArchDesc::declare_register_masks(FILE *fp_hpp) {
149  const char  *rc_name;
150
151  if( _register ) {
152    // Build enumeration of user-defined register classes.
153    defineRegClassEnum(fp_hpp, _register);
154
155    // Generate a list of register masks, one for each class.
156    fprintf(fp_hpp,"\n");
157    fprintf(fp_hpp,"// Register masks, one for each register class.\n");
158    _register->_rclasses.reset();
159    for( rc_name = NULL;
160         (rc_name = _register->_rclasses.iter()) != NULL; ) {
161      const char *prefix    = "";
162      RegClass   *reg_class = _register->getRegClass(rc_name);
163      assert( reg_class, "Using an undefined register class");
164
165      if (reg_class->_user_defined == NULL) {
166        fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, toUpper( rc_name ) );
167        fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ));
168      } else {
169        fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, toUpper( rc_name ), reg_class->_user_defined);
170      }
171
172      if( reg_class->_stack_or_reg ) {
173        assert(reg_class->_user_defined == NULL, "no user defined reg class here");
174        fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) );
175        fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ) );
176      }
177    }
178  }
179}
180
181// Generate an enumeration of user-defined register classes
182// and a list of register masks, one for each class.
183void ArchDesc::build_register_masks(FILE *fp_cpp) {
184  const char  *rc_name;
185
186  if( _register ) {
187    // Generate a list of register masks, one for each class.
188    fprintf(fp_cpp,"\n");
189    fprintf(fp_cpp,"// Register masks, one for each register class.\n");
190    _register->_rclasses.reset();
191    for( rc_name = NULL;
192         (rc_name = _register->_rclasses.iter()) != NULL; ) {
193      const char *prefix    = "";
194      RegClass   *reg_class = _register->getRegClass(rc_name);
195      assert( reg_class, "Using an undefined register class");
196
197      if (reg_class->_user_defined != NULL) continue;
198
199      int len = RegisterForm::RegMask_Size();
200      fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, toUpper( rc_name ) );
201      { int i;
202        for( i = 0; i < len-1; i++ )
203          fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false));
204        fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false));
205      }
206
207      if( reg_class->_stack_or_reg ) {
208        int i;
209        fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) );
210        for( i = 0; i < len-1; i++ )
211          fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true));
212        fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true));
213      }
214    }
215  }
216}
217
218// Compute an index for an array in the pipeline_reads_NNN arrays
219static int pipeline_reads_initializer(FILE *fp_cpp, NameList &pipeline_reads, PipeClassForm *pipeclass)
220{
221  int templen = 1;
222  int paramcount = 0;
223  const char *paramname;
224
225  if (pipeclass->_parameters.count() == 0)
226    return -1;
227
228  pipeclass->_parameters.reset();
229  paramname = pipeclass->_parameters.iter();
230  const PipeClassOperandForm *pipeopnd =
231    (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
232  if (pipeopnd && !pipeopnd->isWrite() && strcmp(pipeopnd->_stage, "Universal"))
233    pipeclass->_parameters.reset();
234
235  while ( (paramname = pipeclass->_parameters.iter()) != NULL ) {
236    const PipeClassOperandForm *tmppipeopnd =
237        (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
238
239    if (tmppipeopnd)
240      templen += 10 + (int)strlen(tmppipeopnd->_stage);
241    else
242      templen += 19;
243
244    paramcount++;
245  }
246
247  // See if the count is zero
248  if (paramcount == 0) {
249    return -1;
250  }
251
252  char *operand_stages = new char [templen];
253  operand_stages[0] = 0;
254  int i = 0;
255  templen = 0;
256
257  pipeclass->_parameters.reset();
258  paramname = pipeclass->_parameters.iter();
259  pipeopnd = (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
260  if (pipeopnd && !pipeopnd->isWrite() && strcmp(pipeopnd->_stage, "Universal"))
261    pipeclass->_parameters.reset();
262
263  while ( (paramname = pipeclass->_parameters.iter()) != NULL ) {
264    const PipeClassOperandForm *tmppipeopnd =
265        (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
266    templen += sprintf(&operand_stages[templen], "  stage_%s%c\n",
267      tmppipeopnd ? tmppipeopnd->_stage : "undefined",
268      (++i < paramcount ? ',' : ' ') );
269  }
270
271  // See if the same string is in the table
272  int ndx = pipeline_reads.index(operand_stages);
273
274  // No, add it to the table
275  if (ndx < 0) {
276    pipeline_reads.addName(operand_stages);
277    ndx = pipeline_reads.index(operand_stages);
278
279    fprintf(fp_cpp, "static const enum machPipelineStages pipeline_reads_%03d[%d] = {\n%s};\n\n",
280      ndx+1, paramcount, operand_stages);
281  }
282  else
283    delete [] operand_stages;
284
285  return (ndx);
286}
287
288// Compute an index for an array in the pipeline_res_stages_NNN arrays
289static int pipeline_res_stages_initializer(
290  FILE *fp_cpp,
291  PipelineForm *pipeline,
292  NameList &pipeline_res_stages,
293  PipeClassForm *pipeclass)
294{
295  const PipeClassResourceForm *piperesource;
296  int * res_stages = new int [pipeline->_rescount];
297  int i;
298
299  for (i = 0; i < pipeline->_rescount; i++)
300     res_stages[i] = 0;
301
302  for (pipeclass->_resUsage.reset();
303       (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; ) {
304    int used_mask = pipeline->_resdict[piperesource->_resource]->is_resource()->mask();
305    for (i = 0; i < pipeline->_rescount; i++)
306      if ((1 << i) & used_mask) {
307        int stage = pipeline->_stages.index(piperesource->_stage);
308        if (res_stages[i] < stage+1)
309          res_stages[i] = stage+1;
310      }
311  }
312
313  // Compute the length needed for the resource list
314  int commentlen = 0;
315  int max_stage = 0;
316  for (i = 0; i < pipeline->_rescount; i++) {
317    if (res_stages[i] == 0) {
318      if (max_stage < 9)
319        max_stage = 9;
320    }
321    else {
322      int stagelen = (int)strlen(pipeline->_stages.name(res_stages[i]-1));
323      if (max_stage < stagelen)
324        max_stage = stagelen;
325    }
326
327    commentlen += (int)strlen(pipeline->_reslist.name(i));
328  }
329
330  int templen = 1 + commentlen + pipeline->_rescount * (max_stage + 14);
331
332  // Allocate space for the resource list
333  char * resource_stages = new char [templen];
334
335  templen = 0;
336  for (i = 0; i < pipeline->_rescount; i++) {
337    const char * const resname =
338      res_stages[i] == 0 ? "undefined" : pipeline->_stages.name(res_stages[i]-1);
339
340    templen += sprintf(&resource_stages[templen], "  stage_%s%-*s // %s\n",
341      resname, max_stage - (int)strlen(resname) + 1,
342      (i < pipeline->_rescount-1) ? "," : "",
343      pipeline->_reslist.name(i));
344  }
345
346  // See if the same string is in the table
347  int ndx = pipeline_res_stages.index(resource_stages);
348
349  // No, add it to the table
350  if (ndx < 0) {
351    pipeline_res_stages.addName(resource_stages);
352    ndx = pipeline_res_stages.index(resource_stages);
353
354    fprintf(fp_cpp, "static const enum machPipelineStages pipeline_res_stages_%03d[%d] = {\n%s};\n\n",
355      ndx+1, pipeline->_rescount, resource_stages);
356  }
357  else
358    delete [] resource_stages;
359
360  delete [] res_stages;
361
362  return (ndx);
363}
364
365// Compute an index for an array in the pipeline_res_cycles_NNN arrays
366static int pipeline_res_cycles_initializer(
367  FILE *fp_cpp,
368  PipelineForm *pipeline,
369  NameList &pipeline_res_cycles,
370  PipeClassForm *pipeclass)
371{
372  const PipeClassResourceForm *piperesource;
373  int * res_cycles = new int [pipeline->_rescount];
374  int i;
375
376  for (i = 0; i < pipeline->_rescount; i++)
377     res_cycles[i] = 0;
378
379  for (pipeclass->_resUsage.reset();
380       (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; ) {
381    int used_mask = pipeline->_resdict[piperesource->_resource]->is_resource()->mask();
382    for (i = 0; i < pipeline->_rescount; i++)
383      if ((1 << i) & used_mask) {
384        int cycles = piperesource->_cycles;
385        if (res_cycles[i] < cycles)
386          res_cycles[i] = cycles;
387      }
388  }
389
390  // Pre-compute the string length
391  int templen;
392  int cyclelen = 0, commentlen = 0;
393  int max_cycles = 0;
394  char temp[32];
395
396  for (i = 0; i < pipeline->_rescount; i++) {
397    if (max_cycles < res_cycles[i])
398      max_cycles = res_cycles[i];
399    templen = sprintf(temp, "%d", res_cycles[i]);
400    if (cyclelen < templen)
401      cyclelen = templen;
402    commentlen += (int)strlen(pipeline->_reslist.name(i));
403  }
404
405  templen = 1 + commentlen + (cyclelen + 8) * pipeline->_rescount;
406
407  // Allocate space for the resource list
408  char * resource_cycles = new char [templen];
409
410  templen = 0;
411
412  for (i = 0; i < pipeline->_rescount; i++) {
413    templen += sprintf(&resource_cycles[templen], "  %*d%c // %s\n",
414      cyclelen, res_cycles[i], (i < pipeline->_rescount-1) ? ',' : ' ', pipeline->_reslist.name(i));
415  }
416
417  // See if the same string is in the table
418  int ndx = pipeline_res_cycles.index(resource_cycles);
419
420  // No, add it to the table
421  if (ndx < 0) {
422    pipeline_res_cycles.addName(resource_cycles);
423    ndx = pipeline_res_cycles.index(resource_cycles);
424
425    fprintf(fp_cpp, "static const uint pipeline_res_cycles_%03d[%d] = {\n%s};\n\n",
426      ndx+1, pipeline->_rescount, resource_cycles);
427  }
428  else
429    delete [] resource_cycles;
430
431  delete [] res_cycles;
432
433  return (ndx);
434}
435
436//typedef unsigned long long uint64_t;
437
438// Compute an index for an array in the pipeline_res_mask_NNN arrays
439static int pipeline_res_mask_initializer(
440  FILE *fp_cpp,
441  PipelineForm *pipeline,
442  NameList &pipeline_res_mask,
443  NameList &pipeline_res_args,
444  PipeClassForm *pipeclass)
445{
446  const PipeClassResourceForm *piperesource;
447  const uint rescount      = pipeline->_rescount;
448  const uint maxcycleused  = pipeline->_maxcycleused;
449  const uint cyclemasksize = (maxcycleused + 31) >> 5;
450
451  int i, j;
452  int element_count = 0;
453  uint *res_mask = new uint [cyclemasksize];
454  uint resources_used             = 0;
455  uint resources_used_exclusively = 0;
456
457  for (pipeclass->_resUsage.reset();
458       (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; )
459    element_count++;
460
461  // Pre-compute the string length
462  int templen;
463  int commentlen = 0;
464  int max_cycles = 0;
465
466  int cyclelen = ((maxcycleused + 3) >> 2);
467  int masklen = (rescount + 3) >> 2;
468
469  int cycledigit = 0;
470  for (i = maxcycleused; i > 0; i /= 10)
471    cycledigit++;
472
473  int maskdigit = 0;
474  for (i = rescount; i > 0; i /= 10)
475    maskdigit++;
476
477  static const char * pipeline_use_cycle_mask = "Pipeline_Use_Cycle_Mask";
478  static const char * pipeline_use_element    = "Pipeline_Use_Element";
479
480  templen = 1 +
481    (int)(strlen(pipeline_use_cycle_mask) + (int)strlen(pipeline_use_element) +
482     (cyclemasksize * 12) + masklen + (cycledigit * 2) + 30) * element_count;
483
484  // Allocate space for the resource list
485  char * resource_mask = new char [templen];
486  char * last_comma = NULL;
487
488  templen = 0;
489
490  for (pipeclass->_resUsage.reset();
491       (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; ) {
492    int used_mask = pipeline->_resdict[piperesource->_resource]->is_resource()->mask();
493
494    if (!used_mask)
495      fprintf(stderr, "*** used_mask is 0 ***\n");
496
497    resources_used |= used_mask;
498
499    uint lb, ub;
500
501    for (lb =  0; (used_mask & (1 << lb)) == 0; lb++);
502    for (ub = 31; (used_mask & (1 << ub)) == 0; ub--);
503
504    if (lb == ub)
505      resources_used_exclusively |= used_mask;
506
507    int formatlen =
508      sprintf(&resource_mask[templen], "  %s(0x%0*x, %*d, %*d, %s %s(",
509        pipeline_use_element,
510        masklen, used_mask,
511        cycledigit, lb, cycledigit, ub,
512        ((used_mask & (used_mask-1)) != 0) ? "true, " : "false,",
513        pipeline_use_cycle_mask);
514
515    templen += formatlen;
516
517    memset(res_mask, 0, cyclemasksize * sizeof(uint));
518
519    int cycles = piperesource->_cycles;
520    uint stage          = pipeline->_stages.index(piperesource->_stage);
521    uint upper_limit    = stage+cycles-1;
522    uint lower_limit    = stage-1;
523    uint upper_idx      = upper_limit >> 5;
524    uint lower_idx      = lower_limit >> 5;
525    uint upper_position = upper_limit & 0x1f;
526    uint lower_position = lower_limit & 0x1f;
527
528    uint mask = (((uint)1) << upper_position) - 1;
529
530    while ( upper_idx > lower_idx ) {
531      res_mask[upper_idx--] |= mask;
532      mask = (uint)-1;
533    }
534
535    mask -= (((uint)1) << lower_position) - 1;
536    res_mask[upper_idx] |= mask;
537
538    for (j = cyclemasksize-1; j >= 0; j--) {
539      formatlen =
540        sprintf(&resource_mask[templen], "0x%08x%s", res_mask[j], j > 0 ? ", " : "");
541      templen += formatlen;
542    }
543
544    resource_mask[templen++] = ')';
545    resource_mask[templen++] = ')';
546    last_comma = &resource_mask[templen];
547    resource_mask[templen++] = ',';
548    resource_mask[templen++] = '\n';
549  }
550
551  resource_mask[templen] = 0;
552  if (last_comma)
553    last_comma[0] = ' ';
554
555  // See if the same string is in the table
556  int ndx = pipeline_res_mask.index(resource_mask);
557
558  // No, add it to the table
559  if (ndx < 0) {
560    pipeline_res_mask.addName(resource_mask);
561    ndx = pipeline_res_mask.index(resource_mask);
562
563    if (strlen(resource_mask) > 0)
564      fprintf(fp_cpp, "static const Pipeline_Use_Element pipeline_res_mask_%03d[%d] = {\n%s};\n\n",
565        ndx+1, element_count, resource_mask);
566
567    char * args = new char [9 + 2*masklen + maskdigit];
568
569    sprintf(args, "0x%0*x, 0x%0*x, %*d",
570      masklen, resources_used,
571      masklen, resources_used_exclusively,
572      maskdigit, element_count);
573
574    pipeline_res_args.addName(args);
575  }
576  else
577    delete [] resource_mask;
578
579  delete [] res_mask;
580//delete [] res_masks;
581
582  return (ndx);
583}
584
585void ArchDesc::build_pipe_classes(FILE *fp_cpp) {
586  const char *classname;
587  const char *resourcename;
588  int resourcenamelen = 0;
589  NameList pipeline_reads;
590  NameList pipeline_res_stages;
591  NameList pipeline_res_cycles;
592  NameList pipeline_res_masks;
593  NameList pipeline_res_args;
594  const int default_latency = 1;
595  const int non_operand_latency = 0;
596  const int node_latency = 0;
597
598  if (!_pipeline) {
599    fprintf(fp_cpp, "uint Node::latency(uint i) const {\n");
600    fprintf(fp_cpp, "  // assert(false, \"pipeline functionality is not defined\");\n");
601    fprintf(fp_cpp, "  return %d;\n", non_operand_latency);
602    fprintf(fp_cpp, "}\n");
603    return;
604  }
605
606  fprintf(fp_cpp, "\n");
607  fprintf(fp_cpp, "//------------------Pipeline Methods-----------------------------------------\n");
608  fprintf(fp_cpp, "#ifndef PRODUCT\n");
609  fprintf(fp_cpp, "const char * Pipeline::stageName(uint s) {\n");
610  fprintf(fp_cpp, "  static const char * const _stage_names[] = {\n");
611  fprintf(fp_cpp, "    \"undefined\"");
612
613  for (int s = 0; s < _pipeline->_stagecnt; s++)
614    fprintf(fp_cpp, ", \"%s\"", _pipeline->_stages.name(s));
615
616  fprintf(fp_cpp, "\n  };\n\n");
617  fprintf(fp_cpp, "  return (s <= %d ? _stage_names[s] : \"???\");\n",
618    _pipeline->_stagecnt);
619  fprintf(fp_cpp, "}\n");
620  fprintf(fp_cpp, "#endif\n\n");
621
622  fprintf(fp_cpp, "uint Pipeline::functional_unit_latency(uint start, const Pipeline *pred) const {\n");
623  fprintf(fp_cpp, "  // See if the functional units overlap\n");
624#if 0
625  fprintf(fp_cpp, "\n#ifndef PRODUCT\n");
626  fprintf(fp_cpp, "  if (TraceOptoOutput) {\n");
627  fprintf(fp_cpp, "    tty->print(\"#   functional_unit_latency: start == %%d, this->exclusively == 0x%%03x, pred->exclusively == 0x%%03x\\n\", start, resourcesUsedExclusively(), pred->resourcesUsedExclusively());\n");
628  fprintf(fp_cpp, "  }\n");
629  fprintf(fp_cpp, "#endif\n\n");
630#endif
631  fprintf(fp_cpp, "  uint mask = resourcesUsedExclusively() & pred->resourcesUsedExclusively();\n");
632  fprintf(fp_cpp, "  if (mask == 0)\n    return (start);\n\n");
633#if 0
634  fprintf(fp_cpp, "\n#ifndef PRODUCT\n");
635  fprintf(fp_cpp, "  if (TraceOptoOutput) {\n");
636  fprintf(fp_cpp, "    tty->print(\"#   functional_unit_latency: mask == 0x%%x\\n\", mask);\n");
637  fprintf(fp_cpp, "  }\n");
638  fprintf(fp_cpp, "#endif\n\n");
639#endif
640  fprintf(fp_cpp, "  for (uint i = 0; i < pred->resourceUseCount(); i++) {\n");
641  fprintf(fp_cpp, "    const Pipeline_Use_Element *predUse = pred->resourceUseElement(i);\n");
642  fprintf(fp_cpp, "    if (predUse->multiple())\n");
643  fprintf(fp_cpp, "      continue;\n\n");
644  fprintf(fp_cpp, "    for (uint j = 0; j < resourceUseCount(); j++) {\n");
645  fprintf(fp_cpp, "      const Pipeline_Use_Element *currUse = resourceUseElement(j);\n");
646  fprintf(fp_cpp, "      if (currUse->multiple())\n");
647  fprintf(fp_cpp, "        continue;\n\n");
648  fprintf(fp_cpp, "      if (predUse->used() & currUse->used()) {\n");
649  fprintf(fp_cpp, "        Pipeline_Use_Cycle_Mask x = predUse->mask();\n");
650  fprintf(fp_cpp, "        Pipeline_Use_Cycle_Mask y = currUse->mask();\n\n");
651  fprintf(fp_cpp, "        for ( y <<= start; x.overlaps(y); start++ )\n");
652  fprintf(fp_cpp, "          y <<= 1;\n");
653  fprintf(fp_cpp, "      }\n");
654  fprintf(fp_cpp, "    }\n");
655  fprintf(fp_cpp, "  }\n\n");
656  fprintf(fp_cpp, "  // There is the potential for overlap\n");
657  fprintf(fp_cpp, "  return (start);\n");
658  fprintf(fp_cpp, "}\n\n");
659  fprintf(fp_cpp, "// The following two routines assume that the root Pipeline_Use entity\n");
660  fprintf(fp_cpp, "// consists of exactly 1 element for each functional unit\n");
661  fprintf(fp_cpp, "// start is relative to the current cycle; used for latency-based info\n");
662  fprintf(fp_cpp, "uint Pipeline_Use::full_latency(uint delay, const Pipeline_Use &pred) const {\n");
663  fprintf(fp_cpp, "  for (uint i = 0; i < pred._count; i++) {\n");
664  fprintf(fp_cpp, "    const Pipeline_Use_Element *predUse = pred.element(i);\n");
665  fprintf(fp_cpp, "    if (predUse->_multiple) {\n");
666  fprintf(fp_cpp, "      uint min_delay = %d;\n",
667    _pipeline->_maxcycleused+1);
668  fprintf(fp_cpp, "      // Multiple possible functional units, choose first unused one\n");
669  fprintf(fp_cpp, "      for (uint j = predUse->_lb; j <= predUse->_ub; j++) {\n");
670  fprintf(fp_cpp, "        const Pipeline_Use_Element *currUse = element(j);\n");
671  fprintf(fp_cpp, "        uint curr_delay = delay;\n");
672  fprintf(fp_cpp, "        if (predUse->_used & currUse->_used) {\n");
673  fprintf(fp_cpp, "          Pipeline_Use_Cycle_Mask x = predUse->_mask;\n");
674  fprintf(fp_cpp, "          Pipeline_Use_Cycle_Mask y = currUse->_mask;\n\n");
675  fprintf(fp_cpp, "          for ( y <<= curr_delay; x.overlaps(y); curr_delay++ )\n");
676  fprintf(fp_cpp, "            y <<= 1;\n");
677  fprintf(fp_cpp, "        }\n");
678  fprintf(fp_cpp, "        if (min_delay > curr_delay)\n          min_delay = curr_delay;\n");
679  fprintf(fp_cpp, "      }\n");
680  fprintf(fp_cpp, "      if (delay < min_delay)\n      delay = min_delay;\n");
681  fprintf(fp_cpp, "    }\n");
682  fprintf(fp_cpp, "    else {\n");
683  fprintf(fp_cpp, "      for (uint j = predUse->_lb; j <= predUse->_ub; j++) {\n");
684  fprintf(fp_cpp, "        const Pipeline_Use_Element *currUse = element(j);\n");
685  fprintf(fp_cpp, "        if (predUse->_used & currUse->_used) {\n");
686  fprintf(fp_cpp, "          Pipeline_Use_Cycle_Mask x = predUse->_mask;\n");
687  fprintf(fp_cpp, "          Pipeline_Use_Cycle_Mask y = currUse->_mask;\n\n");
688  fprintf(fp_cpp, "          for ( y <<= delay; x.overlaps(y); delay++ )\n");
689  fprintf(fp_cpp, "            y <<= 1;\n");
690  fprintf(fp_cpp, "        }\n");
691  fprintf(fp_cpp, "      }\n");
692  fprintf(fp_cpp, "    }\n");
693  fprintf(fp_cpp, "  }\n\n");
694  fprintf(fp_cpp, "  return (delay);\n");
695  fprintf(fp_cpp, "}\n\n");
696  fprintf(fp_cpp, "void Pipeline_Use::add_usage(const Pipeline_Use &pred) {\n");
697  fprintf(fp_cpp, "  for (uint i = 0; i < pred._count; i++) {\n");
698  fprintf(fp_cpp, "    const Pipeline_Use_Element *predUse = pred.element(i);\n");
699  fprintf(fp_cpp, "    if (predUse->_multiple) {\n");
700  fprintf(fp_cpp, "      // Multiple possible functional units, choose first unused one\n");
701  fprintf(fp_cpp, "      for (uint j = predUse->_lb; j <= predUse->_ub; j++) {\n");
702  fprintf(fp_cpp, "        Pipeline_Use_Element *currUse = element(j);\n");
703  fprintf(fp_cpp, "        if ( !predUse->_mask.overlaps(currUse->_mask) ) {\n");
704  fprintf(fp_cpp, "          currUse->_used |= (1 << j);\n");
705  fprintf(fp_cpp, "          _resources_used |= (1 << j);\n");
706  fprintf(fp_cpp, "          currUse->_mask.Or(predUse->_mask);\n");
707  fprintf(fp_cpp, "          break;\n");
708  fprintf(fp_cpp, "        }\n");
709  fprintf(fp_cpp, "      }\n");
710  fprintf(fp_cpp, "    }\n");
711  fprintf(fp_cpp, "    else {\n");
712  fprintf(fp_cpp, "      for (uint j = predUse->_lb; j <= predUse->_ub; j++) {\n");
713  fprintf(fp_cpp, "        Pipeline_Use_Element *currUse = element(j);\n");
714  fprintf(fp_cpp, "        currUse->_used |= (1 << j);\n");
715  fprintf(fp_cpp, "        _resources_used |= (1 << j);\n");
716  fprintf(fp_cpp, "        currUse->_mask.Or(predUse->_mask);\n");
717  fprintf(fp_cpp, "      }\n");
718  fprintf(fp_cpp, "    }\n");
719  fprintf(fp_cpp, "  }\n");
720  fprintf(fp_cpp, "}\n\n");
721
722  fprintf(fp_cpp, "uint Pipeline::operand_latency(uint opnd, const Pipeline *pred) const {\n");
723  fprintf(fp_cpp, "  int const default_latency = 1;\n");
724  fprintf(fp_cpp, "\n");
725#if 0
726  fprintf(fp_cpp, "#ifndef PRODUCT\n");
727  fprintf(fp_cpp, "  if (TraceOptoOutput) {\n");
728  fprintf(fp_cpp, "    tty->print(\"#   operand_latency(%%d), _read_stage_count = %%d\\n\", opnd, _read_stage_count);\n");
729  fprintf(fp_cpp, "  }\n");
730  fprintf(fp_cpp, "#endif\n\n");
731#endif
732  fprintf(fp_cpp, "  assert(this, \"NULL pipeline info\");\n");
733  fprintf(fp_cpp, "  assert(pred, \"NULL predecessor pipline info\");\n\n");
734  fprintf(fp_cpp, "  if (pred->hasFixedLatency())\n    return (pred->fixedLatency());\n\n");
735  fprintf(fp_cpp, "  // If this is not an operand, then assume a dependence with 0 latency\n");
736  fprintf(fp_cpp, "  if (opnd > _read_stage_count)\n    return (0);\n\n");
737  fprintf(fp_cpp, "  uint writeStage = pred->_write_stage;\n");
738  fprintf(fp_cpp, "  uint readStage  = _read_stages[opnd-1];\n");
739#if 0
740  fprintf(fp_cpp, "\n#ifndef PRODUCT\n");
741  fprintf(fp_cpp, "  if (TraceOptoOutput) {\n");
742  fprintf(fp_cpp, "    tty->print(\"#   operand_latency: writeStage=%%s readStage=%%s, opnd=%%d\\n\", stageName(writeStage), stageName(readStage), opnd);\n");
743  fprintf(fp_cpp, "  }\n");
744  fprintf(fp_cpp, "#endif\n\n");
745#endif
746  fprintf(fp_cpp, "\n");
747  fprintf(fp_cpp, "  if (writeStage == stage_undefined || readStage == stage_undefined)\n");
748  fprintf(fp_cpp, "    return (default_latency);\n");
749  fprintf(fp_cpp, "\n");
750  fprintf(fp_cpp, "  int delta = writeStage - readStage;\n");
751  fprintf(fp_cpp, "  if (delta < 0) delta = 0;\n\n");
752#if 0
753  fprintf(fp_cpp, "\n#ifndef PRODUCT\n");
754  fprintf(fp_cpp, "  if (TraceOptoOutput) {\n");
755  fprintf(fp_cpp, "    tty->print(\"# operand_latency: delta=%%d\\n\", delta);\n");
756  fprintf(fp_cpp, "  }\n");
757  fprintf(fp_cpp, "#endif\n\n");
758#endif
759  fprintf(fp_cpp, "  return (delta);\n");
760  fprintf(fp_cpp, "}\n\n");
761
762  if (!_pipeline)
763    /* Do Nothing */;
764
765  else if (_pipeline->_maxcycleused <=
766#ifdef SPARC
767    64
768#else
769    32
770#endif
771      ) {
772    fprintf(fp_cpp, "Pipeline_Use_Cycle_Mask operator&(const Pipeline_Use_Cycle_Mask &in1, const Pipeline_Use_Cycle_Mask &in2) {\n");
773    fprintf(fp_cpp, "  return Pipeline_Use_Cycle_Mask(in1._mask & in2._mask);\n");
774    fprintf(fp_cpp, "}\n\n");
775    fprintf(fp_cpp, "Pipeline_Use_Cycle_Mask operator|(const Pipeline_Use_Cycle_Mask &in1, const Pipeline_Use_Cycle_Mask &in2) {\n");
776    fprintf(fp_cpp, "  return Pipeline_Use_Cycle_Mask(in1._mask | in2._mask);\n");
777    fprintf(fp_cpp, "}\n\n");
778  }
779  else {
780    uint l;
781    uint masklen = (_pipeline->_maxcycleused + 31) >> 5;
782    fprintf(fp_cpp, "Pipeline_Use_Cycle_Mask operator&(const Pipeline_Use_Cycle_Mask &in1, const Pipeline_Use_Cycle_Mask &in2) {\n");
783    fprintf(fp_cpp, "  return Pipeline_Use_Cycle_Mask(");
784    for (l = 1; l <= masklen; l++)
785      fprintf(fp_cpp, "in1._mask%d & in2._mask%d%s\n", l, l, l < masklen ? ", " : "");
786    fprintf(fp_cpp, ");\n");
787    fprintf(fp_cpp, "}\n\n");
788    fprintf(fp_cpp, "Pipeline_Use_Cycle_Mask operator|(const Pipeline_Use_Cycle_Mask &in1, const Pipeline_Use_Cycle_Mask &in2) {\n");
789    fprintf(fp_cpp, "  return Pipeline_Use_Cycle_Mask(");
790    for (l = 1; l <= masklen; l++)
791      fprintf(fp_cpp, "in1._mask%d | in2._mask%d%s", l, l, l < masklen ? ", " : "");
792    fprintf(fp_cpp, ");\n");
793    fprintf(fp_cpp, "}\n\n");
794    fprintf(fp_cpp, "void Pipeline_Use_Cycle_Mask::Or(const Pipeline_Use_Cycle_Mask &in2) {\n ");
795    for (l = 1; l <= masklen; l++)
796      fprintf(fp_cpp, " _mask%d |= in2._mask%d;", l, l);
797    fprintf(fp_cpp, "\n}\n\n");
798  }
799
800  /* Get the length of all the resource names */
801  for (_pipeline->_reslist.reset(), resourcenamelen = 0;
802       (resourcename = _pipeline->_reslist.iter()) != NULL;
803       resourcenamelen += (int)strlen(resourcename));
804
805  // Create the pipeline class description
806
807  fprintf(fp_cpp, "static const Pipeline pipeline_class_Zero_Instructions(0, 0, true, 0, 0, false, false, false, false, NULL, NULL, NULL, Pipeline_Use(0, 0, 0, NULL));\n\n");
808  fprintf(fp_cpp, "static const Pipeline pipeline_class_Unknown_Instructions(0, 0, true, 0, 0, false, true, true, false, NULL, NULL, NULL, Pipeline_Use(0, 0, 0, NULL));\n\n");
809
810  fprintf(fp_cpp, "const Pipeline_Use_Element Pipeline_Use::elaborated_elements[%d] = {\n", _pipeline->_rescount);
811  for (int i1 = 0; i1 < _pipeline->_rescount; i1++) {
812    fprintf(fp_cpp, "  Pipeline_Use_Element(0, %d, %d, false, Pipeline_Use_Cycle_Mask(", i1, i1);
813    uint masklen = (_pipeline->_maxcycleused + 31) >> 5;
814    for (int i2 = masklen-1; i2 >= 0; i2--)
815      fprintf(fp_cpp, "0%s", i2 > 0 ? ", " : "");
816    fprintf(fp_cpp, "))%s\n", i1 < (_pipeline->_rescount-1) ? "," : "");
817  }
818  fprintf(fp_cpp, "};\n\n");
819
820  fprintf(fp_cpp, "const Pipeline_Use Pipeline_Use::elaborated_use(0, 0, %d, (Pipeline_Use_Element *)&elaborated_elements[0]);\n\n",
821    _pipeline->_rescount);
822
823  for (_pipeline->_classlist.reset(); (classname = _pipeline->_classlist.iter()) != NULL; ) {
824    fprintf(fp_cpp, "\n");
825    fprintf(fp_cpp, "// Pipeline Class \"%s\"\n", classname);
826    PipeClassForm *pipeclass = _pipeline->_classdict[classname]->is_pipeclass();
827    int maxWriteStage = -1;
828    int maxMoreInstrs = 0;
829    int paramcount = 0;
830    int i = 0;
831    const char *paramname;
832    int resource_count = (_pipeline->_rescount + 3) >> 2;
833
834    // Scan the operands, looking for last output stage and number of inputs
835    for (pipeclass->_parameters.reset(); (paramname = pipeclass->_parameters.iter()) != NULL; ) {
836      const PipeClassOperandForm *pipeopnd =
837          (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
838      if (pipeopnd) {
839        if (pipeopnd->_iswrite) {
840           int stagenum  = _pipeline->_stages.index(pipeopnd->_stage);
841           int moreinsts = pipeopnd->_more_instrs;
842          if ((maxWriteStage+maxMoreInstrs) < (stagenum+moreinsts)) {
843            maxWriteStage = stagenum;
844            maxMoreInstrs = moreinsts;
845          }
846        }
847      }
848
849      if (i++ > 0 || (pipeopnd && !pipeopnd->isWrite()))
850        paramcount++;
851    }
852
853    // Create the list of stages for the operands that are read
854    // Note that we will build a NameList to reduce the number of copies
855
856    int pipeline_reads_index = pipeline_reads_initializer(fp_cpp, pipeline_reads, pipeclass);
857
858    int pipeline_res_stages_index = pipeline_res_stages_initializer(
859      fp_cpp, _pipeline, pipeline_res_stages, pipeclass);
860
861    int pipeline_res_cycles_index = pipeline_res_cycles_initializer(
862      fp_cpp, _pipeline, pipeline_res_cycles, pipeclass);
863
864    int pipeline_res_mask_index = pipeline_res_mask_initializer(
865      fp_cpp, _pipeline, pipeline_res_masks, pipeline_res_args, pipeclass);
866
867#if 0
868    // Process the Resources
869    const PipeClassResourceForm *piperesource;
870
871    unsigned resources_used = 0;
872    unsigned exclusive_resources_used = 0;
873    unsigned resource_groups = 0;
874    for (pipeclass->_resUsage.reset();
875         (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; ) {
876      int used_mask = _pipeline->_resdict[piperesource->_resource]->is_resource()->mask();
877      if (used_mask)
878        resource_groups++;
879      resources_used |= used_mask;
880      if ((used_mask & (used_mask-1)) == 0)
881        exclusive_resources_used |= used_mask;
882    }
883
884    if (resource_groups > 0) {
885      fprintf(fp_cpp, "static const uint pipeline_res_or_masks_%03d[%d] = {",
886        pipeclass->_num, resource_groups);
887      for (pipeclass->_resUsage.reset(), i = 1;
888           (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL;
889           i++ ) {
890        int used_mask = _pipeline->_resdict[piperesource->_resource]->is_resource()->mask();
891        if (used_mask) {
892          fprintf(fp_cpp, " 0x%0*x%c", resource_count, used_mask, i < (int)resource_groups ? ',' : ' ');
893        }
894      }
895      fprintf(fp_cpp, "};\n\n");
896    }
897#endif
898
899    // Create the pipeline class description
900    fprintf(fp_cpp, "static const Pipeline pipeline_class_%03d(",
901      pipeclass->_num);
902    if (maxWriteStage < 0)
903      fprintf(fp_cpp, "(uint)stage_undefined");
904    else if (maxMoreInstrs == 0)
905      fprintf(fp_cpp, "(uint)stage_%s", _pipeline->_stages.name(maxWriteStage));
906    else
907      fprintf(fp_cpp, "((uint)stage_%s)+%d", _pipeline->_stages.name(maxWriteStage), maxMoreInstrs);
908    fprintf(fp_cpp, ", %d, %s, %d, %d, %s, %s, %s, %s,\n",
909      paramcount,
910      pipeclass->hasFixedLatency() ? "true" : "false",
911      pipeclass->fixedLatency(),
912      pipeclass->InstructionCount(),
913      pipeclass->hasBranchDelay() ? "true" : "false",
914      pipeclass->hasMultipleBundles() ? "true" : "false",
915      pipeclass->forceSerialization() ? "true" : "false",
916      pipeclass->mayHaveNoCode() ? "true" : "false" );
917    if (paramcount > 0) {
918      fprintf(fp_cpp, "\n  (enum machPipelineStages * const) pipeline_reads_%03d,\n ",
919        pipeline_reads_index+1);
920    }
921    else
922      fprintf(fp_cpp, " NULL,");
923    fprintf(fp_cpp, "  (enum machPipelineStages * const) pipeline_res_stages_%03d,\n",
924      pipeline_res_stages_index+1);
925    fprintf(fp_cpp, "  (uint * const) pipeline_res_cycles_%03d,\n",
926      pipeline_res_cycles_index+1);
927    fprintf(fp_cpp, "  Pipeline_Use(%s, (Pipeline_Use_Element *)",
928      pipeline_res_args.name(pipeline_res_mask_index));
929    if (strlen(pipeline_res_masks.name(pipeline_res_mask_index)) > 0)
930      fprintf(fp_cpp, "&pipeline_res_mask_%03d[0]",
931        pipeline_res_mask_index+1);
932    else
933      fprintf(fp_cpp, "NULL");
934    fprintf(fp_cpp, "));\n");
935  }
936
937  // Generate the Node::latency method if _pipeline defined
938  fprintf(fp_cpp, "\n");
939  fprintf(fp_cpp, "//------------------Inter-Instruction Latency--------------------------------\n");
940  fprintf(fp_cpp, "uint Node::latency(uint i) {\n");
941  if (_pipeline) {
942#if 0
943    fprintf(fp_cpp, "#ifndef PRODUCT\n");
944    fprintf(fp_cpp, " if (TraceOptoOutput) {\n");
945    fprintf(fp_cpp, "    tty->print(\"# %%4d->latency(%%d)\\n\", _idx, i);\n");
946    fprintf(fp_cpp, " }\n");
947    fprintf(fp_cpp, "#endif\n");
948#endif
949    fprintf(fp_cpp, "  uint j;\n");
950    fprintf(fp_cpp, "  // verify in legal range for inputs\n");
951    fprintf(fp_cpp, "  assert(i < len(), \"index not in range\");\n\n");
952    fprintf(fp_cpp, "  // verify input is not null\n");
953    fprintf(fp_cpp, "  Node *pred = in(i);\n");
954    fprintf(fp_cpp, "  if (!pred)\n    return %d;\n\n",
955      non_operand_latency);
956    fprintf(fp_cpp, "  if (pred->is_Proj())\n    pred = pred->in(0);\n\n");
957    fprintf(fp_cpp, "  // if either node does not have pipeline info, use default\n");
958    fprintf(fp_cpp, "  const Pipeline *predpipe = pred->pipeline();\n");
959    fprintf(fp_cpp, "  assert(predpipe, \"no predecessor pipeline info\");\n\n");
960    fprintf(fp_cpp, "  if (predpipe->hasFixedLatency())\n    return predpipe->fixedLatency();\n\n");
961    fprintf(fp_cpp, "  const Pipeline *currpipe = pipeline();\n");
962    fprintf(fp_cpp, "  assert(currpipe, \"no pipeline info\");\n\n");
963    fprintf(fp_cpp, "  if (!is_Mach())\n    return %d;\n\n",
964      node_latency);
965    fprintf(fp_cpp, "  const MachNode *m = as_Mach();\n");
966    fprintf(fp_cpp, "  j = m->oper_input_base();\n");
967    fprintf(fp_cpp, "  if (i < j)\n    return currpipe->functional_unit_latency(%d, predpipe);\n\n",
968      non_operand_latency);
969    fprintf(fp_cpp, "  // determine which operand this is in\n");
970    fprintf(fp_cpp, "  uint n = m->num_opnds();\n");
971    fprintf(fp_cpp, "  int delta = %d;\n\n",
972      non_operand_latency);
973    fprintf(fp_cpp, "  uint k;\n");
974    fprintf(fp_cpp, "  for (k = 1; k < n; k++) {\n");
975    fprintf(fp_cpp, "    j += m->_opnds[k]->num_edges();\n");
976    fprintf(fp_cpp, "    if (i < j)\n");
977    fprintf(fp_cpp, "      break;\n");
978    fprintf(fp_cpp, "  }\n");
979    fprintf(fp_cpp, "  if (k < n)\n");
980    fprintf(fp_cpp, "    delta = currpipe->operand_latency(k,predpipe);\n\n");
981    fprintf(fp_cpp, "  return currpipe->functional_unit_latency(delta, predpipe);\n");
982  }
983  else {
984    fprintf(fp_cpp, "  // assert(false, \"pipeline functionality is not defined\");\n");
985    fprintf(fp_cpp, "  return %d;\n",
986      non_operand_latency);
987  }
988  fprintf(fp_cpp, "}\n\n");
989
990  // Output the list of nop nodes
991  fprintf(fp_cpp, "// Descriptions for emitting different functional unit nops\n");
992  const char *nop;
993  int nopcnt = 0;
994  for ( _pipeline->_noplist.reset(); (nop = _pipeline->_noplist.iter()) != NULL; nopcnt++ );
995
996  fprintf(fp_cpp, "void Bundle::initialize_nops(MachNode * nop_list[%d], Compile *C) {\n", nopcnt);
997  int i = 0;
998  for ( _pipeline->_noplist.reset(); (nop = _pipeline->_noplist.iter()) != NULL; i++ ) {
999    fprintf(fp_cpp, "  nop_list[%d] = (MachNode *) new (C) %sNode();\n", i, nop);
1000  }
1001  fprintf(fp_cpp, "};\n\n");
1002  fprintf(fp_cpp, "#ifndef PRODUCT\n");
1003  fprintf(fp_cpp, "void Bundle::dump() const {\n");
1004  fprintf(fp_cpp, "  static const char * bundle_flags[] = {\n");
1005  fprintf(fp_cpp, "    \"\",\n");
1006  fprintf(fp_cpp, "    \"use nop delay\",\n");
1007  fprintf(fp_cpp, "    \"use unconditional delay\",\n");
1008  fprintf(fp_cpp, "    \"use conditional delay\",\n");
1009  fprintf(fp_cpp, "    \"used in conditional delay\",\n");
1010  fprintf(fp_cpp, "    \"used in unconditional delay\",\n");
1011  fprintf(fp_cpp, "    \"used in all conditional delays\",\n");
1012  fprintf(fp_cpp, "  };\n\n");
1013
1014  fprintf(fp_cpp, "  static const char *resource_names[%d] = {", _pipeline->_rescount);
1015  for (i = 0; i < _pipeline->_rescount; i++)
1016    fprintf(fp_cpp, " \"%s\"%c", _pipeline->_reslist.name(i), i < _pipeline->_rescount-1 ? ',' : ' ');
1017  fprintf(fp_cpp, "};\n\n");
1018
1019  // See if the same string is in the table
1020  fprintf(fp_cpp, "  bool needs_comma = false;\n\n");
1021  fprintf(fp_cpp, "  if (_flags) {\n");
1022  fprintf(fp_cpp, "    tty->print(\"%%s\", bundle_flags[_flags]);\n");
1023  fprintf(fp_cpp, "    needs_comma = true;\n");
1024  fprintf(fp_cpp, "  };\n");
1025  fprintf(fp_cpp, "  if (instr_count()) {\n");
1026  fprintf(fp_cpp, "    tty->print(\"%%s%%d instr%%s\", needs_comma ? \", \" : \"\", instr_count(), instr_count() != 1 ? \"s\" : \"\");\n");
1027  fprintf(fp_cpp, "    needs_comma = true;\n");
1028  fprintf(fp_cpp, "  };\n");
1029  fprintf(fp_cpp, "  uint r = resources_used();\n");
1030  fprintf(fp_cpp, "  if (r) {\n");
1031  fprintf(fp_cpp, "    tty->print(\"%%sresource%%s:\", needs_comma ? \", \" : \"\", (r & (r-1)) != 0 ? \"s\" : \"\");\n");
1032  fprintf(fp_cpp, "    for (uint i = 0; i < %d; i++)\n", _pipeline->_rescount);
1033  fprintf(fp_cpp, "      if ((r & (1 << i)) != 0)\n");
1034  fprintf(fp_cpp, "        tty->print(\" %%s\", resource_names[i]);\n");
1035  fprintf(fp_cpp, "    needs_comma = true;\n");
1036  fprintf(fp_cpp, "  };\n");
1037  fprintf(fp_cpp, "  tty->print(\"\\n\");\n");
1038  fprintf(fp_cpp, "}\n");
1039  fprintf(fp_cpp, "#endif\n");
1040}
1041
1042// ---------------------------------------------------------------------------
1043//------------------------------Utilities to build Instruction Classes--------
1044// ---------------------------------------------------------------------------
1045
1046static void defineOut_RegMask(FILE *fp, const char *node, const char *regMask) {
1047  fprintf(fp,"const RegMask &%sNode::out_RegMask() const { return (%s); }\n",
1048          node, regMask);
1049}
1050
1051// Scan the peepmatch and output a test for each instruction
1052static void check_peepmatch_instruction_tree(FILE *fp, PeepMatch *pmatch, PeepConstraint *pconstraint) {
1053  int         parent        = -1;
1054  int         inst_position = 0;
1055  const char* inst_name     = NULL;
1056  int         input         = 0;
1057  fprintf(fp, "      // Check instruction sub-tree\n");
1058  pmatch->reset();
1059  for( pmatch->next_instruction( parent, inst_position, inst_name, input );
1060       inst_name != NULL;
1061       pmatch->next_instruction( parent, inst_position, inst_name, input ) ) {
1062    // If this is not a placeholder
1063    if( ! pmatch->is_placeholder() ) {
1064      // Define temporaries 'inst#', based on parent and parent's input index
1065      if( parent != -1 ) {                // root was initialized
1066        fprintf(fp, "  inst%d = inst%d->in(%d);\n",
1067                inst_position, parent, input);
1068      }
1069
1070      // When not the root
1071      // Test we have the correct instruction by comparing the rule
1072      if( parent != -1 ) {
1073        fprintf(fp, "  matches = matches &&  ( inst%d->rule() == %s_rule );",
1074                inst_position, inst_name);
1075      }
1076    } else {
1077      // Check that user did not try to constrain a placeholder
1078      assert( ! pconstraint->constrains_instruction(inst_position),
1079              "fatal(): Can not constrain a placeholder instruction");
1080    }
1081  }
1082}
1083
1084static void print_block_index(FILE *fp, int inst_position) {
1085  assert( inst_position >= 0, "Instruction number less than zero");
1086  fprintf(fp, "block_index");
1087  if( inst_position != 0 ) {
1088    fprintf(fp, " - %d", inst_position);
1089  }
1090}
1091
1092// Scan the peepmatch and output a test for each instruction
1093static void check_peepmatch_instruction_sequence(FILE *fp, PeepMatch *pmatch, PeepConstraint *pconstraint) {
1094  int         parent        = -1;
1095  int         inst_position = 0;
1096  const char* inst_name     = NULL;
1097  int         input         = 0;
1098  fprintf(fp, "  // Check instruction sub-tree\n");
1099  pmatch->reset();
1100  for( pmatch->next_instruction( parent, inst_position, inst_name, input );
1101       inst_name != NULL;
1102       pmatch->next_instruction( parent, inst_position, inst_name, input ) ) {
1103    // If this is not a placeholder
1104    if( ! pmatch->is_placeholder() ) {
1105      // Define temporaries 'inst#', based on parent and parent's input index
1106      if( parent != -1 ) {                // root was initialized
1107        fprintf(fp, "  // Identify previous instruction if inside this block\n");
1108        fprintf(fp, "  if( ");
1109        print_block_index(fp, inst_position);
1110        fprintf(fp, " > 0 ) {\n    Node *n = block->_nodes.at(");
1111        print_block_index(fp, inst_position);
1112        fprintf(fp, ");\n    inst%d = (n->is_Mach()) ? ", inst_position);
1113        fprintf(fp, "n->as_Mach() : NULL;\n  }\n");
1114      }
1115
1116      // When not the root
1117      // Test we have the correct instruction by comparing the rule.
1118      if( parent != -1 ) {
1119        fprintf(fp, "  matches = matches && (inst%d != NULL) && (inst%d->rule() == %s_rule);\n",
1120                inst_position, inst_position, inst_name);
1121      }
1122    } else {
1123      // Check that user did not try to constrain a placeholder
1124      assert( ! pconstraint->constrains_instruction(inst_position),
1125              "fatal(): Can not constrain a placeholder instruction");
1126    }
1127  }
1128}
1129
1130// Build mapping for register indices, num_edges to input
1131static void build_instruction_index_mapping( FILE *fp, FormDict &globals, PeepMatch *pmatch ) {
1132  int         parent        = -1;
1133  int         inst_position = 0;
1134  const char* inst_name     = NULL;
1135  int         input         = 0;
1136  fprintf(fp, "      // Build map to register info\n");
1137  pmatch->reset();
1138  for( pmatch->next_instruction( parent, inst_position, inst_name, input );
1139       inst_name != NULL;
1140       pmatch->next_instruction( parent, inst_position, inst_name, input ) ) {
1141    // If this is not a placeholder
1142    if( ! pmatch->is_placeholder() ) {
1143      // Define temporaries 'inst#', based on self's inst_position
1144      InstructForm *inst = globals[inst_name]->is_instruction();
1145      if( inst != NULL ) {
1146        char inst_prefix[]  = "instXXXX_";
1147        sprintf(inst_prefix, "inst%d_",   inst_position);
1148        char receiver[]     = "instXXXX->";
1149        sprintf(receiver,    "inst%d->", inst_position);
1150        inst->index_temps( fp, globals, inst_prefix, receiver );
1151      }
1152    }
1153  }
1154}
1155
1156// Generate tests for the constraints
1157static void check_peepconstraints(FILE *fp, FormDict &globals, PeepMatch *pmatch, PeepConstraint *pconstraint) {
1158  fprintf(fp, "\n");
1159  fprintf(fp, "      // Check constraints on sub-tree-leaves\n");
1160
1161  // Build mapping from num_edges to local variables
1162  build_instruction_index_mapping( fp, globals, pmatch );
1163
1164  // Build constraint tests
1165  if( pconstraint != NULL ) {
1166    fprintf(fp, "      matches = matches &&");
1167    bool   first_constraint = true;
1168    while( pconstraint != NULL ) {
1169      // indentation and connecting '&&'
1170      const char *indentation = "      ";
1171      fprintf(fp, "\n%s%s", indentation, (!first_constraint ? "&& " : "  "));
1172
1173      // Only have '==' relation implemented
1174      if( strcmp(pconstraint->_relation,"==") != 0 ) {
1175        assert( false, "Unimplemented()" );
1176      }
1177
1178      // LEFT
1179      int left_index       = pconstraint->_left_inst;
1180      const char *left_op  = pconstraint->_left_op;
1181      // Access info on the instructions whose operands are compared
1182      InstructForm *inst_left = globals[pmatch->instruction_name(left_index)]->is_instruction();
1183      assert( inst_left, "Parser should guaranty this is an instruction");
1184      int left_op_base  = inst_left->oper_input_base(globals);
1185      // Access info on the operands being compared
1186      int left_op_index  = inst_left->operand_position(left_op, Component::USE);
1187      if( left_op_index == -1 ) {
1188        left_op_index = inst_left->operand_position(left_op, Component::DEF);
1189        if( left_op_index == -1 ) {
1190          left_op_index = inst_left->operand_position(left_op, Component::USE_DEF);
1191        }
1192      }
1193      assert( left_op_index  != NameList::Not_in_list, "Did not find operand in instruction");
1194      ComponentList components_left = inst_left->_components;
1195      const char *left_comp_type = components_left.at(left_op_index)->_type;
1196      OpClassForm *left_opclass = globals[left_comp_type]->is_opclass();
1197      Form::InterfaceType left_interface_type = left_opclass->interface_type(globals);
1198
1199
1200      // RIGHT
1201      int right_op_index = -1;
1202      int right_index      = pconstraint->_right_inst;
1203      const char *right_op = pconstraint->_right_op;
1204      if( right_index != -1 ) { // Match operand
1205        // Access info on the instructions whose operands are compared
1206        InstructForm *inst_right = globals[pmatch->instruction_name(right_index)]->is_instruction();
1207        assert( inst_right, "Parser should guaranty this is an instruction");
1208        int right_op_base = inst_right->oper_input_base(globals);
1209        // Access info on the operands being compared
1210        right_op_index = inst_right->operand_position(right_op, Component::USE);
1211        if( right_op_index == -1 ) {
1212          right_op_index = inst_right->operand_position(right_op, Component::DEF);
1213          if( right_op_index == -1 ) {
1214            right_op_index = inst_right->operand_position(right_op, Component::USE_DEF);
1215          }
1216        }
1217        assert( right_op_index != NameList::Not_in_list, "Did not find operand in instruction");
1218        ComponentList components_right = inst_right->_components;
1219        const char *right_comp_type = components_right.at(right_op_index)->_type;
1220        OpClassForm *right_opclass = globals[right_comp_type]->is_opclass();
1221        Form::InterfaceType right_interface_type = right_opclass->interface_type(globals);
1222        assert( right_interface_type == left_interface_type, "Both must be same interface");
1223
1224      } else {                  // Else match register
1225        // assert( false, "should be a register" );
1226      }
1227
1228      //
1229      // Check for equivalence
1230      //
1231      // fprintf(fp, "phase->eqv( ");
1232      // fprintf(fp, "inst%d->in(%d+%d) /* %s */, inst%d->in(%d+%d) /* %s */",
1233      //         left_index,  left_op_base,  left_op_index,  left_op,
1234      //         right_index, right_op_base, right_op_index, right_op );
1235      // fprintf(fp, ")");
1236      //
1237      switch( left_interface_type ) {
1238      case Form::register_interface: {
1239        // Check that they are allocated to the same register
1240        // Need parameter for index position if not result operand
1241        char left_reg_index[] = ",instXXXX_idxXXXX";
1242        if( left_op_index != 0 ) {
1243          assert( (left_index <= 9999) && (left_op_index <= 9999), "exceed string size");
1244          // Must have index into operands
1245          sprintf(left_reg_index,",inst%d_idx%d", left_index, left_op_index);
1246        } else {
1247          strcpy(left_reg_index, "");
1248        }
1249        fprintf(fp, "(inst%d->_opnds[%d]->reg(ra_,inst%d%s)  /* %d.%s */",
1250                left_index,  left_op_index, left_index, left_reg_index, left_index, left_op );
1251        fprintf(fp, " == ");
1252
1253        if( right_index != -1 ) {
1254          char right_reg_index[18] = ",instXXXX_idxXXXX";
1255          if( right_op_index != 0 ) {
1256            assert( (right_index <= 9999) && (right_op_index <= 9999), "exceed string size");
1257            // Must have index into operands
1258            sprintf(right_reg_index,",inst%d_idx%d", right_index, right_op_index);
1259          } else {
1260            strcpy(right_reg_index, "");
1261          }
1262          fprintf(fp, "/* %d.%s */ inst%d->_opnds[%d]->reg(ra_,inst%d%s)",
1263                  right_index, right_op, right_index, right_op_index, right_index, right_reg_index );
1264        } else {
1265          fprintf(fp, "%s_enc", right_op );
1266        }
1267        fprintf(fp,")");
1268        break;
1269      }
1270      case Form::constant_interface: {
1271        // Compare the '->constant()' values
1272        fprintf(fp, "(inst%d->_opnds[%d]->constant()  /* %d.%s */",
1273                left_index,  left_op_index,  left_index, left_op );
1274        fprintf(fp, " == ");
1275        fprintf(fp, "/* %d.%s */ inst%d->_opnds[%d]->constant())",
1276                right_index, right_op, right_index, right_op_index );
1277        break;
1278      }
1279      case Form::memory_interface: {
1280        // Compare 'base', 'index', 'scale', and 'disp'
1281        // base
1282        fprintf(fp, "( \n");
1283        fprintf(fp, "  (inst%d->_opnds[%d]->base(ra_,inst%d,inst%d_idx%d)  /* %d.%s$$base */",
1284          left_index, left_op_index, left_index, left_index, left_op_index, left_index, left_op );
1285        fprintf(fp, " == ");
1286        fprintf(fp, "/* %d.%s$$base */ inst%d->_opnds[%d]->base(ra_,inst%d,inst%d_idx%d)) &&\n",
1287                right_index, right_op, right_index, right_op_index, right_index, right_index, right_op_index );
1288        // index
1289        fprintf(fp, "  (inst%d->_opnds[%d]->index(ra_,inst%d,inst%d_idx%d)  /* %d.%s$$index */",
1290                left_index, left_op_index, left_index, left_index, left_op_index, left_index, left_op );
1291        fprintf(fp, " == ");
1292        fprintf(fp, "/* %d.%s$$index */ inst%d->_opnds[%d]->index(ra_,inst%d,inst%d_idx%d)) &&\n",
1293                right_index, right_op, right_index, right_op_index, right_index, right_index, right_op_index );
1294        // scale
1295        fprintf(fp, "  (inst%d->_opnds[%d]->scale()  /* %d.%s$$scale */",
1296                left_index,  left_op_index,  left_index, left_op );
1297        fprintf(fp, " == ");
1298        fprintf(fp, "/* %d.%s$$scale */ inst%d->_opnds[%d]->scale()) &&\n",
1299                right_index, right_op, right_index, right_op_index );
1300        // disp
1301        fprintf(fp, "  (inst%d->_opnds[%d]->disp(ra_,inst%d,inst%d_idx%d)  /* %d.%s$$disp */",
1302                left_index, left_op_index, left_index, left_index, left_op_index, left_index, left_op );
1303        fprintf(fp, " == ");
1304        fprintf(fp, "/* %d.%s$$disp */ inst%d->_opnds[%d]->disp(ra_,inst%d,inst%d_idx%d))\n",
1305                right_index, right_op, right_index, right_op_index, right_index, right_index, right_op_index );
1306        fprintf(fp, ") \n");
1307        break;
1308      }
1309      case Form::conditional_interface: {
1310        // Compare the condition code being tested
1311        assert( false, "Unimplemented()" );
1312        break;
1313      }
1314      default: {
1315        assert( false, "ShouldNotReachHere()" );
1316        break;
1317      }
1318      }
1319
1320      // Advance to next constraint
1321      pconstraint = pconstraint->next();
1322      first_constraint = false;
1323    }
1324
1325    fprintf(fp, ";\n");
1326  }
1327}
1328
1329// // EXPERIMENTAL -- TEMPORARY code
1330// static Form::DataType get_operand_type(FormDict &globals, InstructForm *instr, const char *op_name ) {
1331//   int op_index = instr->operand_position(op_name, Component::USE);
1332//   if( op_index == -1 ) {
1333//     op_index = instr->operand_position(op_name, Component::DEF);
1334//     if( op_index == -1 ) {
1335//       op_index = instr->operand_position(op_name, Component::USE_DEF);
1336//     }
1337//   }
1338//   assert( op_index != NameList::Not_in_list, "Did not find operand in instruction");
1339//
1340//   ComponentList components_right = instr->_components;
1341//   char *right_comp_type = components_right.at(op_index)->_type;
1342//   OpClassForm *right_opclass = globals[right_comp_type]->is_opclass();
1343//   Form::InterfaceType  right_interface_type = right_opclass->interface_type(globals);
1344//
1345//   return;
1346// }
1347
1348// Construct the new sub-tree
1349static void generate_peepreplace( FILE *fp, FormDict &globals, PeepMatch *pmatch, PeepConstraint *pconstraint, PeepReplace *preplace, int max_position ) {
1350  fprintf(fp, "      // IF instructions and constraints matched\n");
1351  fprintf(fp, "      if( matches ) {\n");
1352  fprintf(fp, "        // generate the new sub-tree\n");
1353  fprintf(fp, "        assert( true, \"Debug stopping point\");\n");
1354  if( preplace != NULL ) {
1355    // Get the root of the new sub-tree
1356    const char *root_inst = NULL;
1357    preplace->next_instruction(root_inst);
1358    InstructForm *root_form = globals[root_inst]->is_instruction();
1359    assert( root_form != NULL, "Replacement instruction was not previously defined");
1360    fprintf(fp, "        %sNode *root = new (C) %sNode();\n", root_inst, root_inst);
1361
1362    int         inst_num;
1363    const char *op_name;
1364    int         opnds_index = 0;            // define result operand
1365    // Then install the use-operands for the new sub-tree
1366    // preplace->reset();             // reset breaks iteration
1367    for( preplace->next_operand( inst_num, op_name );
1368         op_name != NULL;
1369         preplace->next_operand( inst_num, op_name ) ) {
1370      InstructForm *inst_form;
1371      inst_form  = globals[pmatch->instruction_name(inst_num)]->is_instruction();
1372      assert( inst_form, "Parser should guaranty this is an instruction");
1373      int inst_op_num = inst_form->operand_position(op_name, Component::USE);
1374      if( inst_op_num == NameList::Not_in_list )
1375        inst_op_num = inst_form->operand_position(op_name, Component::USE_DEF);
1376      assert( inst_op_num != NameList::Not_in_list, "Did not find operand as USE");
1377      // find the name of the OperandForm from the local name
1378      const Form *form   = inst_form->_localNames[op_name];
1379      OperandForm  *op_form = form->is_operand();
1380      if( opnds_index == 0 ) {
1381        // Initial setup of new instruction
1382        fprintf(fp, "        // ----- Initial setup -----\n");
1383        //
1384        // Add control edge for this node
1385        fprintf(fp, "        root->add_req(_in[0]);                // control edge\n");
1386        // Add unmatched edges from root of match tree
1387        int op_base = root_form->oper_input_base(globals);
1388        for( int unmatched_edge = 1; unmatched_edge < op_base; ++unmatched_edge ) {
1389          fprintf(fp, "        root->add_req(inst%d->in(%d));        // unmatched ideal edge\n",
1390                                          inst_num, unmatched_edge);
1391        }
1392        // If new instruction captures bottom type
1393        if( root_form->captures_bottom_type(globals) ) {
1394          // Get bottom type from instruction whose result we are replacing
1395          fprintf(fp, "        root->_bottom_type = inst%d->bottom_type();\n", inst_num);
1396        }
1397        // Define result register and result operand
1398        fprintf(fp, "        ra_->add_reference(root, inst%d);\n", inst_num);
1399        fprintf(fp, "        ra_->set_oop (root, ra_->is_oop(inst%d));\n", inst_num);
1400        fprintf(fp, "        ra_->set_pair(root->_idx, ra_->get_reg_second(inst%d), ra_->get_reg_first(inst%d));\n", inst_num, inst_num);
1401        fprintf(fp, "        root->_opnds[0] = inst%d->_opnds[0]->clone(C); // result\n", inst_num);
1402        fprintf(fp, "        // ----- Done with initial setup -----\n");
1403      } else {
1404        if( (op_form == NULL) || (op_form->is_base_constant(globals) == Form::none) ) {
1405          // Do not have ideal edges for constants after matching
1406          fprintf(fp, "        for( unsigned x%d = inst%d_idx%d; x%d < inst%d_idx%d; x%d++ )\n",
1407                  inst_op_num, inst_num, inst_op_num,
1408                  inst_op_num, inst_num, inst_op_num+1, inst_op_num );
1409          fprintf(fp, "          root->add_req( inst%d->in(x%d) );\n",
1410                  inst_num, inst_op_num );
1411        } else {
1412          fprintf(fp, "        // no ideal edge for constants after matching\n");
1413        }
1414        fprintf(fp, "        root->_opnds[%d] = inst%d->_opnds[%d]->clone(C);\n",
1415                opnds_index, inst_num, inst_op_num );
1416      }
1417      ++opnds_index;
1418    }
1419  }else {
1420    // Replacing subtree with empty-tree
1421    assert( false, "ShouldNotReachHere();");
1422  }
1423
1424  // Return the new sub-tree
1425  fprintf(fp, "        deleted = %d;\n", max_position+1 /*zero to one based*/);
1426  fprintf(fp, "        return root;  // return new root;\n");
1427  fprintf(fp, "      }\n");
1428}
1429
1430
1431// Define the Peephole method for an instruction node
1432void ArchDesc::definePeephole(FILE *fp, InstructForm *node) {
1433  // Generate Peephole function header
1434  fprintf(fp, "MachNode *%sNode::peephole( Block *block, int block_index, PhaseRegAlloc *ra_, int &deleted, Compile* C ) {\n", node->_ident);
1435  fprintf(fp, "  bool  matches = true;\n");
1436
1437  // Identify the maximum instruction position,
1438  // generate temporaries that hold current instruction
1439  //
1440  //   MachNode  *inst0 = NULL;
1441  //   ...
1442  //   MachNode  *instMAX = NULL;
1443  //
1444  int max_position = 0;
1445  Peephole *peep;
1446  for( peep = node->peepholes(); peep != NULL; peep = peep->next() ) {
1447    PeepMatch *pmatch = peep->match();
1448    assert( pmatch != NULL, "fatal(), missing peepmatch rule");
1449    if( max_position < pmatch->max_position() )  max_position = pmatch->max_position();
1450  }
1451  for( int i = 0; i <= max_position; ++i ) {
1452    if( i == 0 ) {
1453      fprintf(fp, "  MachNode *inst0 = this;\n");
1454    } else {
1455      fprintf(fp, "  MachNode *inst%d = NULL;\n", i);
1456    }
1457  }
1458
1459  // For each peephole rule in architecture description
1460  //   Construct a test for the desired instruction sub-tree
1461  //   then check the constraints
1462  //   If these match, Generate the new subtree
1463  for( peep = node->peepholes(); peep != NULL; peep = peep->next() ) {
1464    int         peephole_number = peep->peephole_number();
1465    PeepMatch      *pmatch      = peep->match();
1466    PeepConstraint *pconstraint = peep->constraints();
1467    PeepReplace    *preplace    = peep->replacement();
1468
1469    // Root of this peephole is the current MachNode
1470    assert( true, // %%name?%% strcmp( node->_ident, pmatch->name(0) ) == 0,
1471            "root of PeepMatch does not match instruction");
1472
1473    // Make each peephole rule individually selectable
1474    fprintf(fp, "  if( (OptoPeepholeAt == -1) || (OptoPeepholeAt==%d) ) {\n", peephole_number);
1475    fprintf(fp, "    matches = true;\n");
1476    // Scan the peepmatch and output a test for each instruction
1477    check_peepmatch_instruction_sequence( fp, pmatch, pconstraint );
1478
1479    // Check constraints and build replacement inside scope
1480    fprintf(fp, "    // If instruction subtree matches\n");
1481    fprintf(fp, "    if( matches ) {\n");
1482
1483    // Generate tests for the constraints
1484    check_peepconstraints( fp, _globalNames, pmatch, pconstraint );
1485
1486    // Construct the new sub-tree
1487    generate_peepreplace( fp, _globalNames, pmatch, pconstraint, preplace, max_position );
1488
1489    // End of scope for this peephole's constraints
1490    fprintf(fp, "    }\n");
1491    // Closing brace '}' to make each peephole rule individually selectable
1492    fprintf(fp, "  } // end of peephole rule #%d\n", peephole_number);
1493    fprintf(fp, "\n");
1494  }
1495
1496  fprintf(fp, "  return NULL;  // No peephole rules matched\n");
1497  fprintf(fp, "}\n");
1498  fprintf(fp, "\n");
1499}
1500
1501// Define the Expand method for an instruction node
1502void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
1503  unsigned      cnt  = 0;          // Count nodes we have expand into
1504  unsigned      i;
1505
1506  // Generate Expand function header
1507  fprintf(fp, "MachNode* %sNode::Expand(State* state, Node_List& proj_list, Node* mem) {\n", node->_ident);
1508  fprintf(fp, "  Compile* C = Compile::current();\n");
1509  // Generate expand code
1510  if( node->expands() ) {
1511    const char   *opid;
1512    int           new_pos, exp_pos;
1513    const char   *new_id   = NULL;
1514    const Form   *frm      = NULL;
1515    InstructForm *new_inst = NULL;
1516    OperandForm  *new_oper = NULL;
1517    unsigned      numo     = node->num_opnds() +
1518                                node->_exprule->_newopers.count();
1519
1520    // If necessary, generate any operands created in expand rule
1521    if (node->_exprule->_newopers.count()) {
1522      for(node->_exprule->_newopers.reset();
1523          (new_id = node->_exprule->_newopers.iter()) != NULL; cnt++) {
1524        frm = node->_localNames[new_id];
1525        assert(frm, "Invalid entry in new operands list of expand rule");
1526        new_oper = frm->is_operand();
1527        char *tmp = (char *)node->_exprule->_newopconst[new_id];
1528        if (tmp == NULL) {
1529          fprintf(fp,"  MachOper *op%d = new (C) %sOper();\n",
1530                  cnt, new_oper->_ident);
1531        }
1532        else {
1533          fprintf(fp,"  MachOper *op%d = new (C) %sOper(%s);\n",
1534                  cnt, new_oper->_ident, tmp);
1535        }
1536      }
1537    }
1538    cnt = 0;
1539    // Generate the temps to use for DAG building
1540    for(i = 0; i < numo; i++) {
1541      if (i < node->num_opnds()) {
1542        fprintf(fp,"  MachNode *tmp%d = this;\n", i);
1543      }
1544      else {
1545        fprintf(fp,"  MachNode *tmp%d = NULL;\n", i);
1546      }
1547    }
1548    // Build mapping from num_edges to local variables
1549    fprintf(fp,"  unsigned num0 = 0;\n");
1550    for( i = 1; i < node->num_opnds(); i++ ) {
1551      fprintf(fp,"  unsigned num%d = opnd_array(%d)->num_edges();\n",i,i);
1552    }
1553
1554    // Build a mapping from operand index to input edges
1555    fprintf(fp,"  unsigned idx0 = oper_input_base();\n");
1556
1557    // The order in which the memory input is added to a node is very
1558    // strange.  Store nodes get a memory input before Expand is
1559    // called and other nodes get it afterwards or before depending on
1560    // match order so oper_input_base is wrong during expansion.  This
1561    // code adjusts it so that expansion will work correctly.
1562    int has_memory_edge = node->_matrule->needs_ideal_memory_edge(_globalNames);
1563    if (has_memory_edge) {
1564      fprintf(fp,"  if (mem == (Node*)1) {\n");
1565      fprintf(fp,"    idx0--; // Adjust base because memory edge hasn't been inserted yet\n");
1566      fprintf(fp,"  }\n");
1567    }
1568
1569    for( i = 0; i < node->num_opnds(); i++ ) {
1570      fprintf(fp,"  unsigned idx%d = idx%d + num%d;\n",
1571              i+1,i,i);
1572    }
1573
1574    // Declare variable to hold root of expansion
1575    fprintf(fp,"  MachNode *result = NULL;\n");
1576
1577    // Iterate over the instructions 'node' expands into
1578    ExpandRule  *expand       = node->_exprule;
1579    NameAndList *expand_instr = NULL;
1580    for(expand->reset_instructions();
1581        (expand_instr = expand->iter_instructions()) != NULL; cnt++) {
1582      new_id = expand_instr->name();
1583
1584      InstructForm* expand_instruction = (InstructForm*)globalAD->globalNames()[new_id];
1585      if (expand_instruction->has_temps()) {
1586        globalAD->syntax_err(node->_linenum, "In %s: expand rules using instructs with TEMPs aren't supported: %s",
1587                             node->_ident, new_id);
1588      }
1589
1590      // Build the node for the instruction
1591      fprintf(fp,"\n  %sNode *n%d = new (C) %sNode();\n", new_id, cnt, new_id);
1592      // Add control edge for this node
1593      fprintf(fp,"  n%d->add_req(_in[0]);\n", cnt);
1594      // Build the operand for the value this node defines.
1595      Form *form = (Form*)_globalNames[new_id];
1596      assert( form, "'new_id' must be a defined form name");
1597      // Grab the InstructForm for the new instruction
1598      new_inst = form->is_instruction();
1599      assert( new_inst, "'new_id' must be an instruction name");
1600      if( node->is_ideal_if() && new_inst->is_ideal_if() ) {
1601        fprintf(fp, "  ((MachIfNode*)n%d)->_prob = _prob;\n",cnt);
1602        fprintf(fp, "  ((MachIfNode*)n%d)->_fcnt = _fcnt;\n",cnt);
1603      }
1604
1605      if( node->is_ideal_fastlock() && new_inst->is_ideal_fastlock() ) {
1606        fprintf(fp, "  ((MachFastLockNode*)n%d)->_counters = _counters;\n",cnt);
1607      }
1608
1609      // Fill in the bottom_type where requested
1610      if (node->captures_bottom_type(_globalNames) &&
1611          new_inst->captures_bottom_type(_globalNames)) {
1612        fprintf(fp, "  ((MachTypeNode*)n%d)->_bottom_type = bottom_type();\n", cnt);
1613      }
1614
1615      const char *resultOper = new_inst->reduce_result();
1616      fprintf(fp,"  n%d->set_opnd_array(0, state->MachOperGenerator( %s, C ));\n",
1617              cnt, machOperEnum(resultOper));
1618
1619      // get the formal operand NameList
1620      NameList *formal_lst = &new_inst->_parameters;
1621      formal_lst->reset();
1622
1623      // Handle any memory operand
1624      int memory_operand = new_inst->memory_operand(_globalNames);
1625      if( memory_operand != InstructForm::NO_MEMORY_OPERAND ) {
1626        int node_mem_op = node->memory_operand(_globalNames);
1627        assert( node_mem_op != InstructForm::NO_MEMORY_OPERAND,
1628                "expand rule member needs memory but top-level inst doesn't have any" );
1629        if (has_memory_edge) {
1630          // Copy memory edge
1631          fprintf(fp,"  if (mem != (Node*)1) {\n");
1632          fprintf(fp,"    n%d->add_req(_in[1]);\t// Add memory edge\n", cnt);
1633          fprintf(fp,"  }\n");
1634        }
1635      }
1636
1637      // Iterate over the new instruction's operands
1638      int prev_pos = -1;
1639      for( expand_instr->reset(); (opid = expand_instr->iter()) != NULL; ) {
1640        // Use 'parameter' at current position in list of new instruction's formals
1641        // instead of 'opid' when looking up info internal to new_inst
1642        const char *parameter = formal_lst->iter();
1643        // Check for an operand which is created in the expand rule
1644        if ((exp_pos = node->_exprule->_newopers.index(opid)) != -1) {
1645          new_pos = new_inst->operand_position(parameter,Component::USE);
1646          exp_pos += node->num_opnds();
1647          // If there is no use of the created operand, just skip it
1648          if (new_pos != -1) {
1649            //Copy the operand from the original made above
1650            fprintf(fp,"  n%d->set_opnd_array(%d, op%d->clone(C)); // %s\n",
1651                    cnt, new_pos, exp_pos-node->num_opnds(), opid);
1652            // Check for who defines this operand & add edge if needed
1653            fprintf(fp,"  if(tmp%d != NULL)\n", exp_pos);
1654            fprintf(fp,"    n%d->add_req(tmp%d);\n", cnt, exp_pos);
1655          }
1656        }
1657        else {
1658          // Use operand name to get an index into instruction component list
1659          // ins = (InstructForm *) _globalNames[new_id];
1660          exp_pos = node->operand_position_format(opid);
1661          assert(exp_pos != -1, "Bad expand rule");
1662          if (prev_pos > exp_pos && expand_instruction->_matrule != NULL) {
1663            // For the add_req calls below to work correctly they need
1664            // to added in the same order that a match would add them.
1665            // This means that they would need to be in the order of
1666            // the components list instead of the formal parameters.
1667            // This is a sort of hidden invariant that previously
1668            // wasn't checked and could lead to incorrectly
1669            // constructed nodes.
1670            syntax_err(node->_linenum, "For expand in %s to work, parameter declaration order in %s must follow matchrule\n",
1671                       node->_ident, new_inst->_ident);
1672          }
1673          prev_pos = exp_pos;
1674
1675          new_pos = new_inst->operand_position(parameter,Component::USE);
1676          if (new_pos != -1) {
1677            // Copy the operand from the ExpandNode to the new node
1678            fprintf(fp,"  n%d->set_opnd_array(%d, opnd_array(%d)->clone(C)); // %s\n",
1679                    cnt, new_pos, exp_pos, opid);
1680            // For each operand add appropriate input edges by looking at tmp's
1681            fprintf(fp,"  if(tmp%d == this) {\n", exp_pos);
1682            // Grab corresponding edges from ExpandNode and insert them here
1683            fprintf(fp,"    for(unsigned i = 0; i < num%d; i++) {\n", exp_pos);
1684            fprintf(fp,"      n%d->add_req(_in[i + idx%d]);\n", cnt, exp_pos);
1685            fprintf(fp,"    }\n");
1686            fprintf(fp,"  }\n");
1687            // This value is generated by one of the new instructions
1688            fprintf(fp,"  else n%d->add_req(tmp%d);\n", cnt, exp_pos);
1689          }
1690        }
1691
1692        // Update the DAG tmp's for values defined by this instruction
1693        int new_def_pos = new_inst->operand_position(parameter,Component::DEF);
1694        Effect *eform = (Effect *)new_inst->_effects[parameter];
1695        // If this operand is a definition in either an effects rule
1696        // or a match rule
1697        if((eform) && (is_def(eform->_use_def))) {
1698          // Update the temp associated with this operand
1699          fprintf(fp,"  tmp%d = n%d;\n", exp_pos, cnt);
1700        }
1701        else if( new_def_pos != -1 ) {
1702          // Instruction defines a value but user did not declare it
1703          // in the 'effect' clause
1704          fprintf(fp,"  tmp%d = n%d;\n", exp_pos, cnt);
1705        }
1706      } // done iterating over a new instruction's operands
1707
1708      // Invoke Expand() for the newly created instruction.
1709      fprintf(fp,"  result = n%d->Expand( state, proj_list, mem );\n", cnt);
1710      assert( !new_inst->expands(), "Do not have complete support for recursive expansion");
1711    } // done iterating over new instructions
1712    fprintf(fp,"\n");
1713  } // done generating expand rule
1714
1715  // Generate projections for instruction's additional DEFs and KILLs
1716  if( ! node->expands() && (node->needs_projections() || node->has_temps())) {
1717    // Get string representing the MachNode that projections point at
1718    const char *machNode = "this";
1719    // Generate the projections
1720    fprintf(fp,"  // Add projection edges for additional defs or kills\n");
1721
1722    // Examine each component to see if it is a DEF or KILL
1723    node->_components.reset();
1724    // Skip the first component, if already handled as (SET dst (...))
1725    Component *comp = NULL;
1726    // For kills, the choice of projection numbers is arbitrary
1727    int proj_no = 1;
1728    bool declared_def  = false;
1729    bool declared_kill = false;
1730
1731    while( (comp = node->_components.iter()) != NULL ) {
1732      // Lookup register class associated with operand type
1733      Form        *form = (Form*)_globalNames[comp->_type];
1734      assert( form, "component type must be a defined form");
1735      OperandForm *op   = form->is_operand();
1736
1737      if (comp->is(Component::TEMP)) {
1738        fprintf(fp, "  // TEMP %s\n", comp->_name);
1739        if (!declared_def) {
1740          // Define the variable "def" to hold new MachProjNodes
1741          fprintf(fp, "  MachTempNode *def;\n");
1742          declared_def = true;
1743        }
1744        if (op && op->_interface && op->_interface->is_RegInterface()) {
1745          fprintf(fp,"  def = new (C) MachTempNode(state->MachOperGenerator( %s, C ));\n",
1746                  machOperEnum(op->_ident));
1747          fprintf(fp,"  add_req(def);\n");
1748          // The operand for TEMP is already constructed during
1749          // this mach node construction, see buildMachNode().
1750          //
1751          // int idx  = node->operand_position_format(comp->_name);
1752          // fprintf(fp,"  set_opnd_array(%d, state->MachOperGenerator( %s, C ));\n",
1753          //         idx, machOperEnum(op->_ident));
1754        } else {
1755          assert(false, "can't have temps which aren't registers");
1756        }
1757      } else if (comp->isa(Component::KILL)) {
1758        fprintf(fp, "  // DEF/KILL %s\n", comp->_name);
1759
1760        if (!declared_kill) {
1761          // Define the variable "kill" to hold new MachProjNodes
1762          fprintf(fp, "  MachProjNode *kill;\n");
1763          declared_kill = true;
1764        }
1765
1766        assert( op, "Support additional KILLS for base operands");
1767        const char *regmask    = reg_mask(*op);
1768        const char *ideal_type = op->ideal_type(_globalNames, _register);
1769
1770        if (!op->is_bound_register()) {
1771          syntax_err(node->_linenum, "In %s only bound registers can be killed: %s %s\n",
1772                     node->_ident, comp->_type, comp->_name);
1773        }
1774
1775        fprintf(fp,"  kill = ");
1776        fprintf(fp,"new (C) MachProjNode( %s, %d, (%s), Op_%s );\n",
1777                machNode, proj_no++, regmask, ideal_type);
1778        fprintf(fp,"  proj_list.push(kill);\n");
1779      }
1780    }
1781  }
1782
1783  if( !node->expands() && node->_matrule != NULL ) {
1784    // Remove duplicated operands and inputs which use the same name.
1785    // Seach through match operands for the same name usage.
1786    uint cur_num_opnds = node->num_opnds();
1787    if( cur_num_opnds > 1 && cur_num_opnds != node->num_unique_opnds() ) {
1788      Component *comp = NULL;
1789      // Build mapping from num_edges to local variables
1790      fprintf(fp,"  unsigned num0 = 0;\n");
1791      for( i = 1; i < cur_num_opnds; i++ ) {
1792        fprintf(fp,"  unsigned num%d = opnd_array(%d)->num_edges();\n",i,i);
1793      }
1794      // Build a mapping from operand index to input edges
1795      fprintf(fp,"  unsigned idx0 = oper_input_base();\n");
1796      for( i = 0; i < cur_num_opnds; i++ ) {
1797        fprintf(fp,"  unsigned idx%d = idx%d + num%d;\n",
1798                i+1,i,i);
1799      }
1800
1801      uint new_num_opnds = 1;
1802      node->_components.reset();
1803      // Skip first unique operands.
1804      for( i = 1; i < cur_num_opnds; i++ ) {
1805        comp = node->_components.iter();
1806        if( (int)i != node->unique_opnds_idx(i) ) {
1807          break;
1808        }
1809        new_num_opnds++;
1810      }
1811      // Replace not unique operands with next unique operands.
1812      for( ; i < cur_num_opnds; i++ ) {
1813        comp = node->_components.iter();
1814        int j = node->unique_opnds_idx(i);
1815        // unique_opnds_idx(i) is unique if unique_opnds_idx(j) is not unique.
1816        if( j != node->unique_opnds_idx(j) ) {
1817          fprintf(fp,"  set_opnd_array(%d, opnd_array(%d)->clone(C)); // %s\n",
1818                  new_num_opnds, i, comp->_name);
1819          // delete not unique edges here
1820          fprintf(fp,"  for(unsigned i = 0; i < num%d; i++) {\n", i);
1821          fprintf(fp,"    set_req(i + idx%d, _in[i + idx%d]);\n", new_num_opnds, i);
1822          fprintf(fp,"  }\n");
1823          fprintf(fp,"  num%d = num%d;\n", new_num_opnds, i);
1824          fprintf(fp,"  idx%d = idx%d + num%d;\n", new_num_opnds+1, new_num_opnds, new_num_opnds);
1825          new_num_opnds++;
1826        }
1827      }
1828      // delete the rest of edges
1829      fprintf(fp,"  for(int i = idx%d - 1; i >= (int)idx%d; i--) {\n", cur_num_opnds, new_num_opnds);
1830      fprintf(fp,"    del_req(i);\n");
1831      fprintf(fp,"  }\n");
1832      fprintf(fp,"  _num_opnds = %d;\n", new_num_opnds);
1833      assert(new_num_opnds == node->num_unique_opnds(), "what?");
1834    }
1835  }
1836
1837  // If the node is a MachConstantNode, insert the MachConstantBaseNode edge.
1838  // NOTE: this edge must be the last input (see MachConstantNode::mach_constant_base_node_input).
1839  if (node->is_mach_constant()) {
1840    fprintf(fp,"  add_req(C->mach_constant_base_node());\n");
1841  }
1842
1843  fprintf(fp,"\n");
1844  if( node->expands() ) {
1845    fprintf(fp,"  return result;\n");
1846  } else {
1847    fprintf(fp,"  return this;\n");
1848  }
1849  fprintf(fp,"}\n");
1850  fprintf(fp,"\n");
1851}
1852
1853
1854//------------------------------Emit Routines----------------------------------
1855// Special classes and routines for defining node emit routines which output
1856// target specific instruction object encodings.
1857// Define the ___Node::emit() routine
1858//
1859// (1) void  ___Node::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
1860// (2)   // ...  encoding defined by user
1861// (3)
1862// (4) }
1863//
1864
1865class DefineEmitState {
1866private:
1867  enum reloc_format { RELOC_NONE        = -1,
1868                      RELOC_IMMEDIATE   =  0,
1869                      RELOC_DISP        =  1,
1870                      RELOC_CALL_DISP   =  2 };
1871  enum literal_status{ LITERAL_NOT_SEEN  = 0,
1872                       LITERAL_SEEN      = 1,
1873                       LITERAL_ACCESSED  = 2,
1874                       LITERAL_OUTPUT    = 3 };
1875  // Temporaries that describe current operand
1876  bool          _cleared;
1877  OpClassForm  *_opclass;
1878  OperandForm  *_operand;
1879  int           _operand_idx;
1880  const char   *_local_name;
1881  const char   *_operand_name;
1882  bool          _doing_disp;
1883  bool          _doing_constant;
1884  Form::DataType _constant_type;
1885  DefineEmitState::literal_status _constant_status;
1886  DefineEmitState::literal_status _reg_status;
1887  bool          _doing_emit8;
1888  bool          _doing_emit_d32;
1889  bool          _doing_emit_d16;
1890  bool          _doing_emit_hi;
1891  bool          _doing_emit_lo;
1892  bool          _may_reloc;
1893  reloc_format  _reloc_form;
1894  const char *  _reloc_type;
1895  bool          _processing_noninput;
1896
1897  NameList      _strings_to_emit;
1898
1899  // Stable state, set by constructor
1900  ArchDesc     &_AD;
1901  FILE         *_fp;
1902  EncClass     &_encoding;
1903  InsEncode    &_ins_encode;
1904  InstructForm &_inst;
1905
1906public:
1907  DefineEmitState(FILE *fp, ArchDesc &AD, EncClass &encoding,
1908                  InsEncode &ins_encode, InstructForm &inst)
1909    : _AD(AD), _fp(fp), _encoding(encoding), _ins_encode(ins_encode), _inst(inst) {
1910      clear();
1911  }
1912
1913  void clear() {
1914    _cleared       = true;
1915    _opclass       = NULL;
1916    _operand       = NULL;
1917    _operand_idx   = 0;
1918    _local_name    = "";
1919    _operand_name  = "";
1920    _doing_disp    = false;
1921    _doing_constant= false;
1922    _constant_type = Form::none;
1923    _constant_status = LITERAL_NOT_SEEN;
1924    _reg_status      = LITERAL_NOT_SEEN;
1925    _doing_emit8   = false;
1926    _doing_emit_d32= false;
1927    _doing_emit_d16= false;
1928    _doing_emit_hi = false;
1929    _doing_emit_lo = false;
1930    _may_reloc     = false;
1931    _reloc_form    = RELOC_NONE;
1932    _reloc_type    = AdlcVMDeps::none_reloc_type();
1933    _strings_to_emit.clear();
1934  }
1935
1936  // Track necessary state when identifying a replacement variable
1937  void update_state(const char *rep_var) {
1938    // A replacement variable or one of its subfields
1939    // Obtain replacement variable from list
1940    if ( (*rep_var) != '$' ) {
1941      // A replacement variable, '$' prefix
1942      // check_rep_var( rep_var );
1943      if ( Opcode::as_opcode_type(rep_var) != Opcode::NOT_AN_OPCODE ) {
1944        // No state needed.
1945        assert( _opclass == NULL,
1946                "'primary', 'secondary' and 'tertiary' don't follow operand.");
1947      }
1948      else if ((strcmp(rep_var, "constanttablebase") == 0) ||
1949               (strcmp(rep_var, "constantoffset")    == 0) ||
1950               (strcmp(rep_var, "constantaddress")   == 0)) {
1951        if (!_inst.is_mach_constant()) {
1952          _AD.syntax_err(_encoding._linenum,
1953                         "Replacement variable %s not allowed in instruct %s (only in MachConstantNode).\n",
1954                         rep_var, _encoding._name);
1955        }
1956      }
1957      else {
1958        // Lookup its position in parameter list
1959        int   param_no  = _encoding.rep_var_index(rep_var);
1960        if ( param_no == -1 ) {
1961          _AD.syntax_err( _encoding._linenum,
1962                          "Replacement variable %s not found in enc_class %s.\n",
1963                          rep_var, _encoding._name);
1964        }
1965
1966        // Lookup the corresponding ins_encode parameter
1967        const char *inst_rep_var = _ins_encode.rep_var_name(_inst, param_no);
1968        if (inst_rep_var == NULL) {
1969          _AD.syntax_err( _ins_encode._linenum,
1970                          "Parameter %s not passed to enc_class %s from instruct %s.\n",
1971                          rep_var, _encoding._name, _inst._ident);
1972        }
1973
1974        // Check if instruction's actual parameter is a local name in the instruction
1975        const Form  *local     = _inst._localNames[inst_rep_var];
1976        OpClassForm *opc       = (local != NULL) ? local->is_opclass() : NULL;
1977        // Note: assert removed to allow constant and symbolic parameters
1978        // assert( opc, "replacement variable was not found in local names");
1979        // Lookup the index position iff the replacement variable is a localName
1980        int idx  = (opc != NULL) ? _inst.operand_position_format(inst_rep_var) : -1;
1981
1982        if ( idx != -1 ) {
1983          // This is a local in the instruction
1984          // Update local state info.
1985          _opclass        = opc;
1986          _operand_idx    = idx;
1987          _local_name     = rep_var;
1988          _operand_name   = inst_rep_var;
1989
1990          // !!!!!
1991          // Do not support consecutive operands.
1992          assert( _operand == NULL, "Unimplemented()");
1993          _operand = opc->is_operand();
1994        }
1995        else if( ADLParser::is_literal_constant(inst_rep_var) ) {
1996          // Instruction provided a constant expression
1997          // Check later that encoding specifies $$$constant to resolve as constant
1998          _constant_status   = LITERAL_SEEN;
1999        }
2000        else if( Opcode::as_opcode_type(inst_rep_var) != Opcode::NOT_AN_OPCODE ) {
2001          // Instruction provided an opcode: "primary", "secondary", "tertiary"
2002          // Check later that encoding specifies $$$constant to resolve as constant
2003          _constant_status   = LITERAL_SEEN;
2004        }
2005        else if((_AD.get_registers() != NULL ) && (_AD.get_registers()->getRegDef(inst_rep_var) != NULL)) {
2006          // Instruction provided a literal register name for this parameter
2007          // Check that encoding specifies $$$reg to resolve.as register.
2008          _reg_status        = LITERAL_SEEN;
2009        }
2010        else {
2011          // Check for unimplemented functionality before hard failure
2012          assert( strcmp(opc->_ident,"label")==0, "Unimplemented() Label");
2013          assert( false, "ShouldNotReachHere()");
2014        }
2015      } // done checking which operand this is.
2016    } else {
2017      //
2018      // A subfield variable, '$$' prefix
2019      // Check for fields that may require relocation information.
2020      // Then check that literal register parameters are accessed with 'reg' or 'constant'
2021      //
2022      if ( strcmp(rep_var,"$disp") == 0 ) {
2023        _doing_disp = true;
2024        assert( _opclass, "Must use operand or operand class before '$disp'");
2025        if( _operand == NULL ) {
2026          // Only have an operand class, generate run-time check for relocation
2027          _may_reloc    = true;
2028          _reloc_form   = RELOC_DISP;
2029          _reloc_type   = AdlcVMDeps::oop_reloc_type();
2030        } else {
2031          // Do precise check on operand: is it a ConP or not
2032          //
2033          // Check interface for value of displacement
2034          assert( ( _operand->_interface != NULL ),
2035                  "$disp can only follow memory interface operand");
2036          MemInterface *mem_interface= _operand->_interface->is_MemInterface();
2037          assert( mem_interface != NULL,
2038                  "$disp can only follow memory interface operand");
2039          const char *disp = mem_interface->_disp;
2040
2041          if( disp != NULL && (*disp == '$') ) {
2042            // MemInterface::disp contains a replacement variable,
2043            // Check if this matches a ConP
2044            //
2045            // Lookup replacement variable, in operand's component list
2046            const char *rep_var_name = disp + 1; // Skip '$'
2047            const Component *comp = _operand->_components.search(rep_var_name);
2048            assert( comp != NULL,"Replacement variable not found in components");
2049            const char      *type = comp->_type;
2050            // Lookup operand form for replacement variable's type
2051            const Form *form = _AD.globalNames()[type];
2052            assert( form != NULL, "Replacement variable's type not found");
2053            OperandForm *op = form->is_operand();
2054            assert( op, "Attempting to emit a non-register or non-constant");
2055            // Check if this is a constant
2056            if (op->_matrule && op->_matrule->is_base_constant(_AD.globalNames())) {
2057              // Check which constant this name maps to: _c0, _c1, ..., _cn
2058              // const int idx = _operand.constant_position(_AD.globalNames(), comp);
2059              // assert( idx != -1, "Constant component not found in operand");
2060              Form::DataType dtype = op->is_base_constant(_AD.globalNames());
2061              if ( dtype == Form::idealP ) {
2062                _may_reloc    = true;
2063                // No longer true that idealP is always an oop
2064                _reloc_form   = RELOC_DISP;
2065                _reloc_type   = AdlcVMDeps::oop_reloc_type();
2066              }
2067            }
2068
2069            else if( _operand->is_user_name_for_sReg() != Form::none ) {
2070              // The only non-constant allowed access to disp is an operand sRegX in a stackSlotX
2071              assert( op->ideal_to_sReg_type(type) != Form::none, "StackSlots access displacements using 'sRegs'");
2072              _may_reloc   = false;
2073            } else {
2074              assert( false, "fatal(); Only stackSlots can access a non-constant using 'disp'");
2075            }
2076          }
2077        } // finished with precise check of operand for relocation.
2078      } // finished with subfield variable
2079      else if ( strcmp(rep_var,"$constant") == 0 ) {
2080        _doing_constant = true;
2081        if ( _constant_status == LITERAL_NOT_SEEN ) {
2082          // Check operand for type of constant
2083          assert( _operand, "Must use operand before '$$constant'");
2084          Form::DataType dtype = _operand->is_base_constant(_AD.globalNames());
2085          _constant_type = dtype;
2086          if ( dtype == Form::idealP ) {
2087            _may_reloc    = true;
2088            // No longer true that idealP is always an oop
2089            // // _must_reloc   = true;
2090            _reloc_form   = RELOC_IMMEDIATE;
2091            _reloc_type   = AdlcVMDeps::oop_reloc_type();
2092          } else {
2093            // No relocation information needed
2094          }
2095        } else {
2096          // User-provided literals may not require relocation information !!!!!
2097          assert( _constant_status == LITERAL_SEEN, "Must know we are processing a user-provided literal");
2098        }
2099      }
2100      else if ( strcmp(rep_var,"$label") == 0 ) {
2101        // Calls containing labels require relocation
2102        if ( _inst.is_ideal_call() )  {
2103          _may_reloc    = true;
2104          // !!!!! !!!!!
2105          _reloc_type   = AdlcVMDeps::none_reloc_type();
2106        }
2107      }
2108
2109      // literal register parameter must be accessed as a 'reg' field.
2110      if ( _reg_status != LITERAL_NOT_SEEN ) {
2111        assert( _reg_status == LITERAL_SEEN, "Must have seen register literal before now");
2112        if (strcmp(rep_var,"$reg") == 0 || reg_conversion(rep_var) != NULL) {
2113          _reg_status  = LITERAL_ACCESSED;
2114        } else {
2115          assert( false, "invalid access to literal register parameter");
2116        }
2117      }
2118      // literal constant parameters must be accessed as a 'constant' field
2119      if ( _constant_status != LITERAL_NOT_SEEN ) {
2120        assert( _constant_status == LITERAL_SEEN, "Must have seen constant literal before now");
2121        if( strcmp(rep_var,"$constant") == 0 ) {
2122          _constant_status  = LITERAL_ACCESSED;
2123        } else {
2124          assert( false, "invalid access to literal constant parameter");
2125        }
2126      }
2127    } // end replacement and/or subfield
2128
2129  }
2130
2131  void add_rep_var(const char *rep_var) {
2132    // Handle subfield and replacement variables.
2133    if ( ( *rep_var == '$' ) && ( *(rep_var+1) == '$' ) ) {
2134      // Check for emit prefix, '$$emit32'
2135      assert( _cleared, "Can not nest $$$emit32");
2136      if ( strcmp(rep_var,"$$emit32") == 0 ) {
2137        _doing_emit_d32 = true;
2138      }
2139      else if ( strcmp(rep_var,"$$emit16") == 0 ) {
2140        _doing_emit_d16 = true;
2141      }
2142      else if ( strcmp(rep_var,"$$emit_hi") == 0 ) {
2143        _doing_emit_hi  = true;
2144      }
2145      else if ( strcmp(rep_var,"$$emit_lo") == 0 ) {
2146        _doing_emit_lo  = true;
2147      }
2148      else if ( strcmp(rep_var,"$$emit8") == 0 ) {
2149        _doing_emit8    = true;
2150      }
2151      else {
2152        _AD.syntax_err(_encoding._linenum, "Unsupported $$operation '%s'\n",rep_var);
2153        assert( false, "fatal();");
2154      }
2155    }
2156    else {
2157      // Update state for replacement variables
2158      update_state( rep_var );
2159      _strings_to_emit.addName(rep_var);
2160    }
2161    _cleared  = false;
2162  }
2163
2164  void emit_replacement() {
2165    // A replacement variable or one of its subfields
2166    // Obtain replacement variable from list
2167    // const char *ec_rep_var = encoding->_rep_vars.iter();
2168    const char *rep_var;
2169    _strings_to_emit.reset();
2170    while ( (rep_var = _strings_to_emit.iter()) != NULL ) {
2171
2172      if ( (*rep_var) == '$' ) {
2173        // A subfield variable, '$$' prefix
2174        emit_field( rep_var );
2175      } else {
2176        if (_strings_to_emit.peek() != NULL &&
2177            strcmp(_strings_to_emit.peek(), "$Address") == 0) {
2178          fprintf(_fp, "Address::make_raw(");
2179
2180          emit_rep_var( rep_var );
2181          fprintf(_fp,"->base(ra_,this,idx%d), ", _operand_idx);
2182
2183          _reg_status = LITERAL_ACCESSED;
2184          emit_rep_var( rep_var );
2185          fprintf(_fp,"->index(ra_,this,idx%d), ", _operand_idx);
2186
2187          _reg_status = LITERAL_ACCESSED;
2188          emit_rep_var( rep_var );
2189          fprintf(_fp,"->scale(), ");
2190
2191          _reg_status = LITERAL_ACCESSED;
2192          emit_rep_var( rep_var );
2193          Form::DataType stack_type = _operand ? _operand->is_user_name_for_sReg() : Form::none;
2194          if( _operand  && _operand_idx==0 && stack_type != Form::none ) {
2195            fprintf(_fp,"->disp(ra_,this,0), ");
2196          } else {
2197            fprintf(_fp,"->disp(ra_,this,idx%d), ", _operand_idx);
2198          }
2199
2200          _reg_status = LITERAL_ACCESSED;
2201          emit_rep_var( rep_var );
2202          fprintf(_fp,"->disp_reloc())");
2203
2204          // skip trailing $Address
2205          _strings_to_emit.iter();
2206        } else {
2207          // A replacement variable, '$' prefix
2208          const char* next = _strings_to_emit.peek();
2209          const char* next2 = _strings_to_emit.peek(2);
2210          if (next != NULL && next2 != NULL && strcmp(next2, "$Register") == 0 &&
2211              (strcmp(next, "$base") == 0 || strcmp(next, "$index") == 0)) {
2212            // handle $rev_var$$base$$Register and $rev_var$$index$$Register by
2213            // producing as_Register(opnd_array(#)->base(ra_,this,idx1)).
2214            fprintf(_fp, "as_Register(");
2215            // emit the operand reference
2216            emit_rep_var( rep_var );
2217            rep_var = _strings_to_emit.iter();
2218            assert(strcmp(rep_var, "$base") == 0 || strcmp(rep_var, "$index") == 0, "bad pattern");
2219            // handle base or index
2220            emit_field(rep_var);
2221            rep_var = _strings_to_emit.iter();
2222            assert(strcmp(rep_var, "$Register") == 0, "bad pattern");
2223            // close up the parens
2224            fprintf(_fp, ")");
2225          } else {
2226            emit_rep_var( rep_var );
2227          }
2228        }
2229      } // end replacement and/or subfield
2230    }
2231  }
2232
2233  void emit_reloc_type(const char* type) {
2234    fprintf(_fp, "%s", type)
2235      ;
2236  }
2237
2238
2239  void emit() {
2240    //
2241    //   "emit_d32_reloc(" or "emit_hi_reloc" or "emit_lo_reloc"
2242    //
2243    // Emit the function name when generating an emit function
2244    if ( _doing_emit_d32 || _doing_emit_hi || _doing_emit_lo ) {
2245      const char *d32_hi_lo = _doing_emit_d32 ? "d32" : (_doing_emit_hi ? "hi" : "lo");
2246      // In general, relocatable isn't known at compiler compile time.
2247      // Check results of prior scan
2248      if ( ! _may_reloc ) {
2249        // Definitely don't need relocation information
2250        fprintf( _fp, "emit_%s(cbuf, ", d32_hi_lo );
2251        emit_replacement(); fprintf(_fp, ")");
2252      }
2253      else {
2254        // Emit RUNTIME CHECK to see if value needs relocation info
2255        // If emitting a relocatable address, use 'emit_d32_reloc'
2256        const char *disp_constant = _doing_disp ? "disp" : _doing_constant ? "constant" : "INVALID";
2257        assert( (_doing_disp || _doing_constant)
2258                && !(_doing_disp && _doing_constant),
2259                "Must be emitting either a displacement or a constant");
2260        fprintf(_fp,"\n");
2261        fprintf(_fp,"if ( opnd_array(%d)->%s_reloc() != relocInfo::none ) {\n",
2262                _operand_idx, disp_constant);
2263        fprintf(_fp,"  ");
2264        fprintf(_fp,"emit_%s_reloc(cbuf, ", d32_hi_lo );
2265        emit_replacement();             fprintf(_fp,", ");
2266        fprintf(_fp,"opnd_array(%d)->%s_reloc(), ",
2267                _operand_idx, disp_constant);
2268        fprintf(_fp, "%d", _reloc_form);fprintf(_fp, ");");
2269        fprintf(_fp,"\n");
2270        fprintf(_fp,"} else {\n");
2271        fprintf(_fp,"  emit_%s(cbuf, ", d32_hi_lo);
2272        emit_replacement(); fprintf(_fp, ");\n"); fprintf(_fp,"}");
2273      }
2274    }
2275    else if ( _doing_emit_d16 ) {
2276      // Relocation of 16-bit values is not supported
2277      fprintf(_fp,"emit_d16(cbuf, ");
2278      emit_replacement(); fprintf(_fp, ")");
2279      // No relocation done for 16-bit values
2280    }
2281    else if ( _doing_emit8 ) {
2282      // Relocation of 8-bit values is not supported
2283      fprintf(_fp,"emit_d8(cbuf, ");
2284      emit_replacement(); fprintf(_fp, ")");
2285      // No relocation done for 8-bit values
2286    }
2287    else {
2288      // Not an emit# command, just output the replacement string.
2289      emit_replacement();
2290    }
2291
2292    // Get ready for next state collection.
2293    clear();
2294  }
2295
2296private:
2297
2298  // recognizes names which represent MacroAssembler register types
2299  // and return the conversion function to build them from OptoReg
2300  const char* reg_conversion(const char* rep_var) {
2301    if (strcmp(rep_var,"$Register") == 0)      return "as_Register";
2302    if (strcmp(rep_var,"$FloatRegister") == 0) return "as_FloatRegister";
2303#if defined(IA32) || defined(AMD64)
2304    if (strcmp(rep_var,"$XMMRegister") == 0)   return "as_XMMRegister";
2305#endif
2306    return NULL;
2307  }
2308
2309  void emit_field(const char *rep_var) {
2310    const char* reg_convert = reg_conversion(rep_var);
2311
2312    // A subfield variable, '$$subfield'
2313    if ( strcmp(rep_var, "$reg") == 0 || reg_convert != NULL) {
2314      // $reg form or the $Register MacroAssembler type conversions
2315      assert( _operand_idx != -1,
2316              "Must use this subfield after operand");
2317      if( _reg_status == LITERAL_NOT_SEEN ) {
2318        if (_processing_noninput) {
2319          const Form  *local     = _inst._localNames[_operand_name];
2320          OperandForm *oper      = local->is_operand();
2321          const RegDef* first = oper->get_RegClass()->find_first_elem();
2322          if (reg_convert != NULL) {
2323            fprintf(_fp, "%s(%s_enc)", reg_convert, first->_regname);
2324          } else {
2325            fprintf(_fp, "%s_enc", first->_regname);
2326          }
2327        } else {
2328          fprintf(_fp,"->%s(ra_,this", reg_convert != NULL ? reg_convert : "reg");
2329          // Add parameter for index position, if not result operand
2330          if( _operand_idx != 0 ) fprintf(_fp,",idx%d", _operand_idx);
2331          fprintf(_fp,")");
2332        }
2333      } else {
2334        assert( _reg_status == LITERAL_OUTPUT, "should have output register literal in emit_rep_var");
2335        // Register literal has already been sent to output file, nothing more needed
2336      }
2337    }
2338    else if ( strcmp(rep_var,"$base") == 0 ) {
2339      assert( _operand_idx != -1,
2340              "Must use this subfield after operand");
2341      assert( ! _may_reloc, "UnImplemented()");
2342      fprintf(_fp,"->base(ra_,this,idx%d)", _operand_idx);
2343    }
2344    else if ( strcmp(rep_var,"$index") == 0 ) {
2345      assert( _operand_idx != -1,
2346              "Must use this subfield after operand");
2347      assert( ! _may_reloc, "UnImplemented()");
2348      fprintf(_fp,"->index(ra_,this,idx%d)", _operand_idx);
2349    }
2350    else if ( strcmp(rep_var,"$scale") == 0 ) {
2351      assert( ! _may_reloc, "UnImplemented()");
2352      fprintf(_fp,"->scale()");
2353    }
2354    else if ( strcmp(rep_var,"$cmpcode") == 0 ) {
2355      assert( ! _may_reloc, "UnImplemented()");
2356      fprintf(_fp,"->ccode()");
2357    }
2358    else if ( strcmp(rep_var,"$constant") == 0 ) {
2359      if( _constant_status == LITERAL_NOT_SEEN ) {
2360        if ( _constant_type == Form::idealD ) {
2361          fprintf(_fp,"->constantD()");
2362        } else if ( _constant_type == Form::idealF ) {
2363          fprintf(_fp,"->constantF()");
2364        } else if ( _constant_type == Form::idealL ) {
2365          fprintf(_fp,"->constantL()");
2366        } else {
2367          fprintf(_fp,"->constant()");
2368        }
2369      } else {
2370        assert( _constant_status == LITERAL_OUTPUT, "should have output constant literal in emit_rep_var");
2371        // Cosntant literal has already been sent to output file, nothing more needed
2372      }
2373    }
2374    else if ( strcmp(rep_var,"$disp") == 0 ) {
2375      Form::DataType stack_type = _operand ? _operand->is_user_name_for_sReg() : Form::none;
2376      if( _operand  && _operand_idx==0 && stack_type != Form::none ) {
2377        fprintf(_fp,"->disp(ra_,this,0)");
2378      } else {
2379        fprintf(_fp,"->disp(ra_,this,idx%d)", _operand_idx);
2380      }
2381    }
2382    else if ( strcmp(rep_var,"$label") == 0 ) {
2383      fprintf(_fp,"->label()");
2384    }
2385    else if ( strcmp(rep_var,"$method") == 0 ) {
2386      fprintf(_fp,"->method()");
2387    }
2388    else {
2389      printf("emit_field: %s\n",rep_var);
2390      assert( false, "UnImplemented()");
2391    }
2392  }
2393
2394
2395  void emit_rep_var(const char *rep_var) {
2396    _processing_noninput = false;
2397    // A replacement variable, originally '$'
2398    if ( Opcode::as_opcode_type(rep_var) != Opcode::NOT_AN_OPCODE ) {
2399      if (!_inst._opcode->print_opcode(_fp, Opcode::as_opcode_type(rep_var) )) {
2400        // Missing opcode
2401        _AD.syntax_err( _inst._linenum,
2402                        "Missing $%s opcode definition in %s, used by encoding %s\n",
2403                        rep_var, _inst._ident, _encoding._name);
2404      }
2405    }
2406    else if (strcmp(rep_var, "constanttablebase") == 0) {
2407      fprintf(_fp, "as_Register(ra_->get_encode(in(mach_constant_base_node_input())))");
2408    }
2409    else if (strcmp(rep_var, "constantoffset") == 0) {
2410      fprintf(_fp, "constant_offset()");
2411    }
2412    else if (strcmp(rep_var, "constantaddress") == 0) {
2413      fprintf(_fp, "InternalAddress(__ code()->consts()->start() + constant_offset())");
2414    }
2415    else {
2416      // Lookup its position in parameter list
2417      int   param_no  = _encoding.rep_var_index(rep_var);
2418      if ( param_no == -1 ) {
2419        _AD.syntax_err( _encoding._linenum,
2420                        "Replacement variable %s not found in enc_class %s.\n",
2421                        rep_var, _encoding._name);
2422      }
2423      // Lookup the corresponding ins_encode parameter
2424      const char *inst_rep_var = _ins_encode.rep_var_name(_inst, param_no);
2425
2426      // Check if instruction's actual parameter is a local name in the instruction
2427      const Form  *local     = _inst._localNames[inst_rep_var];
2428      OpClassForm *opc       = (local != NULL) ? local->is_opclass() : NULL;
2429      // Note: assert removed to allow constant and symbolic parameters
2430      // assert( opc, "replacement variable was not found in local names");
2431      // Lookup the index position iff the replacement variable is a localName
2432      int idx  = (opc != NULL) ? _inst.operand_position_format(inst_rep_var) : -1;
2433      if( idx != -1 ) {
2434        if (_inst.is_noninput_operand(idx)) {
2435          // This operand isn't a normal input so printing it is done
2436          // specially.
2437          _processing_noninput = true;
2438        } else {
2439          // Output the emit code for this operand
2440          fprintf(_fp,"opnd_array(%d)",idx);
2441        }
2442        assert( _operand == opc->is_operand(),
2443                "Previous emit $operand does not match current");
2444      }
2445      else if( ADLParser::is_literal_constant(inst_rep_var) ) {
2446        // else check if it is a constant expression
2447        // Removed following assert to allow primitive C types as arguments to encodings
2448        // assert( _constant_status == LITERAL_ACCESSED, "Must be processing a literal constant parameter");
2449        fprintf(_fp,"(%s)", inst_rep_var);
2450        _constant_status = LITERAL_OUTPUT;
2451      }
2452      else if( Opcode::as_opcode_type(inst_rep_var) != Opcode::NOT_AN_OPCODE ) {
2453        // else check if "primary", "secondary", "tertiary"
2454        assert( _constant_status == LITERAL_ACCESSED, "Must be processing a literal constant parameter");
2455        if (!_inst._opcode->print_opcode(_fp, Opcode::as_opcode_type(inst_rep_var) )) {
2456          // Missing opcode
2457          _AD.syntax_err( _inst._linenum,
2458                          "Missing $%s opcode definition in %s\n",
2459                          rep_var, _inst._ident);
2460
2461        }
2462        _constant_status = LITERAL_OUTPUT;
2463      }
2464      else if((_AD.get_registers() != NULL ) && (_AD.get_registers()->getRegDef(inst_rep_var) != NULL)) {
2465        // Instruction provided a literal register name for this parameter
2466        // Check that encoding specifies $$$reg to resolve.as register.
2467        assert( _reg_status == LITERAL_ACCESSED, "Must be processing a literal register parameter");
2468        fprintf(_fp,"(%s_enc)", inst_rep_var);
2469        _reg_status = LITERAL_OUTPUT;
2470      }
2471      else {
2472        // Check for unimplemented functionality before hard failure
2473        assert( strcmp(opc->_ident,"label")==0, "Unimplemented() Label");
2474        assert( false, "ShouldNotReachHere()");
2475      }
2476      // all done
2477    }
2478  }
2479
2480};  // end class DefineEmitState
2481
2482
2483void ArchDesc::defineSize(FILE *fp, InstructForm &inst) {
2484
2485  //(1)
2486  // Output instruction's emit prototype
2487  fprintf(fp,"uint  %sNode::size(PhaseRegAlloc *ra_) const {\n",
2488          inst._ident);
2489
2490  fprintf(fp, " assert(VerifyOops || MachNode::size(ra_) <= %s, \"bad fixed size\");\n", inst._size);
2491
2492  //(2)
2493  // Print the size
2494  fprintf(fp, " return (VerifyOops ? MachNode::size(ra_) : %s);\n", inst._size);
2495
2496  // (3) and (4)
2497  fprintf(fp,"}\n");
2498}
2499
2500// defineEmit -----------------------------------------------------------------
2501void ArchDesc::defineEmit(FILE* fp, InstructForm& inst) {
2502  InsEncode* encode = inst._insencode;
2503
2504  // (1)
2505  // Output instruction's emit prototype
2506  fprintf(fp, "void %sNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {\n", inst._ident);
2507
2508  // If user did not define an encode section,
2509  // provide stub that does not generate any machine code.
2510  if( (_encode == NULL) || (encode == NULL) ) {
2511    fprintf(fp, "  // User did not define an encode section.\n");
2512    fprintf(fp, "}\n");
2513    return;
2514  }
2515
2516  // Save current instruction's starting address (helps with relocation).
2517  fprintf(fp, "  cbuf.set_insts_mark();\n");
2518
2519  // For MachConstantNodes which are ideal jump nodes, fill the jump table.
2520  if (inst.is_mach_constant() && inst.is_ideal_jump()) {
2521    fprintf(fp, "  ra_->C->constant_table().fill_jump_table(cbuf, (MachConstantNode*) this, _index2label);\n");
2522  }
2523
2524  // Output each operand's offset into the array of registers.
2525  inst.index_temps(fp, _globalNames);
2526
2527  // Output this instruction's encodings
2528  const char *ec_name;
2529  bool        user_defined = false;
2530  encode->reset();
2531  while ((ec_name = encode->encode_class_iter()) != NULL) {
2532    fprintf(fp, "  {\n");
2533    // Output user-defined encoding
2534    user_defined           = true;
2535
2536    const char *ec_code    = NULL;
2537    const char *ec_rep_var = NULL;
2538    EncClass   *encoding   = _encode->encClass(ec_name);
2539    if (encoding == NULL) {
2540      fprintf(stderr, "User did not define contents of this encode_class: %s\n", ec_name);
2541      abort();
2542    }
2543
2544    if (encode->current_encoding_num_args() != encoding->num_args()) {
2545      globalAD->syntax_err(encode->_linenum, "In %s: passing %d arguments to %s but expecting %d",
2546                           inst._ident, encode->current_encoding_num_args(),
2547                           ec_name, encoding->num_args());
2548    }
2549
2550    DefineEmitState pending(fp, *this, *encoding, *encode, inst);
2551    encoding->_code.reset();
2552    encoding->_rep_vars.reset();
2553    // Process list of user-defined strings,
2554    // and occurrences of replacement variables.
2555    // Replacement Vars are pushed into a list and then output
2556    while ((ec_code = encoding->_code.iter()) != NULL) {
2557      if (!encoding->_code.is_signal(ec_code)) {
2558        // Emit pending code
2559        pending.emit();
2560        pending.clear();
2561        // Emit this code section
2562        fprintf(fp, "%s", ec_code);
2563      } else {
2564        // A replacement variable or one of its subfields
2565        // Obtain replacement variable from list
2566        ec_rep_var  = encoding->_rep_vars.iter();
2567        pending.add_rep_var(ec_rep_var);
2568      }
2569    }
2570    // Emit pending code
2571    pending.emit();
2572    pending.clear();
2573    fprintf(fp, "  }\n");
2574  } // end while instruction's encodings
2575
2576  // Check if user stated which encoding to user
2577  if ( user_defined == false ) {
2578    fprintf(fp, "  // User did not define which encode class to use.\n");
2579  }
2580
2581  // (3) and (4)
2582  fprintf(fp, "}\n");
2583}
2584
2585// defineEvalConstant ---------------------------------------------------------
2586void ArchDesc::defineEvalConstant(FILE* fp, InstructForm& inst) {
2587  InsEncode* encode = inst._constant;
2588
2589  // (1)
2590  // Output instruction's emit prototype
2591  fprintf(fp, "void %sNode::eval_constant(Compile* C) {\n", inst._ident);
2592
2593  // For ideal jump nodes, add a jump-table entry.
2594  if (inst.is_ideal_jump()) {
2595    fprintf(fp, "  _constant = C->constant_table().add_jump_table(this);\n");
2596  }
2597
2598  // If user did not define an encode section,
2599  // provide stub that does not generate any machine code.
2600  if ((_encode == NULL) || (encode == NULL)) {
2601    fprintf(fp, "  // User did not define an encode section.\n");
2602    fprintf(fp, "}\n");
2603    return;
2604  }
2605
2606  // Output this instruction's encodings
2607  const char *ec_name;
2608  bool        user_defined = false;
2609  encode->reset();
2610  while ((ec_name = encode->encode_class_iter()) != NULL) {
2611    fprintf(fp, "  {\n");
2612    // Output user-defined encoding
2613    user_defined           = true;
2614
2615    const char *ec_code    = NULL;
2616    const char *ec_rep_var = NULL;
2617    EncClass   *encoding   = _encode->encClass(ec_name);
2618    if (encoding == NULL) {
2619      fprintf(stderr, "User did not define contents of this encode_class: %s\n", ec_name);
2620      abort();
2621    }
2622
2623    if (encode->current_encoding_num_args() != encoding->num_args()) {
2624      globalAD->syntax_err(encode->_linenum, "In %s: passing %d arguments to %s but expecting %d",
2625                           inst._ident, encode->current_encoding_num_args(),
2626                           ec_name, encoding->num_args());
2627    }
2628
2629    DefineEmitState pending(fp, *this, *encoding, *encode, inst);
2630    encoding->_code.reset();
2631    encoding->_rep_vars.reset();
2632    // Process list of user-defined strings,
2633    // and occurrences of replacement variables.
2634    // Replacement Vars are pushed into a list and then output
2635    while ((ec_code = encoding->_code.iter()) != NULL) {
2636      if (!encoding->_code.is_signal(ec_code)) {
2637        // Emit pending code
2638        pending.emit();
2639        pending.clear();
2640        // Emit this code section
2641        fprintf(fp, "%s", ec_code);
2642      } else {
2643        // A replacement variable or one of its subfields
2644        // Obtain replacement variable from list
2645        ec_rep_var  = encoding->_rep_vars.iter();
2646        pending.add_rep_var(ec_rep_var);
2647      }
2648    }
2649    // Emit pending code
2650    pending.emit();
2651    pending.clear();
2652    fprintf(fp, "  }\n");
2653  } // end while instruction's encodings
2654
2655  // Check if user stated which encoding to user
2656  if (user_defined == false) {
2657    fprintf(fp, "  // User did not define which encode class to use.\n");
2658  }
2659
2660  // (3) and (4)
2661  fprintf(fp, "}\n");
2662}
2663
2664// ---------------------------------------------------------------------------
2665//--------Utilities to build MachOper and MachNode derived Classes------------
2666// ---------------------------------------------------------------------------
2667
2668//------------------------------Utilities to build Operand Classes------------
2669static void defineIn_RegMask(FILE *fp, FormDict &globals, OperandForm &oper) {
2670  uint num_edges = oper.num_edges(globals);
2671  if( num_edges != 0 ) {
2672    // Method header
2673    fprintf(fp, "const RegMask *%sOper::in_RegMask(int index) const {\n",
2674            oper._ident);
2675
2676    // Assert that the index is in range.
2677    fprintf(fp, "  assert(0 <= index && index < %d, \"index out of range\");\n",
2678            num_edges);
2679
2680    // Figure out if all RegMasks are the same.
2681    const char* first_reg_class = oper.in_reg_class(0, globals);
2682    bool all_same = true;
2683    assert(first_reg_class != NULL, "did not find register mask");
2684
2685    for (uint index = 1; all_same && index < num_edges; index++) {
2686      const char* some_reg_class = oper.in_reg_class(index, globals);
2687      assert(some_reg_class != NULL, "did not find register mask");
2688      if (strcmp(first_reg_class, some_reg_class) != 0) {
2689        all_same = false;
2690      }
2691    }
2692
2693    if (all_same) {
2694      // Return the sole RegMask.
2695      if (strcmp(first_reg_class, "stack_slots") == 0) {
2696        fprintf(fp,"  return &(Compile::current()->FIRST_STACK_mask());\n");
2697      } else {
2698        fprintf(fp,"  return &%s_mask();\n", toUpper(first_reg_class));
2699      }
2700    } else {
2701      // Build a switch statement to return the desired mask.
2702      fprintf(fp,"  switch (index) {\n");
2703
2704      for (uint index = 0; index < num_edges; index++) {
2705        const char *reg_class = oper.in_reg_class(index, globals);
2706        assert(reg_class != NULL, "did not find register mask");
2707        if( !strcmp(reg_class, "stack_slots") ) {
2708          fprintf(fp, "  case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index);
2709        } else {
2710          fprintf(fp, "  case %d: return &%s_mask();\n", index, toUpper(reg_class));
2711        }
2712      }
2713      fprintf(fp,"  }\n");
2714      fprintf(fp,"  ShouldNotReachHere();\n");
2715      fprintf(fp,"  return NULL;\n");
2716    }
2717
2718    // Method close
2719    fprintf(fp, "}\n\n");
2720  }
2721}
2722
2723// generate code to create a clone for a class derived from MachOper
2724//
2725// (0)  MachOper  *MachOperXOper::clone(Compile* C) const {
2726// (1)    return new (C) MachXOper( _ccode, _c0, _c1, ..., _cn);
2727// (2)  }
2728//
2729static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) {
2730  fprintf(fp,"MachOper  *%sOper::clone(Compile* C) const {\n", oper._ident);
2731  // Check for constants that need to be copied over
2732  const int  num_consts    = oper.num_consts(globalNames);
2733  const bool is_ideal_bool = oper.is_ideal_bool();
2734  if( (num_consts > 0) ) {
2735    fprintf(fp,"  return  new (C) %sOper(", oper._ident);
2736    // generate parameters for constants
2737    int i = 0;
2738    fprintf(fp,"_c%d", i);
2739    for( i = 1; i < num_consts; ++i) {
2740      fprintf(fp,", _c%d", i);
2741    }
2742    // finish line (1)
2743    fprintf(fp,");\n");
2744  }
2745  else {
2746    assert( num_consts == 0, "Currently support zero or one constant per operand clone function");
2747    fprintf(fp,"  return  new (C) %sOper();\n", oper._ident);
2748  }
2749  // finish method
2750  fprintf(fp,"}\n");
2751}
2752
2753static void define_hash(FILE *fp, char *operand) {
2754  fprintf(fp,"uint %sOper::hash() const { return 5; }\n", operand);
2755}
2756
2757static void define_cmp(FILE *fp, char *operand) {
2758  fprintf(fp,"uint %sOper::cmp( const MachOper &oper ) const { return opcode() == oper.opcode(); }\n", operand);
2759}
2760
2761
2762// Helper functions for bug 4796752, abstracted with minimal modification
2763// from define_oper_interface()
2764OperandForm *rep_var_to_operand(const char *encoding, OperandForm &oper, FormDict &globals) {
2765  OperandForm *op = NULL;
2766  // Check for replacement variable
2767  if( *encoding == '$' ) {
2768    // Replacement variable
2769    const char *rep_var = encoding + 1;
2770    // Lookup replacement variable, rep_var, in operand's component list
2771    const Component *comp = oper._components.search(rep_var);
2772    assert( comp != NULL, "Replacement variable not found in components");
2773    // Lookup operand form for replacement variable's type
2774    const char      *type = comp->_type;
2775    Form            *form = (Form*)globals[type];
2776    assert( form != NULL, "Replacement variable's type not found");
2777    op = form->is_operand();
2778    assert( op, "Attempting to emit a non-register or non-constant");
2779  }
2780
2781  return op;
2782}
2783
2784int rep_var_to_constant_index(const char *encoding, OperandForm &oper, FormDict &globals) {
2785  int idx = -1;
2786  // Check for replacement variable
2787  if( *encoding == '$' ) {
2788    // Replacement variable
2789    const char *rep_var = encoding + 1;
2790    // Lookup replacement variable, rep_var, in operand's component list
2791    const Component *comp = oper._components.search(rep_var);
2792    assert( comp != NULL, "Replacement variable not found in components");
2793    // Lookup operand form for replacement variable's type
2794    const char      *type = comp->_type;
2795    Form            *form = (Form*)globals[type];
2796    assert( form != NULL, "Replacement variable's type not found");
2797    OperandForm *op = form->is_operand();
2798    assert( op, "Attempting to emit a non-register or non-constant");
2799    // Check that this is a constant and find constant's index:
2800    if (op->_matrule && op->_matrule->is_base_constant(globals)) {
2801      idx  = oper.constant_position(globals, comp);
2802    }
2803  }
2804
2805  return idx;
2806}
2807
2808bool is_regI(const char *encoding, OperandForm &oper, FormDict &globals ) {
2809  bool is_regI = false;
2810
2811  OperandForm *op = rep_var_to_operand(encoding, oper, globals);
2812  if( op != NULL ) {
2813    // Check that this is a register
2814    if ( (op->_matrule && op->_matrule->is_base_register(globals)) ) {
2815      // Register
2816      const char* ideal  = op->ideal_type(globals);
2817      is_regI = (ideal && (op->ideal_to_Reg_type(ideal) == Form::idealI));
2818    }
2819  }
2820
2821  return is_regI;
2822}
2823
2824bool is_conP(const char *encoding, OperandForm &oper, FormDict &globals ) {
2825  bool is_conP = false;
2826
2827  OperandForm *op = rep_var_to_operand(encoding, oper, globals);
2828  if( op != NULL ) {
2829    // Check that this is a constant pointer
2830    if (op->_matrule && op->_matrule->is_base_constant(globals)) {
2831      // Constant
2832      Form::DataType dtype = op->is_base_constant(globals);
2833      is_conP = (dtype == Form::idealP);
2834    }
2835  }
2836
2837  return is_conP;
2838}
2839
2840
2841// Define a MachOper interface methods
2842void ArchDesc::define_oper_interface(FILE *fp, OperandForm &oper, FormDict &globals,
2843                                     const char *name, const char *encoding) {
2844  bool emit_position = false;
2845  int position = -1;
2846
2847  fprintf(fp,"  virtual int            %s", name);
2848  // Generate access method for base, index, scale, disp, ...
2849  if( (strcmp(name,"base") == 0) || (strcmp(name,"index") == 0) ) {
2850    fprintf(fp,"(PhaseRegAlloc *ra_, const Node *node, int idx) const { \n");
2851    emit_position = true;
2852  } else if ( (strcmp(name,"disp") == 0) ) {
2853    fprintf(fp,"(PhaseRegAlloc *ra_, const Node *node, int idx) const { \n");
2854  } else {
2855    fprintf(fp,"() const { ");
2856  }
2857
2858  // Check for hexadecimal value OR replacement variable
2859  if( *encoding == '$' ) {
2860    // Replacement variable
2861    const char *rep_var = encoding + 1;
2862    fprintf(fp,"// Replacement variable: %s\n", encoding+1);
2863    // Lookup replacement variable, rep_var, in operand's component list
2864    const Component *comp = oper._components.search(rep_var);
2865    assert( comp != NULL, "Replacement variable not found in components");
2866    // Lookup operand form for replacement variable's type
2867    const char      *type = comp->_type;
2868    Form            *form = (Form*)globals[type];
2869    assert( form != NULL, "Replacement variable's type not found");
2870    OperandForm *op = form->is_operand();
2871    assert( op, "Attempting to emit a non-register or non-constant");
2872    // Check that this is a register or a constant and generate code:
2873    if ( (op->_matrule && op->_matrule->is_base_register(globals)) ) {
2874      // Register
2875      int idx_offset = oper.register_position( globals, rep_var);
2876      position = idx_offset;
2877      fprintf(fp,"    return (int)ra_->get_encode(node->in(idx");
2878      if ( idx_offset > 0 ) fprintf(fp,                      "+%d",idx_offset);
2879      fprintf(fp,"));\n");
2880    } else if ( op->ideal_to_sReg_type(op->_ident) != Form::none ) {
2881      // StackSlot for an sReg comes either from input node or from self, when idx==0
2882      fprintf(fp,"    if( idx != 0 ) {\n");
2883      fprintf(fp,"      // Access register number for input operand\n");
2884      fprintf(fp,"      return ra_->reg2offset(ra_->get_reg_first(node->in(idx)));/* sReg */\n");
2885      fprintf(fp,"    }\n");
2886      fprintf(fp,"    // Access register number from myself\n");
2887      fprintf(fp,"    return ra_->reg2offset(ra_->get_reg_first(node));/* sReg */\n");
2888    } else if (op->_matrule && op->_matrule->is_base_constant(globals)) {
2889      // Constant
2890      // Check which constant this name maps to: _c0, _c1, ..., _cn
2891      const int idx = oper.constant_position(globals, comp);
2892      assert( idx != -1, "Constant component not found in operand");
2893      // Output code for this constant, type dependent.
2894      fprintf(fp,"    return (int)" );
2895      oper.access_constant(fp, globals, (uint)idx /* , const_type */);
2896      fprintf(fp,";\n");
2897    } else {
2898      assert( false, "Attempting to emit a non-register or non-constant");
2899    }
2900  }
2901  else if( *encoding == '0' && *(encoding+1) == 'x' ) {
2902    // Hex value
2903    fprintf(fp,"return %s;", encoding);
2904  } else {
2905    assert( false, "Do not support octal or decimal encode constants");
2906  }
2907  fprintf(fp,"  }\n");
2908
2909  if( emit_position && (position != -1) && (oper.num_edges(globals) > 0) ) {
2910    fprintf(fp,"  virtual int            %s_position() const { return %d; }\n", name, position);
2911    MemInterface *mem_interface = oper._interface->is_MemInterface();
2912    const char *base = mem_interface->_base;
2913    const char *disp = mem_interface->_disp;
2914    if( emit_position && (strcmp(name,"base") == 0)
2915        && base != NULL && is_regI(base, oper, globals)
2916        && disp != NULL && is_conP(disp, oper, globals) ) {
2917      // Found a memory access using a constant pointer for a displacement
2918      // and a base register containing an integer offset.
2919      // In this case the base and disp are reversed with respect to what
2920      // is expected by MachNode::get_base_and_disp() and MachNode::adr_type().
2921      // Provide a non-NULL return for disp_as_type() that will allow adr_type()
2922      // to correctly compute the access type for alias analysis.
2923      //
2924      // See BugId 4796752, operand indOffset32X in i486.ad
2925      int idx = rep_var_to_constant_index(disp, oper, globals);
2926      fprintf(fp,"  virtual const TypePtr *disp_as_type() const { return _c%d; }\n", idx);
2927    }
2928  }
2929}
2930
2931//
2932// Construct the method to copy _idx, inputs and operands to new node.
2933static void define_fill_new_machnode(bool used, FILE *fp_cpp) {
2934  fprintf(fp_cpp, "\n");
2935  fprintf(fp_cpp, "// Copy _idx, inputs and operands to new node\n");
2936  fprintf(fp_cpp, "void MachNode::fill_new_machnode( MachNode* node, Compile* C) const {\n");
2937  if( !used ) {
2938    fprintf(fp_cpp, "  // This architecture does not have cisc or short branch instructions\n");
2939    fprintf(fp_cpp, "  ShouldNotCallThis();\n");
2940    fprintf(fp_cpp, "}\n");
2941  } else {
2942    // New node must use same node index for access through allocator's tables
2943    fprintf(fp_cpp, "  // New node must use same node index\n");
2944    fprintf(fp_cpp, "  node->set_idx( _idx );\n");
2945    // Copy machine-independent inputs
2946    fprintf(fp_cpp, "  // Copy machine-independent inputs\n");
2947    fprintf(fp_cpp, "  for( uint j = 0; j < req(); j++ ) {\n");
2948    fprintf(fp_cpp, "    node->add_req(in(j));\n");
2949    fprintf(fp_cpp, "  }\n");
2950    // Copy machine operands to new MachNode
2951    fprintf(fp_cpp, "  // Copy my operands, except for cisc position\n");
2952    fprintf(fp_cpp, "  int nopnds = num_opnds();\n");
2953    fprintf(fp_cpp, "  assert( node->num_opnds() == (uint)nopnds, \"Must have same number of operands\");\n");
2954    fprintf(fp_cpp, "  MachOper **to = node->_opnds;\n");
2955    fprintf(fp_cpp, "  for( int i = 0; i < nopnds; i++ ) {\n");
2956    fprintf(fp_cpp, "    if( i != cisc_operand() ) \n");
2957    fprintf(fp_cpp, "      to[i] = _opnds[i]->clone(C);\n");
2958    fprintf(fp_cpp, "  }\n");
2959    fprintf(fp_cpp, "}\n");
2960  }
2961  fprintf(fp_cpp, "\n");
2962}
2963
2964//------------------------------defineClasses----------------------------------
2965// Define members of MachNode and MachOper classes based on
2966// operand and instruction lists
2967void ArchDesc::defineClasses(FILE *fp) {
2968
2969  // Define the contents of an array containing the machine register names
2970  defineRegNames(fp, _register);
2971  // Define an array containing the machine register encoding values
2972  defineRegEncodes(fp, _register);
2973  // Generate an enumeration of user-defined register classes
2974  // and a list of register masks, one for each class.
2975  // Only define the RegMask value objects in the expand file.
2976  // Declare each as an extern const RegMask ...; in ad_<arch>.hpp
2977  declare_register_masks(_HPP_file._fp);
2978  // build_register_masks(fp);
2979  build_register_masks(_CPP_EXPAND_file._fp);
2980  // Define the pipe_classes
2981  build_pipe_classes(_CPP_PIPELINE_file._fp);
2982
2983  // Generate Machine Classes for each operand defined in AD file
2984  fprintf(fp,"\n");
2985  fprintf(fp,"\n");
2986  fprintf(fp,"//------------------Define classes derived from MachOper---------------------\n");
2987  // Iterate through all operands
2988  _operands.reset();
2989  OperandForm *oper;
2990  for( ; (oper = (OperandForm*)_operands.iter()) != NULL; ) {
2991    // Ensure this is a machine-world instruction
2992    if ( oper->ideal_only() ) continue;
2993    // !!!!!
2994    // The declaration of labelOper is in machine-independent file: machnode
2995    if ( strcmp(oper->_ident,"label") == 0 ) {
2996      defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper);
2997
2998      fprintf(fp,"MachOper  *%sOper::clone(Compile* C) const {\n", oper->_ident);
2999      fprintf(fp,"  return  new (C) %sOper(_label, _block_num);\n", oper->_ident);
3000      fprintf(fp,"}\n");
3001
3002      fprintf(fp,"uint %sOper::opcode() const { return %s; }\n",
3003              oper->_ident, machOperEnum(oper->_ident));
3004      // // Currently all XXXOper::Hash() methods are identical (990820)
3005      // define_hash(fp, oper->_ident);
3006      // // Currently all XXXOper::Cmp() methods are identical (990820)
3007      // define_cmp(fp, oper->_ident);
3008      fprintf(fp,"\n");
3009
3010      continue;
3011    }
3012
3013    // The declaration of methodOper is in machine-independent file: machnode
3014    if ( strcmp(oper->_ident,"method") == 0 ) {
3015      defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper);
3016
3017      fprintf(fp,"MachOper  *%sOper::clone(Compile* C) const {\n", oper->_ident);
3018      fprintf(fp,"  return  new (C) %sOper(_method);\n", oper->_ident);
3019      fprintf(fp,"}\n");
3020
3021      fprintf(fp,"uint %sOper::opcode() const { return %s; }\n",
3022              oper->_ident, machOperEnum(oper->_ident));
3023      // // Currently all XXXOper::Hash() methods are identical (990820)
3024      // define_hash(fp, oper->_ident);
3025      // // Currently all XXXOper::Cmp() methods are identical (990820)
3026      // define_cmp(fp, oper->_ident);
3027      fprintf(fp,"\n");
3028
3029      continue;
3030    }
3031
3032    defineIn_RegMask(fp, _globalNames, *oper);
3033    defineClone(_CPP_CLONE_file._fp, _globalNames, *oper);
3034    // // Currently all XXXOper::Hash() methods are identical (990820)
3035    // define_hash(fp, oper->_ident);
3036    // // Currently all XXXOper::Cmp() methods are identical (990820)
3037    // define_cmp(fp, oper->_ident);
3038
3039    // side-call to generate output that used to be in the header file:
3040    extern void gen_oper_format(FILE *fp, FormDict &globals, OperandForm &oper, bool for_c_file);
3041    gen_oper_format(_CPP_FORMAT_file._fp, _globalNames, *oper, true);
3042
3043  }
3044
3045
3046  // Generate Machine Classes for each instruction defined in AD file
3047  fprintf(fp,"//------------------Define members for classes derived from MachNode----------\n");
3048  // Output the definitions for out_RegMask() // & kill_RegMask()
3049  _instructions.reset();
3050  InstructForm *instr;
3051  MachNodeForm *machnode;
3052  for( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
3053    // Ensure this is a machine-world instruction
3054    if ( instr->ideal_only() ) continue;
3055
3056    defineOut_RegMask(_CPP_MISC_file._fp, instr->_ident, reg_mask(*instr));
3057  }
3058
3059  bool used = false;
3060  // Output the definitions for expand rules & peephole rules
3061  _instructions.reset();
3062  for( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
3063    // Ensure this is a machine-world instruction
3064    if ( instr->ideal_only() ) continue;
3065    // If there are multiple defs/kills, or an explicit expand rule, build rule
3066    if( instr->expands() || instr->needs_projections() ||
3067        instr->has_temps() ||
3068        instr->is_mach_constant() ||
3069        instr->_matrule != NULL &&
3070        instr->num_opnds() != instr->num_unique_opnds() )
3071      defineExpand(_CPP_EXPAND_file._fp, instr);
3072    // If there is an explicit peephole rule, build it
3073    if ( instr->peepholes() )
3074      definePeephole(_CPP_PEEPHOLE_file._fp, instr);
3075
3076    // Output code to convert to the cisc version, if applicable
3077    used |= instr->define_cisc_version(*this, fp);
3078
3079    // Output code to convert to the short branch version, if applicable
3080    used |= instr->define_short_branch_methods(*this, fp);
3081  }
3082
3083  // Construct the method called by cisc_version() to copy inputs and operands.
3084  define_fill_new_machnode(used, fp);
3085
3086  // Output the definitions for labels
3087  _instructions.reset();
3088  while( (instr = (InstructForm*)_instructions.iter()) != NULL ) {
3089    // Ensure this is a machine-world instruction
3090    if ( instr->ideal_only() ) continue;
3091
3092    // Access the fields for operand Label
3093    int label_position = instr->label_position();
3094    if( label_position != -1 ) {
3095      // Set the label
3096      fprintf(fp,"void %sNode::label_set( Label* label, uint block_num ) {\n", instr->_ident);
3097      fprintf(fp,"  labelOper* oper  = (labelOper*)(opnd_array(%d));\n",
3098              label_position );
3099      fprintf(fp,"  oper->_label     = label;\n");
3100      fprintf(fp,"  oper->_block_num = block_num;\n");
3101      fprintf(fp,"}\n");
3102      // Save the label
3103      fprintf(fp,"void %sNode::save_label( Label** label, uint* block_num ) {\n", instr->_ident);
3104      fprintf(fp,"  labelOper* oper  = (labelOper*)(opnd_array(%d));\n",
3105              label_position );
3106      fprintf(fp,"  *label = oper->_label;\n");
3107      fprintf(fp,"  *block_num = oper->_block_num;\n");
3108      fprintf(fp,"}\n");
3109    }
3110  }
3111
3112  // Output the definitions for methods
3113  _instructions.reset();
3114  while( (instr = (InstructForm*)_instructions.iter()) != NULL ) {
3115    // Ensure this is a machine-world instruction
3116    if ( instr->ideal_only() ) continue;
3117
3118    // Access the fields for operand Label
3119    int method_position = instr->method_position();
3120    if( method_position != -1 ) {
3121      // Access the method's address
3122      fprintf(fp,"void %sNode::method_set( intptr_t method ) {\n", instr->_ident);
3123      fprintf(fp,"  ((methodOper*)opnd_array(%d))->_method = method;\n",
3124              method_position );
3125      fprintf(fp,"}\n");
3126      fprintf(fp,"\n");
3127    }
3128  }
3129
3130  // Define this instruction's number of relocation entries, base is '0'
3131  _instructions.reset();
3132  while( (instr = (InstructForm*)_instructions.iter()) != NULL ) {
3133    // Output the definition for number of relocation entries
3134    uint reloc_size = instr->reloc(_globalNames);
3135    if ( reloc_size != 0 ) {
3136      fprintf(fp,"int  %sNode::reloc()   const {\n", instr->_ident);
3137      fprintf(fp,  "  return  %d;\n", reloc_size );
3138      fprintf(fp,"}\n");
3139      fprintf(fp,"\n");
3140    }
3141  }
3142  fprintf(fp,"\n");
3143
3144  // Output the definitions for code generation
3145  //
3146  // address  ___Node::emit(address ptr, PhaseRegAlloc *ra_) const {
3147  //   // ...  encoding defined by user
3148  //   return ptr;
3149  // }
3150  //
3151  _instructions.reset();
3152  for( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
3153    // Ensure this is a machine-world instruction
3154    if ( instr->ideal_only() ) continue;
3155
3156    if (instr->_insencode)         defineEmit        (fp, *instr);
3157    if (instr->is_mach_constant()) defineEvalConstant(fp, *instr);
3158    if (instr->_size)              defineSize        (fp, *instr);
3159
3160    // side-call to generate output that used to be in the header file:
3161    extern void gen_inst_format(FILE *fp, FormDict &globals, InstructForm &oper, bool for_c_file);
3162    gen_inst_format(_CPP_FORMAT_file._fp, _globalNames, *instr, true);
3163  }
3164
3165  // Output the definitions for alias analysis
3166  _instructions.reset();
3167  for( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
3168    // Ensure this is a machine-world instruction
3169    if ( instr->ideal_only() ) continue;
3170
3171    // Analyze machine instructions that either USE or DEF memory.
3172    int memory_operand = instr->memory_operand(_globalNames);
3173    // Some guys kill all of memory
3174    if ( instr->is_wide_memory_kill(_globalNames) ) {
3175      memory_operand = InstructForm::MANY_MEMORY_OPERANDS;
3176    }
3177
3178    if ( memory_operand != InstructForm::NO_MEMORY_OPERAND ) {
3179      if( memory_operand == InstructForm::MANY_MEMORY_OPERANDS ) {
3180        fprintf(fp,"const TypePtr *%sNode::adr_type() const { return TypePtr::BOTTOM; }\n", instr->_ident);
3181        fprintf(fp,"const MachOper* %sNode::memory_operand() const { return (MachOper*)-1; }\n", instr->_ident);
3182      } else {
3183        fprintf(fp,"const MachOper* %sNode::memory_operand() const { return _opnds[%d]; }\n", instr->_ident, memory_operand);
3184  }
3185    }
3186  }
3187
3188  // Get the length of the longest identifier
3189  int max_ident_len = 0;
3190  _instructions.reset();
3191
3192  for ( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
3193    if (instr->_ins_pipe && _pipeline->_classlist.search(instr->_ins_pipe)) {
3194      int ident_len = (int)strlen(instr->_ident);
3195      if( max_ident_len < ident_len )
3196        max_ident_len = ident_len;
3197    }
3198  }
3199
3200  // Emit specifically for Node(s)
3201  fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %*s::pipeline_class() { return %s; }\n",
3202    max_ident_len, "Node", _pipeline ? "(&pipeline_class_Zero_Instructions)" : "NULL");
3203  fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %*s::pipeline() const { return %s; }\n",
3204    max_ident_len, "Node", _pipeline ? "(&pipeline_class_Zero_Instructions)" : "NULL");
3205  fprintf(_CPP_PIPELINE_file._fp, "\n");
3206
3207  fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %*s::pipeline_class() { return %s; }\n",
3208    max_ident_len, "MachNode", _pipeline ? "(&pipeline_class_Unknown_Instructions)" : "NULL");
3209  fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %*s::pipeline() const { return pipeline_class(); }\n",
3210    max_ident_len, "MachNode");
3211  fprintf(_CPP_PIPELINE_file._fp, "\n");
3212
3213  // Output the definitions for machine node specific pipeline data
3214  _machnodes.reset();
3215
3216  for ( ; (machnode = (MachNodeForm*)_machnodes.iter()) != NULL; ) {
3217    fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %sNode::pipeline() const { return (&pipeline_class_%03d); }\n",
3218      machnode->_ident, ((class PipeClassForm *)_pipeline->_classdict[machnode->_machnode_pipe])->_num);
3219  }
3220
3221  fprintf(_CPP_PIPELINE_file._fp, "\n");
3222
3223  // Output the definitions for instruction pipeline static data references
3224  _instructions.reset();
3225
3226  for ( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
3227    if (instr->_ins_pipe && _pipeline->_classlist.search(instr->_ins_pipe)) {
3228      fprintf(_CPP_PIPELINE_file._fp, "\n");
3229      fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %*sNode::pipeline_class() { return (&pipeline_class_%03d); }\n",
3230        max_ident_len, instr->_ident, ((class PipeClassForm *)_pipeline->_classdict[instr->_ins_pipe])->_num);
3231      fprintf(_CPP_PIPELINE_file._fp, "const Pipeline * %*sNode::pipeline() const { return (&pipeline_class_%03d); }\n",
3232        max_ident_len, instr->_ident, ((class PipeClassForm *)_pipeline->_classdict[instr->_ins_pipe])->_num);
3233    }
3234  }
3235}
3236
3237
3238// -------------------------------- maps ------------------------------------
3239
3240// Information needed to generate the ReduceOp mapping for the DFA
3241class OutputReduceOp : public OutputMap {
3242public:
3243  OutputReduceOp(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
3244    : OutputMap(hpp, cpp, globals, AD) {};
3245
3246  void declaration() { fprintf(_hpp, "extern const int   reduceOp[];\n"); }
3247  void definition()  { fprintf(_cpp, "const        int   reduceOp[] = {\n"); }
3248  void closing()     { fprintf(_cpp, "  0 // no trailing comma\n");
3249                       OutputMap::closing();
3250  }
3251  void map(OpClassForm &opc)  {
3252    const char *reduce = opc._ident;
3253    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3254    else          fprintf(_cpp, "  0");
3255  }
3256  void map(OperandForm &oper) {
3257    // Most operands without match rules, e.g.  eFlagsReg, do not have a result operand
3258    const char *reduce = (oper._matrule ? oper.reduce_result() : NULL);
3259    // operand stackSlot does not have a match rule, but produces a stackSlot
3260    if( oper.is_user_name_for_sReg() != Form::none ) reduce = oper.reduce_result();
3261    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3262    else          fprintf(_cpp, "  0");
3263  }
3264  void map(InstructForm &inst) {
3265    const char *reduce = (inst._matrule ? inst.reduce_result() : NULL);
3266    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3267    else          fprintf(_cpp, "  0");
3268  }
3269  void map(char         *reduce) {
3270    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3271    else          fprintf(_cpp, "  0");
3272  }
3273};
3274
3275// Information needed to generate the LeftOp mapping for the DFA
3276class OutputLeftOp : public OutputMap {
3277public:
3278  OutputLeftOp(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
3279    : OutputMap(hpp, cpp, globals, AD) {};
3280
3281  void declaration() { fprintf(_hpp, "extern const int   leftOp[];\n"); }
3282  void definition()  { fprintf(_cpp, "const        int   leftOp[] = {\n"); }
3283  void closing()     { fprintf(_cpp, "  0 // no trailing comma\n");
3284                       OutputMap::closing();
3285  }
3286  void map(OpClassForm &opc)  { fprintf(_cpp, "  0"); }
3287  void map(OperandForm &oper) {
3288    const char *reduce = oper.reduce_left(_globals);
3289    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3290    else          fprintf(_cpp, "  0");
3291  }
3292  void map(char        *name) {
3293    const char *reduce = _AD.reduceLeft(name);
3294    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3295    else          fprintf(_cpp, "  0");
3296  }
3297  void map(InstructForm &inst) {
3298    const char *reduce = inst.reduce_left(_globals);
3299    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3300    else          fprintf(_cpp, "  0");
3301  }
3302};
3303
3304
3305// Information needed to generate the RightOp mapping for the DFA
3306class OutputRightOp : public OutputMap {
3307public:
3308  OutputRightOp(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
3309    : OutputMap(hpp, cpp, globals, AD) {};
3310
3311  void declaration() { fprintf(_hpp, "extern const int   rightOp[];\n"); }
3312  void definition()  { fprintf(_cpp, "const        int   rightOp[] = {\n"); }
3313  void closing()     { fprintf(_cpp, "  0 // no trailing comma\n");
3314                       OutputMap::closing();
3315  }
3316  void map(OpClassForm &opc)  { fprintf(_cpp, "  0"); }
3317  void map(OperandForm &oper) {
3318    const char *reduce = oper.reduce_right(_globals);
3319    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3320    else          fprintf(_cpp, "  0");
3321  }
3322  void map(char        *name) {
3323    const char *reduce = _AD.reduceRight(name);
3324    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3325    else          fprintf(_cpp, "  0");
3326  }
3327  void map(InstructForm &inst) {
3328    const char *reduce = inst.reduce_right(_globals);
3329    if( reduce )  fprintf(_cpp, "  %s_rule", reduce);
3330    else          fprintf(_cpp, "  0");
3331  }
3332};
3333
3334
3335// Information needed to generate the Rule names for the DFA
3336class OutputRuleName : public OutputMap {
3337public:
3338  OutputRuleName(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
3339    : OutputMap(hpp, cpp, globals, AD) {};
3340
3341  void declaration() { fprintf(_hpp, "extern const char *ruleName[];\n"); }
3342  void definition()  { fprintf(_cpp, "const char        *ruleName[] = {\n"); }
3343  void closing()     { fprintf(_cpp, "  \"no trailing comma\"\n");
3344                       OutputMap::closing();
3345  }
3346  void map(OpClassForm &opc)  { fprintf(_cpp, "  \"%s\"", _AD.machOperEnum(opc._ident) ); }
3347  void map(OperandForm &oper) { fprintf(_cpp, "  \"%s\"", _AD.machOperEnum(oper._ident) ); }
3348  void map(char        *name) { fprintf(_cpp, "  \"%s\"", name ? name : "0"); }
3349  void map(InstructForm &inst){ fprintf(_cpp, "  \"%s\"", inst._ident ? inst._ident : "0"); }
3350};
3351
3352
3353// Information needed to generate the swallowed mapping for the DFA
3354class OutputSwallowed : public OutputMap {
3355public:
3356  OutputSwallowed(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
3357    : OutputMap(hpp, cpp, globals, AD) {};
3358
3359  void declaration() { fprintf(_hpp, "extern const bool  swallowed[];\n"); }
3360  void definition()  { fprintf(_cpp, "const        bool  swallowed[] = {\n"); }
3361  void closing()     { fprintf(_cpp, "  false // no trailing comma\n");
3362                       OutputMap::closing();
3363  }
3364  void map(OperandForm &oper) { // Generate the entry for this opcode
3365    const char *swallowed = oper.swallowed(_globals) ? "true" : "false";
3366    fprintf(_cpp, "  %s", swallowed);
3367  }
3368  void map(OpClassForm &opc)  { fprintf(_cpp, "  false"); }
3369  void map(char        *name) { fprintf(_cpp, "  false"); }
3370  void map(InstructForm &inst){ fprintf(_cpp, "  false"); }
3371};
3372
3373
3374// Information needed to generate the decision array for instruction chain rule
3375class OutputInstChainRule : public OutputMap {
3376public:
3377  OutputInstChainRule(FILE *hpp, FILE *cpp, FormDict &globals, ArchDesc &AD)
3378    : OutputMap(hpp, cpp, globals, AD) {};
3379
3380  void declaration() { fprintf(_hpp, "extern const bool  instruction_chain_rule[];\n"); }
3381  void definition()  { fprintf(_cpp, "const        bool  instruction_chain_rule[] = {\n"); }
3382  void closing()     { fprintf(_cpp, "  false // no trailing comma\n");
3383                       OutputMap::closing();
3384  }
3385  void map(OpClassForm &opc)   { fprintf(_cpp, "  false"); }
3386  void map(OperandForm &oper)  { fprintf(_cpp, "  false"); }
3387  void map(char        *name)  { fprintf(_cpp, "  false"); }
3388  void map(InstructForm &inst) { // Check for simple chain rule
3389    const char *chain = inst.is_simple_chain_rule(_globals) ? "true" : "false";
3390    fprintf(_cpp, "  %s", chain);
3391  }
3392};
3393
3394
3395//---------------------------build_map------------------------------------
3396// Build  mapping from enumeration for densely packed operands
3397// TO result and child types.
3398void ArchDesc::build_map(OutputMap &map) {
3399  FILE         *fp_hpp = map.decl_file();
3400  FILE         *fp_cpp = map.def_file();
3401  int           idx    = 0;
3402  OperandForm  *op;
3403  OpClassForm  *opc;
3404  InstructForm *inst;
3405
3406  // Construct this mapping
3407  map.declaration();
3408  fprintf(fp_cpp,"\n");
3409  map.definition();
3410
3411  // Output the mapping for operands
3412  map.record_position(OutputMap::BEGIN_OPERANDS, idx );
3413  _operands.reset();
3414  for(; (op = (OperandForm*)_operands.iter()) != NULL; ) {
3415    // Ensure this is a machine-world instruction
3416    if ( op->ideal_only() )  continue;
3417
3418    // Generate the entry for this opcode
3419    map.map(*op);    fprintf(fp_cpp, ", // %d\n", idx);
3420    ++idx;
3421  };
3422  fprintf(fp_cpp, "  // last operand\n");
3423
3424  // Place all user-defined operand classes into the mapping
3425  map.record_position(OutputMap::BEGIN_OPCLASSES, idx );
3426  _opclass.reset();
3427  for(; (opc = (OpClassForm*)_opclass.iter()) != NULL; ) {
3428    map.map(*opc);    fprintf(fp_cpp, ", // %d\n", idx);
3429    ++idx;
3430  };
3431  fprintf(fp_cpp, "  // last operand class\n");
3432
3433  // Place all internally defined operands into the mapping
3434  map.record_position(OutputMap::BEGIN_INTERNALS, idx );
3435  _internalOpNames.reset();
3436  char *name = NULL;
3437  for(; (name = (char *)_internalOpNames.iter()) != NULL; ) {
3438    map.map(name);    fprintf(fp_cpp, ", // %d\n", idx);
3439    ++idx;
3440  };
3441  fprintf(fp_cpp, "  // last internally defined operand\n");
3442
3443  // Place all user-defined instructions into the mapping
3444  if( map.do_instructions() ) {
3445    map.record_position(OutputMap::BEGIN_INSTRUCTIONS, idx );
3446    // Output all simple instruction chain rules first
3447    map.record_position(OutputMap::BEGIN_INST_CHAIN_RULES, idx );
3448    {
3449      _instructions.reset();
3450      for(; (inst = (InstructForm*)_instructions.iter()) != NULL; ) {
3451        // Ensure this is a machine-world instruction
3452        if ( inst->ideal_only() )  continue;
3453        if ( ! inst->is_simple_chain_rule(_globalNames) ) continue;
3454        if ( inst->rematerialize(_globalNames, get_registers()) ) continue;
3455
3456        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
3457        ++idx;
3458      };
3459      map.record_position(OutputMap::BEGIN_REMATERIALIZE, idx );
3460      _instructions.reset();
3461      for(; (inst = (InstructForm*)_instructions.iter()) != NULL; ) {
3462        // Ensure this is a machine-world instruction
3463        if ( inst->ideal_only() )  continue;
3464        if ( ! inst->is_simple_chain_rule(_globalNames) ) continue;
3465        if ( ! inst->rematerialize(_globalNames, get_registers()) ) continue;
3466
3467        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
3468        ++idx;
3469      };
3470      map.record_position(OutputMap::END_INST_CHAIN_RULES, idx );
3471    }
3472    // Output all instructions that are NOT simple chain rules
3473    {
3474      _instructions.reset();
3475      for(; (inst = (InstructForm*)_instructions.iter()) != NULL; ) {
3476        // Ensure this is a machine-world instruction
3477        if ( inst->ideal_only() )  continue;
3478        if ( inst->is_simple_chain_rule(_globalNames) ) continue;
3479        if ( ! inst->rematerialize(_globalNames, get_registers()) ) continue;
3480
3481        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
3482        ++idx;
3483      };
3484      map.record_position(OutputMap::END_REMATERIALIZE, idx );
3485      _instructions.reset();
3486      for(; (inst = (InstructForm*)_instructions.iter()) != NULL; ) {
3487        // Ensure this is a machine-world instruction
3488        if ( inst->ideal_only() )  continue;
3489        if ( inst->is_simple_chain_rule(_globalNames) ) continue;
3490        if ( inst->rematerialize(_globalNames, get_registers()) ) continue;
3491
3492        map.map(*inst);      fprintf(fp_cpp, ", // %d\n", idx);
3493        ++idx;
3494      };
3495    }
3496    fprintf(fp_cpp, "  // last instruction\n");
3497    map.record_position(OutputMap::END_INSTRUCTIONS, idx );
3498  }
3499  // Finish defining table
3500  map.closing();
3501};
3502
3503
3504// Helper function for buildReduceMaps
3505char reg_save_policy(const char *calling_convention) {
3506  char callconv;
3507
3508  if      (!strcmp(calling_convention, "NS"))  callconv = 'N';
3509  else if (!strcmp(calling_convention, "SOE")) callconv = 'E';
3510  else if (!strcmp(calling_convention, "SOC")) callconv = 'C';
3511  else if (!strcmp(calling_convention, "AS"))  callconv = 'A';
3512  else                                         callconv = 'Z';
3513
3514  return callconv;
3515}
3516
3517//---------------------------generate_assertion_checks-------------------
3518void ArchDesc::generate_adlc_verification(FILE *fp_cpp) {
3519  fprintf(fp_cpp, "\n");
3520
3521  fprintf(fp_cpp, "#ifndef PRODUCT\n");
3522  fprintf(fp_cpp, "void Compile::adlc_verification() {\n");
3523  globalDefs().print_asserts(fp_cpp);
3524  fprintf(fp_cpp, "}\n");
3525  fprintf(fp_cpp, "#endif\n");
3526  fprintf(fp_cpp, "\n");
3527}
3528
3529//---------------------------addSourceBlocks-----------------------------
3530void ArchDesc::addSourceBlocks(FILE *fp_cpp) {
3531  if (_source.count() > 0)
3532    _source.output(fp_cpp);
3533
3534  generate_adlc_verification(fp_cpp);
3535}
3536//---------------------------addHeaderBlocks-----------------------------
3537void ArchDesc::addHeaderBlocks(FILE *fp_hpp) {
3538  if (_header.count() > 0)
3539    _header.output(fp_hpp);
3540}
3541//-------------------------addPreHeaderBlocks----------------------------
3542void ArchDesc::addPreHeaderBlocks(FILE *fp_hpp) {
3543  // Output #defines from definition block
3544  globalDefs().print_defines(fp_hpp);
3545
3546  if (_pre_header.count() > 0)
3547    _pre_header.output(fp_hpp);
3548}
3549
3550//---------------------------buildReduceMaps-----------------------------
3551// Build  mapping from enumeration for densely packed operands
3552// TO result and child types.
3553void ArchDesc::buildReduceMaps(FILE *fp_hpp, FILE *fp_cpp) {
3554  RegDef       *rdef;
3555  RegDef       *next;
3556
3557  // The emit bodies currently require functions defined in the source block.
3558
3559  // Build external declarations for mappings
3560  fprintf(fp_hpp, "\n");
3561  fprintf(fp_hpp, "extern const char  register_save_policy[];\n");
3562  fprintf(fp_hpp, "extern const char  c_reg_save_policy[];\n");
3563  fprintf(fp_hpp, "extern const int   register_save_type[];\n");
3564  fprintf(fp_hpp, "\n");
3565
3566  // Construct Save-Policy array
3567  fprintf(fp_cpp, "// Map from machine-independent register number to register_save_policy\n");
3568  fprintf(fp_cpp, "const        char register_save_policy[] = {\n");
3569  _register->reset_RegDefs();
3570  for( rdef = _register->iter_RegDefs(); rdef != NULL; rdef = next ) {
3571    next              = _register->iter_RegDefs();
3572    char policy       = reg_save_policy(rdef->_callconv);
3573    const char *comma = (next != NULL) ? "," : " // no trailing comma";
3574    fprintf(fp_cpp, "  '%c'%s\n", policy, comma);
3575  }
3576  fprintf(fp_cpp, "};\n\n");
3577
3578  // Construct Native Save-Policy array
3579  fprintf(fp_cpp, "// Map from machine-independent register number to c_reg_save_policy\n");
3580  fprintf(fp_cpp, "const        char c_reg_save_policy[] = {\n");
3581  _register->reset_RegDefs();
3582  for( rdef = _register->iter_RegDefs(); rdef != NULL; rdef = next ) {
3583    next        = _register->iter_RegDefs();
3584    char policy = reg_save_policy(rdef->_c_conv);
3585    const char *comma = (next != NULL) ? "," : " // no trailing comma";
3586    fprintf(fp_cpp, "  '%c'%s\n", policy, comma);
3587  }
3588  fprintf(fp_cpp, "};\n\n");
3589
3590  // Construct Register Save Type array
3591  fprintf(fp_cpp, "// Map from machine-independent register number to register_save_type\n");
3592  fprintf(fp_cpp, "const        int register_save_type[] = {\n");
3593  _register->reset_RegDefs();
3594  for( rdef = _register->iter_RegDefs(); rdef != NULL; rdef = next ) {
3595    next = _register->iter_RegDefs();
3596    const char *comma = (next != NULL) ? "," : " // no trailing comma";
3597    fprintf(fp_cpp, "  %s%s\n", rdef->_idealtype, comma);
3598  }
3599  fprintf(fp_cpp, "};\n\n");
3600
3601  // Construct the table for reduceOp
3602  OutputReduceOp output_reduce_op(fp_hpp, fp_cpp, _globalNames, *this);
3603  build_map(output_reduce_op);
3604  // Construct the table for leftOp
3605  OutputLeftOp output_left_op(fp_hpp, fp_cpp, _globalNames, *this);
3606  build_map(output_left_op);
3607  // Construct the table for rightOp
3608  OutputRightOp output_right_op(fp_hpp, fp_cpp, _globalNames, *this);
3609  build_map(output_right_op);
3610  // Construct the table of rule names
3611  OutputRuleName output_rule_name(fp_hpp, fp_cpp, _globalNames, *this);
3612  build_map(output_rule_name);
3613  // Construct the boolean table for subsumed operands
3614  OutputSwallowed output_swallowed(fp_hpp, fp_cpp, _globalNames, *this);
3615  build_map(output_swallowed);
3616  // // // Preserve in case we decide to use this table instead of another
3617  //// Construct the boolean table for instruction chain rules
3618  //OutputInstChainRule output_inst_chain(fp_hpp, fp_cpp, _globalNames, *this);
3619  //build_map(output_inst_chain);
3620
3621}
3622
3623
3624//---------------------------buildMachOperGenerator---------------------------
3625
3626// Recurse through match tree, building path through corresponding state tree,
3627// Until we reach the constant we are looking for.
3628static void path_to_constant(FILE *fp, FormDict &globals,
3629                             MatchNode *mnode, uint idx) {
3630  if ( ! mnode) return;
3631
3632  unsigned    position = 0;
3633  const char *result   = NULL;
3634  const char *name     = NULL;
3635  const char *optype   = NULL;
3636
3637  // Base Case: access constant in ideal node linked to current state node
3638  // Each type of constant has its own access function
3639  if ( (mnode->_lChild == NULL) && (mnode->_rChild == NULL)
3640       && mnode->base_operand(position, globals, result, name, optype) ) {
3641    if (         strcmp(optype,"ConI") == 0 ) {
3642      fprintf(fp, "_leaf->get_int()");
3643    } else if ( (strcmp(optype,"ConP") == 0) ) {
3644      fprintf(fp, "_leaf->bottom_type()->is_ptr()");
3645    } else if ( (strcmp(optype,"ConN") == 0) ) {
3646      fprintf(fp, "_leaf->bottom_type()->is_narrowoop()");
3647    } else if ( (strcmp(optype,"ConNKlass") == 0) ) {
3648      fprintf(fp, "_leaf->bottom_type()->is_narrowklass()");
3649    } else if ( (strcmp(optype,"ConF") == 0) ) {
3650      fprintf(fp, "_leaf->getf()");
3651    } else if ( (strcmp(optype,"ConD") == 0) ) {
3652      fprintf(fp, "_leaf->getd()");
3653    } else if ( (strcmp(optype,"ConL") == 0) ) {
3654      fprintf(fp, "_leaf->get_long()");
3655    } else if ( (strcmp(optype,"Con")==0) ) {
3656      // !!!!! - Update if adding a machine-independent constant type
3657      fprintf(fp, "_leaf->get_int()");
3658      assert( false, "Unsupported constant type, pointer or indefinite");
3659    } else if ( (strcmp(optype,"Bool") == 0) ) {
3660      fprintf(fp, "_leaf->as_Bool()->_test._test");
3661    } else {
3662      assert( false, "Unsupported constant type");
3663    }
3664    return;
3665  }
3666
3667  // If constant is in left child, build path and recurse
3668  uint lConsts = (mnode->_lChild) ? (mnode->_lChild->num_consts(globals) ) : 0;
3669  uint rConsts = (mnode->_rChild) ? (mnode->_rChild->num_consts(globals) ) : 0;
3670  if ( (mnode->_lChild) && (lConsts > idx) ) {
3671    fprintf(fp, "_kids[0]->");
3672    path_to_constant(fp, globals, mnode->_lChild, idx);
3673    return;
3674  }
3675  // If constant is in right child, build path and recurse
3676  if ( (mnode->_rChild) && (rConsts > (idx - lConsts) ) ) {
3677    idx = idx - lConsts;
3678    fprintf(fp, "_kids[1]->");
3679    path_to_constant(fp, globals, mnode->_rChild, idx);
3680    return;
3681  }
3682  assert( false, "ShouldNotReachHere()");
3683}
3684
3685// Generate code that is executed when generating a specific Machine Operand
3686static void genMachOperCase(FILE *fp, FormDict &globalNames, ArchDesc &AD,
3687                            OperandForm &op) {
3688  const char *opName         = op._ident;
3689  const char *opEnumName     = AD.machOperEnum(opName);
3690  uint        num_consts     = op.num_consts(globalNames);
3691
3692  // Generate the case statement for this opcode
3693  fprintf(fp, "  case %s:", opEnumName);
3694  fprintf(fp, "\n    return new (C) %sOper(", opName);
3695  // Access parameters for constructor from the stat object
3696  //
3697  // Build access to condition code value
3698  if ( (num_consts > 0) ) {
3699    uint i = 0;
3700    path_to_constant(fp, globalNames, op._matrule, i);
3701    for ( i = 1; i < num_consts; ++i ) {
3702      fprintf(fp, ", ");
3703      path_to_constant(fp, globalNames, op._matrule, i);
3704    }
3705  }
3706  fprintf(fp, " );\n");
3707}
3708
3709
3710// Build switch to invoke "new" MachNode or MachOper
3711void ArchDesc::buildMachOperGenerator(FILE *fp_cpp) {
3712  int idx = 0;
3713
3714  // Build switch to invoke 'new' for a specific MachOper
3715  fprintf(fp_cpp, "\n");
3716  fprintf(fp_cpp, "\n");
3717  fprintf(fp_cpp,
3718          "//------------------------- MachOper Generator ---------------\n");
3719  fprintf(fp_cpp,
3720          "// A switch statement on the dense-packed user-defined type system\n"
3721          "// that invokes 'new' on the corresponding class constructor.\n");
3722  fprintf(fp_cpp, "\n");
3723  fprintf(fp_cpp, "MachOper *State::MachOperGenerator");
3724  fprintf(fp_cpp, "(int opcode, Compile* C)");
3725  fprintf(fp_cpp, "{\n");
3726  fprintf(fp_cpp, "\n");
3727  fprintf(fp_cpp, "  switch(opcode) {\n");
3728
3729  // Place all user-defined operands into the mapping
3730  _operands.reset();
3731  int  opIndex = 0;
3732  OperandForm *op;
3733  for( ; (op =  (OperandForm*)_operands.iter()) != NULL; ) {
3734    // Ensure this is a machine-world instruction
3735    if ( op->ideal_only() )  continue;
3736
3737    genMachOperCase(fp_cpp, _globalNames, *this, *op);
3738  };
3739
3740  // Do not iterate over operand classes for the  operand generator!!!
3741
3742  // Place all internal operands into the mapping
3743  _internalOpNames.reset();
3744  const char *iopn;
3745  for( ; (iopn =  _internalOpNames.iter()) != NULL; ) {
3746    const char *opEnumName = machOperEnum(iopn);
3747    // Generate the case statement for this opcode
3748    fprintf(fp_cpp, "  case %s:", opEnumName);
3749    fprintf(fp_cpp, "    return NULL;\n");
3750  };
3751
3752  // Generate the default case for switch(opcode)
3753  fprintf(fp_cpp, "  \n");
3754  fprintf(fp_cpp, "  default:\n");
3755  fprintf(fp_cpp, "    fprintf(stderr, \"Default MachOper Generator invoked for: \\n\");\n");
3756  fprintf(fp_cpp, "    fprintf(stderr, \"   opcode = %cd\\n\", opcode);\n", '%');
3757  fprintf(fp_cpp, "    break;\n");
3758  fprintf(fp_cpp, "  }\n");
3759
3760  // Generate the closing for method Matcher::MachOperGenerator
3761  fprintf(fp_cpp, "  return NULL;\n");
3762  fprintf(fp_cpp, "};\n");
3763}
3764
3765
3766//---------------------------buildMachNode-------------------------------------
3767// Build a new MachNode, for MachNodeGenerator or cisc-spilling
3768void ArchDesc::buildMachNode(FILE *fp_cpp, InstructForm *inst, const char *indent) {
3769  const char *opType  = NULL;
3770  const char *opClass = inst->_ident;
3771
3772  // Create the MachNode object
3773  fprintf(fp_cpp, "%s %sNode *node = new (C) %sNode();\n",indent, opClass,opClass);
3774
3775  if ( (inst->num_post_match_opnds() != 0) ) {
3776    // Instruction that contains operands which are not in match rule.
3777    //
3778    // Check if the first post-match component may be an interesting def
3779    bool           dont_care = false;
3780    ComponentList &comp_list = inst->_components;
3781    Component     *comp      = NULL;
3782    comp_list.reset();
3783    if ( comp_list.match_iter() != NULL )    dont_care = true;
3784
3785    // Insert operands that are not in match-rule.
3786    // Only insert a DEF if the do_care flag is set
3787    comp_list.reset();
3788    while ( comp = comp_list.post_match_iter() ) {
3789      // Check if we don't care about DEFs or KILLs that are not USEs
3790      if ( dont_care && (! comp->isa(Component::USE)) ) {
3791        continue;
3792      }
3793      dont_care = true;
3794      // For each operand not in the match rule, call MachOperGenerator
3795      // with the enum for the opcode that needs to be built.
3796      ComponentList clist = inst->_components;
3797      int         index  = clist.operand_position(comp->_name, comp->_usedef);
3798      const char *opcode = machOperEnum(comp->_type);
3799      fprintf(fp_cpp, "%s node->set_opnd_array(%d, ", indent, index);
3800      fprintf(fp_cpp, "MachOperGenerator(%s, C));\n", opcode);
3801      }
3802  }
3803  else if ( inst->is_chain_of_constant(_globalNames, opType) ) {
3804    // An instruction that chains from a constant!
3805    // In this case, we need to subsume the constant into the node
3806    // at operand position, oper_input_base().
3807    //
3808    // Fill in the constant
3809    fprintf(fp_cpp, "%s node->_opnd_array[%d] = ", indent,
3810            inst->oper_input_base(_globalNames));
3811    // #####
3812    // Check for multiple constants and then fill them in.
3813    // Just like MachOperGenerator
3814    const char *opName = inst->_matrule->_rChild->_opType;
3815    fprintf(fp_cpp, "new (C) %sOper(", opName);
3816    // Grab operand form
3817    OperandForm *op = (_globalNames[opName])->is_operand();
3818    // Look up the number of constants
3819    uint num_consts = op->num_consts(_globalNames);
3820    if ( (num_consts > 0) ) {
3821      uint i = 0;
3822      path_to_constant(fp_cpp, _globalNames, op->_matrule, i);
3823      for ( i = 1; i < num_consts; ++i ) {
3824        fprintf(fp_cpp, ", ");
3825        path_to_constant(fp_cpp, _globalNames, op->_matrule, i);
3826      }
3827    }
3828    fprintf(fp_cpp, " );\n");
3829    // #####
3830  }
3831
3832  // Fill in the bottom_type where requested
3833  if ( inst->captures_bottom_type(_globalNames) ) {
3834    fprintf(fp_cpp, "%s node->_bottom_type = _leaf->bottom_type();\n", indent);
3835  }
3836  if( inst->is_ideal_if() ) {
3837    fprintf(fp_cpp, "%s node->_prob = _leaf->as_If()->_prob;\n", indent);
3838    fprintf(fp_cpp, "%s node->_fcnt = _leaf->as_If()->_fcnt;\n", indent);
3839  }
3840  if( inst->is_ideal_fastlock() ) {
3841    fprintf(fp_cpp, "%s node->_counters = _leaf->as_FastLock()->counters();\n", indent);
3842  }
3843
3844}
3845
3846//---------------------------declare_cisc_version------------------------------
3847// Build CISC version of this instruction
3848void InstructForm::declare_cisc_version(ArchDesc &AD, FILE *fp_hpp) {
3849  if( AD.can_cisc_spill() ) {
3850    InstructForm *inst_cisc = cisc_spill_alternate();
3851    if (inst_cisc != NULL) {
3852      fprintf(fp_hpp, "  virtual int            cisc_operand() const { return %d; }\n", cisc_spill_operand());
3853      fprintf(fp_hpp, "  virtual MachNode      *cisc_version(int offset, Compile* C);\n");
3854      fprintf(fp_hpp, "  virtual void           use_cisc_RegMask();\n");
3855      fprintf(fp_hpp, "  virtual const RegMask *cisc_RegMask() const { return _cisc_RegMask; }\n");
3856    }
3857  }
3858}
3859
3860//---------------------------define_cisc_version-------------------------------
3861// Build CISC version of this instruction
3862bool InstructForm::define_cisc_version(ArchDesc &AD, FILE *fp_cpp) {
3863  InstructForm *inst_cisc = this->cisc_spill_alternate();
3864  if( AD.can_cisc_spill() && (inst_cisc != NULL) ) {
3865    const char   *name      = inst_cisc->_ident;
3866    assert( inst_cisc->num_opnds() == this->num_opnds(), "Must have same number of operands");
3867    OperandForm *cisc_oper = AD.cisc_spill_operand();
3868    assert( cisc_oper != NULL, "insanity check");
3869    const char *cisc_oper_name  = cisc_oper->_ident;
3870    assert( cisc_oper_name != NULL, "insanity check");
3871    //
3872    // Set the correct reg_mask_or_stack for the cisc operand
3873    fprintf(fp_cpp, "\n");
3874    fprintf(fp_cpp, "void %sNode::use_cisc_RegMask() {\n", this->_ident);
3875    // Lookup the correct reg_mask_or_stack
3876    const char *reg_mask_name = cisc_reg_mask_name();
3877    fprintf(fp_cpp, "  _cisc_RegMask = &STACK_OR_%s;\n", reg_mask_name);
3878    fprintf(fp_cpp, "}\n");
3879    //
3880    // Construct CISC version of this instruction
3881    fprintf(fp_cpp, "\n");
3882    fprintf(fp_cpp, "// Build CISC version of this instruction\n");
3883    fprintf(fp_cpp, "MachNode *%sNode::cisc_version( int offset, Compile* C ) {\n", this->_ident);
3884    // Create the MachNode object
3885    fprintf(fp_cpp, "  %sNode *node = new (C) %sNode();\n", name, name);
3886    // Fill in the bottom_type where requested
3887    if ( this->captures_bottom_type(AD.globalNames()) ) {
3888      fprintf(fp_cpp, "  node->_bottom_type = bottom_type();\n");
3889    }
3890
3891    uint cur_num_opnds = num_opnds();
3892    if (cur_num_opnds > 1 && cur_num_opnds != num_unique_opnds()) {
3893      fprintf(fp_cpp,"  node->_num_opnds = %d;\n", num_unique_opnds());
3894    }
3895
3896    fprintf(fp_cpp, "\n");
3897    fprintf(fp_cpp, "  // Copy _idx, inputs and operands to new node\n");
3898    fprintf(fp_cpp, "  fill_new_machnode(node, C);\n");
3899    // Construct operand to access [stack_pointer + offset]
3900    fprintf(fp_cpp, "  // Construct operand to access [stack_pointer + offset]\n");
3901    fprintf(fp_cpp, "  node->set_opnd_array(cisc_operand(), new (C) %sOper(offset));\n", cisc_oper_name);
3902    fprintf(fp_cpp, "\n");
3903
3904    // Return result and exit scope
3905    fprintf(fp_cpp, "  return node;\n");
3906    fprintf(fp_cpp, "}\n");
3907    fprintf(fp_cpp, "\n");
3908    return true;
3909  }
3910  return false;
3911}
3912
3913//---------------------------declare_short_branch_methods----------------------
3914// Build prototypes for short branch methods
3915void InstructForm::declare_short_branch_methods(FILE *fp_hpp) {
3916  if (has_short_branch_form()) {
3917    fprintf(fp_hpp, "  virtual MachNode      *short_branch_version(Compile* C);\n");
3918  }
3919}
3920
3921//---------------------------define_short_branch_methods-----------------------
3922// Build definitions for short branch methods
3923bool InstructForm::define_short_branch_methods(ArchDesc &AD, FILE *fp_cpp) {
3924  if (has_short_branch_form()) {
3925    InstructForm *short_branch = short_branch_form();
3926    const char   *name         = short_branch->_ident;
3927
3928    // Construct short_branch_version() method.
3929    fprintf(fp_cpp, "// Build short branch version of this instruction\n");
3930    fprintf(fp_cpp, "MachNode *%sNode::short_branch_version(Compile* C) {\n", this->_ident);
3931    // Create the MachNode object
3932    fprintf(fp_cpp, "  %sNode *node = new (C) %sNode();\n", name, name);
3933    if( is_ideal_if() ) {
3934      fprintf(fp_cpp, "  node->_prob = _prob;\n");
3935      fprintf(fp_cpp, "  node->_fcnt = _fcnt;\n");
3936    }
3937    // Fill in the bottom_type where requested
3938    if ( this->captures_bottom_type(AD.globalNames()) ) {
3939      fprintf(fp_cpp, "  node->_bottom_type = bottom_type();\n");
3940    }
3941
3942    fprintf(fp_cpp, "\n");
3943    // Short branch version must use same node index for access
3944    // through allocator's tables
3945    fprintf(fp_cpp, "  // Copy _idx, inputs and operands to new node\n");
3946    fprintf(fp_cpp, "  fill_new_machnode(node, C);\n");
3947
3948    // Return result and exit scope
3949    fprintf(fp_cpp, "  return node;\n");
3950    fprintf(fp_cpp, "}\n");
3951    fprintf(fp_cpp,"\n");
3952    return true;
3953  }
3954  return false;
3955}
3956
3957
3958//---------------------------buildMachNodeGenerator----------------------------
3959// Build switch to invoke appropriate "new" MachNode for an opcode
3960void ArchDesc::buildMachNodeGenerator(FILE *fp_cpp) {
3961
3962  // Build switch to invoke 'new' for a specific MachNode
3963  fprintf(fp_cpp, "\n");
3964  fprintf(fp_cpp, "\n");
3965  fprintf(fp_cpp,
3966          "//------------------------- MachNode Generator ---------------\n");
3967  fprintf(fp_cpp,
3968          "// A switch statement on the dense-packed user-defined type system\n"
3969          "// that invokes 'new' on the corresponding class constructor.\n");
3970  fprintf(fp_cpp, "\n");
3971  fprintf(fp_cpp, "MachNode *State::MachNodeGenerator");
3972  fprintf(fp_cpp, "(int opcode, Compile* C)");
3973  fprintf(fp_cpp, "{\n");
3974  fprintf(fp_cpp, "  switch(opcode) {\n");
3975
3976  // Provide constructor for all user-defined instructions
3977  _instructions.reset();
3978  int  opIndex = operandFormCount();
3979  InstructForm *inst;
3980  for( ; (inst = (InstructForm*)_instructions.iter()) != NULL; ) {
3981    // Ensure that matrule is defined.
3982    if ( inst->_matrule == NULL ) continue;
3983
3984    int         opcode  = opIndex++;
3985    const char *opClass = inst->_ident;
3986    char       *opType  = NULL;
3987
3988    // Generate the case statement for this instruction
3989    fprintf(fp_cpp, "  case %s_rule:", opClass);
3990
3991    // Start local scope
3992    fprintf(fp_cpp, "  {\n");
3993    // Generate code to construct the new MachNode
3994    buildMachNode(fp_cpp, inst, "     ");
3995    // Return result and exit scope
3996    fprintf(fp_cpp, "      return node;\n");
3997    fprintf(fp_cpp, "    }\n");
3998  }
3999
4000  // Generate the default case for switch(opcode)
4001  fprintf(fp_cpp, "  \n");
4002  fprintf(fp_cpp, "  default:\n");
4003  fprintf(fp_cpp, "    fprintf(stderr, \"Default MachNode Generator invoked for: \\n\");\n");
4004  fprintf(fp_cpp, "    fprintf(stderr, \"   opcode = %cd\\n\", opcode);\n", '%');
4005  fprintf(fp_cpp, "    break;\n");
4006  fprintf(fp_cpp, "  };\n");
4007
4008  // Generate the closing for method Matcher::MachNodeGenerator
4009  fprintf(fp_cpp, "  return NULL;\n");
4010  fprintf(fp_cpp, "}\n");
4011}
4012
4013
4014//---------------------------buildInstructMatchCheck--------------------------
4015// Output the method to Matcher which checks whether or not a specific
4016// instruction has a matching rule for the host architecture.
4017void ArchDesc::buildInstructMatchCheck(FILE *fp_cpp) const {
4018  fprintf(fp_cpp, "\n\n");
4019  fprintf(fp_cpp, "const bool Matcher::has_match_rule(int opcode) {\n");
4020  fprintf(fp_cpp, "  assert(_last_machine_leaf < opcode && opcode < _last_opcode, \"opcode in range\");\n");
4021  fprintf(fp_cpp, "  return _hasMatchRule[opcode];\n");
4022  fprintf(fp_cpp, "}\n\n");
4023
4024  fprintf(fp_cpp, "const bool Matcher::_hasMatchRule[_last_opcode] = {\n");
4025  int i;
4026  for (i = 0; i < _last_opcode - 1; i++) {
4027    fprintf(fp_cpp, "    %-5s,  // %s\n",
4028            _has_match_rule[i] ? "true" : "false",
4029            NodeClassNames[i]);
4030  }
4031  fprintf(fp_cpp, "    %-5s   // %s\n",
4032          _has_match_rule[i] ? "true" : "false",
4033          NodeClassNames[i]);
4034  fprintf(fp_cpp, "};\n");
4035}
4036
4037//---------------------------buildFrameMethods---------------------------------
4038// Output the methods to Matcher which specify frame behavior
4039void ArchDesc::buildFrameMethods(FILE *fp_cpp) {
4040  fprintf(fp_cpp,"\n\n");
4041  // Stack Direction
4042  fprintf(fp_cpp,"bool Matcher::stack_direction() const { return %s; }\n\n",
4043          _frame->_direction ? "true" : "false");
4044  // Sync Stack Slots
4045  fprintf(fp_cpp,"int Compile::sync_stack_slots() const { return %s; }\n\n",
4046          _frame->_sync_stack_slots);
4047  // Java Stack Alignment
4048  fprintf(fp_cpp,"uint Matcher::stack_alignment_in_bytes() { return %s; }\n\n",
4049          _frame->_alignment);
4050  // Java Return Address Location
4051  fprintf(fp_cpp,"OptoReg::Name Matcher::return_addr() const {");
4052  if (_frame->_return_addr_loc) {
4053    fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n",
4054            _frame->_return_addr);
4055  }
4056  else {
4057    fprintf(fp_cpp," return OptoReg::stack2reg(%s); }\n\n",
4058            _frame->_return_addr);
4059  }
4060  // Java Stack Slot Preservation
4061  fprintf(fp_cpp,"uint Compile::in_preserve_stack_slots() ");
4062  fprintf(fp_cpp,"{ return %s; }\n\n", _frame->_in_preserve_slots);
4063  // Top Of Stack Slot Preservation, for both Java and C
4064  fprintf(fp_cpp,"uint Compile::out_preserve_stack_slots() ");
4065  fprintf(fp_cpp,"{ return SharedRuntime::out_preserve_stack_slots(); }\n\n");
4066  // varargs C out slots killed
4067  fprintf(fp_cpp,"uint Compile::varargs_C_out_slots_killed() const ");
4068  fprintf(fp_cpp,"{ return %s; }\n\n", _frame->_varargs_C_out_slots_killed);
4069  // Java Argument Position
4070  fprintf(fp_cpp,"void Matcher::calling_convention(BasicType *sig_bt, VMRegPair *regs, uint length, bool is_outgoing) {\n");
4071  fprintf(fp_cpp,"%s\n", _frame->_calling_convention);
4072  fprintf(fp_cpp,"}\n\n");
4073  // Native Argument Position
4074  fprintf(fp_cpp,"void Matcher::c_calling_convention(BasicType *sig_bt, VMRegPair *regs, uint length) {\n");
4075  fprintf(fp_cpp,"%s\n", _frame->_c_calling_convention);
4076  fprintf(fp_cpp,"}\n\n");
4077  // Java Return Value Location
4078  fprintf(fp_cpp,"OptoRegPair Matcher::return_value(int ideal_reg, bool is_outgoing) {\n");
4079  fprintf(fp_cpp,"%s\n", _frame->_return_value);
4080  fprintf(fp_cpp,"}\n\n");
4081  // Native Return Value Location
4082  fprintf(fp_cpp,"OptoRegPair Matcher::c_return_value(int ideal_reg, bool is_outgoing) {\n");
4083  fprintf(fp_cpp,"%s\n", _frame->_c_return_value);
4084  fprintf(fp_cpp,"}\n\n");
4085
4086  // Inline Cache Register, mask definition, and encoding
4087  fprintf(fp_cpp,"OptoReg::Name Matcher::inline_cache_reg() {");
4088  fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n",
4089          _frame->_inline_cache_reg);
4090  fprintf(fp_cpp,"int Matcher::inline_cache_reg_encode() {");
4091  fprintf(fp_cpp," return _regEncode[inline_cache_reg()]; }\n\n");
4092
4093  // Interpreter's Method Oop Register, mask definition, and encoding
4094  fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_method_oop_reg() {");
4095  fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n",
4096          _frame->_interpreter_method_oop_reg);
4097  fprintf(fp_cpp,"int Matcher::interpreter_method_oop_reg_encode() {");
4098  fprintf(fp_cpp," return _regEncode[interpreter_method_oop_reg()]; }\n\n");
4099
4100  // Interpreter's Frame Pointer Register, mask definition, and encoding
4101  fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_frame_pointer_reg() {");
4102  if (_frame->_interpreter_frame_pointer_reg == NULL)
4103    fprintf(fp_cpp," return OptoReg::Bad; }\n\n");
4104  else
4105    fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n",
4106            _frame->_interpreter_frame_pointer_reg);
4107
4108  // Frame Pointer definition
4109  /* CNC - I can not contemplate having a different frame pointer between
4110     Java and native code; makes my head hurt to think about it.
4111  fprintf(fp_cpp,"OptoReg::Name Matcher::frame_pointer() const {");
4112  fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n",
4113          _frame->_frame_pointer);
4114  */
4115  // (Native) Frame Pointer definition
4116  fprintf(fp_cpp,"OptoReg::Name Matcher::c_frame_pointer() const {");
4117  fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n",
4118          _frame->_frame_pointer);
4119
4120  // Number of callee-save + always-save registers for calling convention
4121  fprintf(fp_cpp, "// Number of callee-save + always-save registers\n");
4122  fprintf(fp_cpp, "int  Matcher::number_of_saved_registers() {\n");
4123  RegDef *rdef;
4124  int nof_saved_registers = 0;
4125  _register->reset_RegDefs();
4126  while( (rdef = _register->iter_RegDefs()) != NULL ) {
4127    if( !strcmp(rdef->_callconv, "SOE") ||  !strcmp(rdef->_callconv, "AS") )
4128      ++nof_saved_registers;
4129  }
4130  fprintf(fp_cpp, "  return %d;\n", nof_saved_registers);
4131  fprintf(fp_cpp, "};\n\n");
4132}
4133
4134
4135
4136
4137static int PrintAdlcCisc = 0;
4138//---------------------------identify_cisc_spilling----------------------------
4139// Get info for the CISC_oracle and MachNode::cisc_version()
4140void ArchDesc::identify_cisc_spill_instructions() {
4141
4142  // Find the user-defined operand for cisc-spilling
4143  if( _frame->_cisc_spilling_operand_name != NULL ) {
4144    const Form *form = _globalNames[_frame->_cisc_spilling_operand_name];
4145    OperandForm *oper = form ? form->is_operand() : NULL;
4146    // Verify the user's suggestion
4147    if( oper != NULL ) {
4148      // Ensure that match field is defined.
4149      if ( oper->_matrule != NULL )  {
4150        MatchRule &mrule = *oper->_matrule;
4151        if( strcmp(mrule._opType,"AddP") == 0 ) {
4152          MatchNode *left = mrule._lChild;
4153          MatchNode *right= mrule._rChild;
4154          if( left != NULL && right != NULL ) {
4155            const Form *left_op  = _globalNames[left->_opType]->is_operand();
4156            const Form *right_op = _globalNames[right->_opType]->is_operand();
4157            if(  (left_op != NULL && right_op != NULL)
4158              && (left_op->interface_type(_globalNames) == Form::register_interface)
4159              && (right_op->interface_type(_globalNames) == Form::constant_interface) ) {
4160              // Successfully verified operand
4161              set_cisc_spill_operand( oper );
4162              if( _cisc_spill_debug ) {
4163                fprintf(stderr, "\n\nVerified CISC-spill operand %s\n\n", oper->_ident);
4164             }
4165            }
4166          }
4167        }
4168      }
4169    }
4170  }
4171
4172  if( cisc_spill_operand() != NULL ) {
4173    // N^2 comparison of instructions looking for a cisc-spilling version
4174    _instructions.reset();
4175    InstructForm *instr;
4176    for( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
4177      // Ensure that match field is defined.
4178      if ( instr->_matrule == NULL )  continue;
4179
4180      MatchRule &mrule = *instr->_matrule;
4181      Predicate *pred  =  instr->build_predicate();
4182
4183      // Grab the machine type of the operand
4184      const char *rootOp = instr->_ident;
4185      mrule._machType    = rootOp;
4186
4187      // Find result type for match
4188      const char *result = instr->reduce_result();
4189
4190      if( PrintAdlcCisc ) fprintf(stderr, "  new instruction %s \n", instr->_ident ? instr->_ident : " ");
4191      bool  found_cisc_alternate = false;
4192      _instructions.reset2();
4193      InstructForm *instr2;
4194      for( ; !found_cisc_alternate && (instr2 = (InstructForm*)_instructions.iter2()) != NULL; ) {
4195        // Ensure that match field is defined.
4196        if( PrintAdlcCisc ) fprintf(stderr, "  instr2 == %s \n", instr2->_ident ? instr2->_ident : " ");
4197        if ( instr2->_matrule != NULL
4198            && (instr != instr2 )                // Skip self
4199            && (instr2->reduce_result() != NULL) // want same result
4200            && (strcmp(result, instr2->reduce_result()) == 0)) {
4201          MatchRule &mrule2 = *instr2->_matrule;
4202          Predicate *pred2  =  instr2->build_predicate();
4203          found_cisc_alternate = instr->cisc_spills_to(*this, instr2);
4204        }
4205      }
4206    }
4207  }
4208}
4209
4210//---------------------------build_cisc_spilling-------------------------------
4211// Get info for the CISC_oracle and MachNode::cisc_version()
4212void ArchDesc::build_cisc_spill_instructions(FILE *fp_hpp, FILE *fp_cpp) {
4213  // Output the table for cisc spilling
4214  fprintf(fp_cpp, "//  The following instructions can cisc-spill\n");
4215  _instructions.reset();
4216  InstructForm *inst = NULL;
4217  for(; (inst = (InstructForm*)_instructions.iter()) != NULL; ) {
4218    // Ensure this is a machine-world instruction
4219    if ( inst->ideal_only() )  continue;
4220    const char *inst_name = inst->_ident;
4221    int   operand   = inst->cisc_spill_operand();
4222    if( operand != AdlcVMDeps::Not_cisc_spillable ) {
4223      InstructForm *inst2 = inst->cisc_spill_alternate();
4224      fprintf(fp_cpp, "//  %s can cisc-spill operand %d to %s\n", inst->_ident, operand, inst2->_ident);
4225    }
4226  }
4227  fprintf(fp_cpp, "\n\n");
4228}
4229
4230//---------------------------identify_short_branches----------------------------
4231// Get info for our short branch replacement oracle.
4232void ArchDesc::identify_short_branches() {
4233  // Walk over all instructions, checking to see if they match a short
4234  // branching alternate.
4235  _instructions.reset();
4236  InstructForm *instr;
4237  while( (instr = (InstructForm*)_instructions.iter()) != NULL ) {
4238    // The instruction must have a match rule.
4239    if (instr->_matrule != NULL &&
4240        instr->is_short_branch()) {
4241
4242      _instructions.reset2();
4243      InstructForm *instr2;
4244      while( (instr2 = (InstructForm*)_instructions.iter2()) != NULL ) {
4245        instr2->check_branch_variant(*this, instr);
4246      }
4247    }
4248  }
4249}
4250
4251
4252//---------------------------identify_unique_operands---------------------------
4253// Identify unique operands.
4254void ArchDesc::identify_unique_operands() {
4255  // Walk over all instructions.
4256  _instructions.reset();
4257  InstructForm *instr;
4258  while( (instr = (InstructForm*)_instructions.iter()) != NULL ) {
4259    // Ensure this is a machine-world instruction
4260    if (!instr->ideal_only()) {
4261      instr->set_unique_opnds();
4262    }
4263  }
4264}
4265