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