hotspot/src/share/vm/opto/machnode.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13969 d2a189b83b87
child 15241 87d217c2d183
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11190
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4566
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4566
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: 4566
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
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "gc_interface/collectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "opto/machnode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "opto/regalloc.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// Return the value requested
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// result register lookup, corresponding to int_format
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
int MachOper::reg(PhaseRegAlloc *ra_, const Node *node) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
  return (int)ra_->get_encode(node);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// input register lookup, corresponding to ext_format
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
int MachOper::reg(PhaseRegAlloc *ra_, const Node *node, int idx) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  return (int)(ra_->get_encode(node->in(idx)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
intptr_t  MachOper::constant() const { return 0x00; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
    41
relocInfo::relocType MachOper::constant_reloc() const { return relocInfo::none; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
jdouble MachOper::constantD() const { ShouldNotReachHere(); return 0.0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
jfloat  MachOper::constantF() const { ShouldNotReachHere(); return 0.0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
jlong   MachOper::constantL() const { ShouldNotReachHere(); return CONST64(0) ; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
TypeOopPtr *MachOper::oop() const { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
int MachOper::ccode() const { return 0x00; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// A zero, default, indicates this value is not needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// May need to lookup the base register, as done in int_ and ext_format
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
int MachOper::base (PhaseRegAlloc *ra_, const Node *node, int idx)  const { return 0x00; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
int MachOper::index(PhaseRegAlloc *ra_, const Node *node, int idx)  const { return 0x00; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
int MachOper::scale()  const { return 0x00; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
int MachOper::disp (PhaseRegAlloc *ra_, const Node *node, int idx)  const { return 0x00; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
int MachOper::constant_disp()  const { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
int MachOper::base_position()  const { return -1; }  // no base input
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
int MachOper::index_position() const { return -1; }  // no index input
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
// Check for PC-Relative displacement
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
    57
relocInfo::relocType MachOper::disp_reloc() const { return relocInfo::none; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// Return the label
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
Label*   MachOper::label()  const { ShouldNotReachHere(); return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
intptr_t MachOper::method() const { ShouldNotReachHere(); return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
//------------------------------negate-----------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// Negate conditional branches.  Error for non-branch operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
void MachOper::negate() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
//-----------------------------type--------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
const Type *MachOper::type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  return Type::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
//------------------------------in_RegMask-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
const RegMask *MachOper::in_RegMask(int index) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
//------------------------------dump_spec--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
void MachOper::dump_spec(outputStream *st) const { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
//------------------------------hash-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
uint MachOper::hash() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  return 5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
//------------------------------cmp--------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
uint MachOper::cmp( const MachOper &oper ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  return opcode() == oper.opcode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
//------------------------------hash-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
uint labelOper::hash() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  return _block_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
//------------------------------cmp--------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
uint labelOper::cmp( const MachOper &oper ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  return (opcode() == oper.opcode()) && (_label == oper.label());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
//------------------------------hash-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
uint methodOper::hash() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  return (uint)_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
//------------------------------cmp--------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
uint methodOper::cmp( const MachOper &oper ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  return (opcode() == oper.opcode()) && (_method == oper.method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
//------------------------------MachNode---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
//------------------------------emit-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
void MachNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  tty->print("missing MachNode emit function: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
//------------------------------size-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
// Size of instruction in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
uint MachNode::size(PhaseRegAlloc *ra_) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  // If a virtual was not defined for this specific instruction,
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 781
diff changeset
   141
  // Call the helper which finds the size by emitting the bits.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  return MachNode::emit_size(ra_);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
//------------------------------size-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
// Helper function that computes size by emitting code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
uint MachNode::emit_size(PhaseRegAlloc *ra_) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // Emit into a trash buffer and count bytes emitted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  assert(ra_ == ra_->C->regalloc(), "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  return ra_->C->scratch_emit_size(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
//------------------------------hash-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
uint MachNode::hash() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  uint no = num_opnds();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  uint sum = rule();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  for( uint i=0; i<no; i++ )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    sum += _opnds[i]->hash();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  return sum+Node::hash();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
//-----------------------------cmp---------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
uint MachNode::cmp( const Node &node ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  MachNode& n = *((Node&)node).as_Mach();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  uint no = num_opnds();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  if( no != n.num_opnds() ) return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  if( rule() != n.rule() ) return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  for( uint i=0; i<no; i++ )    // All operands must match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    if( !_opnds[i]->cmp( *n._opnds[i] ) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
      return 0;                 // mis-matched operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  return 1;                     // match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
// Return an equivalent instruction using memory for cisc_operand position
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
MachNode *MachNode::cisc_version(int offset, Compile* C) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
void MachNode::use_cisc_RegMask() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
//-----------------------------in_RegMask--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
const RegMask &MachNode::in_RegMask( uint idx ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  uint numopnds = num_opnds();        // Virtual call for number of operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  uint skipped   = oper_input_base(); // Sum of leaves skipped so far
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  if( idx < skipped ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    assert( ideal_Opcode() == Op_AddP, "expected base ptr here" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    assert( idx == 1, "expected base ptr here" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    // debug info can be anywhere
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    return *Compile::current()->matcher()->idealreg2spillmask[Op_RegP];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  uint opcnt     = 1;                 // First operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  uint num_edges = _opnds[1]->num_edges(); // leaves for first operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  while( idx >= skipped+num_edges ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    skipped += num_edges;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    opcnt++;                          // Bump operand count
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    assert( opcnt < numopnds, "Accessing non-existent operand" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    num_edges = _opnds[opcnt]->num_edges(); // leaves for next operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  const RegMask *rm = cisc_RegMask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  if( rm == NULL || (int)opcnt != cisc_operand() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    rm = _opnds[opcnt]->in_RegMask(idx-skipped);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  return *rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
//-----------------------------memory_inputs--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
const MachOper*  MachNode::memory_inputs(Node* &base, Node* &index) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  const MachOper* oper = memory_operand();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  if (oper == (MachOper*)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    base = NodeSentinel;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    index = NodeSentinel;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    base = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    index = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    if (oper != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
      // It has a unique memory operand.  Find its index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
      int oper_idx = num_opnds();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
      while (--oper_idx >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
        if (_opnds[oper_idx] == oper)  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
      int oper_pos = operand_index(oper_idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
      int base_pos = oper->base_position();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
      if (base_pos >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
        base = _in[oper_pos+base_pos];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
      int index_pos = oper->index_position();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      if (index_pos >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
        index = _in[oper_pos+index_pos];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  return oper;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
//-----------------------------get_base_and_disp----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
const Node* MachNode::get_base_and_disp(intptr_t &offset, const TypePtr* &adr_type) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  // Find the memory inputs using our helper function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  Node* base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  Node* index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  const MachOper* oper = memory_inputs(base, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  if (oper == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    // Base has been set to NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    offset = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  } else if (oper == (MachOper*)-1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
    // Base has been set to NodeSentinel
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    // There is not a unique memory use here.  We will fall to AliasIdxBot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    offset = Type::OffsetBot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    // Base may be NULL, even if offset turns out to be != 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    intptr_t disp = oper->constant_disp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    int scale = oper->scale();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    // Now we have collected every part of the ADLC MEMORY_INTER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    // See if it adds up to a base + offset.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    if (index != NULL) {
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 762
diff changeset
   267
      const Type* t_index = index->bottom_type();
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   268
      if (t_index->isa_narrowoop() || t_index->isa_narrowklass()) { // EncodeN, LoadN, LoadConN, LoadNKlass,
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   269
                                                                    // EncodeNKlass, LoadConNklass.
762
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   270
        // Memory references through narrow oops have a
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   271
        // funny base so grab the type from the index:
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   272
        // [R12 + narrow_oop_reg<<3 + offset]
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   273
        assert(base == NULL, "Memory references through narrow oops have no base");
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   274
        offset = disp;
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 762
diff changeset
   275
        adr_type = t_index->make_ptr()->add_offset(offset);
762
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   276
        return NULL;
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 360
diff changeset
   277
      } else if (!index->is_Con()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
        disp = Type::OffsetBot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
      } else if (disp != Type::OffsetBot) {
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 762
diff changeset
   280
        const TypeX* ti = t_index->isa_intptr_t();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
        if (ti == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
          disp = Type::OffsetBot;  // a random constant??
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
          disp += ti->get_con() << scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    offset = disp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    // In i486.ad, indOffset32X uses base==RegI and disp==RegP,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    // this will prevent alias analysis without the following support:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    // Lookup the TypePtr used by indOffset32X, a compile-time constant oop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    // Add the offset determined by the "base", or use Type::OffsetBot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    if( adr_type == TYPE_PTR_SENTINAL ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
      const TypePtr *t_disp = oper->disp_as_type();  // only !NULL for indOffset32X
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
      if (t_disp != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
        offset = Type::OffsetBot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
        const Type* t_base = base->bottom_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
        if (t_base->isa_intptr_t()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
          const TypeX *t_offset = t_base->is_intptr_t();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
          if( t_offset->is_con() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
            offset = t_offset->get_con();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
        adr_type = t_disp->add_offset(offset);
3268
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 2340
diff changeset
   306
      } else if( base == NULL && offset != 0 && offset != Type::OffsetBot ) {
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 2340
diff changeset
   307
        // Use ideal type if it is oop ptr.
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 2340
diff changeset
   308
        const TypePtr *tp = oper->type()->isa_ptr();
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 2340
diff changeset
   309
        if( tp != NULL) {
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 2340
diff changeset
   310
          adr_type = tp;
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 2340
diff changeset
   311
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  return base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
//---------------------------------adr_type---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
const class TypePtr *MachNode::adr_type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  intptr_t offset = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  const TypePtr *adr_type = TYPE_PTR_SENTINAL;  // attempt computing adr_type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  const Node *base = get_base_and_disp(offset, adr_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  if( adr_type != TYPE_PTR_SENTINAL ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    return adr_type;      // get_base_and_disp has the answer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // Direct addressing modes have no base node, simply an indirect
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  // offset, which is always to raw memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  // %%%%% Someday we'd like to allow constant oop offsets which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  // would let Intel load from static globals in 1 instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // Currently Intel requires 2 instructions and a register temp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  if (base == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    // NULL base, zero offset means no memory at all (a null pointer!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    if (offset == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
      return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    // NULL base, any offset means any pointer whatever
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    if (offset == Type::OffsetBot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
      return TypePtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    // %%% make offset be intptr_t
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    assert(!Universe::heap()->is_in_reserved((oop)offset), "must be a raw ptr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    return TypeRawPtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // base of -1 with no particular offset means all of memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  if (base == NodeSentinel)  return TypePtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  const Type* t = base->bottom_type();
2340
cb47f8209cd8 6810845: Performance regression in mpegaudio on x64
kvn
parents: 2131
diff changeset
   352
  if (UseCompressedOops && Universe::narrow_oop_shift() == 0) {
cb47f8209cd8 6810845: Performance regression in mpegaudio on x64
kvn
parents: 2131
diff changeset
   353
    // 32-bit unscaled narrow oop can be the base of any address expression
cb47f8209cd8 6810845: Performance regression in mpegaudio on x64
kvn
parents: 2131
diff changeset
   354
    t = t->make_ptr();
cb47f8209cd8 6810845: Performance regression in mpegaudio on x64
kvn
parents: 2131
diff changeset
   355
  }
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   356
  if (UseCompressedKlassPointers && Universe::narrow_klass_shift() == 0) {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   357
    // 32-bit unscaled narrow oop can be the base of any address expression
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   358
    t = t->make_ptr();
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   359
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  if (t->isa_intptr_t() && offset != 0 && offset != Type::OffsetBot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    // We cannot assert that the offset does not look oop-ish here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    // Depending on the heap layout the cardmark base could land
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    // inside some oopish region.  It definitely does for Win2K.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
    // The sum of cardmark-base plus shift-by-9-oop lands outside
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
    // the oop-ish area but we can't assert for that statically.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    return TypeRawPtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  const TypePtr *tp = t->isa_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // be conservative if we do not recognize the type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  if (tp == NULL) {
2340
cb47f8209cd8 6810845: Performance regression in mpegaudio on x64
kvn
parents: 2131
diff changeset
   373
    assert(false, "this path may produce not optimal code");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    return TypePtr::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  assert(tp->base() != Type::AnyPtr, "not a bare pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  return tp->add_offset(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
//-----------------------------operand_index---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
int MachNode::operand_index( uint operand ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  if( operand < 1 )  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  assert(operand < num_opnds(), "oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  if( _opnds[operand]->num_edges() == 0 )  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  uint skipped   = oper_input_base(); // Sum of leaves skipped so far
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  for (uint opcnt = 1; opcnt < operand; opcnt++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    uint num_edges = _opnds[opcnt]->num_edges(); // leaves for operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    skipped += num_edges;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  return skipped;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
//------------------------------peephole---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
// Apply peephole rule(s) to this instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
MachNode *MachNode::peephole( Block *block, int block_index, PhaseRegAlloc *ra_, int &deleted, Compile* C ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
//------------------------------add_case_label---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
// Adds the label for the case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
void MachNode::add_case_label( int index_num, Label* blockLabel) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
//------------------------------method_set-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
// Set the absolute address of a method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
void MachNode::method_set( intptr_t addr ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
//------------------------------rematerialize----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
bool MachNode::rematerialize() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // Temps are always rematerializable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  if (is_MachTemp()) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  uint r = rule();              // Match rule
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  if( r <  Matcher::_begin_rematerialize ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
      r >= Matcher::_end_rematerialize )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // For 2-address instructions, the input live range is also the output
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // live range.  Remateralizing does not make progress on the that live range.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  if( two_adr() )  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // Check for rematerializing float constants, or not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  if( !Matcher::rematerialize_float_constants ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
    int op = ideal_Opcode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    if( op == Op_ConF || op == Op_ConD )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  // Defining flags - can't spill these!  Must remateralize.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  if( ideal_reg() == Op_RegFlags )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  // Stretching lots of inputs - don't do it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  if( req() > 2 )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // Don't remateralize somebody with bound inputs - it stretches a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  // fixed register lifetime.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  uint idx = oper_input_base();
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11190
diff changeset
   447
  if (req() > idx) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    const RegMask &rm = in_RegMask(idx);
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11190
diff changeset
   449
    if (rm.is_bound(ideal_reg()))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
//------------------------------dump_spec--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
// Print any per-operand special info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
void MachNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  uint cnt = num_opnds();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  for( uint i=0; i<cnt; i++ )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    _opnds[i]->dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  const TypePtr *t = adr_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  if( t ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    Compile* C = Compile::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    if( C->alias_type(t)->is_volatile() )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
      st->print(" Volatile!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
//------------------------------dump_format------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
// access to virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
void MachNode::dump_format(PhaseRegAlloc *ra, outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  format(ra, st); // access to virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
void MachTypeNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  _bottom_type->dump_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   485
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   486
//=============================================================================
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   487
int MachConstantNode::constant_offset() {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   488
  // Bind the offset lazily.
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   489
  if (_constant.offset() == -1) {
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   490
    Compile::ConstantTable& constant_table = Compile::current()->constant_table();
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   491
    int offset = constant_table.find_offset(_constant);
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   492
    // If called from Compile::scratch_emit_size return the
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   493
    // pre-calculated offset.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   494
    // NOTE: If the AD file does some table base offset optimizations
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   495
    // later the AD file needs to take care of this fact.
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   496
    if (Compile::current()->in_scratch_emit_size()) {
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   497
      return constant_table.calculate_table_base_offset() + offset;
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   498
    }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   499
    _constant.set_offset(constant_table.table_base_offset() + offset);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   500
  }
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10977
diff changeset
   501
  return _constant.offset();
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   502
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   503
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   504
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
void MachNullCheckNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  int reg = ra_->get_reg_first(in(1)->in(_vidx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  tty->print("%s %s", Name(), Matcher::regName[reg]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
void MachNullCheckNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  // only emits entries in the null-pointer exception handler table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
}
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 7433
diff changeset
   516
void MachNullCheckNode::label_set(Label* label, uint block_num) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 7433
diff changeset
   517
  // Nothing to emit
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 7433
diff changeset
   518
}
10266
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   519
void MachNullCheckNode::save_label( Label** label, uint* block_num ) {
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   520
  // Nothing to emit
2ea344c79e33 7079317: Incorrect branch's destination block in PrintoOptoAssembly output
kvn
parents: 10252
diff changeset
   521
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
const RegMask &MachNullCheckNode::in_RegMask( uint idx ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  if( idx == 0 ) return RegMask::Empty;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  else return in(1)->as_Mach()->out_RegMask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
const Type *MachProjNode::bottom_type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  if( _ideal_reg == fat_proj ) return Type::BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  // Try the normal mechanism first
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  const Type *t = in(0)->bottom_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  if( t->base() == Type::Tuple ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    const TypeTuple *tt = t->is_tuple();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
    if (_con < tt->cnt())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
      return tt->field_at(_con);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // Else use generic type from ideal register set
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  assert((uint)_ideal_reg < (uint)_last_machine_leaf && Type::mreg2type[_ideal_reg], "in bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  return Type::mreg2type[_ideal_reg];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
const TypePtr *MachProjNode::adr_type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  if (bottom_type() == Type::MEMORY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    // in(0) might be a narrow MemBar; otherwise we will report TypePtr::BOTTOM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
    const TypePtr* adr_type = in(0)->adr_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
    if (!is_error_reported() && !Node::in_dump())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
      assert(adr_type != NULL, "source must have adr_type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
    return adr_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  assert(bottom_type()->base() != Type::Memory, "no other memories?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
void MachProjNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  ProjNode::dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  switch (_ideal_reg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  case unmatched_proj:  st->print("/unmatched");                         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  case fat_proj:        st->print("/fat"); if (WizardMode) _rout.dump(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
void MachIfNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  st->print("P=%f, C=%f",_prob, _fcnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
uint MachReturnNode::size_of() const { return sizeof(*this); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
//------------------------------Registers--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
const RegMask &MachReturnNode::in_RegMask( uint idx ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  return _in_rms[idx];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
const TypePtr *MachReturnNode::adr_type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  // most returns and calls are assumed to consume & modify all of memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  // the matcher will copy non-wide adr_types from ideal originals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  return _adr_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
const Type *MachSafePointNode::bottom_type() const {  return TypeTuple::MEMBAR; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
//------------------------------Registers--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
const RegMask &MachSafePointNode::in_RegMask( uint idx ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  // Values in the domain use the users calling convention, embodied in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // _in_rms array of RegMasks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  if( idx < TypeFunc::Parms ) return _in_rms[idx];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  if (SafePointNode::needs_polling_address_input() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
      idx == TypeFunc::Parms &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
      ideal_Opcode() == Op_SafePoint) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
    return MachNode::in_RegMask(idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  // Values outside the domain represent debug info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  return *Compile::current()->matcher()->idealreg2spillmask[in(idx)->ideal_reg()];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
uint MachCallNode::cmp( const Node &n ) const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
{ return _tf == ((MachCallNode&)n)._tf; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
const Type *MachCallNode::bottom_type() const { return tf()->range(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
const Type *MachCallNode::Value(PhaseTransform *phase) const { return tf()->range(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
void MachCallNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  st->print("# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  tf()->dump_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  if (_cnt != COUNT_UNKNOWN)  st->print(" C=%f",_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  if (jvms() != NULL)  jvms()->dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
bool MachCallNode::return_value_is_used() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  if (tf()->range()->cnt() == TypeFunc::Parms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
    // void return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  // find the projection corresponding to the return value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
    Node *use = fast_out(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
    if (!use->is_Proj()) continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    if (use->as_Proj()->_con == TypeFunc::Parms) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
//------------------------------Registers--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
const RegMask &MachCallNode::in_RegMask( uint idx ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  // Values in the domain use the users calling convention, embodied in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  // _in_rms array of RegMasks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  if (idx < tf()->domain()->cnt())  return _in_rms[idx];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  // Values outside the domain represent debug info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  return *Compile::current()->matcher()->idealreg2debugmask[in(idx)->ideal_reg()];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
uint MachCallJavaNode::size_of() const { return sizeof(*this); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
uint MachCallJavaNode::cmp( const Node &n ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  MachCallJavaNode &call = (MachCallJavaNode&)n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  return MachCallNode::cmp(call) && _method->equals(call._method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
void MachCallJavaNode::dump_spec(outputStream *st) const {
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   660
  if (_method_handle_invoke)
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   661
    st->print("MethodHandle ");
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   662
  if (_method) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
    _method->print_short_name(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  MachCallNode::dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   670
//------------------------------Registers--------------------------------------
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   671
const RegMask &MachCallJavaNode::in_RegMask(uint idx) const {
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   672
  // Values in the domain use the users calling convention, embodied in the
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   673
  // _in_rms array of RegMasks.
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   674
  if (idx < tf()->domain()->cnt())  return _in_rms[idx];
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   675
  // Values outside the domain represent debug info
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   676
  Matcher* m = Compile::current()->matcher();
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   677
  // If this call is a MethodHandle invoke we have to use a different
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   678
  // debugmask which does not include the register we use to save the
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   679
  // SP over MH invokes.
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   680
  RegMask** debugmask = _method_handle_invoke ? m->idealreg2mhdebugmask : m->idealreg2debugmask;
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   681
  return *debugmask[in(idx)->ideal_reg()];
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   682
}
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3283
diff changeset
   683
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
uint MachCallStaticJavaNode::size_of() const { return sizeof(*this); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
uint MachCallStaticJavaNode::cmp( const Node &n ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  MachCallStaticJavaNode &call = (MachCallStaticJavaNode&)n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  return MachCallJavaNode::cmp(call) && _name == call._name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
//----------------------------uncommon_trap_request----------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
// If this is an uncommon trap, return the request code, else zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
int MachCallStaticJavaNode::uncommon_trap_request() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  if (_name != NULL && !strcmp(_name, "uncommon_trap")) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
    return CallStaticJavaNode::extract_uncommon_trap_request(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
// Helper for summarizing uncommon_trap arguments.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
void MachCallStaticJavaNode::dump_trap_args(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  int trap_req = uncommon_trap_request();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  if (trap_req != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
    char buf[100];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
    st->print("(%s)",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
               Deoptimization::format_trap_request(buf, sizeof(buf),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
                                                   trap_req));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
void MachCallStaticJavaNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  st->print("Static ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  if (_name != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
    st->print("wrapper for: %s", _name );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    dump_trap_args(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    st->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  MachCallJavaNode::dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
void MachCallDynamicJavaNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  st->print("Dynamic ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  MachCallJavaNode::dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
uint MachCallRuntimeNode::size_of() const { return sizeof(*this); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
uint MachCallRuntimeNode::cmp( const Node &n ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  MachCallRuntimeNode &call = (MachCallRuntimeNode&)n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  return MachCallNode::cmp(call) && !strcmp(_name,call._name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
void MachCallRuntimeNode::dump_spec(outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  st->print("%s ",_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  MachCallNode::dump_spec(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
// A shared JVMState for all HaltNodes.  Indicates the start of debug info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
// is at TypeFunc::Parms.  Only required for SOE register spill handling -
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
// to indicate where the stack-slot-only debug info inputs begin.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
// There is no other JVM state needed here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
JVMState jvms_for_throw(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
JVMState *MachHaltNode::jvms() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  return &jvms_for_throw;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
void labelOper::int_format(PhaseRegAlloc *ra, const MachNode *node, outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  st->print("B%d", _block_num);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
//=============================================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
void methodOper::int_format(PhaseRegAlloc *ra, const MachNode *node, outputStream *st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  st->print(INTPTR_FORMAT, _method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
#endif // PRODUCT