hotspot/src/share/vm/adlc/archDesc.cpp
author kvn
Tue, 09 Oct 2012 16:09:31 -0700
changeset 13971 3c568f3dacca
parent 13969 d2a189b83b87
child 16626 b58a6213631c
permissions -rw-r--r--
8000592: Improve adlc usability Summary: several changes to adlc to improve its usability Reviewed-by: kvn Contributed-by: goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
//
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
     2
// Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
// This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
// under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
// published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
// This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
// version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
// accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
// You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
// 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
//
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3815
diff changeset
    19
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3815
diff changeset
    20
// or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3815
diff changeset
    21
// questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
// archDesc.cpp - Internal format for architecture definition
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
#include "adlc.hpp"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
static FILE *errfile = stderr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
//--------------------------- utility functions -----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
inline char  toUpper(char lower) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
  return (('a' <= lower && lower <= 'z') ? (lower + ('A'-'a')) : lower);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
char *toUpper(const char *str) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
  char *upper  = new char[strlen(str)+1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
  char *result = upper;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  const char *end    = str + strlen(str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  for (; str < end; ++str, ++upper) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
    *upper = toUpper(*str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  *upper = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// Utilities to characterize effect statements
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
static bool is_def(int usedef) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  switch(usedef) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  case Component::DEF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  case Component::USE_DEF: return true; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
static bool is_use(int usedef) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  switch(usedef) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  case Component::USE:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  case Component::USE_DEF:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  case Component::USE_KILL: return true; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
static bool is_kill(int usedef) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  switch(usedef) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  case Component::KILL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  case Component::USE_KILL: return true; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
//---------------------------ChainList Methods-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
ChainList::ChainList() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
void ChainList::insert(const char *name, const char *cost, const char *rule) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  _name.addName(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  _cost.addName(cost);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  _rule.addName(rule);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
bool ChainList::search(const char *name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  return _name.search(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
void ChainList::reset() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  _name.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  _cost.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  _rule.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
bool ChainList::iter(const char * &name, const char * &cost, const char * &rule) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  bool        notDone = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  const char *n       = _name.iter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  const char *c       = _cost.iter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  const char *r       = _rule.iter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  if (n && c && r) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    notDone = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    name = n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    cost = c;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    rule = r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  return notDone;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
void ChainList::dump() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  output(stderr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
void ChainList::output(FILE *fp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  fprintf(fp, "\nChain Rules: output resets iterator\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  const char   *cost  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  const char   *name  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  const char   *rule  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  bool   chains_exist = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  for(reset(); (iter(name,cost,rule)) == true; ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    fprintf(fp, "Chain to <%s> at cost #%s using %s_rule\n",name, cost ? cost : "0", rule);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    //  // Check for transitive chain rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    //  Form *form = (Form *)_globalNames[rule];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    //  if (form->is_instruction()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    //    // chain_rule(fp, indent, name, cost, rule);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    //    chain_rule(fp, indent, name, cost, rule);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    //  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  if( ! chains_exist ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    fprintf(fp, "No entries in this ChainList\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
//---------------------------MatchList Methods-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
bool MatchList::search(const char *opc, const char *res, const char *lch,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
                       const char *rch, Predicate *pr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  bool tmp = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  if ((res == _resultStr) || (res && _resultStr && !strcmp(res, _resultStr))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    if ((lch == _lchild) || (lch && _lchild && !strcmp(lch, _lchild))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
      if ((rch == _rchild) || (rch && _rchild && !strcmp(rch, _rchild))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
        char * predStr = get_pred();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
        char * prStr = pr?pr->_pred:NULL;
1662
76a93a5fb765 6771309: debugging AD files is difficult without #line directives in generated code
jrose
parents: 1552
diff changeset
   143
        if (ADLParser::equivalent_expressions(prStr, predStr)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
          return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  if (_next) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    tmp = _next->search(opc, res, lch, rch, pr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  return tmp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
void MatchList::dump() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  output(stderr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
void MatchList::output(FILE *fp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  fprintf(fp, "\nMatchList output is Unimplemented();\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
//---------------------------ArchDesc Constructor and Destructor-------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
ArchDesc::ArchDesc()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  : _globalNames(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    _globalDefs(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    _preproc_table(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    _idealIndex(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    _internalOps(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    _internalMatch(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    _chainRules(cmpstr,hashstr, Form::arena),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    _cisc_spill_operand(NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
      // Initialize the opcode to MatchList table with NULLs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
      for( int i=0; i<_last_opcode; ++i ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
        _mlistab[i] = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
      // Set-up the global tables
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
      initKeywords(_globalNames);    // Initialize the Name Table with keywords
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
      // Prime user-defined types with predefined types: Set, RegI, RegF, ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
      initBaseOpTypes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
      // Initialize flags & counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
      _TotalLines        = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
      _no_output         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
      _quiet_mode        = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
      _disable_warnings  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
      _dfa_debug         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
      _dfa_small         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
      _adl_debug         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
      _adlocation_debug  = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
      _internalOpCounter = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
      _cisc_spill_debug  = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
      _short_branch_debug = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
      // Initialize match rule flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
      for (int i = 0; i < _last_opcode; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
        _has_match_rule[i] = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
      // Error/Warning Counts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
      _syntax_errs       = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
      _semantic_errs     = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
      _warnings          = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
      _internal_errs     = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
      // Initialize I/O Files
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
      _ADL_file._name = NULL; _ADL_file._fp = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
      // Machine dependent output files
1552
45c617d33fa6 6767659: Conversion from i486 to x86 missed some entries in makefiles
kvn
parents: 670
diff changeset
   215
      _DFA_file._name    = NULL;  _DFA_file._fp = NULL;
45c617d33fa6 6767659: Conversion from i486 to x86 missed some entries in makefiles
kvn
parents: 670
diff changeset
   216
      _HPP_file._name    = NULL;  _HPP_file._fp = NULL;
45c617d33fa6 6767659: Conversion from i486 to x86 missed some entries in makefiles
kvn
parents: 670
diff changeset
   217
      _CPP_file._name    = NULL;  _CPP_file._fp = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
      _bug_file._name    = "bugs.out";      _bug_file._fp = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
      // Initialize Register & Pipeline Form Pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
      _register = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
      _encode = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
      _pipeline = NULL;
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   224
      _frame = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
ArchDesc::~ArchDesc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // Clean-up and quit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
//---------------------------ArchDesc methods: Public ----------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
// Store forms according to type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
void ArchDesc::addForm(PreHeaderForm *ptr) { _pre_header.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
void ArchDesc::addForm(HeaderForm    *ptr) { _header.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
void ArchDesc::addForm(SourceForm    *ptr) { _source.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
void ArchDesc::addForm(EncodeForm    *ptr) { _encode = ptr; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
void ArchDesc::addForm(InstructForm  *ptr) { _instructions.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
void ArchDesc::addForm(MachNodeForm  *ptr) { _machnodes.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
void ArchDesc::addForm(OperandForm   *ptr) { _operands.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
void ArchDesc::addForm(OpClassForm   *ptr) { _opclass.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
void ArchDesc::addForm(AttributeForm *ptr) { _attributes.addForm(ptr); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
void ArchDesc::addForm(RegisterForm  *ptr) { _register = ptr; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
void ArchDesc::addForm(FrameForm     *ptr) { _frame = ptr; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
void ArchDesc::addForm(PipelineForm  *ptr) { _pipeline = ptr; };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
// Build MatchList array and construct MatchLists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
void ArchDesc::generateMatchLists() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // Call inspection routines to populate array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  inspectOperands();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  inspectInstructions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
// Build MatchList structures for operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
void ArchDesc::inspectOperands() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // Iterate through all operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  _operands.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  OperandForm *op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  for( ; (op = (OperandForm*)_operands.iter()) != NULL;) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    // Construct list of top-level operands (components)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    op->build_components();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    // Ensure that match field is defined.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    if ( op->_matrule == NULL )  continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    // Type check match rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    check_optype(op->_matrule);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    // Construct chain rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    build_chain_rule(op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    MatchRule &mrule = *op->_matrule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    Predicate *pred  =  op->_predicate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    // Grab the machine type of the operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    const char  *rootOp    = op->_ident;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    mrule._machType  = rootOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    // Check for special cases
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    if (strcmp(rootOp,"Universe")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    if (strcmp(rootOp,"label")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    // !!!!! !!!!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    assert( strcmp(rootOp,"sReg") != 0, "Disable untyped 'sReg'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    if (strcmp(rootOp,"sRegI")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    if (strcmp(rootOp,"sRegP")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    if (strcmp(rootOp,"sRegF")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    if (strcmp(rootOp,"sRegD")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    if (strcmp(rootOp,"sRegL")==0) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    // Cost for this match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    const char *costStr     = op->cost();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    const char *defaultCost =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
      ((AttributeForm*)_globalNames[AttributeForm::_op_cost])->_attrdef;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
    const char *cost        =  costStr? costStr : defaultCost;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    // Find result type for match.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
    const char *result      = op->reduce_result();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    bool        has_root    = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    // Construct a MatchList for this entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    buildMatchList(op->_matrule, result, rootOp, pred, cost);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
// Build MatchList structures for instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
void ArchDesc::inspectInstructions() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  // Iterate through all instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  _instructions.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  InstructForm *instr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  for( ; (instr = (InstructForm*)_instructions.iter()) != NULL; ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    // Construct list of top-level operands (components)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    instr->build_components();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    // Ensure that match field is defined.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
    if ( instr->_matrule == NULL )  continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    MatchRule &mrule = *instr->_matrule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    Predicate *pred  =  instr->build_predicate();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    // Grab the machine type of the operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    const char  *rootOp    = instr->_ident;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    mrule._machType  = rootOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    // Cost for this match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    const char *costStr = instr->cost();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    const char *defaultCost =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
      ((AttributeForm*)_globalNames[AttributeForm::_ins_cost])->_attrdef;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    const char *cost    =  costStr? costStr : defaultCost;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    // Find result type for match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    const char *result  = instr->reduce_result();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
10266
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10255
diff changeset
   335
    if ( instr->is_ideal_branch() && instr->label_position() == -1 ||
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10255
diff changeset
   336
        !instr->is_ideal_branch() && instr->label_position() != -1) {
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10255
diff changeset
   337
      syntax_err(instr->_linenum, "%s: Only branches to a label are supported\n", rootOp);
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10255
diff changeset
   338
    }
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10255
diff changeset
   339
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    Attribute *attr = instr->_attribs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    while (attr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
      if (strcmp(attr->_ident,"ins_short_branch") == 0 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
          attr->int_val(*this) != 0) {
10255
bab46e6f7661 7069452: Cleanup NodeFlags
kvn
parents: 7397
diff changeset
   344
        if (!instr->is_ideal_branch() || instr->label_position() == -1) {
bab46e6f7661 7069452: Cleanup NodeFlags
kvn
parents: 7397
diff changeset
   345
          syntax_err(instr->_linenum, "%s: Only short branch to a label is supported\n", rootOp);
bab46e6f7661 7069452: Cleanup NodeFlags
kvn
parents: 7397
diff changeset
   346
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
        instr->set_short_branch(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
      } else if (strcmp(attr->_ident,"ins_alignment") == 0 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
          attr->int_val(*this) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
        instr->set_alignment(attr->int_val(*this));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
      attr = (Attribute *)attr->_next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    if (!instr->is_short_branch()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
      buildMatchList(instr->_matrule, result, mrule._machType, pred, cost);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
static int setsResult(MatchRule &mrule) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  if (strcmp(mrule._name,"Set") == 0) return 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
const char *ArchDesc::getMatchListIndex(MatchRule &mrule) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  if (setsResult(mrule)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    // right child
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    return mrule._rChild->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    // first entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    return mrule._opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
//------------------------------result of reduction----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
//------------------------------left reduction---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
// Return the left reduction associated with an internal name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
const char *ArchDesc::reduceLeft(char         *internalName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  const char *left  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  MatchNode *mnode = (MatchNode*)_internalMatch[internalName];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  if (mnode->_lChild) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    mnode = mnode->_lChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    left = mnode->_internalop ? mnode->_internalop : mnode->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  return left;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
//------------------------------right reduction--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
const char *ArchDesc::reduceRight(char  *internalName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  const char *right  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  MatchNode *mnode = (MatchNode*)_internalMatch[internalName];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  if (mnode->_rChild) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    mnode = mnode->_rChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
    right = mnode->_internalop ? mnode->_internalop : mnode->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  return right;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
//------------------------------check_optype-----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
void ArchDesc::check_optype(MatchRule *mrule) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  MatchRule *rule = mrule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  //   !!!!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  //   // Cycle through the list of match rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  //   while(mrule) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  //     // Check for a filled in type field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  //     if (mrule->_opType == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  //     const Form  *form    = operands[_result];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  //     OpClassForm *opcForm = form ? form->is_opclass() : NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  //     assert(opcForm != NULL, "Match Rule contains invalid operand name.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  //     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  //     char *opType = opcForm->_ident;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  //   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
//------------------------------add_chain_rule_entry--------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
void ArchDesc::add_chain_rule_entry(const char *src, const char *cost,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
                                    const char *result) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // Look-up the operation in chain rule table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  ChainList *lst = (ChainList *)_chainRules[src];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  if (lst == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    lst = new ChainList();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    _chainRules.Insert(src, lst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  if (!lst->search(result)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    if (cost == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
      cost = ((AttributeForm*)_globalNames[AttributeForm::_op_cost])->_attrdef;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
    lst->insert(result, cost, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
//------------------------------build_chain_rule-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
void ArchDesc::build_chain_rule(OperandForm *oper) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  MatchRule     *rule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  // Check for chain rules here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // If this is only a chain rule
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  if ((oper->_matrule) && (oper->_matrule->_lChild == NULL) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
      (oper->_matrule->_rChild == NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
   448
    {
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
   449
      const Form *form = _globalNames[oper->_matrule->_opType];
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
   450
      if ((form) && form->is_operand() &&
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
   451
          (form->ideal_only() == false)) {
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
   452
        add_chain_rule_entry(oper->_matrule->_opType, oper->cost(), oper->_ident);
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
   453
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
    // Check for additional chain rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
    if (oper->_matrule->_next) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
      rule = oper->_matrule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
      do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
        rule = rule->_next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
        // Any extra match rules after the first must be chain rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
        const Form *form = _globalNames[rule->_opType];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
        if ((form) && form->is_operand() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
            (form->ideal_only() == false)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
          add_chain_rule_entry(rule->_opType, oper->cost(), oper->_ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
      } while(rule->_next != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  else if ((oper->_matrule) && (oper->_matrule->_next)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    // Regardles of whether the first matchrule is a chain rule, check the list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    rule = oper->_matrule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
      rule = rule->_next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
      // Any extra match rules after the first must be chain rules
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
      const Form *form = _globalNames[rule->_opType];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
      if ((form) && form->is_operand() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
          (form->ideal_only() == false)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
        assert( oper->cost(), "This case expects NULL cost, not default cost");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
        add_chain_rule_entry(rule->_opType, oper->cost(), oper->_ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
    } while(rule->_next != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
//------------------------------buildMatchList---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
// operands and instructions provide the result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
void ArchDesc::buildMatchList(MatchRule *mrule, const char *resultStr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
                              const char *rootOp, Predicate *pred,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
                              const char *cost) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  const char *leftstr, *rightstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  MatchNode  *mnode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  leftstr = rightstr = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  // Check for chain rule, and do not generate a match list for it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  if ( mrule->is_chain_rule(_globalNames) ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  // Identify index position among ideal operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  intptr_t    index     = _last_opcode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  const char  *indexStr  = getMatchListIndex(*mrule);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  index  = (intptr_t)_idealIndex[indexStr];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  if (index == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    fprintf(stderr, "Ideal node missing: %s\n", indexStr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    assert(index != 0, "Failed lookup of ideal node\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  // Check that this will be placed appropriately in the DFA
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  if (index >= _last_opcode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    fprintf(stderr, "Invalid match rule %s <-- ( %s )\n",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
            resultStr ? resultStr : " ",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
            rootOp    ? rootOp    : " ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    assert(index < _last_opcode, "Matching item not in ideal graph\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // Walk the MatchRule, generating MatchList entries for each level
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // of the rule (each nesting of parentheses)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  // Check for "Set"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  if (!strcmp(mrule->_opType, "Set")) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    mnode = mrule->_rChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
    buildMList(mnode, rootOp, resultStr, pred, cost);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  // Build MatchLists for children
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  // Check each child for an internal operand name, and use that name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  // for the parent's matchlist entry if it exists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  mnode = mrule->_lChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  if (mnode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    buildMList(mnode, NULL, NULL, NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    leftstr = mnode->_internalop ? mnode->_internalop : mnode->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  mnode = mrule->_rChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  if (mnode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    buildMList(mnode, NULL, NULL, NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    rightstr = mnode->_internalop ? mnode->_internalop : mnode->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  // Search for an identical matchlist entry already on the list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  if ((_mlistab[index] == NULL) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
      (_mlistab[index] &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
       !_mlistab[index]->search(rootOp, resultStr, leftstr, rightstr, pred))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
    // Place this match rule at front of list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    MatchList *mList =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
      new MatchList(_mlistab[index], pred, cost,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
                    rootOp, resultStr, leftstr, rightstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
    _mlistab[index] = mList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
// Recursive call for construction of match lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
void ArchDesc::buildMList(MatchNode *node, const char *rootOp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
                          const char *resultOp, Predicate *pred,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
                          const char *cost) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  const char *leftstr, *rightstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  const char *resultop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  const char *opcode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  MatchNode  *mnode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  Form       *form;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  leftstr = rightstr = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  // Do not process leaves of the Match Tree if they are not ideal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  if ((node) && (node->_lChild == NULL) && (node->_rChild == NULL) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
      ((form = (Form *)_globalNames[node->_opType]) != NULL) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
      (!form->ideal_only())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  // Identify index position among ideal operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  intptr_t    index     = _last_opcode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  const char *indexStr  = node ? node->_opType : (char *) " ";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  index            = (intptr_t)_idealIndex[indexStr];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  if (index == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
    fprintf(stderr, "error: operand \"%s\" not found\n", indexStr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    assert(0, "fatal error");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  // Build MatchLists for children
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  // Check each child for an internal operand name, and use that name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  // for the parent's matchlist entry if it exists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  mnode = node->_lChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  if (mnode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    buildMList(mnode, NULL, NULL, NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    leftstr = mnode->_internalop ? mnode->_internalop : mnode->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  mnode = node->_rChild;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  if (mnode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    buildMList(mnode, NULL, NULL, NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    rightstr = mnode->_internalop ? mnode->_internalop : mnode->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  // Grab the string for the opcode of this list entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  if (rootOp == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    opcode = (node->_internalop) ? node->_internalop : node->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    opcode = rootOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  // Grab the string for the result of this list entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  if (resultOp == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
    resultop = (node->_internalop) ? node->_internalop : node->_opType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  else resultop = resultOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  // Search for an identical matchlist entry already on the list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  if ((_mlistab[index] == NULL) || (_mlistab[index] &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
                                    !_mlistab[index]->search(opcode, resultop, leftstr, rightstr, pred))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
    // Place this match rule at front of list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
    MatchList *mList =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
      new MatchList(_mlistab[index],pred,cost,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
                    opcode, resultop, leftstr, rightstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
    _mlistab[index] = mList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
// Count number of OperandForms defined
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
int  ArchDesc::operandFormCount() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  // Only interested in ones with non-NULL match rule
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  int  count = 0; _operands.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  OperandForm *cur;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  for( ; (cur = (OperandForm*)_operands.iter()) != NULL; ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    if (cur->_matrule != NULL) ++count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  return count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
// Count number of OpClassForms defined
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
int  ArchDesc::opclassFormCount() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  // Only interested in ones with non-NULL match rule
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  int  count = 0; _operands.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  OpClassForm *cur;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  for( ; (cur = (OpClassForm*)_opclass.iter()) != NULL; ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
    ++count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  return count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
// Count number of InstructForms defined
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
int  ArchDesc::instructFormCount() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  // Only interested in ones with non-NULL match rule
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  int  count = 0; _instructions.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  InstructForm *cur;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  for( ; (cur = (InstructForm*)_instructions.iter()) != NULL; ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    if (cur->_matrule != NULL) ++count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  return count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
//------------------------------get_preproc_def--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
// Return the textual binding for a given CPP flag name.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
// Return NULL if there is no binding, or it has been #undef-ed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
char* ArchDesc::get_preproc_def(const char* flag) {
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   652
  // In case of syntax errors, flag may take the value NULL.
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   653
  SourceForm* deff = NULL;
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   654
  if (flag != NULL)
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   655
    deff = (SourceForm*) _preproc_table[flag];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  return (deff == NULL) ? NULL : deff->_code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
//------------------------------set_preproc_def--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
// Change or create a textual binding for a given CPP flag name.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
// Giving NULL means the flag name is to be #undef-ed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
// In any case, _preproc_list collects all names either #defined or #undef-ed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
void ArchDesc::set_preproc_def(const char* flag, const char* def) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  SourceForm* deff = (SourceForm*) _preproc_table[flag];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  if (deff == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
    deff = new SourceForm(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
    _preproc_table.Insert(flag, deff);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
    _preproc_list.addName(flag);   // this supports iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  deff->_code = (char*) def;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
bool ArchDesc::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  if (_register)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    assert( _register->verify(), "Register declarations failed verification");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  if (!_quiet_mode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  // fprintf(stderr,"---------------------------- Verify Operands ---------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  // _operands.verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  // fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  // fprintf(stderr,"---------------------------- Verify Operand Classes --------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  // _opclass.verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  // fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  // fprintf(stderr,"---------------------------- Verify Attributes  ------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  // _attributes.verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  // fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  if (!_quiet_mode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
    fprintf(stderr,"---------------------------- Verify Instructions ----------------------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  _instructions.verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  if (!_quiet_mode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  // if ( _encode ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  //   fprintf(stderr,"---------------------------- Verify Encodings --------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  //   _encode->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  //if (_pipeline) _pipeline->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
void ArchDesc::dump() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  _pre_header.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  _header.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  _source.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  if (_register) _register->dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  fprintf(stderr,"------------------ Dump Operands ---------------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  _operands.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  fprintf(stderr,"------------------ Dump Operand Classes --------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  _opclass.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  fprintf(stderr,"------------------ Dump Attributes  ------------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  _attributes.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  fprintf(stderr,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  fprintf(stderr,"------------------ Dump Instructions -----------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  _instructions.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  if ( _encode ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    fprintf(stderr,"------------------ Dump Encodings --------------------\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    _encode->dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  if (_pipeline) _pipeline->dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
//------------------------------init_keywords----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
// Load the kewords into the global name table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
void ArchDesc::initKeywords(FormDict& names) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  // Insert keyword strings into Global Name Table.  Keywords have a NULL value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  // field for quick easy identification when checking identifiers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  names.Insert("instruct", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  names.Insert("operand", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  names.Insert("attribute", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  names.Insert("source", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  names.Insert("register", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  names.Insert("pipeline", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  names.Insert("constraint", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  names.Insert("predicate", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  names.Insert("encode", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  names.Insert("enc_class", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  names.Insert("interface", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  names.Insert("opcode", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  names.Insert("ins_encode", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  names.Insert("match", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  names.Insert("effect", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  names.Insert("expand", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  names.Insert("rewrite", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  names.Insert("reg_def", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  names.Insert("reg_class", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  names.Insert("alloc_class", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  names.Insert("resource", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  names.Insert("pipe_class", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  names.Insert("pipe_desc", NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
//------------------------------internal_err----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
// Issue a parser error message, and skip to the end of the current line
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
void ArchDesc::internal_err(const char *fmt, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  va_start(args, fmt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  _internal_errs += emit_msg(0, INTERNAL_ERR, 0, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  _no_output = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
//------------------------------syntax_err----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
// Issue a parser error message, and skip to the end of the current line
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
void ArchDesc::syntax_err(int lineno, const char *fmt, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  va_list args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  va_start(args, fmt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  _internal_errs += emit_msg(0, SYNERR, lineno, fmt, args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  va_end(args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  _no_output = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
//------------------------------emit_msg---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
// Emit a user message, typically a warning or error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
int ArchDesc::emit_msg(int quiet, int flag, int line, const char *fmt,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
    va_list args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  static int  last_lineno = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  int         i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  const char *pref;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  switch(flag) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  case 0: pref = "Warning: "; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  case 1: pref = "Syntax Error: "; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  case 2: pref = "Semantic Error: "; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  case 3: pref = "Internal Error: "; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  default: assert(0, ""); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  if (line == last_lineno) return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  last_lineno = line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  if (!quiet) {                        /* no output if in quiet mode         */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    i = fprintf(errfile, "%s(%d) ", _ADL_file._name, line);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    while (i++ <= 15)  fputc(' ', errfile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
    fprintf(errfile, "%-8s:", pref);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    vfprintf(errfile, fmt, args);
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   810
    fprintf(errfile, "\n");
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   811
    fflush(errfile);
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   812
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  return 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
// ---------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
//--------Utilities to build mappings for machine registers ------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
// ---------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
// Construct the name of the register mask.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
static const char *getRegMask(const char *reg_class_name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  if( reg_class_name == NULL ) return "RegMask::Empty";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  if (strcmp(reg_class_name,"Universe")==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
    return "RegMask::Empty";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  } else if (strcmp(reg_class_name,"stack_slots")==0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
    return "(Compile::current()->FIRST_STACK_mask())";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
    char       *rc_name = toUpper(reg_class_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
    const char *mask    = "_mask";
11197
158eecd6b330 7090968: Allow adlc register class to depend on runtime conditions
roland
parents: 11196
diff changeset
   832
    int         length  = (int)strlen(rc_name) + (int)strlen(mask) + 5;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
    char       *regMask = new char[length];
11197
158eecd6b330 7090968: Allow adlc register class to depend on runtime conditions
roland
parents: 11196
diff changeset
   834
    sprintf(regMask,"%s%s()", rc_name, mask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    return regMask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
// Convert a register class name to its register mask.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
const char *ArchDesc::reg_class_to_reg_mask(const char *rc_name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  const char *reg_mask = "RegMask::Empty";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  if( _register ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
    RegClass *reg_class  = _register->getRegClass(rc_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
    if (reg_class == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
      syntax_err(0, "Use of an undefined register class %s", rc_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
      return reg_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    // Construct the name of the register mask.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    reg_mask = getRegMask(rc_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  return reg_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
// Obtain the name of the RegMask for an OperandForm
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
const char *ArchDesc::reg_mask(OperandForm  &opForm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  const char *regMask      = "RegMask::Empty";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  // Check constraints on result's register class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  const char *result_class = opForm.constrained_reg_class();
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   864
  if (result_class == NULL) {
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   865
    opForm.dump();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   866
    syntax_err(opForm._linenum,
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   867
               "Use of an undefined result class for operand: %s",
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   868
               opForm._ident);
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   869
    abort();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   870
  }
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   871
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  regMask = reg_class_to_reg_mask( result_class );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  return regMask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
// Obtain the name of the RegMask for an InstructForm
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
const char *ArchDesc::reg_mask(InstructForm &inForm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  const char *result = inForm.reduce_result();
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   880
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   881
  if (result == NULL) {
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   882
    syntax_err(inForm._linenum,
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   883
               "Did not find result operand or RegMask"
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   884
               " for this instruction: %s",
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   885
               inForm._ident);
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   886
    abort();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   887
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  // Instructions producing 'Universe' use RegMask::Empty
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  if( strcmp(result,"Universe")==0 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    return "RegMask::Empty";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  // Lookup this result operand and get its register class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  Form *form = (Form*)_globalNames[result];
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   896
  if (form == NULL) {
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   897
    syntax_err(inForm._linenum,
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   898
               "Did not find result operand for result: %s", result);
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   899
    abort();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   900
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  OperandForm *oper = form->is_operand();
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   902
  if (oper == NULL) {
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   903
    syntax_err(inForm._linenum, "Form is not an OperandForm:");
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   904
    form->dump();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   905
    abort();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   906
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  return reg_mask( *oper );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
// Obtain the STACK_OR_reg_mask name for an OperandForm
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
char *ArchDesc::stack_or_reg_mask(OperandForm  &opForm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  // name of cisc_spillable version
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  const char *reg_mask_name = reg_mask(opForm);
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   915
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   916
  if (reg_mask_name == NULL) {
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   917
     syntax_err(opForm._linenum,
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   918
                "Did not find reg_mask for opForm: %s",
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   919
                opForm._ident);
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   920
     abort();
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13969
diff changeset
   921
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  const char *stack_or = "STACK_OR_";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  int   length         = (int)strlen(stack_or) + (int)strlen(reg_mask_name) + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  char *result         = new char[length];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  sprintf(result,"%s%s", stack_or, reg_mask_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
// Record that the register class must generate a stack_or_reg_mask
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
void ArchDesc::set_stack_or_reg(const char *reg_class_name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  if( _register ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
    RegClass *reg_class  = _register->getRegClass(reg_class_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
    reg_class->_stack_or_reg = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
// Return the type signature for the ideal operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
const char *ArchDesc::getIdealType(const char *idealOp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  // Find last character in idealOp, it specifies the type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  char  last_char = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  const char *ptr = idealOp;
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   945
  for (; *ptr != '\0'; ++ptr) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
    last_char = *ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   949
  // Match Vector types.
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   950
  if (strncmp(idealOp, "Vec",3)==0) {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   951
    switch(last_char) {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   952
    case 'S':  return "TypeVect::VECTS";
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   953
    case 'D':  return "TypeVect::VECTD";
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   954
    case 'X':  return "TypeVect::VECTX";
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   955
    case 'Y':  return "TypeVect::VECTY";
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   956
    default:
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   957
      internal_err("Vector type %s with unrecognized type\n",idealOp);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   958
    }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   959
  }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   960
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  // !!!!!
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   962
  switch(last_char) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  case 'I':    return "TypeInt::INT";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  case 'P':    return "TypePtr::BOTTOM";
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   965
  case 'N':    return "TypeNarrowOop::BOTTOM";
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  case 'F':    return "Type::FLOAT";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  case 'D':    return "Type::DOUBLE";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  case 'L':    return "TypeLong::LONG";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  case 's':    return "TypeInt::CC /*flags*/";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
    // !!!!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
    // internal_err("Ideal type %s with unrecognized type\n",idealOp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
OperandForm *ArchDesc::constructOperand(const char *ident,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
                                        bool  ideal_only) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  OperandForm *opForm = new OperandForm(ident, ideal_only);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  _globalNames.Insert(ident, opForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  addForm(opForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  return opForm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
// Import predefined base types: Set = 1, RegI, RegP, ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
void ArchDesc::initBaseOpTypes() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  // Create OperandForm and assign type for each opcode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  for (int i = 1; i < _last_machine_leaf; ++i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
    char        *ident   = (char *)NodeClassNames[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    constructOperand(ident, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  // Create InstructForm and assign type for each ideal instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  for ( int j = _last_machine_leaf+1; j < _last_opcode; ++j) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
    char         *ident    = (char *)NodeClassNames[j];
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13104
diff changeset
  1002
    if(!strcmp(ident, "ConI") || !strcmp(ident, "ConP") ||
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13104
diff changeset
  1003
       !strcmp(ident, "ConN") || !strcmp(ident, "ConNKlass") ||
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
       !strcmp(ident, "ConF") || !strcmp(ident, "ConD") ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
       !strcmp(ident, "ConL") || !strcmp(ident, "Con" ) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
       !strcmp(ident, "Bool") ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
      constructOperand(ident, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
      InstructForm *insForm  = new InstructForm(ident, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
      // insForm->_opcode       = nextUserOpType(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
      _globalNames.Insert(ident,insForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
      addForm(insForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  { OperandForm *opForm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  // Create operand type "Universe" for return instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  const char *ident = "Universe";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  opForm = constructOperand(ident, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  // Create operand type "label" for branch targets
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  ident = "label";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  opForm = constructOperand(ident, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  // !!!!! Update - when adding a new sReg/stackSlot type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  // Create operand types "sReg[IPFDL]" for stack slot registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  opForm = constructOperand("sRegI", false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  opForm->_constraint = new Constraint("ALLOC_IN_RC", "stack_slots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  opForm = constructOperand("sRegP", false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  opForm->_constraint = new Constraint("ALLOC_IN_RC", "stack_slots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  opForm = constructOperand("sRegF", false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  opForm->_constraint = new Constraint("ALLOC_IN_RC", "stack_slots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  opForm = constructOperand("sRegD", false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  opForm->_constraint = new Constraint("ALLOC_IN_RC", "stack_slots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  opForm = constructOperand("sRegL", false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  opForm->_constraint = new Constraint("ALLOC_IN_RC", "stack_slots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  // Create operand type "method" for call targets
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  ident = "method";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  opForm = constructOperand(ident, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  // Create Effect Forms for each of the legal effects
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  // USE, DEF, USE_DEF, KILL, USE_KILL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
    const char *ident = "USE";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
    Effect     *eForm = new Effect(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
    _globalNames.Insert(ident, eForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    ident = "DEF";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
    eForm = new Effect(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
    _globalNames.Insert(ident, eForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
    ident = "USE_DEF";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    eForm = new Effect(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
    _globalNames.Insert(ident, eForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
    ident = "KILL";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
    eForm = new Effect(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
    _globalNames.Insert(ident, eForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
    ident = "USE_KILL";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
    eForm = new Effect(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
    _globalNames.Insert(ident, eForm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
    ident = "TEMP";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
    eForm = new Effect(ident);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
    _globalNames.Insert(ident, eForm);
11196
a310a659c580 7077312: Provide a CALL effect for instruct declaration in the ad file
roland
parents: 10266
diff changeset
  1065
    ident = "CALL";
a310a659c580 7077312: Provide a CALL effect for instruct declaration in the ad file
roland
parents: 10266
diff changeset
  1066
    eForm = new Effect(ident);
a310a659c580 7077312: Provide a CALL effect for instruct declaration in the ad file
roland
parents: 10266
diff changeset
  1067
    _globalNames.Insert(ident, eForm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  // Build mapping from ideal names to ideal indices
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  int idealIndex = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  for (idealIndex = 1; idealIndex < _last_machine_leaf; ++idealIndex) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
    const char *idealName = NodeClassNames[idealIndex];
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
  1075
    _idealIndex.Insert((void*) idealName, (void*) (intptr_t) idealIndex);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  for ( idealIndex = _last_machine_leaf+1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
        idealIndex < _last_opcode; ++idealIndex) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
    const char *idealName = NodeClassNames[idealIndex];
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1662
diff changeset
  1080
    _idealIndex.Insert((void*) idealName, (void*) (intptr_t) idealIndex);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
//---------------------------addSUNcopyright-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
// output SUN copyright info
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
void ArchDesc::addSunCopyright(char* legal, int size, FILE *fp) {
3815
36a687917fd8 6879689: Fix warning about ignored return value when compiling with -O2
andrew
parents: 2154
diff changeset
  1089
  size_t count = fwrite(legal, 1, size, fp);
36a687917fd8 6879689: Fix warning about ignored return value when compiling with -O2
andrew
parents: 2154
diff changeset
  1090
  assert(count == (size_t) size, "copyright info truncated");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  fprintf(fp,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  fprintf(fp,"// Machine Generated File.  Do Not Edit!\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  fprintf(fp,"\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1097
//---------------------------addIncludeGuardStart--------------------------
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1098
// output the start of an include guard.
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1099
void ArchDesc::addIncludeGuardStart(ADLFILE &adlfile, const char* guardString) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  // Build #include lines
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  fprintf(adlfile._fp, "\n");
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1102
  fprintf(adlfile._fp, "#ifndef %s\n", guardString);
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1103
  fprintf(adlfile._fp, "#define %s\n", guardString);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  fprintf(adlfile._fp, "\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1108
//---------------------------addIncludeGuardEnd--------------------------
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1109
// output the end of an include guard.
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1110
void ArchDesc::addIncludeGuardEnd(ADLFILE &adlfile, const char* guardString) {
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1111
  // Build #include lines
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1112
  fprintf(adlfile._fp, "\n");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1113
  fprintf(adlfile._fp, "#endif // %s\n", guardString);
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1114
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1115
}
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1116
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1117
//---------------------------addInclude--------------------------
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1118
// output the #include line for this file.
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1119
void ArchDesc::addInclude(ADLFILE &adlfile, const char* fileName) {
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1120
  fprintf(adlfile._fp, "#include \"%s\"\n", fileName);
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1121
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1122
}
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1123
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1124
void ArchDesc::addInclude(ADLFILE &adlfile, const char* includeDir, const char* fileName) {
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1125
  fprintf(adlfile._fp, "#include \"%s/%s\"\n", includeDir, fileName);
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1126
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
  1127
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
//---------------------------addPreprocessorChecks-----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
// Output C preprocessor code to verify the backend compilation environment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
// The idea is to force code produced by "adlc -DHS64" to be compiled by a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
// command of the form "CC ... -DHS64 ...", so that any #ifdefs in the source
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
// blocks select C code that is consistent with adlc's selections of AD code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
void ArchDesc::addPreprocessorChecks(FILE *fp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  const char* flag;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  _preproc_list.reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  if (_preproc_list.count() > 0 && !_preproc_list.current_is_signal()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
    fprintf(fp, "// Check consistency of C++ compilation with ADLC options:\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  for (_preproc_list.reset(); (flag = _preproc_list.iter()) != NULL; ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
    if (_preproc_list.current_is_signal())  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
    char* def = get_preproc_def(flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
    fprintf(fp, "// Check adlc ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
    if (def)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
          fprintf(fp, "-D%s=%s\n", flag, def);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
    else  fprintf(fp, "-U%s\n", flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
    fprintf(fp, "#%s %s\n",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
            def ? "ifndef" : "ifdef", flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
    fprintf(fp, "#  error \"%s %s be defined\"\n",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
            flag, def ? "must" : "must not");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
    fprintf(fp, "#endif // %s\n", flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
// Convert operand name into enum name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
const char *ArchDesc::machOperEnum(const char *opName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  return ArchDesc::getMachOperEnum(opName);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
// Convert operand name into enum name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
const char *ArchDesc::getMachOperEnum(const char *opName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  return (opName ? toUpper(opName) : opName);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
//---------------------------buildMustCloneMap-----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
// Flag cases when machine needs cloned values or instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
void ArchDesc::buildMustCloneMap(FILE *fp_hpp, FILE *fp_cpp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  // Build external declarations for mappings
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  fprintf(fp_hpp, "// Mapping from machine-independent opcode to boolean\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  fprintf(fp_hpp, "// Flag cases where machine needs cloned values or instructions\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
  fprintf(fp_hpp, "extern const char must_clone[];\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
  fprintf(fp_hpp, "\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  // Build mapping from ideal names to ideal indices
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  fprintf(fp_cpp, "\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  fprintf(fp_cpp, "// Mapping from machine-independent opcode to boolean\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  fprintf(fp_cpp, "const        char must_clone[] = {\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  for (int idealIndex = 0; idealIndex < _last_opcode; ++idealIndex) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
    int         must_clone = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
    const char *idealName = NodeClassNames[idealIndex];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
    // Previously selected constants for cloning
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
    // !!!!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
    // These are the current machine-dependent clones
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
    if ( strcmp(idealName,"CmpI") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
         || strcmp(idealName,"CmpU") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
         || strcmp(idealName,"CmpP") == 0
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1188
         || strcmp(idealName,"CmpN") == 0
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
         || strcmp(idealName,"CmpL") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
         || strcmp(idealName,"CmpD") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
         || strcmp(idealName,"CmpF") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
         || strcmp(idealName,"FastLock") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
         || strcmp(idealName,"FastUnlock") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
         || strcmp(idealName,"Bool") == 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
         || strcmp(idealName,"Binary") == 0 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
      // Removed ConI from the must_clone list.  CPUs that cannot use
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
      // large constants as immediates manifest the constant as an
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
      // instruction.  The must_clone flag prevents the constant from
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
      // floating up out of loops.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
      must_clone = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
    fprintf(fp_cpp, "  %d%s // %s: %d\n", must_clone,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
      (idealIndex != (_last_opcode - 1)) ? "," : " // no trailing comma",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
      idealName, idealIndex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  // Finish defining table
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  fprintf(fp_cpp, "};\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
}