hotspot/src/share/vm/c1/c1_LIR.hpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7427 d7b79a367474
child 7713 1e06d2419258
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5420
diff changeset
     2
 * Copyright (c) 2000, 2010, 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: 5420
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5420
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: 5420
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: 6742
diff changeset
    25
#ifndef SHARE_VM_C1_C1_LIR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6742
diff changeset
    26
#define SHARE_VM_C1_C1_LIR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6742
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6742
diff changeset
    28
#include "c1/c1_ValueType.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6742
diff changeset
    29
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
class BlockBegin;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
class BlockList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
class LIR_Assembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class CodeEmitInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class CodeStub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class CodeStubList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class ArrayCopyStub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class LIR_Op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class ciType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class ValueType;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class FpuStackSim;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
//---------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//                 LIR Operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//  LIR_OprDesc
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//    LIR_OprPtr
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//      LIR_Const
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//      LIR_Address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//---------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
class LIR_OprDesc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
class LIR_OprPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
class LIR_Const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class LIR_Address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
class LIR_OprVisitor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
typedef LIR_OprDesc* LIR_Opr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
typedef int          RegNr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
define_array(LIR_OprArray, LIR_Opr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
define_stack(LIR_OprList, LIR_OprArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
define_array(LIR_OprRefArray, LIR_Opr*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
define_stack(LIR_OprRefList, LIR_OprRefArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
define_array(CodeEmitInfoArray, CodeEmitInfo*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
define_stack(CodeEmitInfoList, CodeEmitInfoArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
define_array(LIR_OpArray, LIR_Op*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
define_stack(LIR_OpList, LIR_OpArray)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
// define LIR_OprPtr early so LIR_OprDesc can refer to it
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
class LIR_OprPtr: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  bool is_oop_pointer() const                    { return (type() == T_OBJECT); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  bool is_float_kind() const                     { BasicType t = type(); return (t == T_FLOAT) || (t == T_DOUBLE); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  virtual LIR_Const*  as_constant()              { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  virtual LIR_Address* as_address()              { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  virtual BasicType type() const                 = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  virtual void print_value_on(outputStream* out) const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
// LIR constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
class LIR_Const: public LIR_OprPtr {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  JavaValue _value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  void type_check(BasicType t) const   { assert(type() == t, "type check"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  void type_check(BasicType t1, BasicType t2) const   { assert(type() == t1 || type() == t2, "type check"); }
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
    93
  void type_check(BasicType t1, BasicType t2, BasicType t3) const   { assert(type() == t1 || type() == t2 || type() == t3, "type check"); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
 public:
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
    96
  LIR_Const(jint i, bool is_address=false)       { _value.set_type(is_address?T_ADDRESS:T_INT); _value.set_jint(i); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  LIR_Const(jlong l)                             { _value.set_type(T_LONG);    _value.set_jlong(l); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  LIR_Const(jfloat f)                            { _value.set_type(T_FLOAT);   _value.set_jfloat(f); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  LIR_Const(jdouble d)                           { _value.set_type(T_DOUBLE);  _value.set_jdouble(d); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  LIR_Const(jobject o)                           { _value.set_type(T_OBJECT);  _value.set_jobject(o); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  LIR_Const(void* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    assert(sizeof(jlong) >= sizeof(p), "too small");;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    _value.set_type(T_LONG);    _value.set_jlong((jlong)p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    assert(sizeof(jint) >= sizeof(p), "too small");;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    _value.set_type(T_INT);     _value.set_jint((jint)p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  virtual BasicType type()       const { return _value.get_type(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  virtual LIR_Const* as_constant()     { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
   114
  jint      as_jint()    const         { type_check(T_INT, T_ADDRESS); return _value.get_jint(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  jlong     as_jlong()   const         { type_check(T_LONG  ); return _value.get_jlong(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  jfloat    as_jfloat()  const         { type_check(T_FLOAT ); return _value.get_jfloat(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  jdouble   as_jdouble() const         { type_check(T_DOUBLE); return _value.get_jdouble(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  jobject   as_jobject() const         { type_check(T_OBJECT); return _value.get_jobject(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  jint      as_jint_lo() const         { type_check(T_LONG  ); return low(_value.get_jlong()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  jint      as_jint_hi() const         { type_check(T_LONG  ); return high(_value.get_jlong()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  address   as_pointer() const         { type_check(T_LONG  ); return (address)_value.get_jlong(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  address   as_pointer() const         { type_check(T_INT   ); return (address)_value.get_jint(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
   129
  jint      as_jint_bits() const       { type_check(T_FLOAT, T_INT, T_ADDRESS); return _value.get_jint(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  jint      as_jint_lo_bits() const    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    if (type() == T_DOUBLE) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
      return low(jlong_cast(_value.get_jdouble()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
      return as_jint_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  jint      as_jint_hi_bits() const    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    if (type() == T_DOUBLE) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
      return high(jlong_cast(_value.get_jdouble()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
      return as_jint_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   144
  jlong      as_jlong_bits() const    {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   145
    if (type() == T_DOUBLE) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   146
      return jlong_cast(_value.get_jdouble());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   147
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   148
      return as_jlong();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   149
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   150
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  virtual void print_value_on(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  bool is_zero_float() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    jfloat f = as_jfloat();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    jfloat ok = 0.0f;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    return jint_cast(f) == jint_cast(ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  bool is_one_float() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    jfloat f = as_jfloat();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    return !g_isnan(f) && g_isfinite(f) && f == 1.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  bool is_zero_double() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    jdouble d = as_jdouble();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    jdouble ok = 0.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    return jlong_cast(d) == jlong_cast(ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  bool is_one_double() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    jdouble d = as_jdouble();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    return !g_isnan(d) && g_isfinite(d) && d == 1.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
//---------------------LIR Operand descriptor------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
// The class LIR_OprDesc represents a LIR instruction operand;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
// it can be a register (ALU/FPU), stack location or a constant;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
// Constants and addresses are represented as resource area allocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
// structures (see above).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
// Registers and stack locations are inlined into the this pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
// (see value function).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
class LIR_OprDesc: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // value structure:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  //     data       opr-type opr-kind
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // +--------------+-------+-------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // [max...........|7 6 5 4|3 2 1 0]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  //                             ^
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  //                    is_pointer bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // lowest bit cleared, means it is a structure pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // we need  4 bits to represent types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  friend class LIR_OprFact;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // Conversion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  intptr_t value() const                         { return (intptr_t) this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  bool check_value_mask(intptr_t mask, intptr_t masked_value) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    return (value() & mask) == masked_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  enum OprKind {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
      pointer_value      = 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    , stack_value        = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
    , cpu_register       = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    , fpu_register       = 5
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    , illegal_value      = 7
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  enum OprBits {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      pointer_bits   = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    , kind_bits      = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    , type_bits      = 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    , size_bits      = 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    , destroys_bits  = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    , virtual_bits   = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    , is_xmm_bits    = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    , last_use_bits  = 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    , is_fpu_stack_offset_bits = 1        // used in assertion checking on x86 for FPU stack slot allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    , non_data_bits  = kind_bits + type_bits + size_bits + destroys_bits + last_use_bits +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
                       is_fpu_stack_offset_bits + virtual_bits + is_xmm_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    , data_bits      = BitsPerInt - non_data_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    , reg_bits       = data_bits / 2      // for two registers in one value encoding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  enum OprShift {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      kind_shift     = 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    , type_shift     = kind_shift     + kind_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    , size_shift     = type_shift     + type_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    , destroys_shift = size_shift     + size_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    , last_use_shift = destroys_shift + destroys_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    , is_fpu_stack_offset_shift = last_use_shift + last_use_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    , virtual_shift  = is_fpu_stack_offset_shift + is_fpu_stack_offset_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    , is_xmm_shift   = virtual_shift + virtual_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    , data_shift     = is_xmm_shift + is_xmm_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    , reg1_shift = data_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    , reg2_shift = data_shift + reg_bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  enum OprSize {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
      single_size = 0 << size_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    , double_size = 1 << size_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  enum OprMask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
      kind_mask      = right_n_bits(kind_bits)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
    , type_mask      = right_n_bits(type_bits) << type_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    , size_mask      = right_n_bits(size_bits) << size_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    , last_use_mask  = right_n_bits(last_use_bits) << last_use_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    , is_fpu_stack_offset_mask = right_n_bits(is_fpu_stack_offset_bits) << is_fpu_stack_offset_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    , virtual_mask   = right_n_bits(virtual_bits) << virtual_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    , is_xmm_mask    = right_n_bits(is_xmm_bits) << is_xmm_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    , pointer_mask   = right_n_bits(pointer_bits)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    , lower_reg_mask = right_n_bits(reg_bits)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    , no_type_mask   = (int)(~(type_mask | last_use_mask | is_fpu_stack_offset_mask))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  uintptr_t data() const                         { return value() >> data_shift; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  int lo_reg_half() const                        { return data() & lower_reg_mask; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  int hi_reg_half() const                        { return (data() >> reg_bits) & lower_reg_mask; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  OprKind kind_field() const                     { return (OprKind)(value() & kind_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  OprSize size_field() const                     { return (OprSize)(value() & size_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  static char type_char(BasicType t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    vreg_base = ConcreteRegisterImpl::number_of_registers,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    vreg_max = (1 << data_bits) - 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  static inline LIR_Opr illegalOpr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  enum OprType {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
      unknown_type  = 0 << type_shift    // means: not set (catch uninitialized types)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    , int_type      = 1 << type_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    , long_type     = 2 << type_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    , object_type   = 3 << type_shift
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   288
    , address_type  = 4 << type_shift
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    , float_type    = 5 << type_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    , double_type   = 6 << type_shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  friend OprType as_OprType(BasicType t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  friend BasicType as_BasicType(OprType t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  OprType type_field_valid() const               { assert(is_register() || is_stack(), "should not be called otherwise"); return (OprType)(value() & type_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  OprType type_field() const                     { return is_illegal() ? unknown_type : (OprType)(value() & type_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  static OprSize size_for(BasicType t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    switch (t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
      case T_LONG:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
      case T_DOUBLE:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
        return double_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
      case T_FLOAT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
      case T_BOOLEAN:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
      case T_CHAR:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
      case T_BYTE:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
      case T_SHORT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
      case T_INT:
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   311
      case T_ADDRESS:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
      case T_OBJECT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
      case T_ARRAY:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
        return single_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
        ShouldNotReachHere();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   319
        return single_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  void validate_type() const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  BasicType type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    if (is_pointer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
      return pointer()->type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    return as_BasicType(type_field());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  ValueType* value_type() const                  { return as_ValueType(type()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  char type_char() const                         { return type_char((is_pointer()) ? pointer()->type() : type()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  bool is_equal(LIR_Opr opr) const         { return this == opr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // checks whether types are same
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  bool is_same_type(LIR_Opr opr) const     {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    assert(type_field() != unknown_type &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
           opr->type_field() != unknown_type, "shouldn't see unknown_type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    return type_field() == opr->type_field();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  bool is_same_register(LIR_Opr opr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    return (is_register() && opr->is_register() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
            kind_field() == opr->kind_field() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
            (value() & no_type_mask) == (opr->value() & no_type_mask));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  bool is_pointer() const      { return check_value_mask(pointer_mask, pointer_value); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  bool is_illegal() const      { return kind_field() == illegal_value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  bool is_valid() const        { return kind_field() != illegal_value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  bool is_register() const     { return is_cpu_register() || is_fpu_register(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  bool is_virtual() const      { return is_virtual_cpu()  || is_virtual_fpu();  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  bool is_constant() const     { return is_pointer() && pointer()->as_constant() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  bool is_address() const      { return is_pointer() && pointer()->as_address() != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  bool is_float_kind() const   { return is_pointer() ? pointer()->is_float_kind() : (kind_field() == fpu_register); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  bool is_oop() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  // semantic for fpu- and xmm-registers:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  // * is_float and is_double return true for xmm_registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  //   (so is_single_fpu and is_single_xmm are true)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  // * So you must always check for is_???_xmm prior to is_???_fpu to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  //   distinguish between fpu- and xmm-registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  bool is_stack() const        { validate_type(); return check_value_mask(kind_mask,                stack_value);                 }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  bool is_single_stack() const { validate_type(); return check_value_mask(kind_mask | size_mask,    stack_value  | single_size);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  bool is_double_stack() const { validate_type(); return check_value_mask(kind_mask | size_mask,    stack_value  | double_size);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  bool is_cpu_register() const { validate_type(); return check_value_mask(kind_mask,                cpu_register);                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  bool is_virtual_cpu() const  { validate_type(); return check_value_mask(kind_mask | virtual_mask, cpu_register | virtual_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  bool is_fixed_cpu() const    { validate_type(); return check_value_mask(kind_mask | virtual_mask, cpu_register);                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  bool is_single_cpu() const   { validate_type(); return check_value_mask(kind_mask | size_mask,    cpu_register | single_size);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  bool is_double_cpu() const   { validate_type(); return check_value_mask(kind_mask | size_mask,    cpu_register | double_size);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  bool is_fpu_register() const { validate_type(); return check_value_mask(kind_mask,                fpu_register);                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  bool is_virtual_fpu() const  { validate_type(); return check_value_mask(kind_mask | virtual_mask, fpu_register | virtual_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  bool is_fixed_fpu() const    { validate_type(); return check_value_mask(kind_mask | virtual_mask, fpu_register);                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  bool is_single_fpu() const   { validate_type(); return check_value_mask(kind_mask | size_mask,    fpu_register | single_size);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  bool is_double_fpu() const   { validate_type(); return check_value_mask(kind_mask | size_mask,    fpu_register | double_size);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  bool is_xmm_register() const { validate_type(); return check_value_mask(kind_mask | is_xmm_mask,             fpu_register | is_xmm_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  bool is_single_xmm() const   { validate_type(); return check_value_mask(kind_mask | size_mask | is_xmm_mask, fpu_register | single_size | is_xmm_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  bool is_double_xmm() const   { validate_type(); return check_value_mask(kind_mask | size_mask | is_xmm_mask, fpu_register | double_size | is_xmm_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  // fast accessor functions for special bits that do not work for pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  // (in this functions, the check for is_pointer() is omitted)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  bool is_single_word() const      { assert(is_register() || is_stack(), "type check"); return check_value_mask(size_mask, single_size); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  bool is_double_word() const      { assert(is_register() || is_stack(), "type check"); return check_value_mask(size_mask, double_size); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  bool is_virtual_register() const { assert(is_register(),               "type check"); return check_value_mask(virtual_mask, virtual_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  bool is_oop_register() const     { assert(is_register() || is_stack(), "type check"); return type_field_valid() == object_type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  BasicType type_register() const  { assert(is_register() || is_stack(), "type check"); return as_BasicType(type_field_valid());  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  bool is_last_use() const         { assert(is_register(), "only works for registers"); return (value() & last_use_mask) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  bool is_fpu_stack_offset() const { assert(is_register(), "only works for registers"); return (value() & is_fpu_stack_offset_mask) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  LIR_Opr make_last_use()          { assert(is_register(), "only works for registers"); return (LIR_Opr)(value() | last_use_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  LIR_Opr make_fpu_stack_offset()  { assert(is_register(), "only works for registers"); return (LIR_Opr)(value() | is_fpu_stack_offset_mask); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  int single_stack_ix() const  { assert(is_single_stack() && !is_virtual(), "type check"); return (int)data(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  int double_stack_ix() const  { assert(is_double_stack() && !is_virtual(), "type check"); return (int)data(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  RegNr cpu_regnr() const      { assert(is_single_cpu()   && !is_virtual(), "type check"); return (RegNr)data(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  RegNr cpu_regnrLo() const    { assert(is_double_cpu()   && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  RegNr cpu_regnrHi() const    { assert(is_double_cpu()   && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  RegNr fpu_regnr() const      { assert(is_single_fpu()   && !is_virtual(), "type check"); return (RegNr)data(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  RegNr fpu_regnrLo() const    { assert(is_double_fpu()   && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  RegNr fpu_regnrHi() const    { assert(is_double_fpu()   && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  RegNr xmm_regnr() const      { assert(is_single_xmm()   && !is_virtual(), "type check"); return (RegNr)data(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  RegNr xmm_regnrLo() const    { assert(is_double_xmm()   && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  RegNr xmm_regnrHi() const    { assert(is_double_xmm()   && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  int   vreg_number() const    { assert(is_virtual(),                       "type check"); return (RegNr)data(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  LIR_OprPtr* pointer()  const                   { assert(is_pointer(), "type check");      return (LIR_OprPtr*)this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  LIR_Const* as_constant_ptr() const             { return pointer()->as_constant(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  LIR_Address* as_address_ptr() const            { return pointer()->as_address(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  Register as_register()    const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  Register as_register_lo() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  Register as_register_hi() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  Register as_pointer_register() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    if (is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
      assert(as_register_lo() == as_register_hi(), "should be a single register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
      return as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    return as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   435
#ifdef X86
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  XMMRegister as_xmm_float_reg() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  XMMRegister as_xmm_double_reg() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // for compatibility with RInfo
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  int fpu () const                                  { return lo_reg_half(); }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   440
#endif // X86
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   441
#if defined(SPARC) || defined(ARM) || defined(PPC)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  FloatRegister as_float_reg   () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  FloatRegister as_double_reg  () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  jint      as_jint()    const { return as_constant_ptr()->as_jint(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  jlong     as_jlong()   const { return as_constant_ptr()->as_jlong(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  jfloat    as_jfloat()  const { return as_constant_ptr()->as_jfloat(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  jdouble   as_jdouble() const { return as_constant_ptr()->as_jdouble(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  jobject   as_jobject() const { return as_constant_ptr()->as_jobject(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  void print() const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  void print(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
inline LIR_OprDesc::OprType as_OprType(BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  case T_INT:      return LIR_OprDesc::int_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  case T_LONG:     return LIR_OprDesc::long_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  case T_FLOAT:    return LIR_OprDesc::float_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  case T_DOUBLE:   return LIR_OprDesc::double_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  case T_OBJECT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  case T_ARRAY:    return LIR_OprDesc::object_type;
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   465
  case T_ADDRESS:  return LIR_OprDesc::address_type;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  case T_ILLEGAL:  // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  default: ShouldNotReachHere(); return LIR_OprDesc::unknown_type;
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
inline BasicType as_BasicType(LIR_OprDesc::OprType t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  switch (t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  case LIR_OprDesc::int_type:     return T_INT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  case LIR_OprDesc::long_type:    return T_LONG;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  case LIR_OprDesc::float_type:   return T_FLOAT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  case LIR_OprDesc::double_type:  return T_DOUBLE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  case LIR_OprDesc::object_type:  return T_OBJECT;
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   478
  case LIR_OprDesc::address_type: return T_ADDRESS;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  case LIR_OprDesc::unknown_type: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  default: ShouldNotReachHere();  return T_ILLEGAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
// LIR_Address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
class LIR_Address: public LIR_OprPtr {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // NOTE: currently these must be the log2 of the scale factor (and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // must also be equivalent to the ScaleFactor enum in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // assembler_i486.hpp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  enum Scale {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
    times_1  =  0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    times_2  =  1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    times_4  =  2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    times_8  =  3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  LIR_Opr   _base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  LIR_Opr   _index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  Scale     _scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  intx      _disp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  BasicType _type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  LIR_Address(LIR_Opr base, LIR_Opr index, BasicType type):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
       _base(base)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
     , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
     , _scale(times_1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
     , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
     , _disp(0) { verify(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
5695
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   515
  LIR_Address(LIR_Opr base, intx disp, BasicType type):
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
       _base(base)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
     , _index(LIR_OprDesc::illegalOpr())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
     , _scale(times_1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
     , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
     , _disp(disp) { verify(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
5695
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   522
  LIR_Address(LIR_Opr base, BasicType type):
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   523
       _base(base)
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   524
     , _index(LIR_OprDesc::illegalOpr())
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   525
     , _scale(times_1)
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   526
     , _type(type)
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   527
     , _disp(0) { verify(); }
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   528
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   529
#if defined(X86) || defined(ARM)
5695
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
   530
  LIR_Address(LIR_Opr base, LIR_Opr index, Scale scale, intx disp, BasicType type):
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
       _base(base)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
     , _index(index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
     , _scale(scale)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
     , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
     , _disp(disp) { verify(); }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   536
#endif // X86 || ARM
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  LIR_Opr base()  const                          { return _base;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  LIR_Opr index() const                          { return _index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  Scale   scale() const                          { return _scale; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  intx    disp()  const                          { return _disp;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  bool equals(LIR_Address* other) const          { return base() == other->base() && index() == other->index() && disp() == other->disp() && scale() == other->scale(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  virtual LIR_Address* as_address()              { return this;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  virtual BasicType type() const                 { return _type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  virtual void print_value_on(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  void verify() const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  static Scale scale(BasicType type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
// operand factory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
class LIR_OprFact: public AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  static LIR_Opr illegalOpr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   561
  static LIR_Opr single_cpu(int reg) {
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   562
    return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   563
                               LIR_OprDesc::int_type             |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   564
                               LIR_OprDesc::cpu_register         |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   565
                               LIR_OprDesc::single_size);
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   566
  }
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   567
  static LIR_Opr single_cpu_oop(int reg) {
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   568
    return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   569
                               LIR_OprDesc::object_type          |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   570
                               LIR_OprDesc::cpu_register         |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   571
                               LIR_OprDesc::single_size);
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   572
  }
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   573
  static LIR_Opr single_cpu_address(int reg) {
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   574
    return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   575
                               LIR_OprDesc::address_type         |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   576
                               LIR_OprDesc::cpu_register         |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   577
                               LIR_OprDesc::single_size);
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   578
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   579
  static LIR_Opr double_cpu(int reg1, int reg2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   580
    LP64_ONLY(assert(reg1 == reg2, "must be identical"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   581
    return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   582
                               (reg2 << LIR_OprDesc::reg2_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   583
                               LIR_OprDesc::long_type            |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   584
                               LIR_OprDesc::cpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   585
                               LIR_OprDesc::double_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   586
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   588
  static LIR_Opr single_fpu(int reg)            { return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   589
                                                                             LIR_OprDesc::float_type           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   590
                                                                             LIR_OprDesc::fpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   591
                                                                             LIR_OprDesc::single_size); }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   592
#if defined(ARM)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   593
  static LIR_Opr double_fpu(int reg1, int reg2)    { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   594
  static LIR_Opr single_softfp(int reg)            { return (LIR_Opr)((reg  << LIR_OprDesc::reg1_shift) |                                     LIR_OprDesc::float_type  | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   595
  static LIR_Opr double_softfp(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::cpu_register | LIR_OprDesc::double_size); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   596
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
#ifdef SPARC
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   598
  static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   599
                                                                             (reg2 << LIR_OprDesc::reg2_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   600
                                                                             LIR_OprDesc::double_type          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   601
                                                                             LIR_OprDesc::fpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   602
                                                                             LIR_OprDesc::double_size); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   604
#ifdef X86
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   605
  static LIR_Opr double_fpu(int reg)            { return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   606
                                                                             (reg  << LIR_OprDesc::reg2_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   607
                                                                             LIR_OprDesc::double_type          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   608
                                                                             LIR_OprDesc::fpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   609
                                                                             LIR_OprDesc::double_size); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   610
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   611
  static LIR_Opr single_xmm(int reg)            { return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   612
                                                                             LIR_OprDesc::float_type           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   613
                                                                             LIR_OprDesc::fpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   614
                                                                             LIR_OprDesc::single_size          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   615
                                                                             LIR_OprDesc::is_xmm_mask); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   616
  static LIR_Opr double_xmm(int reg)            { return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   617
                                                                             (reg  << LIR_OprDesc::reg2_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   618
                                                                             LIR_OprDesc::double_type          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   619
                                                                             LIR_OprDesc::fpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   620
                                                                             LIR_OprDesc::double_size          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   621
                                                                             LIR_OprDesc::is_xmm_mask); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   622
#endif // X86
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   623
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   624
  static LIR_Opr double_fpu(int reg)            { return (LIR_Opr)(intptr_t)((reg  << LIR_OprDesc::reg1_shift) |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   625
                                                                             (reg  << LIR_OprDesc::reg2_shift) |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   626
                                                                             LIR_OprDesc::double_type          |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   627
                                                                             LIR_OprDesc::fpu_register         |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   628
                                                                             LIR_OprDesc::double_size); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   629
  static LIR_Opr single_softfp(int reg)            { return (LIR_Opr)((reg  << LIR_OprDesc::reg1_shift)        |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   630
                                                                             LIR_OprDesc::float_type           |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   631
                                                                             LIR_OprDesc::cpu_register         |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   632
                                                                             LIR_OprDesc::single_size); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   633
  static LIR_Opr double_softfp(int reg1, int reg2) { return (LIR_Opr)((reg2 << LIR_OprDesc::reg1_shift)        |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   634
                                                                             (reg1 << LIR_OprDesc::reg2_shift) |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   635
                                                                             LIR_OprDesc::double_type          |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   636
                                                                             LIR_OprDesc::cpu_register         |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   637
                                                                             LIR_OprDesc::double_size); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   638
#endif // PPC
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  static LIR_Opr virtual_register(int index, BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
    LIR_Opr res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
      case T_OBJECT: // fall through
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   644
      case T_ARRAY:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   645
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift)  |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   646
                                            LIR_OprDesc::object_type  |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   647
                                            LIR_OprDesc::cpu_register |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   648
                                            LIR_OprDesc::single_size  |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   649
                                            LIR_OprDesc::virtual_mask);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   650
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   651
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   652
      case T_INT:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   653
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   654
                                  LIR_OprDesc::int_type              |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   655
                                  LIR_OprDesc::cpu_register          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   656
                                  LIR_OprDesc::single_size           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   657
                                  LIR_OprDesc::virtual_mask);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   658
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   659
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   660
      case T_ADDRESS:
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   661
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   662
                                  LIR_OprDesc::address_type          |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   663
                                  LIR_OprDesc::cpu_register          |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   664
                                  LIR_OprDesc::single_size           |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   665
                                  LIR_OprDesc::virtual_mask);
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   666
        break;
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   667
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   668
      case T_LONG:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   669
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   670
                                  LIR_OprDesc::long_type             |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   671
                                  LIR_OprDesc::cpu_register          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   672
                                  LIR_OprDesc::double_size           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   673
                                  LIR_OprDesc::virtual_mask);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   674
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   675
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   676
#ifdef __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   677
      case T_FLOAT:
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   678
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   679
                                  LIR_OprDesc::float_type  |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   680
                                  LIR_OprDesc::cpu_register |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   681
                                  LIR_OprDesc::single_size |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   682
                                  LIR_OprDesc::virtual_mask);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   683
        break;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   684
      case T_DOUBLE:
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   685
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   686
                                  LIR_OprDesc::double_type |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   687
                                  LIR_OprDesc::cpu_register |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   688
                                  LIR_OprDesc::double_size |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   689
                                  LIR_OprDesc::virtual_mask);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   690
        break;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   691
#else // __SOFTFP__
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   692
      case T_FLOAT:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   693
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   694
                                  LIR_OprDesc::float_type           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   695
                                  LIR_OprDesc::fpu_register         |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   696
                                  LIR_OprDesc::single_size          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   697
                                  LIR_OprDesc::virtual_mask);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   698
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   699
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   700
      case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   701
        T_DOUBLE: res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   702
                                            LIR_OprDesc::double_type           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   703
                                            LIR_OprDesc::fpu_register          |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   704
                                            LIR_OprDesc::double_size           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   705
                                            LIR_OprDesc::virtual_mask);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   706
        break;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   707
#endif // __SOFTFP__
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
      default:       ShouldNotReachHere(); res = illegalOpr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
    res->validate_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
    assert(res->vreg_number() == index, "conversion check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
    assert(index >= LIR_OprDesc::vreg_base, "must start at vreg_base");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
    assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    // old-style calculation; check if old and new method are equal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
    LIR_OprDesc::OprType t = as_OprType(type);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   719
#ifdef __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   720
    LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   721
                               t |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   722
                               LIR_OprDesc::cpu_register |
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   723
                               LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   724
#else // __SOFTFP__
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   725
    LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | t |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   726
                                          ((type == T_FLOAT || type == T_DOUBLE) ?  LIR_OprDesc::fpu_register : LIR_OprDesc::cpu_register) |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
                               LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
    assert(res == old_res, "old and new method not equal");
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   729
#endif // __SOFTFP__
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
   730
#endif // ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  // 'index' is computed by FrameMap::local_stack_pos(index); do not use other parameters as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  // the index is platform independent; a double stack useing indeces 2 and 3 has always
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  // index 2.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  static LIR_Opr stack(int index, BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
    LIR_Opr res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
    switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
      case T_OBJECT: // fall through
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   742
      case T_ARRAY:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   743
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   744
                                  LIR_OprDesc::object_type           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   745
                                  LIR_OprDesc::stack_value           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   746
                                  LIR_OprDesc::single_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   747
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   748
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   749
      case T_INT:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   750
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   751
                                  LIR_OprDesc::int_type              |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   752
                                  LIR_OprDesc::stack_value           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   753
                                  LIR_OprDesc::single_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   754
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   755
6742
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   756
      case T_ADDRESS:
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   757
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   758
                                  LIR_OprDesc::address_type          |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   759
                                  LIR_OprDesc::stack_value           |
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   760
                                  LIR_OprDesc::single_size);
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   761
        break;
81ef369b8fc7 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 6461
diff changeset
   762
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   763
      case T_LONG:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   764
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   765
                                  LIR_OprDesc::long_type             |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   766
                                  LIR_OprDesc::stack_value           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   767
                                  LIR_OprDesc::double_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   768
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   769
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   770
      case T_FLOAT:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   771
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   772
                                  LIR_OprDesc::float_type            |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   773
                                  LIR_OprDesc::stack_value           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   774
                                  LIR_OprDesc::single_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   775
        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   776
      case T_DOUBLE:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   777
        res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   778
                                  LIR_OprDesc::double_type           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   779
                                  LIR_OprDesc::stack_value           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   780
                                  LIR_OprDesc::double_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   781
        break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
      default:       ShouldNotReachHere(); res = illegalOpr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    assert(index >= 0, "index must be positive");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
    assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   790
    LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   791
                                          LIR_OprDesc::stack_value           |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   792
                                          as_OprType(type)                   |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 1
diff changeset
   793
                                          LIR_OprDesc::size_for(type));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    assert(res == old_res, "old and new method not equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  static LIR_Opr intConst(jint i)                { return (LIR_Opr)(new LIR_Const(i)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  static LIR_Opr longConst(jlong l)              { return (LIR_Opr)(new LIR_Const(l)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  static LIR_Opr floatConst(jfloat f)            { return (LIR_Opr)(new LIR_Const(f)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  static LIR_Opr doubleConst(jdouble d)          { return (LIR_Opr)(new LIR_Const(d)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  static LIR_Opr oopConst(jobject o)             { return (LIR_Opr)(new LIR_Const(o)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  static LIR_Opr address(LIR_Address* a)         { return (LIR_Opr)a; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  static LIR_Opr intptrConst(void* p)            { return (LIR_Opr)(new LIR_Const(p)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  static LIR_Opr intptrConst(intptr_t v)         { return (LIR_Opr)(new LIR_Const((void*)v)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  static LIR_Opr illegal()                       { return (LIR_Opr)-1; }
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
   809
  static LIR_Opr addressConst(jint i)            { return (LIR_Opr)(new LIR_Const(i, true)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  static LIR_Opr value_type(ValueType* type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  static LIR_Opr dummy_value_type(ValueType* type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
//-------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
//                   LIR Instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
//-------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
// Note:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
//  - every instruction has a result operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
//  - every instruction has an CodeEmitInfo operand (can be revisited later)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
//  - every instruction has a LIR_OpCode operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
//  - LIR_OpN, means an instruction that has N input operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
// class hierarchy:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
class  LIR_Op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
class    LIR_Op0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
class      LIR_OpLabel;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
class    LIR_Op1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
class      LIR_OpBranch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
class      LIR_OpConvert;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
class      LIR_OpAllocObj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
class      LIR_OpRoundFP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
class    LIR_Op2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
class    LIR_OpDelay;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
class    LIR_Op3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
class      LIR_OpAllocArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
class    LIR_OpCall;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
class      LIR_OpJavaCall;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
class      LIR_OpRTCall;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
class    LIR_OpArrayCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
class    LIR_OpLock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
class    LIR_OpTypeCheck;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
class    LIR_OpCompareAndSwap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
class    LIR_OpProfileCall;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
// LIR operation codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
enum LIR_Code {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
    lir_none
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  , begin_op0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
      , lir_word_align
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
      , lir_label
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
      , lir_nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
      , lir_backwardbranch_target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
      , lir_std_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
      , lir_osr_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
      , lir_build_frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
      , lir_fpop_raw
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
      , lir_24bit_FPU
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
      , lir_reset_FPU
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
      , lir_breakpoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
      , lir_rtcall
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
      , lir_membar
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
      , lir_membar_acquire
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
      , lir_membar_release
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
      , lir_get_thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  , end_op0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  , begin_op1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
      , lir_fxch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
      , lir_fld
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
      , lir_ffree
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
      , lir_push
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
      , lir_pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
      , lir_null_check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
      , lir_return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
      , lir_leal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
      , lir_neg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
      , lir_branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
      , lir_cond_float_branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
      , lir_move
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
      , lir_prefetchr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
      , lir_prefetchw
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
      , lir_convert
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
      , lir_alloc_object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
      , lir_monaddr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
      , lir_roundfp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
      , lir_safepoint
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
   891
      , lir_pack64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
   892
      , lir_unpack64
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
   893
      , lir_unwind
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  , end_op1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  , begin_op2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
      , lir_cmp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
      , lir_cmp_l2i
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
      , lir_ucmp_fd2i
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
      , lir_cmp_fd2i
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
      , lir_cmove
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
      , lir_add
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
      , lir_sub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
      , lir_mul
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
      , lir_mul_strictfp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
      , lir_div
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
      , lir_div_strictfp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
      , lir_rem
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
      , lir_sqrt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
      , lir_abs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
      , lir_sin
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
      , lir_cos
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
      , lir_tan
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
      , lir_log
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
      , lir_log10
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
      , lir_logic_and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
      , lir_logic_or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
      , lir_logic_xor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
      , lir_shl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
      , lir_shr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
      , lir_ushr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
      , lir_alloc_array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
      , lir_throw
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
      , lir_compare_to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  , end_op2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  , begin_op3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
      , lir_idiv
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
      , lir_irem
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  , end_op3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  , begin_opJavaCall
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
      , lir_static_call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
      , lir_optvirtual_call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
      , lir_icvirtual_call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
      , lir_virtual_call
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
   934
      , lir_dynamic_call
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  , end_opJavaCall
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  , begin_opArrayCopy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
      , lir_arraycopy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  , end_opArrayCopy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  , begin_opLock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
    , lir_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
    , lir_unlock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  , end_opLock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  , begin_delay_slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
    , lir_delay_slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  , end_delay_slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  , begin_opTypeCheck
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
    , lir_instanceof
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
    , lir_checkcast
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
    , lir_store_check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  , end_opTypeCheck
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  , begin_opCompareAndSwap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
    , lir_cas_long
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
    , lir_cas_obj
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
    , lir_cas_int
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  , end_opCompareAndSwap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  , begin_opMDOProfile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    , lir_profile_call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  , end_opMDOProfile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
enum LIR_Condition {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
    lir_cond_equal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  , lir_cond_notEqual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  , lir_cond_less
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  , lir_cond_lessEqual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  , lir_cond_greaterEqual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  , lir_cond_greater
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  , lir_cond_belowEqual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  , lir_cond_aboveEqual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  , lir_cond_always
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  , lir_cond_unknown = -1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
enum LIR_PatchCode {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  lir_patch_none,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  lir_patch_low,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  lir_patch_high,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  lir_patch_normal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
enum LIR_MoveKind {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  lir_move_normal,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  lir_move_volatile,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  lir_move_unaligned,
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   988
  lir_move_wide,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  lir_move_max_flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
// LIR_Op
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
class LIR_Op: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  const char *  _file;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  int           _line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  LIR_Opr       _result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  unsigned short _code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  unsigned short _flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  CodeEmitInfo* _info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  int           _id;     // value id for register allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  int           _fpu_pop_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  Instruction*  _source; // for debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  static void print_condition(outputStream* out, LIR_Condition cond) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  static bool is_in_range(LIR_Code test, LIR_Code start, LIR_Code end)  { return start < test && test < end; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  LIR_Op()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
    : _result(LIR_OprFact::illegalOpr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
    , _code(lir_none)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
    , _flags(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
    , _info(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
    , _file(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
    , _line(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
    , _fpu_pop_count(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
    , _source(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
    , _id(-1)                             {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  LIR_Op(LIR_Code code, LIR_Opr result, CodeEmitInfo* info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
    : _result(result)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
    , _code(code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    , _flags(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
    , _info(info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
    , _file(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
    , _line(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
    , _fpu_pop_count(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
    , _source(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
    , _id(-1)                             {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  CodeEmitInfo* info() const                  { return _info;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  LIR_Code code()      const                  { return (LIR_Code)_code;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  LIR_Opr result_opr() const                  { return _result; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  void    set_result_opr(LIR_Opr opr)         { _result = opr;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  void set_file_and_line(const char * file, int line) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
    _file = file;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    _line = line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  virtual const char * name() const PRODUCT_RETURN0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  int id()             const                  { return _id;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  void set_id(int id)                         { _id = id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  // FPU stack simulation helpers -- only used on Intel
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  void set_fpu_pop_count(int count)           { assert(count >= 0 && count <= 1, "currently only 0 and 1 are valid"); _fpu_pop_count = count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  int  fpu_pop_count() const                  { return _fpu_pop_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  bool pop_fpu_stack()                        { return _fpu_pop_count > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  Instruction* source() const                 { return _source; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  void set_source(Instruction* ins)           { _source = ins; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  virtual void emit_code(LIR_Assembler* masm) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  virtual void print_instr(outputStream* out) const   = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  virtual void print_on(outputStream* st) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  virtual LIR_OpCall* as_OpCall() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  virtual LIR_OpLabel* as_OpLabel() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  virtual LIR_OpDelay* as_OpDelay() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  virtual LIR_OpLock* as_OpLock() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  virtual LIR_OpAllocArray* as_OpAllocArray() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  virtual LIR_OpAllocObj* as_OpAllocObj() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  virtual LIR_OpRoundFP* as_OpRoundFP() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  virtual LIR_OpBranch* as_OpBranch() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
  virtual LIR_OpRTCall* as_OpRTCall() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  virtual LIR_OpConvert* as_OpConvert() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  virtual LIR_Op0* as_Op0() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  virtual LIR_Op1* as_Op1() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  virtual LIR_Op2* as_Op2() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  virtual LIR_Op3* as_Op3() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  virtual void verify() const {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
// for calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
class LIR_OpCall: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  address      _addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  LIR_OprList* _arguments;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  LIR_OpCall(LIR_Code code, address addr, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
             LIR_OprList* arguments, CodeEmitInfo* info = NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
    : LIR_Op(code, result, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
    , _arguments(arguments)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
    , _addr(addr) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  address addr() const                           { return _addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  const LIR_OprList* arguments() const           { return _arguments; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  virtual LIR_OpCall* as_OpCall()                { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
// LIR_OpJavaCall
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
class LIR_OpJavaCall: public LIR_OpCall {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
 private:
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1126
  ciMethod* _method;
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1127
  LIR_Opr   _receiver;
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1128
  LIR_Opr   _method_handle_invoke_SP_save_opr;  // Used in LIR_OpVisitState::visit to store the reference to FrameMap::method_handle_invoke_SP_save_opr.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  LIR_OpJavaCall(LIR_Code code, ciMethod* method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
                 LIR_Opr receiver, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
                 address addr, LIR_OprList* arguments,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
                 CodeEmitInfo* info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  : LIR_OpCall(code, addr, result, arguments, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  , _receiver(receiver)
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1137
  , _method(method)
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1138
  , _method_handle_invoke_SP_save_opr(LIR_OprFact::illegalOpr)
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1139
  { assert(is_in_range(code, begin_opJavaCall, end_opJavaCall), "code check"); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  LIR_OpJavaCall(LIR_Code code, ciMethod* method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
                 LIR_Opr receiver, LIR_Opr result, intptr_t vtable_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
                 LIR_OprList* arguments, CodeEmitInfo* info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  : LIR_OpCall(code, (address)vtable_offset, result, arguments, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  , _receiver(receiver)
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1146
  , _method(method)
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1147
  , _method_handle_invoke_SP_save_opr(LIR_OprFact::illegalOpr)
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5420
diff changeset
  1148
  { assert(is_in_range(code, begin_opJavaCall, end_opJavaCall), "code check"); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  LIR_Opr receiver() const                       { return _receiver; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  ciMethod* method() const                       { return _method;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1153
  // JSR 292 support.
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1154
  bool is_invokedynamic() const                  { return code() == lir_dynamic_call; }
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1155
  bool is_method_handle_invoke() const {
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1156
    return
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1157
      is_invokedynamic()  // An invokedynamic is always a MethodHandle call site.
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1158
      ||
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1159
      (method()->holder()->name() == ciSymbol::java_dyn_MethodHandle() &&
5420
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 5334
diff changeset
  1160
       methodOopDesc::is_method_handle_invoke_name(method()->name()->sid()));
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1161
  }
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1162
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  intptr_t vtable_offset() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
    assert(_code == lir_virtual_call, "only have vtable for real vcall");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    return (intptr_t) addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  virtual LIR_OpJavaCall* as_OpJavaCall() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
// LIR_OpLabel
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
// Location where a branch can continue
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
class LIR_OpLabel: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  Label* _label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  LIR_OpLabel(Label* lbl)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
   : LIR_Op(lir_label, LIR_OprFact::illegalOpr, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
   , _label(lbl)                                 {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  Label* label() const                           { return _label; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  virtual LIR_OpLabel* as_OpLabel() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
// LIR_OpArrayCopy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
class LIR_OpArrayCopy: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  ArrayCopyStub*  _stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  LIR_Opr   _src;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  LIR_Opr   _src_pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  LIR_Opr   _dst;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
  LIR_Opr   _dst_pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  LIR_Opr   _length;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  LIR_Opr   _tmp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  ciArrayKlass* _expected_type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  int       _flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  enum Flags {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
    src_null_check         = 1 << 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
    dst_null_check         = 1 << 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
    src_pos_positive_check = 1 << 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
    dst_pos_positive_check = 1 << 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
    length_positive_check  = 1 << 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
    src_range_check        = 1 << 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
    dst_range_check        = 1 << 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
    type_check             = 1 << 7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
    all_flags              = (1 << 8) - 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  LIR_OpArrayCopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_Opr dst_pos, LIR_Opr length, LIR_Opr tmp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
                  ciArrayKlass* expected_type, int flags, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  LIR_Opr src() const                            { return _src; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  LIR_Opr src_pos() const                        { return _src_pos; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
  LIR_Opr dst() const                            { return _dst; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  LIR_Opr dst_pos() const                        { return _dst_pos; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
  LIR_Opr length() const                         { return _length; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  LIR_Opr tmp() const                            { return _tmp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  int flags() const                              { return _flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  ciArrayKlass* expected_type() const            { return _expected_type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  ArrayCopyStub* stub() const                    { return _stub; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  virtual LIR_OpArrayCopy* as_OpArrayCopy() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
// LIR_Op0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
class LIR_Op0: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
  LIR_Op0(LIR_Code code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
   : LIR_Op(code, LIR_OprFact::illegalOpr, NULL)  { assert(is_in_range(code, begin_op0, end_op0), "code check"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
  LIR_Op0(LIR_Code code, LIR_Opr result, CodeEmitInfo* info = NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
   : LIR_Op(code, result, info)  { assert(is_in_range(code, begin_op0, end_op0), "code check"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  virtual LIR_Op0* as_Op0() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
// LIR_Op1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
// --------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
class LIR_Op1: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  LIR_Opr         _opr;   // input operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
  BasicType       _type;  // Operand types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  LIR_PatchCode   _patch; // only required with patchin (NEEDS_CLEANUP: do we want a special instruction for patching?)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
  static void print_patch_code(outputStream* out, LIR_PatchCode code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
  void set_kind(LIR_MoveKind kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
    assert(code() == lir_move, "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    _flags = kind;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
  LIR_Op1(LIR_Code code, LIR_Opr opr, LIR_Opr result = LIR_OprFact::illegalOpr, BasicType type = T_ILLEGAL, LIR_PatchCode patch = lir_patch_none, CodeEmitInfo* info = NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
    : LIR_Op(code, result, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
    , _opr(opr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
    , _patch(patch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
    , _type(type)                      { assert(is_in_range(code, begin_op1, end_op1), "code check"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  LIR_Op1(LIR_Code code, LIR_Opr opr, LIR_Opr result, BasicType type, LIR_PatchCode patch, CodeEmitInfo* info, LIR_MoveKind kind)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
    : LIR_Op(code, result, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
    , _opr(opr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
    , _patch(patch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
    , _type(type)                      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
    assert(code == lir_move, "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
    set_kind(kind);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
  LIR_Op1(LIR_Code code, LIR_Opr opr, CodeEmitInfo* info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
    : LIR_Op(code, LIR_OprFact::illegalOpr, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
    , _opr(opr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
    , _patch(lir_patch_none)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
    , _type(T_ILLEGAL)                 { assert(is_in_range(code, begin_op1, end_op1), "code check"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  LIR_Opr in_opr()           const               { return _opr;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
  LIR_PatchCode patch_code() const               { return _patch; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
  BasicType type()           const               { return _type;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  LIR_MoveKind move_kind() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
    assert(code() == lir_move, "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
    return (LIR_MoveKind)_flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
  virtual LIR_Op1* as_Op1() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
  virtual const char * name() const PRODUCT_RETURN0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
  void set_in_opr(LIR_Opr opr) { _opr = opr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
  virtual void verify() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
// for runtime calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
class LIR_OpRTCall: public LIR_OpCall {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
  LIR_Opr _tmp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
  LIR_OpRTCall(address addr, LIR_Opr tmp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
               LIR_Opr result, LIR_OprList* arguments, CodeEmitInfo* info = NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
    : LIR_OpCall(lir_rtcall, addr, result, arguments, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
    , _tmp(tmp) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  virtual LIR_OpRTCall* as_OpRTCall() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  LIR_Opr tmp() const                            { return _tmp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  virtual void verify() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
class LIR_OpBranch: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  LIR_Condition _cond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  BasicType     _type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  Label*        _label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
  BlockBegin*   _block;  // if this is a branch to a block, this is the block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  BlockBegin*   _ublock; // if this is a float-branch, this is the unorderd block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
  CodeStub*     _stub;   // if this is a branch to a stub, this is the stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  LIR_OpBranch(LIR_Condition cond, Label* lbl)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
    : LIR_Op(lir_branch, LIR_OprFact::illegalOpr, (CodeEmitInfo*) NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
    , _cond(cond)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
    , _label(lbl)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
    , _block(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
    , _ublock(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
    , _stub(NULL) { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
  LIR_OpBranch(LIR_Condition cond, BasicType type, BlockBegin* block);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
  LIR_OpBranch(LIR_Condition cond, BasicType type, CodeStub* stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  // for unordered comparisons
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  LIR_OpBranch(LIR_Condition cond, BasicType type, BlockBegin* block, BlockBegin* ublock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
  LIR_Condition cond()        const              { return _cond;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
  BasicType     type()        const              { return _type;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
  Label*        label()       const              { return _label;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
  BlockBegin*   block()       const              { return _block;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
  BlockBegin*   ublock()      const              { return _ublock;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  CodeStub*     stub()        const              { return _stub;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
  void          change_block(BlockBegin* b);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
  void          change_ublock(BlockBegin* b);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
  void          negate_cond();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  virtual LIR_OpBranch* as_OpBranch() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
class ConversionStub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
class LIR_OpConvert: public LIR_Op1 {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
   Bytecodes::Code _bytecode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
   ConversionStub* _stub;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1392
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1393
  LIR_Opr _tmp1;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1394
  LIR_Opr _tmp2;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1395
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
   LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
     : LIR_Op1(lir_convert, opr, result)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
     , _stub(stub)
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1401
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1402
     , _tmp1(LIR_OprDesc::illegalOpr())
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1403
     , _tmp2(LIR_OprDesc::illegalOpr())
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1404
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
     , _bytecode(code)                           {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1407
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1408
   LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1409
                 ,LIR_Opr tmp1, LIR_Opr tmp2)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1410
     : LIR_Op1(lir_convert, opr, result)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1411
     , _stub(stub)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1412
     , _tmp1(tmp1)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1413
     , _tmp2(tmp2)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1414
     , _bytecode(code)                           {}
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1415
#endif
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1416
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  Bytecodes::Code bytecode() const               { return _bytecode; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  ConversionStub* stub() const                   { return _stub; }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1419
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1420
  LIR_Opr tmp1() const                           { return _tmp1; }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1421
  LIR_Opr tmp2() const                           { return _tmp2; }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1422
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  virtual LIR_OpConvert* as_OpConvert() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
  static void print_bytecode(outputStream* out, Bytecodes::Code code) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
// LIR_OpAllocObj
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
class LIR_OpAllocObj : public LIR_Op1 {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
  LIR_Opr _tmp1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
  LIR_Opr _tmp2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
  LIR_Opr _tmp3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
  LIR_Opr _tmp4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  int     _hdr_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
  int     _obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  CodeStub* _stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
  bool    _init_check;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
  LIR_OpAllocObj(LIR_Opr klass, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
                 LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
                 int hdr_size, int obj_size, bool init_check, CodeStub* stub)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
    : LIR_Op1(lir_alloc_object, klass, result)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
    , _tmp1(t1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
    , _tmp2(t2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
    , _tmp3(t3)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
    , _tmp4(t4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
    , _hdr_size(hdr_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
    , _obj_size(obj_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
    , _init_check(init_check)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
    , _stub(stub)                                { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  LIR_Opr klass()        const                   { return in_opr();     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
  LIR_Opr obj()          const                   { return result_opr(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  LIR_Opr tmp1()         const                   { return _tmp1;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
  LIR_Opr tmp2()         const                   { return _tmp2;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
  LIR_Opr tmp3()         const                   { return _tmp3;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  LIR_Opr tmp4()         const                   { return _tmp4;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  int     header_size()  const                   { return _hdr_size;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  int     object_size()  const                   { return _obj_size;    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  bool    init_check()   const                   { return _init_check;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  CodeStub* stub()       const                   { return _stub;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  virtual LIR_OpAllocObj * as_OpAllocObj () { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
// LIR_OpRoundFP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
class LIR_OpRoundFP : public LIR_Op1 {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
  LIR_Opr _tmp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  LIR_OpRoundFP(LIR_Opr reg, LIR_Opr stack_loc_temp, LIR_Opr result)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
    : LIR_Op1(lir_roundfp, reg, result)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
    , _tmp(stack_loc_temp) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  LIR_Opr tmp() const                            { return _tmp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
  virtual LIR_OpRoundFP* as_OpRoundFP()          { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
// LIR_OpTypeCheck
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
class LIR_OpTypeCheck: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
  LIR_Opr       _object;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
  LIR_Opr       _array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
  ciKlass*      _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
  LIR_Opr       _tmp1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
  LIR_Opr       _tmp2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
  LIR_Opr       _tmp3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  bool          _fast_check;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
  CodeEmitInfo* _info_for_patch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
  CodeEmitInfo* _info_for_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
  CodeStub*     _stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
  ciMethod*     _profiled_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
  int           _profiled_bci;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1511
  bool          _should_profile;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
  LIR_OpTypeCheck(LIR_Code code, LIR_Opr result, LIR_Opr object, ciKlass* klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
                  LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1516
                  CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
  LIR_OpTypeCheck(LIR_Code code, LIR_Opr object, LIR_Opr array,
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1518
                  LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
  LIR_Opr object() const                         { return _object;         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
  LIR_Opr array() const                          { assert(code() == lir_store_check, "not valid"); return _array;         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
  LIR_Opr tmp1() const                           { return _tmp1;           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  LIR_Opr tmp2() const                           { return _tmp2;           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
  LIR_Opr tmp3() const                           { return _tmp3;           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  ciKlass* klass() const                         { assert(code() == lir_instanceof || code() == lir_checkcast, "not valid"); return _klass;          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
  bool fast_check() const                        { assert(code() == lir_instanceof || code() == lir_checkcast, "not valid"); return _fast_check;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  CodeEmitInfo* info_for_patch() const           { return _info_for_patch;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  CodeEmitInfo* info_for_exception() const       { return _info_for_exception; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
  CodeStub* stub() const                         { return _stub;           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
  // methodDataOop profiling
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1532
  void set_profiled_method(ciMethod *method)     { _profiled_method = method; }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1533
  void set_profiled_bci(int bci)                 { _profiled_bci = bci;       }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1534
  void set_should_profile(bool b)                { _should_profile = b;       }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1535
  ciMethod* profiled_method() const              { return _profiled_method;   }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1536
  int       profiled_bci() const                 { return _profiled_bci;      }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1537
  bool      should_profile() const               { return _should_profile;    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
  virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
  void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
// LIR_Op2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
class LIR_Op2: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
  int  _fpu_stack_size; // for sin/cos implementation on Intel
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
  LIR_Opr   _opr1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  LIR_Opr   _opr2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
  BasicType _type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
  LIR_Opr   _tmp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
  LIR_Condition _condition;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
  void verify() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
  LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, CodeEmitInfo* info = NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
    : LIR_Op(code, LIR_OprFact::illegalOpr, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
    , _opr1(opr1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
    , _opr2(opr2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
    , _type(T_ILLEGAL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
    , _condition(condition)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
    , _fpu_stack_size(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
    , _tmp(LIR_OprFact::illegalOpr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
    assert(code == lir_cmp, "code check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
  LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
    : LIR_Op(code, result, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
    , _opr1(opr1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
    , _opr2(opr2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
    , _type(T_ILLEGAL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
    , _condition(condition)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
    , _fpu_stack_size(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
    , _tmp(LIR_OprFact::illegalOpr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
    assert(code == lir_cmove, "code check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result = LIR_OprFact::illegalOpr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
          CodeEmitInfo* info = NULL, BasicType type = T_ILLEGAL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
    : LIR_Op(code, result, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
    , _opr1(opr1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
    , _opr2(opr2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
    , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
    , _condition(lir_cond_unknown)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
    , _fpu_stack_size(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
    , _tmp(LIR_OprFact::illegalOpr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
    assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
  LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, LIR_Opr tmp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
    : LIR_Op(code, result, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
    , _opr1(opr1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
    , _opr2(opr2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
    , _type(T_ILLEGAL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
    , _condition(lir_cond_unknown)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
    , _fpu_stack_size(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
    , _tmp(tmp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
    assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
  LIR_Opr in_opr1() const                        { return _opr1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
  LIR_Opr in_opr2() const                        { return _opr2; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
  BasicType type()  const                        { return _type; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
  LIR_Opr tmp_opr() const                        { return _tmp; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
  LIR_Condition condition() const  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
    assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); return _condition;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
  }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1612
  void set_condition(LIR_Condition condition) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1613
    assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove");  _condition = condition;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1614
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
  void set_fpu_stack_size(int size)              { _fpu_stack_size = size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
  int  fpu_stack_size() const                    { return _fpu_stack_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
  void set_in_opr1(LIR_Opr opr)                  { _opr1 = opr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
  void set_in_opr2(LIR_Opr opr)                  { _opr2 = opr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
  virtual LIR_Op2* as_Op2() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
class LIR_OpAllocArray : public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
  LIR_Opr   _klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
  LIR_Opr   _len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
  LIR_Opr   _tmp1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
  LIR_Opr   _tmp2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
  LIR_Opr   _tmp3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
  LIR_Opr   _tmp4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  BasicType _type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
  CodeStub* _stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
  LIR_OpAllocArray(LIR_Opr klass, LIR_Opr len, LIR_Opr result, LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4, BasicType type, CodeStub* stub)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
    : LIR_Op(lir_alloc_array, result, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
    , _klass(klass)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
    , _len(len)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
    , _tmp1(t1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
    , _tmp2(t2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
    , _tmp3(t3)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
    , _tmp4(t4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
    , _type(type)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
    , _stub(stub) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
  LIR_Opr   klass()   const                      { return _klass;       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
  LIR_Opr   len()     const                      { return _len;         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
  LIR_Opr   obj()     const                      { return result_opr(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
  LIR_Opr   tmp1()    const                      { return _tmp1;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
  LIR_Opr   tmp2()    const                      { return _tmp2;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
  LIR_Opr   tmp3()    const                      { return _tmp3;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
  LIR_Opr   tmp4()    const                      { return _tmp4;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
  BasicType type()    const                      { return _type;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  CodeStub* stub()    const                      { return _stub;        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
  virtual LIR_OpAllocArray * as_OpAllocArray () { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
class LIR_Op3: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
  LIR_Opr _opr1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  LIR_Opr _opr2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
  LIR_Opr _opr3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
  LIR_Op3(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr opr3, LIR_Opr result, CodeEmitInfo* info = NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
    : LIR_Op(code, result, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
    , _opr1(opr1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
    , _opr2(opr2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
    , _opr3(opr3)                                { assert(is_in_range(code, begin_op3, end_op3), "code check"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
  LIR_Opr in_opr1() const                        { return _opr1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
  LIR_Opr in_opr2() const                        { return _opr2; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
  LIR_Opr in_opr3() const                        { return _opr3; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
  virtual LIR_Op3* as_Op3() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
//--------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
class LabelObj: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
  Label _label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
  LabelObj()                                     {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
  Label* label()                                 { return &_label; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
class LIR_OpLock: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
  LIR_Opr _hdr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
  LIR_Opr _obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
  LIR_Opr _lock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
  LIR_Opr _scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
  CodeStub* _stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
  LIR_OpLock(LIR_Code code, LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub, CodeEmitInfo* info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
    : LIR_Op(code, LIR_OprFact::illegalOpr, info)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
    , _hdr(hdr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
    , _obj(obj)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
    , _lock(lock)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
    , _scratch(scratch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
    , _stub(stub)                      {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
  LIR_Opr hdr_opr() const                        { return _hdr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
  LIR_Opr obj_opr() const                        { return _obj; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
  LIR_Opr lock_opr() const                       { return _lock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
  LIR_Opr scratch_opr() const                    { return _scratch; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
  CodeStub* stub() const                         { return _stub; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
  virtual LIR_OpLock* as_OpLock() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
  void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
class LIR_OpDelay: public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
  LIR_Op* _op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
  LIR_OpDelay(LIR_Op* op, CodeEmitInfo* info):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
    LIR_Op(lir_delay_slot, LIR_OprFact::illegalOpr, info),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
    _op(op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
    assert(op->code() == lir_nop || LIRFillDelaySlots, "should be filling with nops");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  virtual LIR_OpDelay* as_OpDelay() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
  void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
  LIR_Op* delay_op() const { return _op; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
  CodeEmitInfo* call_info() const { return info(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
// LIR_OpCompareAndSwap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
class LIR_OpCompareAndSwap : public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
  LIR_Opr _addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
  LIR_Opr _cmp_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  LIR_Opr _new_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
  LIR_Opr _tmp1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
  LIR_Opr _tmp2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
 public:
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1763
  LIR_OpCompareAndSwap(LIR_Code code, LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1764
                       LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1765
    : LIR_Op(code, result, NULL)  // no result, no info
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
    , _addr(addr)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
    , _cmp_value(cmp_value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
    , _new_value(new_value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
    , _tmp1(t1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
    , _tmp2(t2)                                  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
  LIR_Opr addr()        const                    { return _addr;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
  LIR_Opr cmp_value()   const                    { return _cmp_value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
  LIR_Opr new_value()   const                    { return _new_value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
  LIR_Opr tmp1()        const                    { return _tmp1;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
  LIR_Opr tmp2()        const                    { return _tmp2;      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
  virtual LIR_OpCompareAndSwap * as_OpCompareAndSwap () { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
// LIR_OpProfileCall
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
class LIR_OpProfileCall : public LIR_Op {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
 friend class LIR_OpVisitState;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  ciMethod* _profiled_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  int _profiled_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
  LIR_Opr _mdo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  LIR_Opr _recv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  LIR_Opr _tmp1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
  ciKlass* _known_holder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
  // Destroys recv
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
  LIR_OpProfileCall(LIR_Code code, ciMethod* profiled_method, int profiled_bci, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* known_holder)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
    : LIR_Op(code, LIR_OprFact::illegalOpr, NULL)  // no result, no info
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
    , _profiled_method(profiled_method)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
    , _profiled_bci(profiled_bci)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
    , _mdo(mdo)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
    , _recv(recv)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
    , _tmp1(t1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
    , _known_holder(known_holder)                { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
  ciMethod* profiled_method() const              { return _profiled_method;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
  int       profiled_bci()    const              { return _profiled_bci;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
  LIR_Opr   mdo()             const              { return _mdo;              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  LIR_Opr   recv()            const              { return _recv;             }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  LIR_Opr   tmp1()            const              { return _tmp1;             }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  ciKlass*  known_holder()    const              { return _known_holder;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  virtual void emit_code(LIR_Assembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
  virtual LIR_OpProfileCall* as_OpProfileCall() { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
  virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
class LIR_InsertionBuffer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
//--------------------------------LIR_List---------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
// Maintains a list of LIR instructions (one instance of LIR_List per basic block)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
// The LIR instructions are appended by the LIR_List class itself;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
// Notes:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
// - all offsets are(should be) in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
// - local positions are specified with an offset, with offset 0 being local 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
class LIR_List: public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
  LIR_OpList  _operations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  Compilation*  _compilation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
  BlockBegin*   _block;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
  const char *  _file;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
  int           _line;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  void append(LIR_Op* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
    if (op->source() == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
      op->set_source(_compilation->current_instruction());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
    if (PrintIRWithLIR) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
      _compilation->maybe_print_current_instruction();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
      op->print(); tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
    _operations.append(op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
    op->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
    op->set_file_and_line(_file, _line);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
    _file = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
    _line = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
  LIR_List(Compilation* compilation, BlockBegin* block = NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  void set_file_and_line(const char * file, int line);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
  //---------- accessors ---------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  LIR_OpList* instructions_list()                { return &_operations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  int         length() const                     { return _operations.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
  LIR_Op*     at(int i) const                    { return _operations.at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  NOT_PRODUCT(BlockBegin* block() const          { return _block; });
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  // insert LIR_Ops in buffer to right places in LIR_List
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
  void append(LIR_InsertionBuffer* buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
  //---------- mutators ---------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  void insert_before(int i, LIR_List* op_list)   { _operations.insert_before(i, op_list->instructions_list()); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
  void insert_before(int i, LIR_Op* op)          { _operations.insert_before(i, op); }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1881
  void remove_at(int i)                          { _operations.remove_at(i); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
  //---------- printing -------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
  void print_instructions() PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
  //---------- instructions -------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
  void call_opt_virtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
                        address dest, LIR_OprList* arguments,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
                        CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
    append(new LIR_OpJavaCall(lir_optvirtual_call, method, receiver, result, dest, arguments, info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
  void call_static(ciMethod* method, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
                   address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
    append(new LIR_OpJavaCall(lir_static_call, method, LIR_OprFact::illegalOpr, result, dest, arguments, info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
  void call_icvirtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
                      address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
    append(new LIR_OpJavaCall(lir_icvirtual_call, method, receiver, result, dest, arguments, info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  void call_virtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
                    intptr_t vtable_offset, LIR_OprList* arguments, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
    append(new LIR_OpJavaCall(lir_virtual_call, method, receiver, result, vtable_offset, arguments, info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  }
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1905
  void call_dynamic(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1906
                    address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1907
    append(new LIR_OpJavaCall(lir_dynamic_call, method, receiver, result, dest, arguments, info));
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4646
diff changeset
  1908
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
  void get_thread(LIR_Opr result)                { append(new LIR_Op0(lir_get_thread, result)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
  void word_align()                              { append(new LIR_Op0(lir_word_align)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
  void membar()                                  { append(new LIR_Op0(lir_membar)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
  void membar_acquire()                          { append(new LIR_Op0(lir_membar_acquire)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
  void membar_release()                          { append(new LIR_Op0(lir_membar_release)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
  void nop()                                     { append(new LIR_Op0(lir_nop)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
  void build_frame()                             { append(new LIR_Op0(lir_build_frame)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  void std_entry(LIR_Opr receiver)               { append(new LIR_Op0(lir_std_entry, receiver)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
  void osr_entry(LIR_Opr osrPointer)             { append(new LIR_Op0(lir_osr_entry, osrPointer)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
  void branch_destination(Label* lbl)            { append(new LIR_OpLabel(lbl)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
  void negate(LIR_Opr from, LIR_Opr to)          { append(new LIR_Op1(lir_neg, from, to)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
  void leal(LIR_Opr from, LIR_Opr result_reg)    { append(new LIR_Op1(lir_leal, from, result_reg)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
  // result is a stack location for old backend and vreg for UseLinearScan
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
  // stack_loc_temp is an illegal register for old backend
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
  void roundfp(LIR_Opr reg, LIR_Opr stack_loc_temp, LIR_Opr result) { append(new LIR_OpRoundFP(reg, stack_loc_temp, result)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
  void unaligned_move(LIR_Address* src, LIR_Opr dst) { append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, dst->type(), lir_patch_none, NULL, lir_move_unaligned)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
  void unaligned_move(LIR_Opr src, LIR_Address* dst) { append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), src->type(), lir_patch_none, NULL, lir_move_unaligned)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
  void unaligned_move(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_move, src, dst, dst->type(), lir_patch_none, NULL, lir_move_unaligned)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
  void move(LIR_Opr src, LIR_Opr dst, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_move, src, dst, dst->type(), lir_patch_none, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
  void move(LIR_Address* src, LIR_Opr dst, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, src->type(), lir_patch_none, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
  void move(LIR_Opr src, LIR_Address* dst, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), dst->type(), lir_patch_none, info)); }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1936
  void move_wide(LIR_Address* src, LIR_Opr dst, CodeEmitInfo* info = NULL) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1937
    if (UseCompressedOops) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1938
      append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, src->type(), lir_patch_none, info, lir_move_wide));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1939
    } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1940
      move(src, dst, info);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1941
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1942
  }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1943
  void move_wide(LIR_Opr src, LIR_Address* dst, CodeEmitInfo* info = NULL) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1944
    if (UseCompressedOops) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1945
      append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), dst->type(), lir_patch_none, info, lir_move_wide));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1946
    } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1947
      move(src, dst, info);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1948
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1949
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
  void volatile_move(LIR_Opr src, LIR_Opr dst, BasicType type, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none) { append(new LIR_Op1(lir_move, src, dst, type, patch_code, info, lir_move_volatile)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
  void oop2reg  (jobject o, LIR_Opr reg)         { append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o),    reg));   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
  void oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
  void return_op(LIR_Opr result)                 { append(new LIR_Op1(lir_return, result)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
  void safepoint(LIR_Opr tmp, CodeEmitInfo* info)  { append(new LIR_Op1(lir_safepoint, tmp, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1959
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1960
  void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_OpConvert(code, left, dst, NULL, tmp1, tmp2)); }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  1961
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
  void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst, ConversionStub* stub = NULL/*, bool is_32bit = false*/) { append(new LIR_OpConvert(code, left, dst, stub)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
  void logical_and (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_and,  left, right, dst)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
  void logical_or  (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_or,   left, right, dst)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
  void logical_xor (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_xor,  left, right, dst)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1968
  void   pack64(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_pack64,   src, dst, T_LONG, lir_patch_none, NULL)); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1969
  void unpack64(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_unpack64, src, dst, T_LONG, lir_patch_none, NULL)); }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1970
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
  void null_check(LIR_Opr opr, CodeEmitInfo* info)         { append(new LIR_Op1(lir_null_check, opr, info)); }
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
  1972
  void throw_exception(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmitInfo* info) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
  1973
    append(new LIR_Op2(lir_throw, exceptionPC, exceptionOop, LIR_OprFact::illegalOpr, info));
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
  1974
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
  1975
  void unwind_exception(LIR_Opr exceptionOop) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
  1976
    append(new LIR_Op1(lir_unwind, exceptionOop));
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5048
diff changeset
  1977
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
  void compare_to (LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
    append(new LIR_Op2(lir_compare_to,  left, right, dst));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  void push(LIR_Opr opr)                                   { append(new LIR_Op1(lir_push, opr)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  void pop(LIR_Opr reg)                                    { append(new LIR_Op1(lir_pop,  reg)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
  void cmp(LIR_Condition condition, LIR_Opr left, LIR_Opr right, CodeEmitInfo* info = NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
    append(new LIR_Op2(lir_cmp, condition, left, right, info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  void cmp(LIR_Condition condition, LIR_Opr left, int right, CodeEmitInfo* info = NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
    cmp(condition, left, LIR_OprFact::intConst(right), info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
  void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
  void cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Address* addr, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
  void cmove(LIR_Condition condition, LIR_Opr src1, LIR_Opr src2, LIR_Opr dst) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
    append(new LIR_Op2(lir_cmove, condition, src1, src2, dst));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2000
  void cas_long(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2001
                LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2002
  void cas_obj(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2003
               LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2004
  void cas_int(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2005
               LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
  void abs (LIR_Opr from, LIR_Opr to, LIR_Opr tmp)                { append(new LIR_Op2(lir_abs , from, tmp, to)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
  void sqrt(LIR_Opr from, LIR_Opr to, LIR_Opr tmp)                { append(new LIR_Op2(lir_sqrt, from, tmp, to)); }
3800
3195b4844b5a 6855215: Calculation error (NaN) after about 1500 calculations
never
parents: 1217
diff changeset
  2009
  void log (LIR_Opr from, LIR_Opr to, LIR_Opr tmp)                { append(new LIR_Op2(lir_log,  from, LIR_OprFact::illegalOpr, to, tmp)); }
3195b4844b5a 6855215: Calculation error (NaN) after about 1500 calculations
never
parents: 1217
diff changeset
  2010
  void log10 (LIR_Opr from, LIR_Opr to, LIR_Opr tmp)              { append(new LIR_Op2(lir_log10, from, LIR_OprFact::illegalOpr, to, tmp)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  void sin (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_sin , from, tmp1, to, tmp2)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
  void cos (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_cos , from, tmp1, to, tmp2)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
  void tan (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_tan , from, tmp1, to, tmp2)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
  void add (LIR_Opr left, LIR_Opr right, LIR_Opr res)      { append(new LIR_Op2(lir_add, left, right, res)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  void sub (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_sub, left, right, res, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
  void mul (LIR_Opr left, LIR_Opr right, LIR_Opr res) { append(new LIR_Op2(lir_mul, left, right, res)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
  void mul_strictfp (LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_mul_strictfp, left, right, res, tmp)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
  void div (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL)      { append(new LIR_Op2(lir_div, left, right, res, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
  void div_strictfp (LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_div_strictfp, left, right, res, tmp)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
  void rem (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL)      { append(new LIR_Op2(lir_rem, left, right, res, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  void volatile_load_mem_reg(LIR_Address* address, LIR_Opr dst, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
  void volatile_load_unsafe_reg(LIR_Opr base, LIR_Opr offset, LIR_Opr dst, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
  void load(LIR_Address* addr, LIR_Opr src, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
  void prefetch(LIR_Address* addr, bool is_store);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
  void store_mem_int(jint v,    LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
  void store_mem_oop(jobject o, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
  void store(LIR_Opr src, LIR_Address* addr, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
  void volatile_store_mem_reg(LIR_Opr src, LIR_Address* address, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  void volatile_store_unsafe_reg(LIR_Opr src, LIR_Opr base, LIR_Opr offset, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  void idiv(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
  void idiv(LIR_Opr left, int   right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
  void irem(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
  void irem(LIR_Opr left, int   right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
  void allocate_object(LIR_Opr dst, LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4, int header_size, int object_size, LIR_Opr klass, bool init_check, CodeStub* stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
  void allocate_array(LIR_Opr dst, LIR_Opr len, LIR_Opr t1,LIR_Opr t2, LIR_Opr t3,LIR_Opr t4, BasicType type, LIR_Opr klass, CodeStub* stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
  // jump is an unconditional branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
  void jump(BlockBegin* block) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
    append(new LIR_OpBranch(lir_cond_always, T_ILLEGAL, block));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
  void jump(CodeStub* stub) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
    append(new LIR_OpBranch(lir_cond_always, T_ILLEGAL, stub));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  void branch(LIR_Condition cond, Label* lbl)        { append(new LIR_OpBranch(cond, lbl)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
  void branch(LIR_Condition cond, BasicType type, BlockBegin* block) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
    assert(type != T_FLOAT && type != T_DOUBLE, "no fp comparisons");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
    append(new LIR_OpBranch(cond, type, block));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  void branch(LIR_Condition cond, BasicType type, CodeStub* stub)    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
    assert(type != T_FLOAT && type != T_DOUBLE, "no fp comparisons");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
    append(new LIR_OpBranch(cond, type, stub));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
  void branch(LIR_Condition cond, BasicType type, BlockBegin* block, BlockBegin* unordered) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
    assert(type == T_FLOAT || type == T_DOUBLE, "fp comparisons only");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
    append(new LIR_OpBranch(cond, type, block, unordered));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
  void shift_left(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
  void shift_right(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
  void unsigned_shift_right(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
  void shift_left(LIR_Opr value, int count, LIR_Opr dst)       { shift_left(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
  void shift_right(LIR_Opr value, int count, LIR_Opr dst)      { shift_right(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
  void unsigned_shift_right(LIR_Opr value, int count, LIR_Opr dst) { unsigned_shift_right(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
  void lcmp2int(LIR_Opr left, LIR_Opr right, LIR_Opr dst)        { append(new LIR_Op2(lir_cmp_l2i,  left, right, dst)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
  void fcmp2int(LIR_Opr left, LIR_Opr right, LIR_Opr dst, bool is_unordered_less);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
  void call_runtime_leaf(address routine, LIR_Opr tmp, LIR_Opr result, LIR_OprList* arguments) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
    append(new LIR_OpRTCall(routine, tmp, result, arguments));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
  void call_runtime(address routine, LIR_Opr tmp, LIR_Opr result,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
                    LIR_OprList* arguments, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
    append(new LIR_OpRTCall(routine, tmp, result, arguments, info));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  void load_stack_address_monitor(int monitor_ix, LIR_Opr dst)  { append(new LIR_Op1(lir_monaddr, LIR_OprFact::intConst(monitor_ix), dst)); }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5702
diff changeset
  2086
  void unlock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
  void lock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub, CodeEmitInfo* info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
  void set_24bit_fpu()                                               { append(new LIR_Op0(lir_24bit_FPU )); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
  void restore_fpu()                                                 { append(new LIR_Op0(lir_reset_FPU )); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
  void breakpoint()                                                  { append(new LIR_Op0(lir_breakpoint)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
  void arraycopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_Opr dst_pos, LIR_Opr length, LIR_Opr tmp, ciArrayKlass* expected_type, int flags, CodeEmitInfo* info) { append(new LIR_OpArrayCopy(src, src_pos, dst, dst_pos, length, tmp, expected_type, flags, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
  void fpop_raw()                                { append(new LIR_Op0(lir_fpop_raw)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6453
diff changeset
  2097
  void instanceof(LIR_Opr result, LIR_Opr object, ciKlass* klass, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check, CodeEmitInfo* info_for_patch, ciMethod* profiled_method, int profiled_bci);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  2098
  void store_check(LIR_Opr object, LIR_Opr array, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  2099
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
  void checkcast (LIR_Opr result, LIR_Opr object, ciKlass* klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
                  LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
                  CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
                  ciMethod* profiled_method, int profiled_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
  // methodDataOop profiling
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  2105
  void profile_call(ciMethod* method, int bci, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* cha_klass) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  2106
    append(new LIR_OpProfileCall(lir_profile_call, method, bci, mdo, recv, t1, cha_klass));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  2107
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
void print_LIR(BlockList* blocks);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
class LIR_InsertionBuffer : public CompilationResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
  LIR_List*   _lir;   // the lir list where ops of this buffer should be inserted later (NULL when uninitialized)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
  // list of insertion points. index and count are stored alternately:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
  // _index_and_count[i * 2]:     the index into lir list where "count" ops should be inserted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
  // _index_and_count[i * 2 + 1]: the number of ops to be inserted at index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
  intStack    _index_and_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
  // the LIR_Ops to be inserted
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
  LIR_OpList  _ops;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
  void append_new(int index, int count)  { _index_and_count.append(index); _index_and_count.append(count); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
  void set_index_at(int i, int value)    { _index_and_count.at_put((i << 1),     value); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
  void set_count_at(int i, int value)    { _index_and_count.at_put((i << 1) + 1, value); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
  void verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
  LIR_InsertionBuffer() : _lir(NULL), _index_and_count(8), _ops(8) { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
  // must be called before using the insertion buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
  void init(LIR_List* lir)  { assert(!initialized(), "already initialized"); _lir = lir; _index_and_count.clear(); _ops.clear(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
  bool initialized() const  { return _lir != NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
  // called automatically when the buffer is appended to the LIR_List
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
  void finish()             { _lir = NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
  LIR_List*  lir_list() const             { return _lir; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
  int number_of_insertion_points() const  { return _index_and_count.length() >> 1; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
  int index_at(int i) const               { return _index_and_count.at((i << 1));     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
  int count_at(int i) const               { return _index_and_count.at((i << 1) + 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
  int number_of_ops() const               { return _ops.length(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  LIR_Op* op_at(int i) const              { return _ops.at(i); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
  // append an instruction to the buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
  void append(int index, LIR_Op* op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
  // instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
  void move(int index, LIR_Opr src, LIR_Opr dst, CodeEmitInfo* info = NULL) { append(index, new LIR_Op1(lir_move, src, dst, dst->type(), lir_patch_none, info)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
// LIR_OpVisitState is used for manipulating LIR_Ops in an abstract way.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
// Calling a LIR_Op's visit function with a LIR_OpVisitState causes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
// information about the input, output and temporaries used by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
// op to be recorded.  It also records whether the op has call semantics
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
// and also records all the CodeEmitInfos used by this op.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
class LIR_OpVisitState: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
  typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
  enum {
4646
e0683487dbe5 6879943: CTW failure jdk6_18/hotspot/src/share/vm/c1/c1_LIR.hpp:2029
never
parents: 3800
diff changeset
  2171
    maxNumberOfOperands = 16,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
    maxNumberOfInfos = 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
  LIR_Op*          _op;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
  // optimization: the operands and infos are not stored in a variable-length
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
  //               list, but in a fixed-size array to save time of size checks and resizing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
  int              _oprs_len[numModes];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
  LIR_Opr*         _oprs_new[numModes][maxNumberOfOperands];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
  int _info_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
  CodeEmitInfo*    _info_new[maxNumberOfInfos];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
  bool             _has_call;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
  bool             _has_slow_case;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
  // only include register operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
  // addresses are decomposed to the base and index registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
  // constants and stack operands are ignored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
  void append(LIR_Opr& opr, OprMode mode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
    assert(opr->is_valid(), "should not call this otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
    assert(mode >= 0 && mode < numModes, "bad mode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
    if (opr->is_register()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
       assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
      _oprs_new[mode][_oprs_len[mode]++] = &opr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
    } else if (opr->is_pointer()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
      LIR_Address* address = opr->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
      if (address != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
        // special handling for addresses: add base and index register of the address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
        // both are always input operands!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
        if (address->_base->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
          assert(address->_base->is_register(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
          assert(_oprs_len[inputMode] < maxNumberOfOperands, "array overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
          _oprs_new[inputMode][_oprs_len[inputMode]++] = &address->_base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
        if (address->_index->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
          assert(address->_index->is_register(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
          assert(_oprs_len[inputMode] < maxNumberOfOperands, "array overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
          _oprs_new[inputMode][_oprs_len[inputMode]++] = &address->_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
        assert(opr->is_constant(), "constant operands are not processed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
      assert(opr->is_stack(), "stack operands are not processed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
  void append(CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
    assert(info != NULL, "should not call this otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
    assert(_info_len < maxNumberOfInfos, "array overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
    _info_new[_info_len++] = info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
  LIR_OpVisitState()         { reset(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
  LIR_Op* op() const         { return _op; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
  void set_op(LIR_Op* op)    { reset(); _op = op; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  bool has_call() const      { return _has_call; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
  bool has_slow_case() const { return _has_slow_case; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
  void reset() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
    _op = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
    _has_call = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
    _has_slow_case = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
    _oprs_len[inputMode] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
    _oprs_len[tempMode] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
    _oprs_len[outputMode] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
    _info_len = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  int opr_count(OprMode mode) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
    assert(mode >= 0 && mode < numModes, "bad mode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
    return _oprs_len[mode];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
  LIR_Opr opr_at(OprMode mode, int index) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
    assert(mode >= 0 && mode < numModes, "bad mode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
    assert(index >= 0 && index < _oprs_len[mode], "index out of bound");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
    return *_oprs_new[mode][index];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
  void set_opr_at(OprMode mode, int index, LIR_Opr opr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
    assert(mode >= 0 && mode < numModes, "bad mode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
    assert(index >= 0 && index < _oprs_len[mode], "index out of bound");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
    *_oprs_new[mode][index] = opr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
  int info_count() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
    return _info_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
  CodeEmitInfo* info_at(int index) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
    assert(index < _info_len, "index out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
    return _info_new[index];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
  XHandlers* all_xhandler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  // collects all register operands of the instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
  void visit(LIR_Op* op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
#if ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  // check that an operation has no operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  bool no_operands(LIR_Op* op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
  // LIR_Op visitor functions use these to fill in the state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  void do_input(LIR_Opr& opr)             { append(opr, LIR_OpVisitState::inputMode); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  void do_output(LIR_Opr& opr)            { append(opr, LIR_OpVisitState::outputMode); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
  void do_temp(LIR_Opr& opr)              { append(opr, LIR_OpVisitState::tempMode); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  void do_info(CodeEmitInfo* info)        { append(info); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
  void do_stub(CodeStub* stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
  void do_call()                          { _has_call = true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  void do_slow_case()                     { _has_slow_case = true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
  void do_slow_case(CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
    _has_slow_case = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
    append(info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
inline LIR_Opr LIR_OprDesc::illegalOpr()   { return LIR_OprFact::illegalOpr; };
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6742
diff changeset
  2304
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6742
diff changeset
  2305
#endif // SHARE_VM_C1_C1_LIR_HPP