hotspot/src/share/vm/opto/matcher.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13969 d2a189b83b87
child 19330 49d6711171e6
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: 11197
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5025
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5025
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: 5025
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: 7115
diff changeset
    25
#ifndef SHARE_VM_OPTO_MATCHER_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    26
#define SHARE_VM_OPTO_MATCHER_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    28
#include "libadt/vectset.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    29
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    30
#include "opto/node.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    31
#include "opto/phaseX.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    32
#include "opto/regmask.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
    33
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class Compile;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class Node;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class MachNode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class MachTypeNode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class MachOper;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//---------------------------Matcher-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class Matcher : public PhaseTransform {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  // Private arena of State objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  ResourceArea _states_arena;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  VectorSet   _visited;         // Visit bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  // Used to control the Label pass
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  VectorSet   _shared;          // Shared Ideal Node
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  VectorSet   _dontcare;        // Nothing the matcher cares about
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  // Private methods which perform the actual matching and reduction
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  // Walks the label tree, generating machine nodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  MachNode *ReduceInst( State *s, int rule, Node *&mem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  void ReduceInst_Chain_Rule( State *s, int rule, Node *&mem, MachNode *mach);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  uint ReduceInst_Interior(State *s, int rule, Node *&mem, MachNode *mach, uint num_opnds);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  void ReduceOper( State *s, int newrule, Node *&mem, MachNode *mach );
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  // If this node already matched using "rule", return the MachNode for it.
594
9f4474e5dbaf 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 1
diff changeset
    60
  MachNode* find_shared_node(Node* n, uint rule);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  // Convert a dense opcode number to an expanded rule number
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  const int *_reduceOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  const int *_leftOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  const int *_rightOp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  // Map dense opcode number to info on when rule is swallowed constant.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  const bool *_swallowed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  // Map dense rule number to determine if this is an instruction chain rule
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  const uint _begin_inst_chain_rule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  const uint _end_inst_chain_rule;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // We want to clone constants and possible CmpI-variants.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // If we do not clone CmpI, then we can have many instances of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  // condition codes alive at once.  This is OK on some chips and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // bad on others.  Hence the machine-dependent table lookup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  const char *_must_clone;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // Find shared Nodes, or Nodes that otherwise are Matcher roots
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  void find_shared( Node *n );
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // Debug and profile information for nodes in old space:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  GrowableArray<Node_Notes*>* _old_node_note_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // Node labeling iterator for instruction selection
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  Node *Label_Root( const Node *n, State *svec, Node *control, const Node *mem );
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  Node *transform( Node *dummy );
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  Node_List &_proj_list;        // For Machine nodes killing many values
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
594
9f4474e5dbaf 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 1
diff changeset
    93
  Node_Array _shared_nodes;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  debug_only(Node_Array _old2new_map;)   // Map roots of ideal-trees to machine-roots
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 762
diff changeset
    96
  debug_only(Node_Array _new2old_map;)   // Maps machine nodes back to ideal
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // Accessors for the inherited field PhaseTransform::_nodes:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  void   grow_new_node_array(uint idx_limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    _nodes.map(idx_limit-1, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  bool    has_new_node(const Node* n) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    return _nodes.at(n->_idx) != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  Node*       new_node(const Node* n) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    assert(has_new_node(n), "set before get");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    return _nodes.at(n->_idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  void    set_new_node(const Node* n, Node *nn) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    assert(!has_new_node(n), "set only once");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    _nodes.map(n->_idx, nn);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // Make sure only new nodes are reachable from this node
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  void verify_new_nodes_only(Node* root);
762
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 594
diff changeset
   117
1b26adb5fea1 6715633: when matching a memory node the adr_type should not change
kvn
parents: 594
diff changeset
   118
  Node* _mem_node;   // Ideal memory node consumed by mach node
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
2573
b5002ef26155 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 1495
diff changeset
   121
  // Mach node for ConP #NULL
b5002ef26155 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 1495
diff changeset
   122
  MachNode* _mach_null;
b5002ef26155 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 1495
diff changeset
   123
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  int LabelRootDepth;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // Convert ideal machine register to a register mask for spill-loads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  static const RegMask *idealreg2regmask[];
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3261
diff changeset
   128
  RegMask *idealreg2spillmask  [_last_machine_leaf];
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3261
diff changeset
   129
  RegMask *idealreg2debugmask  [_last_machine_leaf];
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3261
diff changeset
   130
  RegMask *idealreg2mhdebugmask[_last_machine_leaf];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  void init_spill_mask( Node *ret );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // Convert machine register number to register mask
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  static uint mreg2regmask_max;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  static RegMask mreg2regmask[];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  static RegMask STACK_ONLY_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
2573
b5002ef26155 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 1495
diff changeset
   137
  MachNode* mach_null() const { return _mach_null; }
b5002ef26155 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 1495
diff changeset
   138
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  bool    is_shared( Node *n ) { return _shared.test(n->_idx) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  void   set_shared( Node *n ) {  _shared.set(n->_idx); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  bool   is_visited( Node *n ) { return _visited.test(n->_idx) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  void  set_visited( Node *n ) { _visited.set(n->_idx); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  bool  is_dontcare( Node *n ) { return _dontcare.test(n->_idx) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  void set_dontcare( Node *n ) {  _dontcare.set(n->_idx); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  // Mode bit to tell DFA and expand rules whether we are running after
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  // (or during) register selection.  Usually, the matcher runs before,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // but it will also get called to generate post-allocation spill code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  // In this situation, it is a deadly error to attempt to allocate more
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // temporary registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  bool _allocation_started;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // Machine register names
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  static const char *regName[];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // Machine register encodings
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  static const unsigned char _regEncode[];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // Machine Node names
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  const char **_ruleName;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // Rules that are cheaper to rematerialize than to spill
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  static const uint _begin_rematerialize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  static const uint _end_rematerialize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // An array of chars, from 0 to _last_Mach_Reg.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // No Save       = 'N' (for register windows)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // Save on Entry = 'E'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // Save on Call  = 'C'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // Always Save   = 'A' (same as SOE + SOC)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  const char *_register_save_policy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  const char *_c_reg_save_policy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // Convert a machine register to a machine register type, so-as to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // properly match spill code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  const int *_register_save_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Maps from machine register to boolean; true if machine register can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // be holding a call argument in some signature.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  static bool can_be_java_arg( int reg );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // Maps from machine register to boolean; true if machine register holds
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // a spillable argument.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  static bool is_spillable_arg( int reg );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // List of IfFalse or IfTrue Nodes that indicate a taken null test.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // List is valid in the post-matching space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  Node_List _null_check_tests;
1400
afd034bb8c2e 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 781
diff changeset
   183
  void collect_null_checks( Node *proj, Node *orig_proj );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  void validate_null_checks( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  Matcher( Node_List &proj_list );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // Select instructions for entire method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  void  match( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // Helper for match
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  OptoReg::Name warp_incoming_stk_arg( VMReg reg );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Transform, then walk.  Does implicit DCE while walking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // Name changed from "transform" to avoid it being virtual.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  Node *xform( Node *old_space_node, int Nodes );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Match a single Ideal Node - turn it into a 1-Node tree; Label & Reduce.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  MachNode *match_tree( const Node *n );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  MachNode *match_sfpt( SafePointNode *sfpt );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // Helper for match_sfpt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  OptoReg::Name warp_outgoing_stk_arg( VMReg reg, OptoReg::Name begin_out_arg_area, OptoReg::Name &out_arg_limit_per_call );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // Initialize first stack mask and related masks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  void init_first_stack_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // If we should save-on-entry this register
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  bool is_save_on_entry( int reg );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // Fixup the save-on-entry registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  void Fixup_Save_On_Entry( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // --- Frame handling ---
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // Register number of the stack slot corresponding to the incoming SP.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // Per the Big Picture in the AD file, it is:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  //   SharedInfo::stack0 + locks + in_preserve_stack_slots + pad2.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  OptoReg::Name _old_SP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // Register number of the stack slot corresponding to the highest incoming
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  // argument on the stack.  Per the Big Picture in the AD file, it is:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  //   _old_SP + out_preserve_stack_slots + incoming argument size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  OptoReg::Name _in_arg_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // Register number of the stack slot corresponding to the new SP.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  // Per the Big Picture in the AD file, it is:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  //   _in_arg_limit + pad0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  OptoReg::Name _new_SP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // Register number of the stack slot corresponding to the highest outgoing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // argument on the stack.  Per the Big Picture in the AD file, it is:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  //   _new_SP + max outgoing arguments of all calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  OptoReg::Name _out_arg_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  OptoRegPair *_parm_regs;        // Array of machine registers per argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  RegMask *_calling_convention_mask; // Array of RegMasks per argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   237
  // Does matcher have a match rule for this ideal node?
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  static const bool has_match_rule(int opcode);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  static const bool _hasMatchRule[_last_opcode];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   241
  // Does matcher have a match rule for this ideal node and is the
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   242
  // predicate (if there is one) true?
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   243
  // NOTE: If this function is used more commonly in the future, ADLC
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   244
  // should generate this one.
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   245
  static const bool match_rule_supported(int opcode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2573
diff changeset
   246
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  // Used to determine if we have fast l2f conversion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  // USII has it, USIII doesn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  static const bool convL2FSupported(void);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  // Vector width in bytes
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   252
  static const int vector_width_in_bytes(BasicType bt);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   253
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   254
  // Limits on vector size (number of elements).
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   255
  static const int max_vector_size(const BasicType bt);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   256
  static const int min_vector_size(const BasicType bt);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   257
  static const bool vector_size_supported(const BasicType bt, int size) {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   258
    return (Matcher::max_vector_size(bt) >= size &&
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   259
            Matcher::min_vector_size(bt) <= size);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   260
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // Vector ideal reg
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   263
  static const int vector_ideal_reg(int len);
13930
8df570f94294 7201026: add vector for shift count
kvn
parents: 13728
diff changeset
   264
  static const int vector_shift_count_ideal_reg(int len);
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   265
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   266
  // CPU supports misaligned vectors store/load.
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 11197
diff changeset
   267
  static const bool misaligned_vectors_ok();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  // Used to determine a "low complexity" 64-bit constant.  (Zero is simple.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  // The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // Depends on the details of 64-bit constant generation on the CPU.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  static const bool isSimpleConstant64(jlong con);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // These calls are all generated by the ADLC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // TRUE - grows up, FALSE - grows down (Intel)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  virtual bool stack_direction() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  // Java-Java calling convention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // (what you use when Java calls Java)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // Alignment of stack in bytes, standard Intel word alignment is 4.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // Sparc probably wants at least double-word (8).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  static uint stack_alignment_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // Alignment of stack, measured in stack slots.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // The size of stack slots is defined by VMRegImpl::stack_slot_size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  static uint stack_alignment_in_slots() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    return stack_alignment_in_bytes() / (VMRegImpl::stack_slot_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // Array mapping arguments to registers.  Argument 0 is usually the 'this'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  // pointer.  Registers can include stack-slots and regular registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  static void calling_convention( BasicType *, VMRegPair *, uint len, bool is_outgoing );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // Convert a sig into a calling convention register layout
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  // and find interesting things about it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  static OptoReg::Name  find_receiver( bool is_outgoing );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // Return address register.  On Intel it is a stack-slot.  On PowerPC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // it is the Link register.  On Sparc it is r31?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  virtual OptoReg::Name return_addr() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  RegMask              _return_addr_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // Return value register.  On Intel it is EAX.  On Sparc i0/o0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  static OptoRegPair   return_value(int ideal_reg, bool is_outgoing);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  static OptoRegPair c_return_value(int ideal_reg, bool is_outgoing);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  RegMask                     _return_value_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // Inline Cache Register
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  static OptoReg::Name  inline_cache_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  static int            inline_cache_reg_encode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  // Register for DIVI projection of divmodI
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  static RegMask divI_proj_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // Register for MODI projection of divmodI
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  static RegMask modI_proj_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // Register for DIVL projection of divmodL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  static RegMask divL_proj_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // Register for MODL projection of divmodL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  static RegMask modL_proj_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
7115
32300e243300 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 5702
diff changeset
   320
  // Use hardware DIV instruction when it is faster than
32300e243300 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 5702
diff changeset
   321
  // a code which use multiply for division by constant.
32300e243300 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 5702
diff changeset
   322
  static bool use_asm_for_ldiv_by_con( jlong divisor );
32300e243300 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 5702
diff changeset
   323
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3261
diff changeset
   324
  static const RegMask method_handle_invoke_SP_save_mask();
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3261
diff changeset
   325
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // Java-Interpreter calling convention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // (what you use when calling between compiled-Java and Interpreted-Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // Number of callee-save + always-save registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  // Ignores frame pointer and "special" registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  static int  number_of_saved_registers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // The Method-klass-holder may be passed in the inline_cache_reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  // and then expanded into the inline_cache_reg and a method_oop register
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  static OptoReg::Name  interpreter_method_oop_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  static int            interpreter_method_oop_reg_encode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  static OptoReg::Name  compiler_method_oop_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  static const RegMask &compiler_method_oop_reg_mask();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  static int            compiler_method_oop_reg_encode();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // Interpreter's Frame Pointer Register
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  static OptoReg::Name  interpreter_frame_pointer_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // Java-Native calling convention
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  // (what you use when intercalling between Java and C++ code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // Array mapping arguments to registers.  Argument 0 is usually the 'this'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // pointer.  Registers can include stack-slots and regular registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  static void c_calling_convention( BasicType*, VMRegPair *, uint );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  // Frame pointer. The frame pointer is kept at the base of the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // and so is probably the stack pointer for most machines.  On Intel
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  // it is ESP.  On the PowerPC it is R1.  On Sparc it is SP.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  OptoReg::Name  c_frame_pointer() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  static RegMask c_frame_ptr_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // !!!!! Special stuff for building ScopeDescs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  virtual int      regnum_to_fpu_offset(int regnum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  // Is this branch offset small enough to be addressed by a short branch?
10264
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10262
diff changeset
   362
  bool is_short_branch_offset(int rule, int br_size, int offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  // Optional scaling for the parameter to the ClearArray/CopyArray node.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  static const bool init_array_count_is_in_bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  // Threshold small size (in bytes) for a ClearArray/CopyArray node.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // Anything this size or smaller may get converted to discrete scalar stores.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  static const int init_array_short_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
10971
db45f6ab9a75 7097546: Optimize use of CMOVE instructions
kvn
parents: 10264
diff changeset
   371
  // Some hardware needs 2 CMOV's for longs.
db45f6ab9a75 7097546: Optimize use of CMOVE instructions
kvn
parents: 10264
diff changeset
   372
  static const int long_cmove_cost();
db45f6ab9a75 7097546: Optimize use of CMOVE instructions
kvn
parents: 10264
diff changeset
   373
db45f6ab9a75 7097546: Optimize use of CMOVE instructions
kvn
parents: 10264
diff changeset
   374
  // Some hardware have expensive CMOV for float and double.
db45f6ab9a75 7097546: Optimize use of CMOVE instructions
kvn
parents: 10264
diff changeset
   375
  static const int float_cmove_cost();
db45f6ab9a75 7097546: Optimize use of CMOVE instructions
kvn
parents: 10264
diff changeset
   376
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // Should the Matcher clone shifts on addressing modes, expecting them to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  // be subsumed into complex addressing expressions or compute them into
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  // registers?  True for Intel but false for most RISCs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  static const bool clone_shift_expressions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   382
  static bool narrow_oop_use_complex_address();
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13930
diff changeset
   383
  static bool narrow_klass_use_complex_address();
5698
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   384
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   385
  // Generate implicit null check for narrow oops if it can fold
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   386
  // into address expression (x64).
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   387
  //
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   388
  // [R12 + narrow_oop_reg<<3 + offset] // fold into address expression
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   389
  // NullCheck narrow_oop_reg
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   390
  //
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   391
  // When narrow oops can't fold into address expression (Sparc) and
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   392
  // base is not null use decode_not_null and normal implicit null check.
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   393
  // Note, decode_not_null node can be used here since it is referenced
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   394
  // only on non null path but it requires special handling, see
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   395
  // collect_null_checks():
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   396
  //
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   397
  // decode_not_null narrow_oop_reg, oop_reg // 'shift' and 'add base'
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   398
  // [oop_reg + offset]
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   399
  // NullCheck oop_reg
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   400
  //
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   401
  // With Zero base and when narrow oops can not fold into address
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   402
  // expression use normal implicit null check since only shift
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   403
  // is needed to decode narrow oop.
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   404
  //
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   405
  // decode narrow_oop_reg, oop_reg // only 'shift'
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   406
  // [oop_reg + offset]
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   407
  // NullCheck oop_reg
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   408
  //
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   409
  inline static bool gen_narrow_oop_implicit_null_checks() {
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   410
    return Universe::narrow_oop_use_implicit_null_checks() &&
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   411
           (narrow_oop_use_complex_address() ||
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   412
            Universe::narrow_oop_base() != NULL);
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   413
  }
091095915ee6 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 5025
diff changeset
   414
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  // Is it better to copy float constants, or load them directly from memory?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // Intel can load a float constant from a direct address, requiring no
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // extra registers.  Most RISCs will have to materialize an address into a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  // register first, so they may as well materialize the constant immediately.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  static const bool rematerialize_float_constants;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  // If CPU can load and store mis-aligned doubles directly then no fixup is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  // needed.  Else we split the double into 2 integer pieces and move it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // piece-by-piece.  Only happens when passing doubles into C code or when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  // calling i2c adapters as the Java calling convention forces doubles to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  static const bool misaligned_doubles_ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  // Perform a platform dependent implicit null fixup.  This is needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // on windows95 to take care of some unusual register constraints.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  void pd_implicit_null_fixup(MachNode *load, uint idx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  // Advertise here if the CPU requires explicit rounding operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // to implement the UseStrictFP mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  static const bool strict_fp_requires_explicit_rounding;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
5025
05adc9b8f96a 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 4566
diff changeset
   436
  // Are floats conerted to double when stored to stack during deoptimization?
05adc9b8f96a 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 4566
diff changeset
   437
  static bool float_in_double();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // Do ints take an entire long register or just half?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  static const bool int_in_long;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
8868
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7433
diff changeset
   441
  // Do the processor's shift instructions only use the low 5/6 bits
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7433
diff changeset
   442
  // of the count for 32/64 bit ints? If not we need to do the masking
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7433
diff changeset
   443
  // ourselves.
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7433
diff changeset
   444
  static const bool need_masked_shift_count;
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7433
diff changeset
   445
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // This routine is run whenever a graph fails to match.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // If it returns, the compiler should bailout to interpreter without error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // In non-product mode, SoftMatchFailure is false to detect non-canonical
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // graphs.  Print a message and exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  static void soft_match_failure() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    if( SoftMatchFailure ) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    else { fatal("SoftMatchFailure is not allowed except in product"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // Check for a following volatile memory barrier without an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // intervening load and thus we don't need a barrier here.  We
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  // retain the Node to act as a compiler ordering barrier.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  static bool post_store_load_barrier(const Node* mb);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  void dump_old2new_map();      // machine-independent to machine-dependent
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 762
diff changeset
   463
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 762
diff changeset
   464
  Node* find_old_node(Node* new_node) {
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 762
diff changeset
   465
    return _new2old_map[new_node->_idx];
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 762
diff changeset
   466
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
   469
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7115
diff changeset
   470
#endif // SHARE_VM_OPTO_MATCHER_HPP