src/share/vm/c1/c1_LIR.hpp

Tue, 04 Sep 2018 21:25:12 +0800

author
aoqi
date
Tue, 04 Sep 2018 21:25:12 +0800
changeset 9228
617b86d17edb
parent 9157
2966b0be4027
permissions
-rw-r--r--

#7517 mRegP match a0_RegP

aoqi@0 1 /*
dlong@7598 2 * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@1 25 /*
aoqi@8863 26 * This file has been modified by Loongson Technology in 2018. These
aoqi@8863 27 * modifications are Copyright (c) 2018 Loongson Technology, and are made
aoqi@1 28 * available on the same license terms set forth above.
aoqi@1 29 */
aoqi@0 30 #ifndef SHARE_VM_C1_C1_LIR_HPP
aoqi@0 31 #define SHARE_VM_C1_C1_LIR_HPP
aoqi@0 32
dlong@7598 33 #include "c1/c1_Defs.hpp"
aoqi@0 34 #include "c1/c1_ValueType.hpp"
aoqi@0 35 #include "oops/method.hpp"
aoqi@0 36
aoqi@0 37 class BlockBegin;
aoqi@0 38 class BlockList;
aoqi@0 39 class LIR_Assembler;
aoqi@0 40 class CodeEmitInfo;
aoqi@0 41 class CodeStub;
aoqi@0 42 class CodeStubList;
aoqi@0 43 class ArrayCopyStub;
aoqi@0 44 class LIR_Op;
aoqi@0 45 class ciType;
aoqi@0 46 class ValueType;
aoqi@0 47 class LIR_OpVisitState;
aoqi@0 48 class FpuStackSim;
aoqi@0 49
aoqi@0 50 //---------------------------------------------------------------------
aoqi@0 51 // LIR Operands
aoqi@0 52 // LIR_OprDesc
aoqi@0 53 // LIR_OprPtr
aoqi@0 54 // LIR_Const
aoqi@0 55 // LIR_Address
aoqi@0 56 //---------------------------------------------------------------------
aoqi@0 57 class LIR_OprDesc;
aoqi@0 58 class LIR_OprPtr;
aoqi@0 59 class LIR_Const;
aoqi@0 60 class LIR_Address;
aoqi@0 61 class LIR_OprVisitor;
aoqi@0 62
aoqi@0 63
aoqi@0 64 typedef LIR_OprDesc* LIR_Opr;
aoqi@0 65 typedef int RegNr;
aoqi@0 66
aoqi@0 67 define_array(LIR_OprArray, LIR_Opr)
aoqi@0 68 define_stack(LIR_OprList, LIR_OprArray)
aoqi@0 69
aoqi@0 70 define_array(LIR_OprRefArray, LIR_Opr*)
aoqi@0 71 define_stack(LIR_OprRefList, LIR_OprRefArray)
aoqi@0 72
aoqi@0 73 define_array(CodeEmitInfoArray, CodeEmitInfo*)
aoqi@0 74 define_stack(CodeEmitInfoList, CodeEmitInfoArray)
aoqi@0 75
aoqi@0 76 define_array(LIR_OpArray, LIR_Op*)
aoqi@0 77 define_stack(LIR_OpList, LIR_OpArray)
aoqi@0 78
aoqi@0 79 // define LIR_OprPtr early so LIR_OprDesc can refer to it
aoqi@0 80 class LIR_OprPtr: public CompilationResourceObj {
aoqi@0 81 public:
aoqi@0 82 bool is_oop_pointer() const { return (type() == T_OBJECT); }
aoqi@0 83 bool is_float_kind() const { BasicType t = type(); return (t == T_FLOAT) || (t == T_DOUBLE); }
aoqi@0 84
aoqi@0 85 virtual LIR_Const* as_constant() { return NULL; }
aoqi@0 86 virtual LIR_Address* as_address() { return NULL; }
aoqi@0 87 virtual BasicType type() const = 0;
aoqi@0 88 virtual void print_value_on(outputStream* out) const = 0;
aoqi@0 89 };
aoqi@0 90
aoqi@0 91
aoqi@0 92
aoqi@0 93 // LIR constants
aoqi@0 94 class LIR_Const: public LIR_OprPtr {
aoqi@0 95 private:
aoqi@0 96 JavaValue _value;
aoqi@0 97
aoqi@0 98 void type_check(BasicType t) const { assert(type() == t, "type check"); }
aoqi@0 99 void type_check(BasicType t1, BasicType t2) const { assert(type() == t1 || type() == t2, "type check"); }
aoqi@0 100 void type_check(BasicType t1, BasicType t2, BasicType t3) const { assert(type() == t1 || type() == t2 || type() == t3, "type check"); }
aoqi@0 101
aoqi@0 102 public:
aoqi@0 103 LIR_Const(jint i, bool is_address=false) { _value.set_type(is_address?T_ADDRESS:T_INT); _value.set_jint(i); }
aoqi@0 104 LIR_Const(jlong l) { _value.set_type(T_LONG); _value.set_jlong(l); }
aoqi@0 105 LIR_Const(jfloat f) { _value.set_type(T_FLOAT); _value.set_jfloat(f); }
aoqi@0 106 LIR_Const(jdouble d) { _value.set_type(T_DOUBLE); _value.set_jdouble(d); }
aoqi@0 107 LIR_Const(jobject o) { _value.set_type(T_OBJECT); _value.set_jobject(o); }
aoqi@0 108 LIR_Const(void* p) {
aoqi@0 109 #ifdef _LP64
aoqi@0 110 assert(sizeof(jlong) >= sizeof(p), "too small");;
aoqi@0 111 _value.set_type(T_LONG); _value.set_jlong((jlong)p);
aoqi@0 112 #else
aoqi@0 113 assert(sizeof(jint) >= sizeof(p), "too small");;
aoqi@0 114 _value.set_type(T_INT); _value.set_jint((jint)p);
aoqi@0 115 #endif
aoqi@0 116 }
aoqi@0 117 LIR_Const(Metadata* m) {
aoqi@0 118 _value.set_type(T_METADATA);
aoqi@0 119 #ifdef _LP64
aoqi@0 120 _value.set_jlong((jlong)m);
aoqi@0 121 #else
aoqi@0 122 _value.set_jint((jint)m);
aoqi@0 123 #endif // _LP64
aoqi@0 124 }
aoqi@0 125
aoqi@0 126 virtual BasicType type() const { return _value.get_type(); }
aoqi@0 127 virtual LIR_Const* as_constant() { return this; }
aoqi@0 128
aoqi@0 129 jint as_jint() const { type_check(T_INT, T_ADDRESS); return _value.get_jint(); }
aoqi@0 130 jlong as_jlong() const { type_check(T_LONG ); return _value.get_jlong(); }
aoqi@0 131 jfloat as_jfloat() const { type_check(T_FLOAT ); return _value.get_jfloat(); }
aoqi@0 132 jdouble as_jdouble() const { type_check(T_DOUBLE); return _value.get_jdouble(); }
aoqi@0 133 jobject as_jobject() const { type_check(T_OBJECT); return _value.get_jobject(); }
aoqi@0 134 jint as_jint_lo() const { type_check(T_LONG ); return low(_value.get_jlong()); }
aoqi@0 135 jint as_jint_hi() const { type_check(T_LONG ); return high(_value.get_jlong()); }
aoqi@0 136
aoqi@0 137 #ifdef _LP64
aoqi@0 138 address as_pointer() const { type_check(T_LONG ); return (address)_value.get_jlong(); }
aoqi@0 139 Metadata* as_metadata() const { type_check(T_METADATA); return (Metadata*)_value.get_jlong(); }
aoqi@0 140 #else
aoqi@0 141 address as_pointer() const { type_check(T_INT ); return (address)_value.get_jint(); }
aoqi@0 142 Metadata* as_metadata() const { type_check(T_METADATA); return (Metadata*)_value.get_jint(); }
aoqi@0 143 #endif
aoqi@0 144
aoqi@0 145
aoqi@0 146 jint as_jint_bits() const { type_check(T_FLOAT, T_INT, T_ADDRESS); return _value.get_jint(); }
aoqi@0 147 jint as_jint_lo_bits() const {
aoqi@0 148 if (type() == T_DOUBLE) {
aoqi@0 149 return low(jlong_cast(_value.get_jdouble()));
aoqi@0 150 } else {
aoqi@0 151 return as_jint_lo();
aoqi@0 152 }
aoqi@0 153 }
aoqi@0 154 jint as_jint_hi_bits() const {
aoqi@0 155 if (type() == T_DOUBLE) {
aoqi@0 156 return high(jlong_cast(_value.get_jdouble()));
aoqi@0 157 } else {
aoqi@0 158 return as_jint_hi();
aoqi@0 159 }
aoqi@0 160 }
aoqi@0 161 jlong as_jlong_bits() const {
aoqi@0 162 if (type() == T_DOUBLE) {
aoqi@0 163 return jlong_cast(_value.get_jdouble());
aoqi@0 164 } else {
aoqi@0 165 return as_jlong();
aoqi@0 166 }
aoqi@0 167 }
aoqi@0 168
aoqi@0 169 virtual void print_value_on(outputStream* out) const PRODUCT_RETURN;
aoqi@0 170
aoqi@0 171
aoqi@0 172 bool is_zero_float() {
aoqi@0 173 jfloat f = as_jfloat();
aoqi@0 174 jfloat ok = 0.0f;
aoqi@0 175 return jint_cast(f) == jint_cast(ok);
aoqi@0 176 }
aoqi@0 177
aoqi@0 178 bool is_one_float() {
aoqi@0 179 jfloat f = as_jfloat();
aoqi@0 180 return !g_isnan(f) && g_isfinite(f) && f == 1.0;
aoqi@0 181 }
aoqi@0 182
aoqi@0 183 bool is_zero_double() {
aoqi@0 184 jdouble d = as_jdouble();
aoqi@0 185 jdouble ok = 0.0;
aoqi@0 186 return jlong_cast(d) == jlong_cast(ok);
aoqi@0 187 }
aoqi@0 188
aoqi@0 189 bool is_one_double() {
aoqi@0 190 jdouble d = as_jdouble();
aoqi@0 191 return !g_isnan(d) && g_isfinite(d) && d == 1.0;
aoqi@0 192 }
aoqi@0 193 };
aoqi@0 194
aoqi@0 195
aoqi@0 196 //---------------------LIR Operand descriptor------------------------------------
aoqi@0 197 //
aoqi@0 198 // The class LIR_OprDesc represents a LIR instruction operand;
aoqi@0 199 // it can be a register (ALU/FPU), stack location or a constant;
aoqi@0 200 // Constants and addresses are represented as resource area allocated
aoqi@0 201 // structures (see above).
aoqi@0 202 // Registers and stack locations are inlined into the this pointer
aoqi@0 203 // (see value function).
aoqi@0 204
aoqi@0 205 class LIR_OprDesc: public CompilationResourceObj {
aoqi@0 206 public:
aoqi@0 207 // value structure:
aoqi@0 208 // data opr-type opr-kind
aoqi@0 209 // +--------------+-------+-------+
aoqi@0 210 // [max...........|7 6 5 4|3 2 1 0]
aoqi@0 211 // ^
aoqi@0 212 // is_pointer bit
aoqi@0 213 //
aoqi@0 214 // lowest bit cleared, means it is a structure pointer
aoqi@0 215 // we need 4 bits to represent types
aoqi@0 216
aoqi@0 217 private:
aoqi@0 218 friend class LIR_OprFact;
aoqi@0 219
aoqi@0 220 // Conversion
aoqi@0 221 intptr_t value() const { return (intptr_t) this; }
aoqi@0 222
aoqi@0 223 bool check_value_mask(intptr_t mask, intptr_t masked_value) const {
aoqi@0 224 return (value() & mask) == masked_value;
aoqi@0 225 }
aoqi@0 226
aoqi@0 227 enum OprKind {
aoqi@0 228 pointer_value = 0
aoqi@0 229 , stack_value = 1
aoqi@0 230 , cpu_register = 3
aoqi@0 231 , fpu_register = 5
aoqi@0 232 , illegal_value = 7
aoqi@0 233 };
aoqi@0 234
aoqi@0 235 enum OprBits {
aoqi@0 236 pointer_bits = 1
aoqi@0 237 , kind_bits = 3
aoqi@0 238 , type_bits = 4
aoqi@0 239 , size_bits = 2
aoqi@0 240 , destroys_bits = 1
aoqi@0 241 , virtual_bits = 1
aoqi@0 242 , is_xmm_bits = 1
aoqi@0 243 , last_use_bits = 1
aoqi@0 244 , is_fpu_stack_offset_bits = 1 // used in assertion checking on x86 for FPU stack slot allocation
aoqi@0 245 , non_data_bits = kind_bits + type_bits + size_bits + destroys_bits + last_use_bits +
aoqi@0 246 is_fpu_stack_offset_bits + virtual_bits + is_xmm_bits
aoqi@0 247 , data_bits = BitsPerInt - non_data_bits
aoqi@0 248 , reg_bits = data_bits / 2 // for two registers in one value encoding
aoqi@0 249 };
aoqi@0 250
aoqi@0 251 enum OprShift {
aoqi@0 252 kind_shift = 0
aoqi@0 253 , type_shift = kind_shift + kind_bits
aoqi@0 254 , size_shift = type_shift + type_bits
aoqi@0 255 , destroys_shift = size_shift + size_bits
aoqi@0 256 , last_use_shift = destroys_shift + destroys_bits
aoqi@0 257 , is_fpu_stack_offset_shift = last_use_shift + last_use_bits
aoqi@0 258 , virtual_shift = is_fpu_stack_offset_shift + is_fpu_stack_offset_bits
aoqi@0 259 , is_xmm_shift = virtual_shift + virtual_bits
aoqi@0 260 , data_shift = is_xmm_shift + is_xmm_bits
aoqi@0 261 , reg1_shift = data_shift
aoqi@0 262 , reg2_shift = data_shift + reg_bits
aoqi@0 263
aoqi@0 264 };
aoqi@0 265
aoqi@0 266 enum OprSize {
aoqi@0 267 single_size = 0 << size_shift
aoqi@0 268 , double_size = 1 << size_shift
aoqi@0 269 };
aoqi@0 270
aoqi@0 271 enum OprMask {
aoqi@0 272 kind_mask = right_n_bits(kind_bits)
aoqi@0 273 , type_mask = right_n_bits(type_bits) << type_shift
aoqi@0 274 , size_mask = right_n_bits(size_bits) << size_shift
aoqi@0 275 , last_use_mask = right_n_bits(last_use_bits) << last_use_shift
aoqi@0 276 , is_fpu_stack_offset_mask = right_n_bits(is_fpu_stack_offset_bits) << is_fpu_stack_offset_shift
aoqi@0 277 , virtual_mask = right_n_bits(virtual_bits) << virtual_shift
aoqi@0 278 , is_xmm_mask = right_n_bits(is_xmm_bits) << is_xmm_shift
aoqi@0 279 , pointer_mask = right_n_bits(pointer_bits)
aoqi@0 280 , lower_reg_mask = right_n_bits(reg_bits)
aoqi@0 281 , no_type_mask = (int)(~(type_mask | last_use_mask | is_fpu_stack_offset_mask))
aoqi@0 282 };
aoqi@0 283
aoqi@0 284 uintptr_t data() const { return value() >> data_shift; }
aoqi@0 285 int lo_reg_half() const { return data() & lower_reg_mask; }
aoqi@0 286 int hi_reg_half() const { return (data() >> reg_bits) & lower_reg_mask; }
aoqi@0 287 OprKind kind_field() const { return (OprKind)(value() & kind_mask); }
aoqi@0 288 OprSize size_field() const { return (OprSize)(value() & size_mask); }
aoqi@0 289
aoqi@0 290 static char type_char(BasicType t);
aoqi@0 291
aoqi@0 292 public:
aoqi@0 293 enum {
aoqi@0 294 vreg_base = ConcreteRegisterImpl::number_of_registers,
aoqi@0 295 vreg_max = (1 << data_bits) - 1
aoqi@0 296 };
aoqi@0 297
aoqi@0 298 static inline LIR_Opr illegalOpr();
aoqi@0 299
aoqi@0 300 enum OprType {
aoqi@0 301 unknown_type = 0 << type_shift // means: not set (catch uninitialized types)
aoqi@0 302 , int_type = 1 << type_shift
aoqi@0 303 , long_type = 2 << type_shift
aoqi@0 304 , object_type = 3 << type_shift
aoqi@0 305 , address_type = 4 << type_shift
aoqi@0 306 , float_type = 5 << type_shift
aoqi@0 307 , double_type = 6 << type_shift
aoqi@0 308 , metadata_type = 7 << type_shift
aoqi@0 309 };
aoqi@0 310 friend OprType as_OprType(BasicType t);
aoqi@0 311 friend BasicType as_BasicType(OprType t);
aoqi@0 312
aoqi@0 313 OprType type_field_valid() const { assert(is_register() || is_stack(), "should not be called otherwise"); return (OprType)(value() & type_mask); }
aoqi@0 314 OprType type_field() const { return is_illegal() ? unknown_type : (OprType)(value() & type_mask); }
aoqi@0 315
aoqi@0 316 static OprSize size_for(BasicType t) {
aoqi@0 317 switch (t) {
aoqi@0 318 case T_LONG:
aoqi@0 319 case T_DOUBLE:
aoqi@0 320 return double_size;
aoqi@0 321 break;
aoqi@0 322
aoqi@0 323 case T_FLOAT:
aoqi@0 324 case T_BOOLEAN:
aoqi@0 325 case T_CHAR:
aoqi@0 326 case T_BYTE:
aoqi@0 327 case T_SHORT:
aoqi@0 328 case T_INT:
aoqi@0 329 case T_ADDRESS:
aoqi@0 330 case T_OBJECT:
aoqi@0 331 case T_ARRAY:
aoqi@0 332 case T_METADATA:
aoqi@0 333 return single_size;
aoqi@0 334 break;
aoqi@0 335
aoqi@0 336 default:
aoqi@0 337 ShouldNotReachHere();
aoqi@0 338 return single_size;
aoqi@0 339 }
aoqi@0 340 }
aoqi@0 341
aoqi@0 342
aoqi@0 343 void validate_type() const PRODUCT_RETURN;
aoqi@0 344
aoqi@0 345 BasicType type() const {
aoqi@0 346 if (is_pointer()) {
aoqi@0 347 return pointer()->type();
aoqi@0 348 }
aoqi@0 349 return as_BasicType(type_field());
aoqi@0 350 }
aoqi@0 351
aoqi@0 352
aoqi@0 353 ValueType* value_type() const { return as_ValueType(type()); }
aoqi@0 354
aoqi@0 355 char type_char() const { return type_char((is_pointer()) ? pointer()->type() : type()); }
aoqi@0 356
aoqi@0 357 bool is_equal(LIR_Opr opr) const { return this == opr; }
aoqi@0 358 // checks whether types are same
aoqi@0 359 bool is_same_type(LIR_Opr opr) const {
aoqi@0 360 assert(type_field() != unknown_type &&
aoqi@0 361 opr->type_field() != unknown_type, "shouldn't see unknown_type");
aoqi@0 362 return type_field() == opr->type_field();
aoqi@0 363 }
fujie@9143 364 #ifdef MIPS
fujie@9143 365 bool is_same_register(LIR_Opr opr) const {
fujie@9143 366 #else
aoqi@0 367 bool is_same_register(LIR_Opr opr) {
fujie@9143 368 #endif
aoqi@0 369 return (is_register() && opr->is_register() &&
aoqi@0 370 kind_field() == opr->kind_field() &&
aoqi@0 371 (value() & no_type_mask) == (opr->value() & no_type_mask));
aoqi@0 372 }
aoqi@0 373
aoqi@0 374 bool is_pointer() const { return check_value_mask(pointer_mask, pointer_value); }
aoqi@0 375 bool is_illegal() const { return kind_field() == illegal_value; }
aoqi@0 376 bool is_valid() const { return kind_field() != illegal_value; }
aoqi@0 377
aoqi@0 378 bool is_register() const { return is_cpu_register() || is_fpu_register(); }
aoqi@0 379 bool is_virtual() const { return is_virtual_cpu() || is_virtual_fpu(); }
aoqi@0 380
aoqi@0 381 bool is_constant() const { return is_pointer() && pointer()->as_constant() != NULL; }
aoqi@0 382 bool is_address() const { return is_pointer() && pointer()->as_address() != NULL; }
aoqi@0 383
aoqi@0 384 bool is_float_kind() const { return is_pointer() ? pointer()->is_float_kind() : (kind_field() == fpu_register); }
aoqi@0 385 bool is_oop() const;
aoqi@0 386
fujie@9143 387 #ifdef MIPS
fujie@9143 388 bool has_common_register(LIR_Opr opr) const;
fujie@9143 389 #endif
aoqi@0 390 // semantic for fpu- and xmm-registers:
aoqi@0 391 // * is_float and is_double return true for xmm_registers
aoqi@0 392 // (so is_single_fpu and is_single_xmm are true)
aoqi@0 393 // * So you must always check for is_???_xmm prior to is_???_fpu to
aoqi@0 394 // distinguish between fpu- and xmm-registers
aoqi@0 395
aoqi@0 396 bool is_stack() const { validate_type(); return check_value_mask(kind_mask, stack_value); }
aoqi@0 397 bool is_single_stack() const { validate_type(); return check_value_mask(kind_mask | size_mask, stack_value | single_size); }
aoqi@0 398 bool is_double_stack() const { validate_type(); return check_value_mask(kind_mask | size_mask, stack_value | double_size); }
aoqi@0 399
aoqi@0 400 bool is_cpu_register() const { validate_type(); return check_value_mask(kind_mask, cpu_register); }
aoqi@0 401 bool is_virtual_cpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, cpu_register | virtual_mask); }
aoqi@0 402 bool is_fixed_cpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, cpu_register); }
aoqi@0 403 bool is_single_cpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, cpu_register | single_size); }
aoqi@0 404 bool is_double_cpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, cpu_register | double_size); }
aoqi@0 405
aoqi@0 406 bool is_fpu_register() const { validate_type(); return check_value_mask(kind_mask, fpu_register); }
aoqi@0 407 bool is_virtual_fpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, fpu_register | virtual_mask); }
aoqi@0 408 bool is_fixed_fpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, fpu_register); }
aoqi@0 409 bool is_single_fpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, fpu_register | single_size); }
aoqi@0 410 bool is_double_fpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, fpu_register | double_size); }
aoqi@0 411
aoqi@0 412 bool is_xmm_register() const { validate_type(); return check_value_mask(kind_mask | is_xmm_mask, fpu_register | is_xmm_mask); }
aoqi@0 413 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); }
aoqi@0 414 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); }
aoqi@0 415
aoqi@0 416 // fast accessor functions for special bits that do not work for pointers
aoqi@0 417 // (in this functions, the check for is_pointer() is omitted)
aoqi@0 418 bool is_single_word() const { assert(is_register() || is_stack(), "type check"); return check_value_mask(size_mask, single_size); }
aoqi@0 419 bool is_double_word() const { assert(is_register() || is_stack(), "type check"); return check_value_mask(size_mask, double_size); }
aoqi@0 420 bool is_virtual_register() const { assert(is_register(), "type check"); return check_value_mask(virtual_mask, virtual_mask); }
aoqi@0 421 bool is_oop_register() const { assert(is_register() || is_stack(), "type check"); return type_field_valid() == object_type; }
aoqi@0 422 BasicType type_register() const { assert(is_register() || is_stack(), "type check"); return as_BasicType(type_field_valid()); }
aoqi@0 423
aoqi@0 424 bool is_last_use() const { assert(is_register(), "only works for registers"); return (value() & last_use_mask) != 0; }
aoqi@0 425 bool is_fpu_stack_offset() const { assert(is_register(), "only works for registers"); return (value() & is_fpu_stack_offset_mask) != 0; }
aoqi@0 426 LIR_Opr make_last_use() { assert(is_register(), "only works for registers"); return (LIR_Opr)(value() | last_use_mask); }
aoqi@0 427 LIR_Opr make_fpu_stack_offset() { assert(is_register(), "only works for registers"); return (LIR_Opr)(value() | is_fpu_stack_offset_mask); }
aoqi@0 428
aoqi@0 429
aoqi@0 430 int single_stack_ix() const { assert(is_single_stack() && !is_virtual(), "type check"); return (int)data(); }
aoqi@0 431 int double_stack_ix() const { assert(is_double_stack() && !is_virtual(), "type check"); return (int)data(); }
aoqi@0 432 RegNr cpu_regnr() const { assert(is_single_cpu() && !is_virtual(), "type check"); return (RegNr)data(); }
aoqi@0 433 RegNr cpu_regnrLo() const { assert(is_double_cpu() && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
aoqi@0 434 RegNr cpu_regnrHi() const { assert(is_double_cpu() && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
aoqi@0 435 RegNr fpu_regnr() const { assert(is_single_fpu() && !is_virtual(), "type check"); return (RegNr)data(); }
aoqi@0 436 RegNr fpu_regnrLo() const { assert(is_double_fpu() && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
aoqi@0 437 RegNr fpu_regnrHi() const { assert(is_double_fpu() && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
aoqi@0 438 RegNr xmm_regnr() const { assert(is_single_xmm() && !is_virtual(), "type check"); return (RegNr)data(); }
aoqi@0 439 RegNr xmm_regnrLo() const { assert(is_double_xmm() && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
aoqi@0 440 RegNr xmm_regnrHi() const { assert(is_double_xmm() && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
aoqi@0 441 int vreg_number() const { assert(is_virtual(), "type check"); return (RegNr)data(); }
aoqi@0 442
aoqi@0 443 LIR_OprPtr* pointer() const { assert(is_pointer(), "type check"); return (LIR_OprPtr*)this; }
aoqi@0 444 LIR_Const* as_constant_ptr() const { return pointer()->as_constant(); }
aoqi@0 445 LIR_Address* as_address_ptr() const { return pointer()->as_address(); }
aoqi@0 446
aoqi@0 447 Register as_register() const;
aoqi@0 448 Register as_register_lo() const;
aoqi@0 449 Register as_register_hi() const;
aoqi@0 450
aoqi@0 451 Register as_pointer_register() {
aoqi@0 452 #ifdef _LP64
aoqi@0 453 if (is_double_cpu()) {
aoqi@0 454 assert(as_register_lo() == as_register_hi(), "should be a single register");
aoqi@0 455 return as_register_lo();
aoqi@0 456 }
aoqi@0 457 #endif
aoqi@0 458 return as_register();
aoqi@0 459 }
aoqi@0 460
aoqi@0 461 #ifdef X86
aoqi@0 462 XMMRegister as_xmm_float_reg() const;
aoqi@0 463 XMMRegister as_xmm_double_reg() const;
aoqi@0 464 // for compatibility with RInfo
aoqi@0 465 int fpu () const { return lo_reg_half(); }
aoqi@0 466 #endif // X86
fujie@9138 467 #if defined(SPARC) || defined(ARM) || defined(PPC) || defined(MIPS)
aoqi@0 468 FloatRegister as_float_reg () const;
aoqi@0 469 FloatRegister as_double_reg () const;
aoqi@0 470 #endif
aoqi@0 471
aoqi@0 472 jint as_jint() const { return as_constant_ptr()->as_jint(); }
aoqi@0 473 jlong as_jlong() const { return as_constant_ptr()->as_jlong(); }
aoqi@0 474 jfloat as_jfloat() const { return as_constant_ptr()->as_jfloat(); }
aoqi@0 475 jdouble as_jdouble() const { return as_constant_ptr()->as_jdouble(); }
aoqi@0 476 jobject as_jobject() const { return as_constant_ptr()->as_jobject(); }
aoqi@0 477
aoqi@0 478 void print() const PRODUCT_RETURN;
aoqi@0 479 void print(outputStream* out) const PRODUCT_RETURN;
aoqi@0 480 };
aoqi@0 481
aoqi@0 482
aoqi@0 483 inline LIR_OprDesc::OprType as_OprType(BasicType type) {
aoqi@0 484 switch (type) {
aoqi@0 485 case T_INT: return LIR_OprDesc::int_type;
aoqi@0 486 case T_LONG: return LIR_OprDesc::long_type;
aoqi@0 487 case T_FLOAT: return LIR_OprDesc::float_type;
aoqi@0 488 case T_DOUBLE: return LIR_OprDesc::double_type;
aoqi@0 489 case T_OBJECT:
aoqi@0 490 case T_ARRAY: return LIR_OprDesc::object_type;
aoqi@0 491 case T_ADDRESS: return LIR_OprDesc::address_type;
aoqi@0 492 case T_METADATA: return LIR_OprDesc::metadata_type;
aoqi@0 493 case T_ILLEGAL: // fall through
aoqi@0 494 default: ShouldNotReachHere(); return LIR_OprDesc::unknown_type;
aoqi@0 495 }
aoqi@0 496 }
aoqi@0 497
aoqi@0 498 inline BasicType as_BasicType(LIR_OprDesc::OprType t) {
aoqi@0 499 switch (t) {
aoqi@0 500 case LIR_OprDesc::int_type: return T_INT;
aoqi@0 501 case LIR_OprDesc::long_type: return T_LONG;
aoqi@0 502 case LIR_OprDesc::float_type: return T_FLOAT;
aoqi@0 503 case LIR_OprDesc::double_type: return T_DOUBLE;
aoqi@0 504 case LIR_OprDesc::object_type: return T_OBJECT;
aoqi@0 505 case LIR_OprDesc::address_type: return T_ADDRESS;
aoqi@0 506 case LIR_OprDesc::metadata_type:return T_METADATA;
aoqi@0 507 case LIR_OprDesc::unknown_type: // fall through
aoqi@0 508 default: ShouldNotReachHere(); return T_ILLEGAL;
aoqi@0 509 }
aoqi@0 510 }
aoqi@0 511
aoqi@0 512
aoqi@0 513 // LIR_Address
aoqi@0 514 class LIR_Address: public LIR_OprPtr {
aoqi@0 515 friend class LIR_OpVisitState;
aoqi@0 516
aoqi@0 517 public:
aoqi@0 518 // NOTE: currently these must be the log2 of the scale factor (and
aoqi@0 519 // must also be equivalent to the ScaleFactor enum in
aoqi@0 520 // assembler_i486.hpp)
aoqi@0 521 enum Scale {
aoqi@0 522 times_1 = 0,
aoqi@0 523 times_2 = 1,
aoqi@0 524 times_4 = 2,
aoqi@0 525 times_8 = 3
aoqi@0 526 };
aoqi@0 527
aoqi@0 528 private:
aoqi@0 529 LIR_Opr _base;
aoqi@0 530 LIR_Opr _index;
aoqi@0 531 Scale _scale;
aoqi@0 532 intx _disp;
aoqi@0 533 BasicType _type;
aoqi@0 534
aoqi@0 535 public:
aoqi@0 536 LIR_Address(LIR_Opr base, LIR_Opr index, BasicType type):
aoqi@0 537 _base(base)
aoqi@0 538 , _index(index)
aoqi@0 539 , _scale(times_1)
aoqi@0 540 , _type(type)
aoqi@0 541 , _disp(0) { verify(); }
aoqi@0 542
fujie@9138 543 #ifndef MIPS
aoqi@0 544 LIR_Address(LIR_Opr base, intx disp, BasicType type):
aoqi@1 545 #else
aoqi@1 546 LIR_Address(LIR_Opr base, int disp, BasicType type):
aoqi@1 547 #endif
aoqi@0 548 _base(base)
aoqi@0 549 , _index(LIR_OprDesc::illegalOpr())
aoqi@0 550 , _scale(times_1)
aoqi@0 551 , _type(type)
aoqi@0 552 , _disp(disp) { verify(); }
aoqi@0 553
aoqi@0 554 LIR_Address(LIR_Opr base, BasicType type):
aoqi@0 555 _base(base)
aoqi@0 556 , _index(LIR_OprDesc::illegalOpr())
aoqi@0 557 , _scale(times_1)
aoqi@0 558 , _type(type)
aoqi@0 559 , _disp(0) { verify(); }
aoqi@0 560
aoqi@0 561 #if defined(X86) || defined(ARM)
aoqi@0 562 LIR_Address(LIR_Opr base, LIR_Opr index, Scale scale, intx disp, BasicType type):
aoqi@0 563 _base(base)
aoqi@0 564 , _index(index)
aoqi@0 565 , _scale(scale)
aoqi@0 566 , _type(type)
aoqi@0 567 , _disp(disp) { verify(); }
aoqi@0 568 #endif // X86 || ARM
aoqi@0 569
aoqi@0 570 LIR_Opr base() const { return _base; }
aoqi@0 571 LIR_Opr index() const { return _index; }
aoqi@0 572 Scale scale() const { return _scale; }
aoqi@0 573 intx disp() const { return _disp; }
aoqi@0 574
aoqi@0 575 bool equals(LIR_Address* other) const { return base() == other->base() && index() == other->index() && disp() == other->disp() && scale() == other->scale(); }
aoqi@0 576
aoqi@0 577 virtual LIR_Address* as_address() { return this; }
aoqi@0 578 virtual BasicType type() const { return _type; }
aoqi@0 579 virtual void print_value_on(outputStream* out) const PRODUCT_RETURN;
aoqi@0 580
dlong@7598 581 void verify0() const PRODUCT_RETURN;
dlong@7598 582 #if defined(LIR_ADDRESS_PD_VERIFY) && !defined(PRODUCT)
dlong@7598 583 void pd_verify() const;
dlong@7598 584 void verify() const { pd_verify(); }
dlong@7598 585 #else
dlong@7598 586 void verify() const { verify0(); }
dlong@7598 587 #endif
aoqi@0 588
aoqi@0 589 static Scale scale(BasicType type);
aoqi@0 590 };
aoqi@0 591
aoqi@0 592
aoqi@0 593 // operand factory
aoqi@0 594 class LIR_OprFact: public AllStatic {
aoqi@0 595 public:
aoqi@0 596
aoqi@0 597 static LIR_Opr illegalOpr;
aoqi@0 598
aoqi@0 599 static LIR_Opr single_cpu(int reg) {
aoqi@0 600 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 601 LIR_OprDesc::int_type |
aoqi@0 602 LIR_OprDesc::cpu_register |
aoqi@0 603 LIR_OprDesc::single_size);
aoqi@0 604 }
aoqi@0 605 static LIR_Opr single_cpu_oop(int reg) {
aoqi@0 606 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 607 LIR_OprDesc::object_type |
aoqi@0 608 LIR_OprDesc::cpu_register |
aoqi@0 609 LIR_OprDesc::single_size);
aoqi@0 610 }
aoqi@0 611 static LIR_Opr single_cpu_address(int reg) {
aoqi@0 612 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 613 LIR_OprDesc::address_type |
aoqi@0 614 LIR_OprDesc::cpu_register |
aoqi@0 615 LIR_OprDesc::single_size);
aoqi@0 616 }
aoqi@0 617 static LIR_Opr single_cpu_metadata(int reg) {
aoqi@0 618 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 619 LIR_OprDesc::metadata_type |
aoqi@0 620 LIR_OprDesc::cpu_register |
aoqi@0 621 LIR_OprDesc::single_size);
aoqi@0 622 }
aoqi@0 623 static LIR_Opr double_cpu(int reg1, int reg2) {
aoqi@0 624 LP64_ONLY(assert(reg1 == reg2, "must be identical"));
aoqi@0 625 return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
aoqi@0 626 (reg2 << LIR_OprDesc::reg2_shift) |
aoqi@0 627 LIR_OprDesc::long_type |
aoqi@0 628 LIR_OprDesc::cpu_register |
aoqi@0 629 LIR_OprDesc::double_size);
aoqi@0 630 }
aoqi@0 631
aoqi@0 632 static LIR_Opr single_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 633 LIR_OprDesc::float_type |
aoqi@0 634 LIR_OprDesc::fpu_register |
aoqi@0 635 LIR_OprDesc::single_size); }
dlong@7598 636 #if defined(C1_LIR_MD_HPP)
dlong@7598 637 # include C1_LIR_MD_HPP
dlong@7598 638 #elif defined(SPARC)
aoqi@0 639 static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
aoqi@0 640 (reg2 << LIR_OprDesc::reg2_shift) |
aoqi@0 641 LIR_OprDesc::double_type |
aoqi@0 642 LIR_OprDesc::fpu_register |
aoqi@0 643 LIR_OprDesc::double_size); }
dlong@7598 644 #elif defined(X86)
aoqi@0 645 static LIR_Opr double_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 646 (reg << LIR_OprDesc::reg2_shift) |
aoqi@0 647 LIR_OprDesc::double_type |
aoqi@0 648 LIR_OprDesc::fpu_register |
aoqi@0 649 LIR_OprDesc::double_size); }
aoqi@0 650
aoqi@0 651 static LIR_Opr single_xmm(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 652 LIR_OprDesc::float_type |
aoqi@0 653 LIR_OprDesc::fpu_register |
aoqi@0 654 LIR_OprDesc::single_size |
aoqi@0 655 LIR_OprDesc::is_xmm_mask); }
aoqi@0 656 static LIR_Opr double_xmm(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 657 (reg << LIR_OprDesc::reg2_shift) |
aoqi@0 658 LIR_OprDesc::double_type |
aoqi@0 659 LIR_OprDesc::fpu_register |
aoqi@0 660 LIR_OprDesc::double_size |
aoqi@0 661 LIR_OprDesc::is_xmm_mask); }
dlong@7598 662 #elif defined(PPC)
aoqi@0 663 static LIR_Opr double_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 664 (reg << LIR_OprDesc::reg2_shift) |
aoqi@0 665 LIR_OprDesc::double_type |
aoqi@0 666 LIR_OprDesc::fpu_register |
aoqi@0 667 LIR_OprDesc::double_size); }
aoqi@0 668 static LIR_Opr single_softfp(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) |
aoqi@0 669 LIR_OprDesc::float_type |
aoqi@0 670 LIR_OprDesc::cpu_register |
aoqi@0 671 LIR_OprDesc::single_size); }
aoqi@0 672 static LIR_Opr double_softfp(int reg1, int reg2) { return (LIR_Opr)((reg2 << LIR_OprDesc::reg1_shift) |
aoqi@0 673 (reg1 << LIR_OprDesc::reg2_shift) |
aoqi@0 674 LIR_OprDesc::double_type |
aoqi@0 675 LIR_OprDesc::cpu_register |
aoqi@0 676 LIR_OprDesc::double_size); }
aoqi@0 677 #endif // PPC
fujie@9138 678 #ifdef MIPS
aoqi@7994 679 static LIR_Opr double_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
aoqi@7994 680 (reg << LIR_OprDesc::reg2_shift) |
aoqi@7994 681 LIR_OprDesc::double_type |
aoqi@7994 682 LIR_OprDesc::fpu_register |
aoqi@7994 683 LIR_OprDesc::double_size); }
aoqi@7994 684 #endif
aoqi@0 685
aoqi@0 686 static LIR_Opr virtual_register(int index, BasicType type) {
aoqi@0 687 LIR_Opr res;
aoqi@0 688 switch (type) {
aoqi@0 689 case T_OBJECT: // fall through
aoqi@0 690 case T_ARRAY:
aoqi@0 691 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 692 LIR_OprDesc::object_type |
aoqi@0 693 LIR_OprDesc::cpu_register |
aoqi@0 694 LIR_OprDesc::single_size |
aoqi@0 695 LIR_OprDesc::virtual_mask);
aoqi@0 696 break;
aoqi@0 697
aoqi@0 698 case T_METADATA:
aoqi@0 699 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 700 LIR_OprDesc::metadata_type|
aoqi@0 701 LIR_OprDesc::cpu_register |
aoqi@0 702 LIR_OprDesc::single_size |
aoqi@0 703 LIR_OprDesc::virtual_mask);
aoqi@0 704 break;
aoqi@0 705
aoqi@0 706 case T_INT:
aoqi@0 707 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 708 LIR_OprDesc::int_type |
aoqi@0 709 LIR_OprDesc::cpu_register |
aoqi@0 710 LIR_OprDesc::single_size |
aoqi@0 711 LIR_OprDesc::virtual_mask);
aoqi@0 712 break;
aoqi@0 713
aoqi@0 714 case T_ADDRESS:
aoqi@0 715 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 716 LIR_OprDesc::address_type |
aoqi@0 717 LIR_OprDesc::cpu_register |
aoqi@0 718 LIR_OprDesc::single_size |
aoqi@0 719 LIR_OprDesc::virtual_mask);
aoqi@0 720 break;
aoqi@0 721
aoqi@0 722 case T_LONG:
aoqi@0 723 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 724 LIR_OprDesc::long_type |
aoqi@0 725 LIR_OprDesc::cpu_register |
aoqi@0 726 LIR_OprDesc::double_size |
aoqi@0 727 LIR_OprDesc::virtual_mask);
aoqi@0 728 break;
aoqi@0 729
aoqi@0 730 #ifdef __SOFTFP__
aoqi@0 731 case T_FLOAT:
aoqi@0 732 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 733 LIR_OprDesc::float_type |
aoqi@0 734 LIR_OprDesc::cpu_register |
aoqi@0 735 LIR_OprDesc::single_size |
aoqi@0 736 LIR_OprDesc::virtual_mask);
aoqi@0 737 break;
aoqi@0 738 case T_DOUBLE:
aoqi@0 739 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 740 LIR_OprDesc::double_type |
aoqi@0 741 LIR_OprDesc::cpu_register |
aoqi@0 742 LIR_OprDesc::double_size |
aoqi@0 743 LIR_OprDesc::virtual_mask);
aoqi@0 744 break;
aoqi@0 745 #else // __SOFTFP__
aoqi@0 746 case T_FLOAT:
aoqi@0 747 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 748 LIR_OprDesc::float_type |
aoqi@0 749 LIR_OprDesc::fpu_register |
aoqi@0 750 LIR_OprDesc::single_size |
aoqi@0 751 LIR_OprDesc::virtual_mask);
aoqi@0 752 break;
aoqi@0 753
aoqi@0 754 case
aoqi@0 755 T_DOUBLE: res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 756 LIR_OprDesc::double_type |
aoqi@0 757 LIR_OprDesc::fpu_register |
aoqi@0 758 LIR_OprDesc::double_size |
aoqi@0 759 LIR_OprDesc::virtual_mask);
aoqi@0 760 break;
aoqi@0 761 #endif // __SOFTFP__
aoqi@0 762 default: ShouldNotReachHere(); res = illegalOpr;
aoqi@0 763 }
aoqi@0 764
aoqi@0 765 #ifdef ASSERT
aoqi@0 766 res->validate_type();
aoqi@0 767 assert(res->vreg_number() == index, "conversion check");
aoqi@0 768 assert(index >= LIR_OprDesc::vreg_base, "must start at vreg_base");
aoqi@0 769 assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big");
aoqi@0 770
aoqi@0 771 // old-style calculation; check if old and new method are equal
aoqi@0 772 LIR_OprDesc::OprType t = as_OprType(type);
aoqi@0 773 #ifdef __SOFTFP__
aoqi@0 774 LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 775 t |
aoqi@0 776 LIR_OprDesc::cpu_register |
aoqi@0 777 LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask);
aoqi@0 778 #else // __SOFTFP__
aoqi@0 779 LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | t |
aoqi@0 780 ((type == T_FLOAT || type == T_DOUBLE) ? LIR_OprDesc::fpu_register : LIR_OprDesc::cpu_register) |
aoqi@0 781 LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask);
aoqi@0 782 assert(res == old_res, "old and new method not equal");
aoqi@0 783 #endif // __SOFTFP__
aoqi@0 784 #endif // ASSERT
aoqi@0 785
aoqi@0 786 return res;
aoqi@0 787 }
aoqi@0 788
aoqi@0 789 // 'index' is computed by FrameMap::local_stack_pos(index); do not use other parameters as
aoqi@0 790 // the index is platform independent; a double stack useing indeces 2 and 3 has always
aoqi@0 791 // index 2.
aoqi@0 792 static LIR_Opr stack(int index, BasicType type) {
aoqi@0 793 LIR_Opr res;
aoqi@0 794 switch (type) {
aoqi@0 795 case T_OBJECT: // fall through
aoqi@0 796 case T_ARRAY:
aoqi@0 797 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 798 LIR_OprDesc::object_type |
aoqi@0 799 LIR_OprDesc::stack_value |
aoqi@0 800 LIR_OprDesc::single_size);
aoqi@0 801 break;
aoqi@0 802
aoqi@0 803 case T_METADATA:
aoqi@0 804 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 805 LIR_OprDesc::metadata_type |
aoqi@0 806 LIR_OprDesc::stack_value |
aoqi@0 807 LIR_OprDesc::single_size);
aoqi@0 808 break;
aoqi@0 809 case T_INT:
aoqi@0 810 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 811 LIR_OprDesc::int_type |
aoqi@0 812 LIR_OprDesc::stack_value |
aoqi@0 813 LIR_OprDesc::single_size);
aoqi@0 814 break;
aoqi@0 815
aoqi@0 816 case T_ADDRESS:
aoqi@0 817 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 818 LIR_OprDesc::address_type |
aoqi@0 819 LIR_OprDesc::stack_value |
aoqi@0 820 LIR_OprDesc::single_size);
aoqi@0 821 break;
aoqi@0 822
aoqi@0 823 case T_LONG:
aoqi@0 824 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 825 LIR_OprDesc::long_type |
aoqi@0 826 LIR_OprDesc::stack_value |
aoqi@0 827 LIR_OprDesc::double_size);
aoqi@0 828 break;
aoqi@0 829
aoqi@0 830 case T_FLOAT:
aoqi@0 831 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 832 LIR_OprDesc::float_type |
aoqi@0 833 LIR_OprDesc::stack_value |
aoqi@0 834 LIR_OprDesc::single_size);
aoqi@0 835 break;
aoqi@0 836 case T_DOUBLE:
aoqi@0 837 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 838 LIR_OprDesc::double_type |
aoqi@0 839 LIR_OprDesc::stack_value |
aoqi@0 840 LIR_OprDesc::double_size);
aoqi@0 841 break;
aoqi@0 842
aoqi@0 843 default: ShouldNotReachHere(); res = illegalOpr;
aoqi@0 844 }
aoqi@0 845
aoqi@0 846 #ifdef ASSERT
aoqi@0 847 assert(index >= 0, "index must be positive");
aoqi@0 848 assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big");
aoqi@0 849
aoqi@0 850 LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
aoqi@0 851 LIR_OprDesc::stack_value |
aoqi@0 852 as_OprType(type) |
aoqi@0 853 LIR_OprDesc::size_for(type));
aoqi@0 854 assert(res == old_res, "old and new method not equal");
aoqi@0 855 #endif
aoqi@0 856
aoqi@0 857 return res;
aoqi@0 858 }
aoqi@0 859
aoqi@0 860 static LIR_Opr intConst(jint i) { return (LIR_Opr)(new LIR_Const(i)); }
aoqi@0 861 static LIR_Opr longConst(jlong l) { return (LIR_Opr)(new LIR_Const(l)); }
aoqi@0 862 static LIR_Opr floatConst(jfloat f) { return (LIR_Opr)(new LIR_Const(f)); }
aoqi@0 863 static LIR_Opr doubleConst(jdouble d) { return (LIR_Opr)(new LIR_Const(d)); }
aoqi@0 864 static LIR_Opr oopConst(jobject o) { return (LIR_Opr)(new LIR_Const(o)); }
aoqi@0 865 static LIR_Opr address(LIR_Address* a) { return (LIR_Opr)a; }
aoqi@0 866 static LIR_Opr intptrConst(void* p) { return (LIR_Opr)(new LIR_Const(p)); }
aoqi@0 867 static LIR_Opr intptrConst(intptr_t v) { return (LIR_Opr)(new LIR_Const((void*)v)); }
aoqi@0 868 static LIR_Opr illegal() { return (LIR_Opr)-1; }
aoqi@0 869 static LIR_Opr addressConst(jint i) { return (LIR_Opr)(new LIR_Const(i, true)); }
aoqi@0 870 static LIR_Opr metadataConst(Metadata* m) { return (LIR_Opr)(new LIR_Const(m)); }
aoqi@0 871
aoqi@0 872 static LIR_Opr value_type(ValueType* type);
aoqi@0 873 static LIR_Opr dummy_value_type(ValueType* type);
aoqi@0 874 };
aoqi@0 875
aoqi@0 876
aoqi@0 877 //-------------------------------------------------------------------------------
aoqi@0 878 // LIR Instructions
aoqi@0 879 //-------------------------------------------------------------------------------
aoqi@0 880 //
aoqi@0 881 // Note:
aoqi@0 882 // - every instruction has a result operand
aoqi@0 883 // - every instruction has an CodeEmitInfo operand (can be revisited later)
aoqi@0 884 // - every instruction has a LIR_OpCode operand
aoqi@0 885 // - LIR_OpN, means an instruction that has N input operands
aoqi@0 886 //
aoqi@0 887 // class hierarchy:
aoqi@0 888 //
aoqi@0 889 class LIR_Op;
aoqi@0 890 class LIR_Op0;
aoqi@0 891 class LIR_OpLabel;
aoqi@0 892 class LIR_Op1;
aoqi@0 893 class LIR_OpBranch;
aoqi@0 894 class LIR_OpConvert;
aoqi@0 895 class LIR_OpAllocObj;
aoqi@0 896 class LIR_OpRoundFP;
aoqi@0 897 class LIR_Op2;
aoqi@0 898 class LIR_OpDelay;
aoqi@0 899 class LIR_Op3;
aoqi@0 900 class LIR_OpAllocArray;
fujie@9157 901 #ifdef MIPS
fujie@9157 902 class LIR_Op4;
fujie@9157 903 #endif
aoqi@0 904 class LIR_OpCall;
aoqi@0 905 class LIR_OpJavaCall;
aoqi@0 906 class LIR_OpRTCall;
aoqi@0 907 class LIR_OpArrayCopy;
aoqi@0 908 class LIR_OpUpdateCRC32;
aoqi@0 909 class LIR_OpLock;
aoqi@0 910 class LIR_OpTypeCheck;
aoqi@0 911 class LIR_OpCompareAndSwap;
aoqi@0 912 class LIR_OpProfileCall;
aoqi@0 913 class LIR_OpProfileType;
aoqi@0 914 #ifdef ASSERT
aoqi@0 915 class LIR_OpAssert;
aoqi@0 916 #endif
aoqi@0 917
aoqi@0 918 // LIR operation codes
aoqi@0 919 enum LIR_Code {
aoqi@0 920 lir_none
aoqi@0 921 , begin_op0
aoqi@0 922 , lir_word_align
aoqi@0 923 , lir_label
aoqi@0 924 , lir_nop
aoqi@0 925 , lir_backwardbranch_target
aoqi@0 926 , lir_std_entry
aoqi@0 927 , lir_osr_entry
aoqi@0 928 , lir_build_frame
aoqi@0 929 , lir_fpop_raw
aoqi@0 930 , lir_24bit_FPU
aoqi@0 931 , lir_reset_FPU
aoqi@0 932 , lir_breakpoint
aoqi@0 933 , lir_rtcall
aoqi@0 934 , lir_membar
aoqi@0 935 , lir_membar_acquire
aoqi@0 936 , lir_membar_release
aoqi@0 937 , lir_membar_loadload
aoqi@0 938 , lir_membar_storestore
aoqi@0 939 , lir_membar_loadstore
aoqi@0 940 , lir_membar_storeload
aoqi@0 941 , lir_get_thread
aoqi@0 942 , end_op0
aoqi@0 943 , begin_op1
aoqi@0 944 , lir_fxch
aoqi@0 945 , lir_fld
aoqi@0 946 , lir_ffree
aoqi@0 947 , lir_push
aoqi@0 948 , lir_pop
aoqi@0 949 , lir_null_check
aoqi@0 950 , lir_return
aoqi@0 951 , lir_leal
aoqi@0 952 , lir_neg
fujie@9138 953 #ifndef MIPS
aoqi@0 954 , lir_branch
aoqi@0 955 , lir_cond_float_branch
aoqi@1 956 #endif
aoqi@0 957 , lir_move
aoqi@0 958 , lir_prefetchr
aoqi@0 959 , lir_prefetchw
aoqi@0 960 , lir_convert
aoqi@0 961 , lir_alloc_object
aoqi@0 962 , lir_monaddr
aoqi@0 963 , lir_roundfp
aoqi@0 964 , lir_safepoint
aoqi@0 965 , lir_pack64
aoqi@0 966 , lir_unpack64
aoqi@0 967 , lir_unwind
aoqi@0 968 , end_op1
aoqi@0 969 , begin_op2
fujie@9138 970 #ifdef MIPS
aoqi@1 971 , lir_branch
aoqi@1 972 , lir_cond_float_branch
aoqi@1 973 , lir_null_check_for_branch
aoqi@1 974 #else
aoqi@0 975 , lir_cmp
aoqi@1 976 #endif
aoqi@0 977 , lir_cmp_l2i
aoqi@0 978 , lir_ucmp_fd2i
aoqi@0 979 , lir_cmp_fd2i
aoqi@0 980 , lir_cmove
aoqi@0 981 , lir_add
aoqi@0 982 , lir_sub
aoqi@0 983 , lir_mul
aoqi@0 984 , lir_mul_strictfp
aoqi@0 985 , lir_div
aoqi@0 986 , lir_div_strictfp
aoqi@0 987 , lir_rem
aoqi@0 988 , lir_sqrt
aoqi@0 989 , lir_abs
aoqi@0 990 , lir_sin
aoqi@0 991 , lir_cos
aoqi@0 992 , lir_tan
aoqi@0 993 , lir_log
aoqi@0 994 , lir_log10
aoqi@0 995 , lir_exp
aoqi@0 996 , lir_pow
aoqi@0 997 , lir_logic_and
aoqi@0 998 , lir_logic_or
aoqi@0 999 , lir_logic_xor
aoqi@0 1000 , lir_shl
aoqi@0 1001 , lir_shr
aoqi@0 1002 , lir_ushr
aoqi@0 1003 , lir_alloc_array
aoqi@0 1004 , lir_throw
aoqi@0 1005 , lir_compare_to
aoqi@0 1006 , lir_xadd
aoqi@0 1007 , lir_xchg
aoqi@0 1008 , end_op2
aoqi@0 1009 , begin_op3
fujie@9138 1010 #ifdef MIPS
aoqi@1 1011 , lir_frem
aoqi@1 1012 #endif
aoqi@0 1013 , lir_idiv
aoqi@0 1014 , lir_irem
aoqi@0 1015 , end_op3
fujie@9157 1016 #ifdef MIPS
fujie@9157 1017 , begin_op4
fujie@9157 1018 , lir_cmove_mips
fujie@9157 1019 , end_op4
fujie@9157 1020 #endif
aoqi@0 1021 , begin_opJavaCall
aoqi@0 1022 , lir_static_call
aoqi@0 1023 , lir_optvirtual_call
aoqi@0 1024 , lir_icvirtual_call
aoqi@0 1025 , lir_virtual_call
aoqi@0 1026 , lir_dynamic_call
aoqi@0 1027 , end_opJavaCall
aoqi@0 1028 , begin_opArrayCopy
aoqi@0 1029 , lir_arraycopy
aoqi@0 1030 , end_opArrayCopy
aoqi@0 1031 , begin_opUpdateCRC32
aoqi@0 1032 , lir_updatecrc32
aoqi@0 1033 , end_opUpdateCRC32
aoqi@0 1034 , begin_opLock
aoqi@0 1035 , lir_lock
aoqi@0 1036 , lir_unlock
aoqi@0 1037 , end_opLock
aoqi@0 1038 , begin_delay_slot
aoqi@0 1039 , lir_delay_slot
aoqi@0 1040 , end_delay_slot
aoqi@0 1041 , begin_opTypeCheck
aoqi@0 1042 , lir_instanceof
aoqi@0 1043 , lir_checkcast
aoqi@0 1044 , lir_store_check
aoqi@0 1045 , end_opTypeCheck
aoqi@0 1046 , begin_opCompareAndSwap
aoqi@0 1047 , lir_cas_long
aoqi@0 1048 , lir_cas_obj
aoqi@0 1049 , lir_cas_int
aoqi@0 1050 , end_opCompareAndSwap
aoqi@0 1051 , begin_opMDOProfile
aoqi@0 1052 , lir_profile_call
aoqi@0 1053 , lir_profile_type
aoqi@0 1054 , end_opMDOProfile
aoqi@0 1055 , begin_opAssert
aoqi@0 1056 , lir_assert
aoqi@0 1057 , end_opAssert
aoqi@0 1058 };
aoqi@0 1059
aoqi@0 1060
aoqi@0 1061 enum LIR_Condition {
aoqi@0 1062 lir_cond_equal
aoqi@0 1063 , lir_cond_notEqual
aoqi@0 1064 , lir_cond_less
aoqi@0 1065 , lir_cond_lessEqual
aoqi@0 1066 , lir_cond_greaterEqual
aoqi@0 1067 , lir_cond_greater
aoqi@0 1068 , lir_cond_belowEqual
aoqi@0 1069 , lir_cond_aboveEqual
aoqi@0 1070 , lir_cond_always
aoqi@0 1071 , lir_cond_unknown = -1
aoqi@0 1072 };
aoqi@0 1073
aoqi@0 1074
aoqi@0 1075 enum LIR_PatchCode {
aoqi@0 1076 lir_patch_none,
aoqi@0 1077 lir_patch_low,
aoqi@0 1078 lir_patch_high,
aoqi@0 1079 lir_patch_normal
aoqi@0 1080 };
aoqi@0 1081
aoqi@0 1082
aoqi@0 1083 enum LIR_MoveKind {
aoqi@0 1084 lir_move_normal,
aoqi@0 1085 lir_move_volatile,
aoqi@0 1086 lir_move_unaligned,
aoqi@0 1087 lir_move_wide,
aoqi@0 1088 lir_move_max_flag
aoqi@0 1089 };
aoqi@0 1090
aoqi@0 1091
aoqi@0 1092 // --------------------------------------------------
aoqi@0 1093 // LIR_Op
aoqi@0 1094 // --------------------------------------------------
aoqi@0 1095 class LIR_Op: public CompilationResourceObj {
aoqi@0 1096 friend class LIR_OpVisitState;
aoqi@0 1097
aoqi@0 1098 #ifdef ASSERT
aoqi@0 1099 private:
aoqi@0 1100 const char * _file;
aoqi@0 1101 int _line;
aoqi@0 1102 #endif
aoqi@0 1103
aoqi@0 1104 protected:
aoqi@0 1105 LIR_Opr _result;
aoqi@0 1106 unsigned short _code;
aoqi@0 1107 unsigned short _flags;
aoqi@0 1108 CodeEmitInfo* _info;
aoqi@0 1109 int _id; // value id for register allocation
aoqi@0 1110 int _fpu_pop_count;
aoqi@0 1111 Instruction* _source; // for debugging
aoqi@0 1112
aoqi@0 1113 static void print_condition(outputStream* out, LIR_Condition cond) PRODUCT_RETURN;
aoqi@0 1114
aoqi@0 1115 protected:
aoqi@0 1116 static bool is_in_range(LIR_Code test, LIR_Code start, LIR_Code end) { return start < test && test < end; }
aoqi@0 1117
aoqi@0 1118 public:
aoqi@0 1119 LIR_Op()
aoqi@0 1120 : _result(LIR_OprFact::illegalOpr)
aoqi@0 1121 , _code(lir_none)
aoqi@0 1122 , _flags(0)
aoqi@0 1123 , _info(NULL)
aoqi@0 1124 #ifdef ASSERT
aoqi@0 1125 , _file(NULL)
aoqi@0 1126 , _line(0)
aoqi@0 1127 #endif
aoqi@0 1128 , _fpu_pop_count(0)
aoqi@0 1129 , _source(NULL)
aoqi@0 1130 , _id(-1) {}
aoqi@0 1131
aoqi@0 1132 LIR_Op(LIR_Code code, LIR_Opr result, CodeEmitInfo* info)
aoqi@0 1133 : _result(result)
aoqi@0 1134 , _code(code)
aoqi@0 1135 , _flags(0)
aoqi@0 1136 , _info(info)
aoqi@0 1137 #ifdef ASSERT
aoqi@0 1138 , _file(NULL)
aoqi@0 1139 , _line(0)
aoqi@0 1140 #endif
aoqi@0 1141 , _fpu_pop_count(0)
aoqi@0 1142 , _source(NULL)
aoqi@0 1143 , _id(-1) {}
aoqi@0 1144
aoqi@0 1145 CodeEmitInfo* info() const { return _info; }
aoqi@0 1146 LIR_Code code() const { return (LIR_Code)_code; }
aoqi@0 1147 LIR_Opr result_opr() const { return _result; }
aoqi@0 1148 void set_result_opr(LIR_Opr opr) { _result = opr; }
aoqi@0 1149
aoqi@0 1150 #ifdef ASSERT
aoqi@0 1151 void set_file_and_line(const char * file, int line) {
aoqi@0 1152 _file = file;
aoqi@0 1153 _line = line;
aoqi@0 1154 }
aoqi@0 1155 #endif
aoqi@0 1156
aoqi@0 1157 virtual const char * name() const PRODUCT_RETURN0;
aoqi@0 1158
aoqi@0 1159 int id() const { return _id; }
aoqi@0 1160 void set_id(int id) { _id = id; }
aoqi@0 1161
aoqi@0 1162 // FPU stack simulation helpers -- only used on Intel
aoqi@0 1163 void set_fpu_pop_count(int count) { assert(count >= 0 && count <= 1, "currently only 0 and 1 are valid"); _fpu_pop_count = count; }
aoqi@0 1164 int fpu_pop_count() const { return _fpu_pop_count; }
aoqi@0 1165 bool pop_fpu_stack() { return _fpu_pop_count > 0; }
aoqi@0 1166
aoqi@0 1167 Instruction* source() const { return _source; }
aoqi@0 1168 void set_source(Instruction* ins) { _source = ins; }
aoqi@0 1169
aoqi@0 1170 virtual void emit_code(LIR_Assembler* masm) = 0;
aoqi@0 1171 virtual void print_instr(outputStream* out) const = 0;
aoqi@0 1172 virtual void print_on(outputStream* st) const PRODUCT_RETURN;
aoqi@0 1173
aoqi@0 1174 virtual bool is_patching() { return false; }
aoqi@0 1175 virtual LIR_OpCall* as_OpCall() { return NULL; }
aoqi@0 1176 virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; }
aoqi@0 1177 virtual LIR_OpLabel* as_OpLabel() { return NULL; }
aoqi@0 1178 virtual LIR_OpDelay* as_OpDelay() { return NULL; }
aoqi@0 1179 virtual LIR_OpLock* as_OpLock() { return NULL; }
aoqi@0 1180 virtual LIR_OpAllocArray* as_OpAllocArray() { return NULL; }
aoqi@0 1181 virtual LIR_OpAllocObj* as_OpAllocObj() { return NULL; }
aoqi@0 1182 virtual LIR_OpRoundFP* as_OpRoundFP() { return NULL; }
aoqi@0 1183 virtual LIR_OpBranch* as_OpBranch() { return NULL; }
aoqi@0 1184 virtual LIR_OpRTCall* as_OpRTCall() { return NULL; }
aoqi@0 1185 virtual LIR_OpConvert* as_OpConvert() { return NULL; }
aoqi@0 1186 virtual LIR_Op0* as_Op0() { return NULL; }
aoqi@0 1187 virtual LIR_Op1* as_Op1() { return NULL; }
aoqi@0 1188 virtual LIR_Op2* as_Op2() { return NULL; }
aoqi@0 1189 virtual LIR_Op3* as_Op3() { return NULL; }
fujie@9157 1190 #ifdef MIPS
fujie@9157 1191 virtual LIR_Op4* as_Op4() { return NULL; }
fujie@9157 1192 #endif
aoqi@0 1193 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; }
aoqi@0 1194 virtual LIR_OpUpdateCRC32* as_OpUpdateCRC32() { return NULL; }
aoqi@0 1195 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; }
aoqi@0 1196 virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; }
aoqi@0 1197 virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; }
aoqi@0 1198 virtual LIR_OpProfileType* as_OpProfileType() { return NULL; }
aoqi@0 1199 #ifdef ASSERT
aoqi@0 1200 virtual LIR_OpAssert* as_OpAssert() { return NULL; }
aoqi@0 1201 #endif
aoqi@0 1202
aoqi@0 1203 virtual void verify() const {}
aoqi@0 1204 };
aoqi@0 1205
aoqi@0 1206 // for calls
aoqi@0 1207 class LIR_OpCall: public LIR_Op {
aoqi@0 1208 friend class LIR_OpVisitState;
aoqi@0 1209
aoqi@0 1210 protected:
aoqi@0 1211 address _addr;
aoqi@0 1212 LIR_OprList* _arguments;
aoqi@0 1213 protected:
aoqi@0 1214 LIR_OpCall(LIR_Code code, address addr, LIR_Opr result,
aoqi@0 1215 LIR_OprList* arguments, CodeEmitInfo* info = NULL)
aoqi@0 1216 : LIR_Op(code, result, info)
aoqi@0 1217 , _arguments(arguments)
aoqi@0 1218 , _addr(addr) {}
aoqi@0 1219
aoqi@0 1220 public:
aoqi@0 1221 address addr() const { return _addr; }
aoqi@0 1222 const LIR_OprList* arguments() const { return _arguments; }
aoqi@0 1223 virtual LIR_OpCall* as_OpCall() { return this; }
aoqi@0 1224 };
aoqi@0 1225
aoqi@0 1226
aoqi@0 1227 // --------------------------------------------------
aoqi@0 1228 // LIR_OpJavaCall
aoqi@0 1229 // --------------------------------------------------
aoqi@0 1230 class LIR_OpJavaCall: public LIR_OpCall {
aoqi@0 1231 friend class LIR_OpVisitState;
aoqi@0 1232
aoqi@0 1233 private:
aoqi@0 1234 ciMethod* _method;
aoqi@0 1235 LIR_Opr _receiver;
aoqi@0 1236 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.
aoqi@0 1237
aoqi@0 1238 public:
aoqi@0 1239 LIR_OpJavaCall(LIR_Code code, ciMethod* method,
aoqi@0 1240 LIR_Opr receiver, LIR_Opr result,
aoqi@0 1241 address addr, LIR_OprList* arguments,
aoqi@0 1242 CodeEmitInfo* info)
aoqi@0 1243 : LIR_OpCall(code, addr, result, arguments, info)
aoqi@0 1244 , _receiver(receiver)
aoqi@0 1245 , _method(method)
aoqi@0 1246 , _method_handle_invoke_SP_save_opr(LIR_OprFact::illegalOpr)
aoqi@0 1247 { assert(is_in_range(code, begin_opJavaCall, end_opJavaCall), "code check"); }
aoqi@0 1248
aoqi@0 1249 LIR_OpJavaCall(LIR_Code code, ciMethod* method,
aoqi@0 1250 LIR_Opr receiver, LIR_Opr result, intptr_t vtable_offset,
aoqi@0 1251 LIR_OprList* arguments, CodeEmitInfo* info)
aoqi@0 1252 : LIR_OpCall(code, (address)vtable_offset, result, arguments, info)
aoqi@0 1253 , _receiver(receiver)
aoqi@0 1254 , _method(method)
aoqi@0 1255 , _method_handle_invoke_SP_save_opr(LIR_OprFact::illegalOpr)
aoqi@0 1256 { assert(is_in_range(code, begin_opJavaCall, end_opJavaCall), "code check"); }
aoqi@0 1257
aoqi@0 1258 LIR_Opr receiver() const { return _receiver; }
aoqi@0 1259 ciMethod* method() const { return _method; }
aoqi@0 1260
aoqi@0 1261 // JSR 292 support.
aoqi@0 1262 bool is_invokedynamic() const { return code() == lir_dynamic_call; }
aoqi@0 1263 bool is_method_handle_invoke() const {
zmajo@7854 1264 return method()->is_compiled_lambda_form() || // Java-generated lambda form
zmajo@7854 1265 method()->is_method_handle_intrinsic(); // JVM-generated MH intrinsic
aoqi@0 1266 }
aoqi@0 1267
aoqi@0 1268 intptr_t vtable_offset() const {
aoqi@0 1269 assert(_code == lir_virtual_call, "only have vtable for real vcall");
aoqi@0 1270 return (intptr_t) addr();
aoqi@0 1271 }
aoqi@0 1272
aoqi@0 1273 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1274 virtual LIR_OpJavaCall* as_OpJavaCall() { return this; }
aoqi@0 1275 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1276 };
aoqi@0 1277
aoqi@0 1278 // --------------------------------------------------
aoqi@0 1279 // LIR_OpLabel
aoqi@0 1280 // --------------------------------------------------
aoqi@0 1281 // Location where a branch can continue
aoqi@0 1282 class LIR_OpLabel: public LIR_Op {
aoqi@0 1283 friend class LIR_OpVisitState;
aoqi@0 1284
aoqi@0 1285 private:
aoqi@0 1286 Label* _label;
aoqi@0 1287 public:
aoqi@0 1288 LIR_OpLabel(Label* lbl)
aoqi@0 1289 : LIR_Op(lir_label, LIR_OprFact::illegalOpr, NULL)
aoqi@0 1290 , _label(lbl) {}
aoqi@0 1291 Label* label() const { return _label; }
aoqi@0 1292
aoqi@0 1293 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1294 virtual LIR_OpLabel* as_OpLabel() { return this; }
aoqi@0 1295 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1296 };
aoqi@0 1297
aoqi@0 1298 // LIR_OpArrayCopy
aoqi@0 1299 class LIR_OpArrayCopy: public LIR_Op {
aoqi@0 1300 friend class LIR_OpVisitState;
aoqi@0 1301
aoqi@0 1302 private:
aoqi@0 1303 ArrayCopyStub* _stub;
aoqi@0 1304 LIR_Opr _src;
aoqi@0 1305 LIR_Opr _src_pos;
aoqi@0 1306 LIR_Opr _dst;
aoqi@0 1307 LIR_Opr _dst_pos;
aoqi@0 1308 LIR_Opr _length;
aoqi@0 1309 LIR_Opr _tmp;
aoqi@0 1310 ciArrayKlass* _expected_type;
aoqi@0 1311 int _flags;
aoqi@0 1312
aoqi@0 1313 public:
aoqi@0 1314 enum Flags {
aoqi@0 1315 src_null_check = 1 << 0,
aoqi@0 1316 dst_null_check = 1 << 1,
aoqi@0 1317 src_pos_positive_check = 1 << 2,
aoqi@0 1318 dst_pos_positive_check = 1 << 3,
aoqi@0 1319 length_positive_check = 1 << 4,
aoqi@0 1320 src_range_check = 1 << 5,
aoqi@0 1321 dst_range_check = 1 << 6,
aoqi@0 1322 type_check = 1 << 7,
aoqi@0 1323 overlapping = 1 << 8,
aoqi@0 1324 unaligned = 1 << 9,
aoqi@0 1325 src_objarray = 1 << 10,
aoqi@0 1326 dst_objarray = 1 << 11,
aoqi@0 1327 all_flags = (1 << 12) - 1
aoqi@0 1328 };
aoqi@0 1329
aoqi@0 1330 LIR_OpArrayCopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_Opr dst_pos, LIR_Opr length, LIR_Opr tmp,
aoqi@0 1331 ciArrayKlass* expected_type, int flags, CodeEmitInfo* info);
aoqi@0 1332
aoqi@0 1333 LIR_Opr src() const { return _src; }
aoqi@0 1334 LIR_Opr src_pos() const { return _src_pos; }
aoqi@0 1335 LIR_Opr dst() const { return _dst; }
aoqi@0 1336 LIR_Opr dst_pos() const { return _dst_pos; }
aoqi@0 1337 LIR_Opr length() const { return _length; }
aoqi@0 1338 LIR_Opr tmp() const { return _tmp; }
aoqi@0 1339 int flags() const { return _flags; }
aoqi@0 1340 ciArrayKlass* expected_type() const { return _expected_type; }
aoqi@0 1341 ArrayCopyStub* stub() const { return _stub; }
aoqi@0 1342
aoqi@0 1343 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1344 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return this; }
aoqi@0 1345 void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1346 };
aoqi@0 1347
aoqi@0 1348 // LIR_OpUpdateCRC32
aoqi@0 1349 class LIR_OpUpdateCRC32: public LIR_Op {
aoqi@0 1350 friend class LIR_OpVisitState;
aoqi@0 1351
aoqi@0 1352 private:
aoqi@0 1353 LIR_Opr _crc;
aoqi@0 1354 LIR_Opr _val;
aoqi@0 1355
aoqi@0 1356 public:
aoqi@0 1357
aoqi@0 1358 LIR_OpUpdateCRC32(LIR_Opr crc, LIR_Opr val, LIR_Opr res);
aoqi@0 1359
aoqi@0 1360 LIR_Opr crc() const { return _crc; }
aoqi@0 1361 LIR_Opr val() const { return _val; }
aoqi@0 1362
aoqi@0 1363 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1364 virtual LIR_OpUpdateCRC32* as_OpUpdateCRC32() { return this; }
aoqi@0 1365 void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1366 };
aoqi@0 1367
aoqi@0 1368 // --------------------------------------------------
aoqi@0 1369 // LIR_Op0
aoqi@0 1370 // --------------------------------------------------
aoqi@0 1371 class LIR_Op0: public LIR_Op {
aoqi@0 1372 friend class LIR_OpVisitState;
aoqi@0 1373
aoqi@0 1374 public:
aoqi@0 1375 LIR_Op0(LIR_Code code)
aoqi@0 1376 : LIR_Op(code, LIR_OprFact::illegalOpr, NULL) { assert(is_in_range(code, begin_op0, end_op0), "code check"); }
aoqi@0 1377 LIR_Op0(LIR_Code code, LIR_Opr result, CodeEmitInfo* info = NULL)
aoqi@0 1378 : LIR_Op(code, result, info) { assert(is_in_range(code, begin_op0, end_op0), "code check"); }
aoqi@0 1379
aoqi@0 1380 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1381 virtual LIR_Op0* as_Op0() { return this; }
aoqi@0 1382 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1383 };
aoqi@0 1384
aoqi@0 1385
aoqi@0 1386 // --------------------------------------------------
aoqi@0 1387 // LIR_Op1
aoqi@0 1388 // --------------------------------------------------
aoqi@0 1389
aoqi@0 1390 class LIR_Op1: public LIR_Op {
aoqi@0 1391 friend class LIR_OpVisitState;
aoqi@0 1392
aoqi@0 1393 protected:
aoqi@0 1394 LIR_Opr _opr; // input operand
aoqi@0 1395 BasicType _type; // Operand types
aoqi@0 1396 LIR_PatchCode _patch; // only required with patchin (NEEDS_CLEANUP: do we want a special instruction for patching?)
aoqi@0 1397
aoqi@0 1398 static void print_patch_code(outputStream* out, LIR_PatchCode code);
aoqi@0 1399
aoqi@0 1400 void set_kind(LIR_MoveKind kind) {
aoqi@0 1401 assert(code() == lir_move, "must be");
aoqi@0 1402 _flags = kind;
aoqi@0 1403 }
aoqi@0 1404
aoqi@0 1405 public:
aoqi@0 1406 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)
aoqi@0 1407 : LIR_Op(code, result, info)
aoqi@0 1408 , _opr(opr)
aoqi@0 1409 , _patch(patch)
aoqi@0 1410 , _type(type) { assert(is_in_range(code, begin_op1, end_op1), "code check"); }
aoqi@0 1411
aoqi@0 1412 LIR_Op1(LIR_Code code, LIR_Opr opr, LIR_Opr result, BasicType type, LIR_PatchCode patch, CodeEmitInfo* info, LIR_MoveKind kind)
aoqi@0 1413 : LIR_Op(code, result, info)
aoqi@0 1414 , _opr(opr)
aoqi@0 1415 , _patch(patch)
aoqi@0 1416 , _type(type) {
aoqi@0 1417 assert(code == lir_move, "must be");
aoqi@0 1418 set_kind(kind);
aoqi@0 1419 }
aoqi@0 1420
aoqi@0 1421 LIR_Op1(LIR_Code code, LIR_Opr opr, CodeEmitInfo* info)
aoqi@0 1422 : LIR_Op(code, LIR_OprFact::illegalOpr, info)
aoqi@0 1423 , _opr(opr)
aoqi@0 1424 , _patch(lir_patch_none)
aoqi@0 1425 , _type(T_ILLEGAL) { assert(is_in_range(code, begin_op1, end_op1), "code check"); }
aoqi@0 1426
aoqi@0 1427 LIR_Opr in_opr() const { return _opr; }
aoqi@0 1428 LIR_PatchCode patch_code() const { return _patch; }
aoqi@0 1429 BasicType type() const { return _type; }
aoqi@0 1430
aoqi@0 1431 LIR_MoveKind move_kind() const {
aoqi@0 1432 assert(code() == lir_move, "must be");
aoqi@0 1433 return (LIR_MoveKind)_flags;
aoqi@0 1434 }
aoqi@0 1435
aoqi@0 1436 virtual bool is_patching() { return _patch != lir_patch_none; }
aoqi@0 1437 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1438 virtual LIR_Op1* as_Op1() { return this; }
aoqi@0 1439 virtual const char * name() const PRODUCT_RETURN0;
aoqi@0 1440
aoqi@0 1441 void set_in_opr(LIR_Opr opr) { _opr = opr; }
aoqi@0 1442
aoqi@0 1443 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1444 virtual void verify() const;
aoqi@0 1445 };
aoqi@0 1446
aoqi@0 1447
aoqi@0 1448 // for runtime calls
aoqi@0 1449 class LIR_OpRTCall: public LIR_OpCall {
aoqi@0 1450 friend class LIR_OpVisitState;
aoqi@0 1451
aoqi@0 1452 private:
aoqi@0 1453 LIR_Opr _tmp;
aoqi@0 1454 public:
aoqi@0 1455 LIR_OpRTCall(address addr, LIR_Opr tmp,
aoqi@0 1456 LIR_Opr result, LIR_OprList* arguments, CodeEmitInfo* info = NULL)
aoqi@0 1457 : LIR_OpCall(lir_rtcall, addr, result, arguments, info)
aoqi@0 1458 , _tmp(tmp) {}
aoqi@0 1459
aoqi@0 1460 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1461 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1462 virtual LIR_OpRTCall* as_OpRTCall() { return this; }
aoqi@0 1463
aoqi@0 1464 LIR_Opr tmp() const { return _tmp; }
aoqi@0 1465
aoqi@0 1466 virtual void verify() const;
aoqi@0 1467 };
aoqi@0 1468
neliasso@6688 1469
fujie@9138 1470 #ifndef MIPS
aoqi@0 1471 class LIR_OpBranch: public LIR_Op {
aoqi@0 1472 friend class LIR_OpVisitState;
aoqi@0 1473
aoqi@0 1474 private:
aoqi@0 1475 LIR_Condition _cond;
aoqi@0 1476 BasicType _type;
aoqi@0 1477 Label* _label;
aoqi@0 1478 BlockBegin* _block; // if this is a branch to a block, this is the block
aoqi@0 1479 BlockBegin* _ublock; // if this is a float-branch, this is the unorderd block
aoqi@0 1480 CodeStub* _stub; // if this is a branch to a stub, this is the stub
aoqi@0 1481
aoqi@0 1482 public:
aoqi@0 1483 LIR_OpBranch(LIR_Condition cond, BasicType type, Label* lbl)
aoqi@0 1484 : LIR_Op(lir_branch, LIR_OprFact::illegalOpr, (CodeEmitInfo*) NULL)
aoqi@0 1485 , _cond(cond)
aoqi@0 1486 , _type(type)
aoqi@0 1487 , _label(lbl)
aoqi@0 1488 , _block(NULL)
aoqi@0 1489 , _ublock(NULL)
aoqi@0 1490 , _stub(NULL) { }
aoqi@0 1491
aoqi@0 1492 LIR_OpBranch(LIR_Condition cond, BasicType type, BlockBegin* block);
aoqi@0 1493 LIR_OpBranch(LIR_Condition cond, BasicType type, CodeStub* stub);
aoqi@0 1494
aoqi@0 1495 // for unordered comparisons
aoqi@0 1496 LIR_OpBranch(LIR_Condition cond, BasicType type, BlockBegin* block, BlockBegin* ublock);
aoqi@0 1497
aoqi@0 1498 LIR_Condition cond() const { return _cond; }
aoqi@0 1499 BasicType type() const { return _type; }
aoqi@0 1500 Label* label() const { return _label; }
aoqi@0 1501 BlockBegin* block() const { return _block; }
aoqi@0 1502 BlockBegin* ublock() const { return _ublock; }
aoqi@0 1503 CodeStub* stub() const { return _stub; }
aoqi@0 1504
aoqi@0 1505 void change_block(BlockBegin* b);
aoqi@0 1506 void change_ublock(BlockBegin* b);
aoqi@0 1507 void negate_cond();
aoqi@0 1508
aoqi@0 1509 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1510 virtual LIR_OpBranch* as_OpBranch() { return this; }
aoqi@0 1511 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1512 };
aoqi@1 1513 #endif
aoqi@0 1514
neliasso@6688 1515
aoqi@0 1516 class ConversionStub;
aoqi@0 1517
aoqi@0 1518 class LIR_OpConvert: public LIR_Op1 {
aoqi@0 1519 friend class LIR_OpVisitState;
aoqi@0 1520
aoqi@0 1521 private:
aoqi@0 1522 Bytecodes::Code _bytecode;
aoqi@0 1523 ConversionStub* _stub;
aoqi@0 1524 #ifdef PPC
aoqi@0 1525 LIR_Opr _tmp1;
aoqi@0 1526 LIR_Opr _tmp2;
aoqi@0 1527 #endif
aoqi@0 1528
aoqi@0 1529 public:
aoqi@0 1530 LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub)
aoqi@0 1531 : LIR_Op1(lir_convert, opr, result)
aoqi@0 1532 , _stub(stub)
aoqi@0 1533 #ifdef PPC
aoqi@0 1534 , _tmp1(LIR_OprDesc::illegalOpr())
aoqi@0 1535 , _tmp2(LIR_OprDesc::illegalOpr())
aoqi@0 1536 #endif
aoqi@0 1537 , _bytecode(code) {}
aoqi@0 1538
aoqi@0 1539 #ifdef PPC
aoqi@0 1540 LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub
aoqi@0 1541 ,LIR_Opr tmp1, LIR_Opr tmp2)
aoqi@0 1542 : LIR_Op1(lir_convert, opr, result)
aoqi@0 1543 , _stub(stub)
aoqi@0 1544 , _tmp1(tmp1)
aoqi@0 1545 , _tmp2(tmp2)
aoqi@0 1546 , _bytecode(code) {}
aoqi@0 1547 #endif
aoqi@0 1548
aoqi@0 1549 Bytecodes::Code bytecode() const { return _bytecode; }
aoqi@0 1550 ConversionStub* stub() const { return _stub; }
aoqi@0 1551 #ifdef PPC
aoqi@0 1552 LIR_Opr tmp1() const { return _tmp1; }
aoqi@0 1553 LIR_Opr tmp2() const { return _tmp2; }
aoqi@0 1554 #endif
aoqi@0 1555
aoqi@0 1556 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1557 virtual LIR_OpConvert* as_OpConvert() { return this; }
aoqi@0 1558 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1559
aoqi@0 1560 static void print_bytecode(outputStream* out, Bytecodes::Code code) PRODUCT_RETURN;
aoqi@0 1561 };
aoqi@0 1562
neliasso@6688 1563
fujie@9138 1564 #ifndef MIPS
aoqi@0 1565 // LIR_OpAllocObj
aoqi@0 1566 class LIR_OpAllocObj : public LIR_Op1 {
aoqi@0 1567 friend class LIR_OpVisitState;
aoqi@0 1568
aoqi@0 1569 private:
aoqi@0 1570 LIR_Opr _tmp1;
aoqi@0 1571 LIR_Opr _tmp2;
aoqi@0 1572 LIR_Opr _tmp3;
aoqi@0 1573 LIR_Opr _tmp4;
aoqi@0 1574 int _hdr_size;
aoqi@0 1575 int _obj_size;
aoqi@0 1576 CodeStub* _stub;
aoqi@0 1577 bool _init_check;
aoqi@0 1578
aoqi@0 1579 public:
aoqi@0 1580 LIR_OpAllocObj(LIR_Opr klass, LIR_Opr result,
aoqi@0 1581 LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4,
aoqi@0 1582 int hdr_size, int obj_size, bool init_check, CodeStub* stub)
aoqi@0 1583 : LIR_Op1(lir_alloc_object, klass, result)
aoqi@0 1584 , _tmp1(t1)
aoqi@0 1585 , _tmp2(t2)
aoqi@0 1586 , _tmp3(t3)
aoqi@0 1587 , _tmp4(t4)
aoqi@0 1588 , _hdr_size(hdr_size)
aoqi@0 1589 , _obj_size(obj_size)
aoqi@0 1590 , _init_check(init_check)
aoqi@0 1591 , _stub(stub) { }
aoqi@0 1592
aoqi@0 1593 LIR_Opr klass() const { return in_opr(); }
aoqi@0 1594 LIR_Opr obj() const { return result_opr(); }
aoqi@0 1595 LIR_Opr tmp1() const { return _tmp1; }
aoqi@0 1596 LIR_Opr tmp2() const { return _tmp2; }
aoqi@0 1597 LIR_Opr tmp3() const { return _tmp3; }
aoqi@0 1598 LIR_Opr tmp4() const { return _tmp4; }
aoqi@0 1599 int header_size() const { return _hdr_size; }
aoqi@0 1600 int object_size() const { return _obj_size; }
aoqi@0 1601 bool init_check() const { return _init_check; }
aoqi@0 1602 CodeStub* stub() const { return _stub; }
aoqi@0 1603
aoqi@0 1604 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1605 virtual LIR_OpAllocObj * as_OpAllocObj () { return this; }
aoqi@0 1606 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1607 };
aoqi@1 1608 #else
aoqi@1 1609 class LIR_OpAllocObj : public LIR_Op1 {
aoqi@1 1610 friend class LIR_OpVisitState;
aoqi@1 1611
aoqi@1 1612 private:
aoqi@1 1613 LIR_Opr _tmp1;
aoqi@1 1614 LIR_Opr _tmp2;
aoqi@1 1615 LIR_Opr _tmp3;
aoqi@1 1616 LIR_Opr _tmp4;
aoqi@1 1617 LIR_Opr _tmp5;
aoqi@1 1618 LIR_Opr _tmp6;
aoqi@1 1619 int _hdr_size;
aoqi@1 1620 int _obj_size;
aoqi@1 1621 CodeStub* _stub;
aoqi@1 1622 bool _init_check;
aoqi@1 1623
aoqi@1 1624 public:
aoqi@1 1625 LIR_OpAllocObj(LIR_Opr klass, LIR_Opr result,
aoqi@1 1626 LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4,LIR_Opr t5, LIR_Opr t6,
aoqi@1 1627 int hdr_size, int obj_size, bool init_check, CodeStub* stub)
aoqi@1 1628 : LIR_Op1(lir_alloc_object, klass, result)
aoqi@1 1629 , _tmp1(t1)
aoqi@1 1630 , _tmp2(t2)
aoqi@1 1631 , _tmp3(t3)
aoqi@1 1632 , _tmp4(t4)
aoqi@1 1633 , _tmp5(t5)
aoqi@1 1634 , _tmp6(t6)
aoqi@1 1635 , _hdr_size(hdr_size)
aoqi@1 1636 , _obj_size(obj_size)
aoqi@1 1637 , _init_check(init_check)
aoqi@1 1638 , _stub(stub) { }
aoqi@1 1639
aoqi@1 1640 LIR_Opr klass() const { return in_opr(); }
aoqi@1 1641 LIR_Opr obj() const { return result_opr(); }
aoqi@1 1642 LIR_Opr tmp1() const { return _tmp1; }
aoqi@1 1643 LIR_Opr tmp2() const { return _tmp2; }
aoqi@1 1644 LIR_Opr tmp3() const { return _tmp3; }
aoqi@1 1645 LIR_Opr tmp4() const { return _tmp4; }
aoqi@1 1646 LIR_Opr tmp5() const { return _tmp5; }
aoqi@1 1647 LIR_Opr tmp6() const { return _tmp6; }
aoqi@1 1648 int header_size() const { return _hdr_size; }
aoqi@1 1649 int object_size() const { return _obj_size; }
aoqi@1 1650 bool init_check() const { return _init_check; }
aoqi@1 1651 CodeStub* stub() const { return _stub; }
aoqi@1 1652
aoqi@1 1653 virtual void emit_code(LIR_Assembler* masm);
aoqi@1 1654 virtual LIR_OpAllocObj * as_OpAllocObj () { return this; }
aoqi@1 1655 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@1 1656 };
aoqi@1 1657 #endif
aoqi@0 1658
neliasso@6688 1659
aoqi@0 1660 // LIR_OpRoundFP
aoqi@0 1661 class LIR_OpRoundFP : public LIR_Op1 {
aoqi@0 1662 friend class LIR_OpVisitState;
aoqi@0 1663
aoqi@0 1664 private:
aoqi@0 1665 LIR_Opr _tmp;
aoqi@0 1666
aoqi@0 1667 public:
aoqi@0 1668 LIR_OpRoundFP(LIR_Opr reg, LIR_Opr stack_loc_temp, LIR_Opr result)
aoqi@0 1669 : LIR_Op1(lir_roundfp, reg, result)
aoqi@0 1670 , _tmp(stack_loc_temp) {}
aoqi@0 1671
aoqi@0 1672 LIR_Opr tmp() const { return _tmp; }
aoqi@0 1673 virtual LIR_OpRoundFP* as_OpRoundFP() { return this; }
aoqi@0 1674 void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1675 };
aoqi@0 1676
aoqi@0 1677 // LIR_OpTypeCheck
aoqi@0 1678 class LIR_OpTypeCheck: public LIR_Op {
aoqi@0 1679 friend class LIR_OpVisitState;
aoqi@0 1680
aoqi@0 1681 private:
aoqi@0 1682 LIR_Opr _object;
aoqi@0 1683 LIR_Opr _array;
aoqi@0 1684 ciKlass* _klass;
aoqi@0 1685 LIR_Opr _tmp1;
aoqi@0 1686 LIR_Opr _tmp2;
aoqi@0 1687 LIR_Opr _tmp3;
aoqi@0 1688 bool _fast_check;
aoqi@0 1689 CodeEmitInfo* _info_for_patch;
aoqi@0 1690 CodeEmitInfo* _info_for_exception;
aoqi@0 1691 CodeStub* _stub;
aoqi@0 1692 ciMethod* _profiled_method;
aoqi@0 1693 int _profiled_bci;
aoqi@0 1694 bool _should_profile;
aoqi@0 1695
aoqi@0 1696 public:
aoqi@0 1697 LIR_OpTypeCheck(LIR_Code code, LIR_Opr result, LIR_Opr object, ciKlass* klass,
aoqi@0 1698 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,
aoqi@0 1699 CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub);
aoqi@0 1700 LIR_OpTypeCheck(LIR_Code code, LIR_Opr object, LIR_Opr array,
aoqi@0 1701 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception);
aoqi@0 1702
aoqi@0 1703 LIR_Opr object() const { return _object; }
aoqi@0 1704 LIR_Opr array() const { assert(code() == lir_store_check, "not valid"); return _array; }
aoqi@0 1705 LIR_Opr tmp1() const { return _tmp1; }
aoqi@0 1706 LIR_Opr tmp2() const { return _tmp2; }
aoqi@0 1707 LIR_Opr tmp3() const { return _tmp3; }
aoqi@0 1708 ciKlass* klass() const { assert(code() == lir_instanceof || code() == lir_checkcast, "not valid"); return _klass; }
aoqi@0 1709 bool fast_check() const { assert(code() == lir_instanceof || code() == lir_checkcast, "not valid"); return _fast_check; }
aoqi@0 1710 CodeEmitInfo* info_for_patch() const { return _info_for_patch; }
aoqi@0 1711 CodeEmitInfo* info_for_exception() const { return _info_for_exception; }
aoqi@0 1712 CodeStub* stub() const { return _stub; }
aoqi@0 1713
aoqi@0 1714 // MethodData* profiling
aoqi@0 1715 void set_profiled_method(ciMethod *method) { _profiled_method = method; }
aoqi@0 1716 void set_profiled_bci(int bci) { _profiled_bci = bci; }
aoqi@0 1717 void set_should_profile(bool b) { _should_profile = b; }
aoqi@0 1718 ciMethod* profiled_method() const { return _profiled_method; }
aoqi@0 1719 int profiled_bci() const { return _profiled_bci; }
aoqi@0 1720 bool should_profile() const { return _should_profile; }
aoqi@0 1721
aoqi@0 1722 virtual bool is_patching() { return _info_for_patch != NULL; }
aoqi@0 1723 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1724 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; }
aoqi@0 1725 void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1726 };
neliasso@6688 1727
fujie@9138 1728 #ifndef MIPS
aoqi@0 1729 // LIR_Op2
aoqi@0 1730 class LIR_Op2: public LIR_Op {
aoqi@0 1731 friend class LIR_OpVisitState;
aoqi@0 1732
aoqi@0 1733 int _fpu_stack_size; // for sin/cos implementation on Intel
aoqi@0 1734
aoqi@0 1735 protected:
aoqi@0 1736 LIR_Opr _opr1;
aoqi@0 1737 LIR_Opr _opr2;
aoqi@0 1738 BasicType _type;
aoqi@0 1739 LIR_Opr _tmp1;
aoqi@0 1740 LIR_Opr _tmp2;
aoqi@0 1741 LIR_Opr _tmp3;
aoqi@0 1742 LIR_Opr _tmp4;
aoqi@0 1743 LIR_Opr _tmp5;
aoqi@0 1744 LIR_Condition _condition;
aoqi@0 1745
aoqi@0 1746 void verify() const;
aoqi@0 1747
aoqi@0 1748 public:
aoqi@0 1749 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, CodeEmitInfo* info = NULL)
aoqi@0 1750 : LIR_Op(code, LIR_OprFact::illegalOpr, info)
aoqi@0 1751 , _opr1(opr1)
aoqi@0 1752 , _opr2(opr2)
aoqi@0 1753 , _type(T_ILLEGAL)
aoqi@0 1754 , _condition(condition)
aoqi@0 1755 , _fpu_stack_size(0)
aoqi@0 1756 , _tmp1(LIR_OprFact::illegalOpr)
aoqi@0 1757 , _tmp2(LIR_OprFact::illegalOpr)
aoqi@0 1758 , _tmp3(LIR_OprFact::illegalOpr)
aoqi@0 1759 , _tmp4(LIR_OprFact::illegalOpr)
aoqi@0 1760 , _tmp5(LIR_OprFact::illegalOpr) {
aoqi@0 1761 assert(code == lir_cmp || code == lir_assert, "code check");
aoqi@0 1762 }
aoqi@0 1763
aoqi@0 1764 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type)
aoqi@0 1765 : LIR_Op(code, result, NULL)
aoqi@0 1766 , _opr1(opr1)
aoqi@0 1767 , _opr2(opr2)
aoqi@0 1768 , _type(type)
aoqi@0 1769 , _condition(condition)
aoqi@0 1770 , _fpu_stack_size(0)
aoqi@0 1771 , _tmp1(LIR_OprFact::illegalOpr)
aoqi@0 1772 , _tmp2(LIR_OprFact::illegalOpr)
aoqi@0 1773 , _tmp3(LIR_OprFact::illegalOpr)
aoqi@0 1774 , _tmp4(LIR_OprFact::illegalOpr)
aoqi@0 1775 , _tmp5(LIR_OprFact::illegalOpr) {
aoqi@0 1776 assert(code == lir_cmove, "code check");
aoqi@0 1777 assert(type != T_ILLEGAL, "cmove should have type");
aoqi@0 1778 }
aoqi@0 1779
aoqi@0 1780 LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result = LIR_OprFact::illegalOpr,
aoqi@0 1781 CodeEmitInfo* info = NULL, BasicType type = T_ILLEGAL)
aoqi@0 1782 : LIR_Op(code, result, info)
aoqi@0 1783 , _opr1(opr1)
aoqi@0 1784 , _opr2(opr2)
aoqi@0 1785 , _type(type)
aoqi@0 1786 , _condition(lir_cond_unknown)
aoqi@0 1787 , _fpu_stack_size(0)
aoqi@0 1788 , _tmp1(LIR_OprFact::illegalOpr)
aoqi@0 1789 , _tmp2(LIR_OprFact::illegalOpr)
aoqi@0 1790 , _tmp3(LIR_OprFact::illegalOpr)
aoqi@0 1791 , _tmp4(LIR_OprFact::illegalOpr)
aoqi@0 1792 , _tmp5(LIR_OprFact::illegalOpr) {
aoqi@0 1793 assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check");
aoqi@0 1794 }
aoqi@0 1795
aoqi@0 1796 LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, LIR_Opr tmp1, LIR_Opr tmp2 = LIR_OprFact::illegalOpr,
aoqi@0 1797 LIR_Opr tmp3 = LIR_OprFact::illegalOpr, LIR_Opr tmp4 = LIR_OprFact::illegalOpr, LIR_Opr tmp5 = LIR_OprFact::illegalOpr)
aoqi@0 1798 : LIR_Op(code, result, NULL)
aoqi@0 1799 , _opr1(opr1)
aoqi@0 1800 , _opr2(opr2)
aoqi@0 1801 , _type(T_ILLEGAL)
aoqi@0 1802 , _condition(lir_cond_unknown)
aoqi@0 1803 , _fpu_stack_size(0)
aoqi@0 1804 , _tmp1(tmp1)
aoqi@0 1805 , _tmp2(tmp2)
aoqi@0 1806 , _tmp3(tmp3)
aoqi@0 1807 , _tmp4(tmp4)
aoqi@0 1808 , _tmp5(tmp5) {
aoqi@0 1809 assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check");
aoqi@0 1810 }
aoqi@0 1811
aoqi@0 1812 LIR_Opr in_opr1() const { return _opr1; }
aoqi@0 1813 LIR_Opr in_opr2() const { return _opr2; }
aoqi@0 1814 BasicType type() const { return _type; }
aoqi@0 1815 LIR_Opr tmp1_opr() const { return _tmp1; }
aoqi@0 1816 LIR_Opr tmp2_opr() const { return _tmp2; }
aoqi@0 1817 LIR_Opr tmp3_opr() const { return _tmp3; }
aoqi@0 1818 LIR_Opr tmp4_opr() const { return _tmp4; }
aoqi@0 1819 LIR_Opr tmp5_opr() const { return _tmp5; }
aoqi@0 1820 LIR_Condition condition() const {
aoqi@0 1821 assert(code() == lir_cmp || code() == lir_cmove || code() == lir_assert, "only valid for cmp and cmove and assert"); return _condition;
aoqi@0 1822 }
aoqi@0 1823 void set_condition(LIR_Condition condition) {
aoqi@0 1824 assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); _condition = condition;
aoqi@0 1825 }
aoqi@0 1826
aoqi@0 1827 void set_fpu_stack_size(int size) { _fpu_stack_size = size; }
aoqi@0 1828 int fpu_stack_size() const { return _fpu_stack_size; }
aoqi@0 1829
aoqi@0 1830 void set_in_opr1(LIR_Opr opr) { _opr1 = opr; }
aoqi@0 1831 void set_in_opr2(LIR_Opr opr) { _opr2 = opr; }
aoqi@0 1832
aoqi@0 1833 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1834 virtual LIR_Op2* as_Op2() { return this; }
aoqi@0 1835 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 1836 };
aoqi@1 1837 #else
aoqi@1 1838 class LIR_Op2: public LIR_Op {
aoqi@1 1839 friend class LIR_OpVisitState;
aoqi@1 1840 protected:
aoqi@1 1841 LIR_Opr _opr1;
aoqi@1 1842 LIR_Opr _opr2;
aoqi@1 1843 BasicType _type;
aoqi@1 1844 LIR_Opr _tmp1;
aoqi@1 1845 LIR_Opr _tmp2;
aoqi@1 1846 LIR_Opr _tmp3;
aoqi@1 1847 LIR_Opr _tmp4;
aoqi@1 1848 LIR_Opr _tmp5;
aoqi@1 1849
aoqi@1 1850 virtual void verify() const;
aoqi@1 1851 public:
aoqi@1 1852 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
aoqi@1 1853 CodeEmitInfo* info = NULL, BasicType type = T_ILLEGAL)
aoqi@1 1854 : LIR_Op(code, LIR_OprFact::illegalOpr, info),
aoqi@1 1855 _opr1(opr1), _opr2(opr2),
aoqi@1 1856 _type(type),
aoqi@1 1857 _tmp1(LIR_OprFact::illegalOpr),
aoqi@1 1858 _tmp2(LIR_OprFact::illegalOpr),
aoqi@1 1859 _tmp3(LIR_OprFact::illegalOpr),
aoqi@1 1860 _tmp4(LIR_OprFact::illegalOpr),
aoqi@1 1861 _tmp5(LIR_OprFact::illegalOpr) {
aoqi@1 1862 }
aoqi@8860 1863
aoqi@1 1864 LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result = LIR_OprFact::illegalOpr,
aoqi@1 1865 CodeEmitInfo* info = NULL, BasicType type = T_ILLEGAL)
aoqi@1 1866 : LIR_Op(code, result, info),
aoqi@1 1867 _opr1(opr1), _opr2(opr2),
aoqi@1 1868 _type(type),
aoqi@1 1869 _tmp1(LIR_OprFact::illegalOpr),
aoqi@1 1870 _tmp2(LIR_OprFact::illegalOpr),
aoqi@1 1871 _tmp3(LIR_OprFact::illegalOpr),
aoqi@1 1872 _tmp4(LIR_OprFact::illegalOpr),
aoqi@1 1873 _tmp5(LIR_OprFact::illegalOpr) {
aoqi@1 1874
aoqi@1 1875 assert(is_in_range(code, begin_op2, end_op2), "code check");
aoqi@1 1876 }
aoqi@8860 1877
aoqi@8860 1878
aoqi@1 1879 LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, LIR_Opr tmp1, LIR_Opr tmp2 = LIR_OprFact::illegalOpr, LIR_Opr tmp3 = LIR_OprFact::illegalOpr, LIR_Opr tmp4 = LIR_OprFact::illegalOpr, LIR_Opr tmp5 = LIR_OprFact::illegalOpr)
aoqi@1 1880 : LIR_Op(code, result, NULL),
aoqi@1 1881 _opr1(opr1), _opr2(opr2),
aoqi@1 1882 _type(T_ILLEGAL),
aoqi@1 1883 _tmp1(tmp1),
aoqi@1 1884 _tmp2(tmp2),
aoqi@1 1885 _tmp3(tmp3),
aoqi@1 1886 _tmp4(tmp4),
aoqi@1 1887 _tmp5(tmp5) {
aoqi@1 1888 assert(is_in_range(code, begin_op2, end_op2), "code check");
aoqi@1 1889 }
aoqi@8860 1890
aoqi@1 1891 LIR_Opr in_opr1() const { return _opr1; }
aoqi@1 1892 LIR_Opr in_opr2() const { return _opr2; }
aoqi@1 1893 BasicType type() const { return _type; }
aoqi@1 1894 LIR_Opr tmp1_opr() const { return _tmp1; }
aoqi@1 1895 LIR_Opr tmp2_opr() const { return _tmp2; }
aoqi@1 1896 LIR_Opr tmp3_opr() const { return _tmp3; }
aoqi@1 1897 LIR_Opr tmp4_opr() const { return _tmp4; }
aoqi@1 1898 LIR_Opr tmp5_opr() const { return _tmp5; }
aoqi@1 1899
aoqi@8860 1900
aoqi@1 1901 void set_in_opr1(LIR_Opr opr) { _opr1 = opr; }
aoqi@1 1902 void set_in_opr2(LIR_Opr opr) { _opr2 = opr; }
aoqi@1 1903 virtual void emit_code(LIR_Assembler* masm);
aoqi@1 1904 virtual LIR_Op2* as_Op2() { return this; }
aoqi@8860 1905
aoqi@1 1906 // virtual void print_instr() const PRODUCT_RETURN;
aoqi@1 1907 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@1 1908 };
aoqi@8860 1909
aoqi@8860 1910
aoqi@1 1911 class LIR_OpBranch: public LIR_Op2 {
aoqi@1 1912 friend class LIR_OpVisitState;
aoqi@1 1913 public:
aoqi@8860 1914
aoqi@1 1915 private:
aoqi@1 1916 LIR_Condition _cond;
aoqi@1 1917 BasicType _type;
aoqi@1 1918 Label* _label;
aoqi@1 1919 BlockBegin* _block; // if this is a branch to a block, this is the block
aoqi@1 1920 BlockBegin* _ublock; // if this is a float branch , this is the unorder block
aoqi@1 1921 CodeStub* _stub; // if this is a branch to a stub, this is the stub
aoqi@8860 1922
aoqi@1 1923 public:
aoqi@8860 1924 // these are temporary constructors until we start using the conditional register
aoqi@1 1925 LIR_OpBranch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, Label* lbl)
aoqi@1 1926 : LIR_Op2(lir_branch, left, right, LIR_OprFact::illegalOpr, (CodeEmitInfo*)(NULL)),
aoqi@1 1927 _cond(cond), _label(lbl), _block(NULL), _ublock(NULL),_stub(NULL)
aoqi@1 1928 {
aoqi@1 1929 }
aoqi@8860 1930
aoqi@1 1931 LIR_OpBranch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, BasicType type, BlockBegin* block);
aoqi@8860 1932
aoqi@1 1933 LIR_OpBranch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, BasicType type, CodeStub* stub);
aoqi@8860 1934
aoqi@1 1935 //LIR_OpBranch(LIR_Condition cond, BasicType type, CodeStub* stub);
aoqi@1 1936
aoqi@1 1937 LIR_OpBranch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, BasicType type,
aoqi@1 1938 BlockBegin *block,BlockBegin *ublock);
aoqi@8860 1939
aoqi@1 1940 LIR_Condition cond() const { return _cond; }
aoqi@1 1941 BasicType type() const { return _type; }
aoqi@1 1942 LIR_Opr left() const { return in_opr1(); }
aoqi@1 1943 LIR_Opr right() const { return in_opr2(); }
aoqi@1 1944 Label* label() const { return _label; }
aoqi@1 1945 BlockBegin* block() const { return _block; }
aoqi@1 1946 BlockBegin* ublock() const { return _ublock; }
aoqi@1 1947 CodeStub* stub() const { return _stub; }
aoqi@8860 1948
aoqi@8860 1949
aoqi@1 1950 void change_block(BlockBegin* b);
aoqi@1 1951 void change_ublock(BlockBegin* b);
aoqi@1 1952 void negate_cond();
aoqi@1 1953
aoqi@1 1954
aoqi@1 1955 virtual void emit_code(LIR_Assembler* masm);
aoqi@1 1956 virtual LIR_OpBranch* as_OpBranch() { return this; }
aoqi@1 1957 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@1 1958
aoqi@1 1959 };
aoqi@1 1960 #endif
aoqi@1 1961
fujie@9138 1962 #ifndef MIPS
aoqi@0 1963 class LIR_OpAllocArray : public LIR_Op {
aoqi@0 1964 friend class LIR_OpVisitState;
aoqi@0 1965
aoqi@0 1966 private:
aoqi@0 1967 LIR_Opr _klass;
aoqi@0 1968 LIR_Opr _len;
aoqi@0 1969 LIR_Opr _tmp1;
aoqi@0 1970 LIR_Opr _tmp2;
aoqi@0 1971 LIR_Opr _tmp3;
aoqi@0 1972 LIR_Opr _tmp4;
aoqi@0 1973 BasicType _type;
aoqi@0 1974 CodeStub* _stub;
aoqi@0 1975
aoqi@0 1976 public:
aoqi@0 1977 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)
aoqi@0 1978 : LIR_Op(lir_alloc_array, result, NULL)
aoqi@0 1979 , _klass(klass)
aoqi@0 1980 , _len(len)
aoqi@0 1981 , _tmp1(t1)
aoqi@0 1982 , _tmp2(t2)
aoqi@0 1983 , _tmp3(t3)
aoqi@0 1984 , _tmp4(t4)
aoqi@0 1985 , _type(type)
aoqi@0 1986 , _stub(stub) {}
aoqi@0 1987
aoqi@0 1988 LIR_Opr klass() const { return _klass; }
aoqi@0 1989 LIR_Opr len() const { return _len; }
aoqi@0 1990 LIR_Opr obj() const { return result_opr(); }
aoqi@0 1991 LIR_Opr tmp1() const { return _tmp1; }
aoqi@0 1992 LIR_Opr tmp2() const { return _tmp2; }
aoqi@0 1993 LIR_Opr tmp3() const { return _tmp3; }
aoqi@0 1994 LIR_Opr tmp4() const { return _tmp4; }
aoqi@0 1995 BasicType type() const { return _type; }
aoqi@0 1996 CodeStub* stub() const { return _stub; }
aoqi@0 1997
aoqi@0 1998 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 1999 virtual LIR_OpAllocArray * as_OpAllocArray () { return this; }
aoqi@0 2000 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2001 };
aoqi@1 2002 #else
aoqi@1 2003 class LIR_OpAllocArray : public LIR_Op {
aoqi@1 2004 friend class LIR_OpVisitState;
aoqi@1 2005
aoqi@1 2006 private:
aoqi@1 2007 LIR_Opr _klass;
aoqi@1 2008 LIR_Opr _len;
aoqi@1 2009 LIR_Opr _tmp1;
aoqi@1 2010 LIR_Opr _tmp2;
aoqi@1 2011 LIR_Opr _tmp3;
aoqi@1 2012 LIR_Opr _tmp4;
aoqi@1 2013 LIR_Opr _tmp5;
aoqi@1 2014 BasicType _type;
aoqi@1 2015 CodeStub* _stub;
aoqi@1 2016
aoqi@1 2017 public:
aoqi@1 2018 LIR_OpAllocArray(LIR_Opr klass, LIR_Opr len, LIR_Opr result, LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4, LIR_Opr t5, BasicType type, CodeStub* stub)
aoqi@1 2019 : LIR_Op(lir_alloc_array, result, NULL)
aoqi@1 2020 , _klass(klass)
aoqi@1 2021 , _len(len)
aoqi@1 2022 , _tmp1(t1)
aoqi@1 2023 , _tmp2(t2)
aoqi@1 2024 , _tmp3(t3)
aoqi@1 2025 , _tmp4(t4)
aoqi@1 2026 , _tmp5(t5)
aoqi@1 2027 , _type(type)
aoqi@1 2028 , _stub(stub) {}
aoqi@1 2029
aoqi@1 2030 LIR_Opr klass() const { return _klass; }
aoqi@1 2031 LIR_Opr len() const { return _len; }
aoqi@1 2032 LIR_Opr obj() const { return result_opr(); }
aoqi@1 2033 LIR_Opr tmp1() const { return _tmp1; }
aoqi@1 2034 LIR_Opr tmp2() const { return _tmp2; }
aoqi@1 2035 LIR_Opr tmp3() const { return _tmp3; }
aoqi@1 2036 LIR_Opr tmp4() const { return _tmp4; }
aoqi@1 2037 LIR_Opr tmp5() const { return _tmp5; }
aoqi@1 2038 BasicType type() const { return _type; }
aoqi@1 2039 CodeStub* stub() const { return _stub; }
aoqi@1 2040
aoqi@1 2041 virtual void emit_code(LIR_Assembler* masm);
aoqi@1 2042 virtual LIR_OpAllocArray * as_OpAllocArray () { return this; }
aoqi@1 2043 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@1 2044 };
aoqi@1 2045 #endif
aoqi@0 2046
aoqi@0 2047
aoqi@0 2048 class LIR_Op3: public LIR_Op {
aoqi@0 2049 friend class LIR_OpVisitState;
aoqi@0 2050
aoqi@0 2051 private:
aoqi@0 2052 LIR_Opr _opr1;
aoqi@0 2053 LIR_Opr _opr2;
aoqi@0 2054 LIR_Opr _opr3;
aoqi@0 2055 public:
aoqi@0 2056 LIR_Op3(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr opr3, LIR_Opr result, CodeEmitInfo* info = NULL)
aoqi@0 2057 : LIR_Op(code, result, info)
aoqi@0 2058 , _opr1(opr1)
aoqi@0 2059 , _opr2(opr2)
aoqi@0 2060 , _opr3(opr3) { assert(is_in_range(code, begin_op3, end_op3), "code check"); }
aoqi@0 2061 LIR_Opr in_opr1() const { return _opr1; }
aoqi@0 2062 LIR_Opr in_opr2() const { return _opr2; }
aoqi@0 2063 LIR_Opr in_opr3() const { return _opr3; }
aoqi@0 2064
aoqi@0 2065 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2066 virtual LIR_Op3* as_Op3() { return this; }
aoqi@0 2067 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2068 };
aoqi@0 2069
fujie@9157 2070 #ifdef MIPS
fujie@9157 2071 class LIR_Op4: public LIR_Op {
fujie@9157 2072 friend class LIR_OpVisitState;
fujie@9157 2073 protected:
fujie@9157 2074 LIR_Opr _opr1;
fujie@9157 2075 LIR_Opr _opr2;
fujie@9157 2076 LIR_Opr _opr3;
fujie@9157 2077 LIR_Opr _opr4;
fujie@9157 2078 BasicType _type;
fujie@9157 2079 LIR_Opr _tmp1;
fujie@9157 2080 LIR_Opr _tmp2;
fujie@9157 2081 LIR_Opr _tmp3;
fujie@9157 2082 LIR_Opr _tmp4;
fujie@9157 2083 LIR_Opr _tmp5;
fujie@9157 2084 LIR_Condition _condition;
fujie@9157 2085
fujie@9157 2086 public:
fujie@9157 2087 LIR_Op4(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr opr3, LIR_Opr opr4, LIR_Opr result, BasicType type)
fujie@9157 2088 : LIR_Op(code, result, NULL)
fujie@9157 2089 , _opr1(opr1)
fujie@9157 2090 , _opr2(opr2)
fujie@9157 2091 , _opr3(opr3)
fujie@9157 2092 , _opr4(opr4)
fujie@9157 2093 , _type(type)
fujie@9157 2094 , _condition(condition)
fujie@9157 2095 , _tmp1(LIR_OprFact::illegalOpr)
fujie@9157 2096 , _tmp2(LIR_OprFact::illegalOpr)
fujie@9157 2097 , _tmp3(LIR_OprFact::illegalOpr)
fujie@9157 2098 , _tmp4(LIR_OprFact::illegalOpr)
fujie@9157 2099 , _tmp5(LIR_OprFact::illegalOpr) {
fujie@9157 2100 assert(code == lir_cmove_mips, "code check");
fujie@9157 2101 assert(type != T_ILLEGAL, "cmove should have type");
fujie@9157 2102 }
fujie@9157 2103
fujie@9157 2104 LIR_Opr in_opr1() const { return _opr1; }
fujie@9157 2105 LIR_Opr in_opr2() const { return _opr2; }
fujie@9157 2106 LIR_Opr in_opr3() const { return _opr3; }
fujie@9157 2107 LIR_Opr in_opr4() const { return _opr4; }
fujie@9157 2108 BasicType type() const { return _type; }
fujie@9157 2109 LIR_Opr tmp1_opr() const { return _tmp1; }
fujie@9157 2110 LIR_Opr tmp2_opr() const { return _tmp2; }
fujie@9157 2111 LIR_Opr tmp3_opr() const { return _tmp3; }
fujie@9157 2112 LIR_Opr tmp4_opr() const { return _tmp4; }
fujie@9157 2113 LIR_Opr tmp5_opr() const { return _tmp5; }
fujie@9157 2114 LIR_Condition cond() const { return _condition; }
fujie@9157 2115
fujie@9157 2116 void set_in_opr1(LIR_Opr opr) { _opr1 = opr; }
fujie@9157 2117 void set_in_opr2(LIR_Opr opr) { _opr2 = opr; }
fujie@9157 2118 void set_in_opr3(LIR_Opr opr) { _opr3 = opr; }
fujie@9157 2119 void set_in_opr4(LIR_Opr opr) { _opr4 = opr; }
fujie@9157 2120 virtual void emit_code(LIR_Assembler* masm);
fujie@9157 2121 virtual LIR_Op4* as_Op4() { return this; }
fujie@9157 2122
fujie@9157 2123 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
fujie@9157 2124 };
fujie@9157 2125 #endif
aoqi@0 2126
aoqi@0 2127 //--------------------------------
aoqi@0 2128 class LabelObj: public CompilationResourceObj {
aoqi@0 2129 private:
aoqi@0 2130 Label _label;
aoqi@0 2131 public:
aoqi@0 2132 LabelObj() {}
aoqi@0 2133 Label* label() { return &_label; }
aoqi@0 2134 };
aoqi@0 2135
aoqi@0 2136
aoqi@0 2137 class LIR_OpLock: public LIR_Op {
aoqi@0 2138 friend class LIR_OpVisitState;
aoqi@0 2139
aoqi@0 2140 private:
aoqi@0 2141 LIR_Opr _hdr;
aoqi@0 2142 LIR_Opr _obj;
aoqi@0 2143 LIR_Opr _lock;
aoqi@0 2144 LIR_Opr _scratch;
aoqi@0 2145 CodeStub* _stub;
aoqi@0 2146 public:
aoqi@0 2147 LIR_OpLock(LIR_Code code, LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub, CodeEmitInfo* info)
aoqi@0 2148 : LIR_Op(code, LIR_OprFact::illegalOpr, info)
aoqi@0 2149 , _hdr(hdr)
aoqi@0 2150 , _obj(obj)
aoqi@0 2151 , _lock(lock)
aoqi@0 2152 , _scratch(scratch)
aoqi@0 2153 , _stub(stub) {}
aoqi@0 2154
aoqi@0 2155 LIR_Opr hdr_opr() const { return _hdr; }
aoqi@0 2156 LIR_Opr obj_opr() const { return _obj; }
aoqi@0 2157 LIR_Opr lock_opr() const { return _lock; }
aoqi@0 2158 LIR_Opr scratch_opr() const { return _scratch; }
aoqi@0 2159 CodeStub* stub() const { return _stub; }
aoqi@0 2160
aoqi@0 2161 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2162 virtual LIR_OpLock* as_OpLock() { return this; }
aoqi@0 2163 void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2164 };
aoqi@0 2165
aoqi@0 2166
aoqi@0 2167 class LIR_OpDelay: public LIR_Op {
aoqi@0 2168 friend class LIR_OpVisitState;
aoqi@0 2169
aoqi@0 2170 private:
aoqi@0 2171 LIR_Op* _op;
aoqi@0 2172
aoqi@0 2173 public:
aoqi@0 2174 LIR_OpDelay(LIR_Op* op, CodeEmitInfo* info):
aoqi@0 2175 LIR_Op(lir_delay_slot, LIR_OprFact::illegalOpr, info),
aoqi@0 2176 _op(op) {
aoqi@0 2177 assert(op->code() == lir_nop || LIRFillDelaySlots, "should be filling with nops");
aoqi@0 2178 }
aoqi@0 2179 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2180 virtual LIR_OpDelay* as_OpDelay() { return this; }
aoqi@0 2181 void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2182 LIR_Op* delay_op() const { return _op; }
aoqi@0 2183 CodeEmitInfo* call_info() const { return info(); }
aoqi@0 2184 };
aoqi@0 2185
aoqi@0 2186 #ifdef ASSERT
aoqi@0 2187 // LIR_OpAssert
aoqi@0 2188 class LIR_OpAssert : public LIR_Op2 {
aoqi@0 2189 friend class LIR_OpVisitState;
aoqi@0 2190
aoqi@0 2191 private:
aoqi@0 2192 const char* _msg;
aoqi@0 2193 bool _halt;
aoqi@0 2194
aoqi@0 2195 public:
aoqi@0 2196 LIR_OpAssert(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, const char* msg, bool halt)
aoqi@0 2197 : LIR_Op2(lir_assert, condition, opr1, opr2)
aoqi@0 2198 , _halt(halt)
aoqi@0 2199 , _msg(msg) {
aoqi@0 2200 }
aoqi@0 2201
aoqi@0 2202 const char* msg() const { return _msg; }
aoqi@0 2203 bool halt() const { return _halt; }
aoqi@0 2204
aoqi@0 2205 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2206 virtual LIR_OpAssert* as_OpAssert() { return this; }
aoqi@0 2207 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2208 };
aoqi@0 2209 #endif
aoqi@0 2210
aoqi@0 2211 // LIR_OpCompareAndSwap
aoqi@0 2212 class LIR_OpCompareAndSwap : public LIR_Op {
aoqi@0 2213 friend class LIR_OpVisitState;
aoqi@0 2214
aoqi@0 2215 private:
aoqi@0 2216 LIR_Opr _addr;
aoqi@0 2217 LIR_Opr _cmp_value;
aoqi@0 2218 LIR_Opr _new_value;
aoqi@0 2219 LIR_Opr _tmp1;
aoqi@0 2220 LIR_Opr _tmp2;
aoqi@0 2221
aoqi@0 2222 public:
aoqi@0 2223 LIR_OpCompareAndSwap(LIR_Code code, LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
aoqi@0 2224 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
aoqi@0 2225 : LIR_Op(code, result, NULL) // no result, no info
aoqi@0 2226 , _addr(addr)
aoqi@0 2227 , _cmp_value(cmp_value)
aoqi@0 2228 , _new_value(new_value)
aoqi@0 2229 , _tmp1(t1)
aoqi@0 2230 , _tmp2(t2) { }
aoqi@0 2231
aoqi@0 2232 LIR_Opr addr() const { return _addr; }
aoqi@0 2233 LIR_Opr cmp_value() const { return _cmp_value; }
aoqi@0 2234 LIR_Opr new_value() const { return _new_value; }
aoqi@0 2235 LIR_Opr tmp1() const { return _tmp1; }
aoqi@0 2236 LIR_Opr tmp2() const { return _tmp2; }
aoqi@0 2237
aoqi@0 2238 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2239 virtual LIR_OpCompareAndSwap * as_OpCompareAndSwap () { return this; }
aoqi@0 2240 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2241 };
aoqi@0 2242
aoqi@0 2243 // LIR_OpProfileCall
aoqi@0 2244 class LIR_OpProfileCall : public LIR_Op {
aoqi@0 2245 friend class LIR_OpVisitState;
aoqi@0 2246
aoqi@0 2247 private:
aoqi@0 2248 ciMethod* _profiled_method;
aoqi@0 2249 int _profiled_bci;
aoqi@0 2250 ciMethod* _profiled_callee;
aoqi@0 2251 LIR_Opr _mdo;
aoqi@0 2252 LIR_Opr _recv;
aoqi@0 2253 LIR_Opr _tmp1;
aoqi@0 2254 ciKlass* _known_holder;
aoqi@0 2255
aoqi@0 2256 public:
aoqi@0 2257 // Destroys recv
aoqi@0 2258 LIR_OpProfileCall(ciMethod* profiled_method, int profiled_bci, ciMethod* profiled_callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* known_holder)
aoqi@0 2259 : LIR_Op(lir_profile_call, LIR_OprFact::illegalOpr, NULL) // no result, no info
aoqi@0 2260 , _profiled_method(profiled_method)
aoqi@0 2261 , _profiled_bci(profiled_bci)
aoqi@0 2262 , _profiled_callee(profiled_callee)
aoqi@0 2263 , _mdo(mdo)
aoqi@0 2264 , _recv(recv)
aoqi@0 2265 , _tmp1(t1)
aoqi@0 2266 , _known_holder(known_holder) { }
aoqi@0 2267
aoqi@0 2268 ciMethod* profiled_method() const { return _profiled_method; }
aoqi@0 2269 int profiled_bci() const { return _profiled_bci; }
aoqi@0 2270 ciMethod* profiled_callee() const { return _profiled_callee; }
aoqi@0 2271 LIR_Opr mdo() const { return _mdo; }
aoqi@0 2272 LIR_Opr recv() const { return _recv; }
aoqi@0 2273 LIR_Opr tmp1() const { return _tmp1; }
aoqi@0 2274 ciKlass* known_holder() const { return _known_holder; }
aoqi@0 2275
aoqi@0 2276 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2277 virtual LIR_OpProfileCall* as_OpProfileCall() { return this; }
aoqi@0 2278 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2279 };
aoqi@0 2280
aoqi@0 2281 // LIR_OpProfileType
aoqi@0 2282 class LIR_OpProfileType : public LIR_Op {
aoqi@0 2283 friend class LIR_OpVisitState;
aoqi@0 2284
aoqi@0 2285 private:
aoqi@0 2286 LIR_Opr _mdp;
aoqi@0 2287 LIR_Opr _obj;
aoqi@0 2288 LIR_Opr _tmp;
aoqi@0 2289 ciKlass* _exact_klass; // non NULL if we know the klass statically (no need to load it from _obj)
aoqi@0 2290 intptr_t _current_klass; // what the profiling currently reports
aoqi@0 2291 bool _not_null; // true if we know statically that _obj cannot be null
aoqi@0 2292 bool _no_conflict; // true if we're profling parameters, _exact_klass is not NULL and we know
aoqi@0 2293 // _exact_klass it the only possible type for this parameter in any context.
aoqi@0 2294
aoqi@0 2295 public:
aoqi@0 2296 // Destroys recv
aoqi@0 2297 LIR_OpProfileType(LIR_Opr mdp, LIR_Opr obj, ciKlass* exact_klass, intptr_t current_klass, LIR_Opr tmp, bool not_null, bool no_conflict)
aoqi@0 2298 : LIR_Op(lir_profile_type, LIR_OprFact::illegalOpr, NULL) // no result, no info
aoqi@0 2299 , _mdp(mdp)
aoqi@0 2300 , _obj(obj)
aoqi@0 2301 , _exact_klass(exact_klass)
aoqi@0 2302 , _current_klass(current_klass)
aoqi@0 2303 , _tmp(tmp)
aoqi@0 2304 , _not_null(not_null)
aoqi@0 2305 , _no_conflict(no_conflict) { }
aoqi@0 2306
aoqi@0 2307 LIR_Opr mdp() const { return _mdp; }
aoqi@0 2308 LIR_Opr obj() const { return _obj; }
aoqi@0 2309 LIR_Opr tmp() const { return _tmp; }
aoqi@0 2310 ciKlass* exact_klass() const { return _exact_klass; }
aoqi@0 2311 intptr_t current_klass() const { return _current_klass; }
aoqi@0 2312 bool not_null() const { return _not_null; }
aoqi@0 2313 bool no_conflict() const { return _no_conflict; }
aoqi@0 2314
aoqi@0 2315 virtual void emit_code(LIR_Assembler* masm);
aoqi@0 2316 virtual LIR_OpProfileType* as_OpProfileType() { return this; }
aoqi@0 2317 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
aoqi@0 2318 };
aoqi@0 2319
aoqi@0 2320 class LIR_InsertionBuffer;
aoqi@0 2321
aoqi@0 2322 //--------------------------------LIR_List---------------------------------------------------
aoqi@0 2323 // Maintains a list of LIR instructions (one instance of LIR_List per basic block)
aoqi@0 2324 // The LIR instructions are appended by the LIR_List class itself;
aoqi@0 2325 //
aoqi@0 2326 // Notes:
aoqi@0 2327 // - all offsets are(should be) in bytes
aoqi@0 2328 // - local positions are specified with an offset, with offset 0 being local 0
aoqi@0 2329
aoqi@0 2330 class LIR_List: public CompilationResourceObj {
aoqi@0 2331 private:
aoqi@0 2332 LIR_OpList _operations;
aoqi@0 2333
aoqi@0 2334 Compilation* _compilation;
aoqi@0 2335 #ifndef PRODUCT
aoqi@0 2336 BlockBegin* _block;
aoqi@0 2337 #endif
aoqi@0 2338 #ifdef ASSERT
aoqi@0 2339 const char * _file;
aoqi@0 2340 int _line;
aoqi@0 2341 #endif
aoqi@0 2342
aoqi@0 2343 void append(LIR_Op* op) {
aoqi@0 2344 if (op->source() == NULL)
aoqi@0 2345 op->set_source(_compilation->current_instruction());
aoqi@0 2346 #ifndef PRODUCT
aoqi@0 2347 if (PrintIRWithLIR) {
aoqi@0 2348 _compilation->maybe_print_current_instruction();
aoqi@0 2349 op->print(); tty->cr();
aoqi@0 2350 }
aoqi@0 2351 #endif // PRODUCT
aoqi@0 2352
aoqi@0 2353 _operations.append(op);
aoqi@0 2354
aoqi@0 2355 #ifdef ASSERT
aoqi@0 2356 op->verify();
aoqi@0 2357 op->set_file_and_line(_file, _line);
aoqi@0 2358 _file = NULL;
aoqi@0 2359 _line = 0;
aoqi@0 2360 #endif
aoqi@0 2361 }
aoqi@0 2362
aoqi@0 2363 public:
aoqi@0 2364 LIR_List(Compilation* compilation, BlockBegin* block = NULL);
aoqi@0 2365
aoqi@0 2366 #ifdef ASSERT
aoqi@0 2367 void set_file_and_line(const char * file, int line);
aoqi@0 2368 #endif
aoqi@0 2369
aoqi@0 2370 //---------- accessors ---------------
aoqi@0 2371 LIR_OpList* instructions_list() { return &_operations; }
aoqi@0 2372 int length() const { return _operations.length(); }
aoqi@0 2373 LIR_Op* at(int i) const { return _operations.at(i); }
aoqi@0 2374
aoqi@0 2375 NOT_PRODUCT(BlockBegin* block() const { return _block; });
aoqi@0 2376
aoqi@0 2377 // insert LIR_Ops in buffer to right places in LIR_List
aoqi@0 2378 void append(LIR_InsertionBuffer* buffer);
aoqi@0 2379
aoqi@0 2380 //---------- mutators ---------------
aoqi@0 2381 void insert_before(int i, LIR_List* op_list) { _operations.insert_before(i, op_list->instructions_list()); }
aoqi@0 2382 void insert_before(int i, LIR_Op* op) { _operations.insert_before(i, op); }
aoqi@0 2383 void remove_at(int i) { _operations.remove_at(i); }
aoqi@0 2384
aoqi@0 2385 //---------- printing -------------
aoqi@0 2386 void print_instructions() PRODUCT_RETURN;
aoqi@0 2387
aoqi@0 2388
aoqi@0 2389 //---------- instructions -------------
aoqi@0 2390 void call_opt_virtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
aoqi@0 2391 address dest, LIR_OprList* arguments,
aoqi@0 2392 CodeEmitInfo* info) {
aoqi@0 2393 append(new LIR_OpJavaCall(lir_optvirtual_call, method, receiver, result, dest, arguments, info));
aoqi@0 2394 }
aoqi@0 2395 void call_static(ciMethod* method, LIR_Opr result,
aoqi@0 2396 address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
aoqi@0 2397 append(new LIR_OpJavaCall(lir_static_call, method, LIR_OprFact::illegalOpr, result, dest, arguments, info));
aoqi@0 2398 }
aoqi@0 2399 void call_icvirtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
aoqi@0 2400 address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
aoqi@0 2401 append(new LIR_OpJavaCall(lir_icvirtual_call, method, receiver, result, dest, arguments, info));
aoqi@0 2402 }
aoqi@0 2403 void call_virtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
aoqi@0 2404 intptr_t vtable_offset, LIR_OprList* arguments, CodeEmitInfo* info) {
aoqi@0 2405 append(new LIR_OpJavaCall(lir_virtual_call, method, receiver, result, vtable_offset, arguments, info));
aoqi@0 2406 }
aoqi@0 2407 void call_dynamic(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
aoqi@0 2408 address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
aoqi@0 2409 append(new LIR_OpJavaCall(lir_dynamic_call, method, receiver, result, dest, arguments, info));
aoqi@0 2410 }
aoqi@0 2411
aoqi@0 2412 void get_thread(LIR_Opr result) { append(new LIR_Op0(lir_get_thread, result)); }
aoqi@0 2413 void word_align() { append(new LIR_Op0(lir_word_align)); }
aoqi@0 2414 void membar() { append(new LIR_Op0(lir_membar)); }
aoqi@0 2415 void membar_acquire() { append(new LIR_Op0(lir_membar_acquire)); }
aoqi@0 2416 void membar_release() { append(new LIR_Op0(lir_membar_release)); }
aoqi@0 2417 void membar_loadload() { append(new LIR_Op0(lir_membar_loadload)); }
aoqi@0 2418 void membar_storestore() { append(new LIR_Op0(lir_membar_storestore)); }
aoqi@0 2419 void membar_loadstore() { append(new LIR_Op0(lir_membar_loadstore)); }
aoqi@0 2420 void membar_storeload() { append(new LIR_Op0(lir_membar_storeload)); }
aoqi@0 2421
aoqi@0 2422 void nop() { append(new LIR_Op0(lir_nop)); }
aoqi@0 2423 void build_frame() { append(new LIR_Op0(lir_build_frame)); }
aoqi@0 2424
aoqi@0 2425 void std_entry(LIR_Opr receiver) { append(new LIR_Op0(lir_std_entry, receiver)); }
aoqi@0 2426 void osr_entry(LIR_Opr osrPointer) { append(new LIR_Op0(lir_osr_entry, osrPointer)); }
aoqi@0 2427
aoqi@0 2428 void branch_destination(Label* lbl) { append(new LIR_OpLabel(lbl)); }
aoqi@0 2429
aoqi@0 2430 void negate(LIR_Opr from, LIR_Opr to) { append(new LIR_Op1(lir_neg, from, to)); }
aoqi@0 2431 void leal(LIR_Opr from, LIR_Opr result_reg) { append(new LIR_Op1(lir_leal, from, result_reg)); }
aoqi@0 2432
aoqi@0 2433 // result is a stack location for old backend and vreg for UseLinearScan
aoqi@0 2434 // stack_loc_temp is an illegal register for old backend
aoqi@0 2435 void roundfp(LIR_Opr reg, LIR_Opr stack_loc_temp, LIR_Opr result) { append(new LIR_OpRoundFP(reg, stack_loc_temp, result)); }
aoqi@0 2436 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)); }
aoqi@0 2437 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)); }
aoqi@0 2438 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)); }
aoqi@0 2439 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)); }
aoqi@0 2440 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)); }
aoqi@0 2441 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)); }
aoqi@0 2442 void move_wide(LIR_Address* src, LIR_Opr dst, CodeEmitInfo* info = NULL) {
aoqi@0 2443 if (UseCompressedOops) {
aoqi@0 2444 append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, src->type(), lir_patch_none, info, lir_move_wide));
aoqi@0 2445 } else {
aoqi@0 2446 move(src, dst, info);
aoqi@0 2447 }
aoqi@0 2448 }
aoqi@0 2449 void move_wide(LIR_Opr src, LIR_Address* dst, CodeEmitInfo* info = NULL) {
aoqi@0 2450 if (UseCompressedOops) {
aoqi@0 2451 append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), dst->type(), lir_patch_none, info, lir_move_wide));
aoqi@0 2452 } else {
aoqi@0 2453 move(src, dst, info);
aoqi@0 2454 }
aoqi@0 2455 }
aoqi@0 2456 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)); }
aoqi@0 2457
aoqi@0 2458 void oop2reg (jobject o, LIR_Opr reg) { assert(reg->type() == T_OBJECT, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg)); }
aoqi@0 2459 void oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info);
aoqi@0 2460
aoqi@0 2461 void metadata2reg (Metadata* o, LIR_Opr reg) { assert(reg->type() == T_METADATA, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg)); }
aoqi@0 2462 void klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info);
aoqi@0 2463
aoqi@0 2464 void return_op(LIR_Opr result) { append(new LIR_Op1(lir_return, result)); }
aoqi@0 2465
aoqi@0 2466 void safepoint(LIR_Opr tmp, CodeEmitInfo* info) { append(new LIR_Op1(lir_safepoint, tmp, info)); }
aoqi@0 2467
aoqi@0 2468 #ifdef PPC
aoqi@0 2469 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)); }
aoqi@0 2470 #endif
aoqi@0 2471 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)); }
aoqi@0 2472
aoqi@0 2473 void logical_and (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_and, left, right, dst)); }
aoqi@0 2474 void logical_or (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_or, left, right, dst)); }
aoqi@0 2475 void logical_xor (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_xor, left, right, dst)); }
aoqi@0 2476
aoqi@0 2477 void pack64(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_pack64, src, dst, T_LONG, lir_patch_none, NULL)); }
aoqi@0 2478 void unpack64(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_unpack64, src, dst, T_LONG, lir_patch_none, NULL)); }
aoqi@0 2479
vkempik@8735 2480 void null_check(LIR_Opr opr, CodeEmitInfo* info, bool deoptimize_on_null = false);
aoqi@0 2481 void throw_exception(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmitInfo* info) {
aoqi@0 2482 append(new LIR_Op2(lir_throw, exceptionPC, exceptionOop, LIR_OprFact::illegalOpr, info));
aoqi@0 2483 }
aoqi@0 2484 void unwind_exception(LIR_Opr exceptionOop) {
aoqi@0 2485 append(new LIR_Op1(lir_unwind, exceptionOop));
aoqi@0 2486 }
aoqi@0 2487
aoqi@0 2488 void compare_to (LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
aoqi@0 2489 append(new LIR_Op2(lir_compare_to, left, right, dst));
aoqi@0 2490 }
aoqi@0 2491
aoqi@0 2492 void push(LIR_Opr opr) { append(new LIR_Op1(lir_push, opr)); }
aoqi@0 2493 void pop(LIR_Opr reg) { append(new LIR_Op1(lir_pop, reg)); }
aoqi@0 2494
fujie@9138 2495 #ifndef MIPS
aoqi@0 2496 void cmp(LIR_Condition condition, LIR_Opr left, LIR_Opr right, CodeEmitInfo* info = NULL) {
aoqi@0 2497 append(new LIR_Op2(lir_cmp, condition, left, right, info));
aoqi@0 2498 }
aoqi@0 2499 void cmp(LIR_Condition condition, LIR_Opr left, int right, CodeEmitInfo* info = NULL) {
aoqi@0 2500 cmp(condition, left, LIR_OprFact::intConst(right), info);
aoqi@0 2501 }
aoqi@0 2502
aoqi@0 2503 void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
aoqi@0 2504 void cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Address* addr, CodeEmitInfo* info);
aoqi@0 2505
aoqi@0 2506 void cmove(LIR_Condition condition, LIR_Opr src1, LIR_Opr src2, LIR_Opr dst, BasicType type) {
aoqi@0 2507 append(new LIR_Op2(lir_cmove, condition, src1, src2, dst, type));
aoqi@0 2508 }
aoqi@0 2509
aoqi@1 2510 #else
aoqi@1 2511 void null_check_for_branch(LIR_Condition condition, LIR_Opr left, LIR_Opr right,
aoqi@1 2512 CodeEmitInfo* info = NULL) {
aoqi@1 2513 append(new LIR_Op2(lir_null_check_for_branch, condition, left, right, info));
aoqi@1 2514 }
aoqi@1 2515
aoqi@1 2516 void null_check_for_branch(LIR_Condition condition, LIR_Opr left, int right,
aoqi@1 2517 CodeEmitInfo* info = NULL) {
aoqi@1 2518 append(new LIR_Op2(lir_null_check_for_branch, condition, left, LIR_OprFact::intConst(right), info));
aoqi@1 2519 }
aoqi@1 2520
aoqi@1 2521 void null_check_for_branch(LIR_Condition condition, LIR_Opr base, int disp, int c,
aoqi@1 2522 CodeEmitInfo* info) {
aoqi@1 2523 append(new LIR_Op2(lir_null_check_for_branch, condition,
aoqi@1 2524 LIR_OprFact::address(new LIR_Address(base, disp, T_INT)),
aoqi@1 2525 LIR_OprFact::intConst(c),
aoqi@1 2526 info, T_INT));
aoqi@1 2527 }
aoqi@1 2528
aoqi@1 2529 void null_check_branch(LIR_Condition condition, LIR_Opr reg, LIR_Address* addr,
aoqi@1 2530 CodeEmitInfo* info) {
aoqi@1 2531 append(new LIR_Op2(lir_null_check_for_branch, condition,
aoqi@1 2532 reg,
aoqi@1 2533 LIR_OprFact::address(addr),
aoqi@1 2534 info));
aoqi@1 2535 }
aoqi@1 2536
fujie@9157 2537 void cmove_mips(LIR_Condition condition, LIR_Opr cmp1, LIR_Opr cmp2, LIR_Opr src1, LIR_Opr src2, LIR_Opr dst, BasicType type) {
fujie@9157 2538 append(new LIR_Op4(lir_cmove_mips, condition, cmp1, cmp2, src1, src2, dst, type));
fujie@9157 2539 }
aoqi@1 2540 #endif
aoqi@0 2541 void cas_long(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
aoqi@0 2542 LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
aoqi@0 2543 void cas_obj(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
aoqi@0 2544 LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
aoqi@0 2545 void cas_int(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
aoqi@0 2546 LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
aoqi@0 2547
aoqi@0 2548 void abs (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_abs , from, tmp, to)); }
aoqi@0 2549 void sqrt(LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_sqrt, from, tmp, to)); }
aoqi@0 2550 void log (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log, from, LIR_OprFact::illegalOpr, to, tmp)); }
aoqi@0 2551 void log10 (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log10, from, LIR_OprFact::illegalOpr, to, tmp)); }
aoqi@0 2552 void sin (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_sin , from, tmp1, to, tmp2)); }
aoqi@0 2553 void cos (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_cos , from, tmp1, to, tmp2)); }
aoqi@0 2554 void tan (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_tan , from, tmp1, to, tmp2)); }
aoqi@0 2555 void exp (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, LIR_Opr tmp4, LIR_Opr tmp5) { append(new LIR_Op2(lir_exp , from, tmp1, to, tmp2, tmp3, tmp4, tmp5)); }
aoqi@0 2556 void pow (LIR_Opr arg1, LIR_Opr arg2, LIR_Opr res, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, LIR_Opr tmp4, LIR_Opr tmp5) { append(new LIR_Op2(lir_pow, arg1, arg2, res, tmp1, tmp2, tmp3, tmp4, tmp5)); }
aoqi@0 2557
aoqi@0 2558 void add (LIR_Opr left, LIR_Opr right, LIR_Opr res) { append(new LIR_Op2(lir_add, left, right, res)); }
aoqi@0 2559 void sub (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_sub, left, right, res, info)); }
aoqi@0 2560 void mul (LIR_Opr left, LIR_Opr right, LIR_Opr res) { append(new LIR_Op2(lir_mul, left, right, res)); }
aoqi@0 2561 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)); }
aoqi@0 2562 void div (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_div, left, right, res, info)); }
aoqi@0 2563 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)); }
aoqi@0 2564 void rem (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_rem, left, right, res, info)); }
aoqi@0 2565
aoqi@0 2566 void volatile_load_mem_reg(LIR_Address* address, LIR_Opr dst, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
aoqi@0 2567 void volatile_load_unsafe_reg(LIR_Opr base, LIR_Opr offset, LIR_Opr dst, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code);
aoqi@0 2568
aoqi@0 2569 void load(LIR_Address* addr, LIR_Opr src, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
aoqi@0 2570
aoqi@0 2571 void prefetch(LIR_Address* addr, bool is_store);
aoqi@0 2572
aoqi@0 2573 void store_mem_int(jint v, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
aoqi@0 2574 void store_mem_oop(jobject o, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
aoqi@0 2575 void store(LIR_Opr src, LIR_Address* addr, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
aoqi@0 2576 void volatile_store_mem_reg(LIR_Opr src, LIR_Address* address, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
aoqi@0 2577 void volatile_store_unsafe_reg(LIR_Opr src, LIR_Opr base, LIR_Opr offset, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code);
aoqi@0 2578
fujie@9138 2579 #ifdef MIPS
aoqi@1 2580 void frem(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info = NULL);
aoqi@1 2581 #endif
aoqi@0 2582 void idiv(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
aoqi@0 2583 void idiv(LIR_Opr left, int right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
aoqi@0 2584 void irem(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
aoqi@0 2585 void irem(LIR_Opr left, int right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
neliasso@6688 2586
fujie@9138 2587 #ifndef MIPS
aoqi@0 2588 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);
aoqi@0 2589 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);
aoqi@1 2590 #else
aoqi@1 2591 void allocate_object(LIR_Opr dst, LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4, LIR_Opr t5, LIR_Opr t6,int header_size, int object_size, LIR_Opr klass, bool init_check, CodeStub* stub);
aoqi@1 2592 void allocate_array(LIR_Opr dst, LIR_Opr len, LIR_Opr t1,LIR_Opr t2, LIR_Opr t3,LIR_Opr t4, LIR_Opr t5,BasicType type, LIR_Opr klass, CodeStub* stub);
aoqi@1 2593 #endif
aoqi@0 2594
aoqi@0 2595 // jump is an unconditional branch
aoqi@0 2596 void jump(BlockBegin* block) {
fujie@9138 2597 #ifndef MIPS
aoqi@0 2598 append(new LIR_OpBranch(lir_cond_always, T_ILLEGAL, block));
aoqi@1 2599 #else
aoqi@1 2600 append(new LIR_OpBranch(lir_cond_always, LIR_OprFact::illegalOpr,LIR_OprFact::illegalOpr,T_ILLEGAL, block));
aoqi@1 2601 #endif
aoqi@0 2602 }
aoqi@0 2603 void jump(CodeStub* stub) {
fujie@9138 2604 #ifndef MIPS
aoqi@0 2605 append(new LIR_OpBranch(lir_cond_always, T_ILLEGAL, stub));
aoqi@1 2606 #else
aoqi@1 2607 append(new LIR_OpBranch(lir_cond_always, LIR_OprFact::illegalOpr, LIR_OprFact::illegalOpr,T_ILLEGAL, stub));
aoqi@1 2608 #endif
aoqi@0 2609 }
fujie@9138 2610 #ifndef MIPS
aoqi@0 2611 void branch(LIR_Condition cond, BasicType type, Label* lbl) { append(new LIR_OpBranch(cond, type, lbl)); }
aoqi@0 2612 void branch(LIR_Condition cond, BasicType type, BlockBegin* block) {
aoqi@0 2613 assert(type != T_FLOAT && type != T_DOUBLE, "no fp comparisons");
aoqi@0 2614 append(new LIR_OpBranch(cond, type, block));
aoqi@0 2615 }
aoqi@0 2616 void branch(LIR_Condition cond, BasicType type, CodeStub* stub) {
aoqi@0 2617 assert(type != T_FLOAT && type != T_DOUBLE, "no fp comparisons");
aoqi@0 2618 append(new LIR_OpBranch(cond, type, stub));
aoqi@0 2619 }
aoqi@0 2620 void branch(LIR_Condition cond, BasicType type, BlockBegin* block, BlockBegin* unordered) {
aoqi@0 2621 assert(type == T_FLOAT || type == T_DOUBLE, "fp comparisons only");
aoqi@0 2622 append(new LIR_OpBranch(cond, type, block, unordered));
aoqi@0 2623 }
aoqi@1 2624 #else
aoqi@1 2625 void branch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, Label* lbl) {
aoqi@1 2626 append(new LIR_OpBranch(cond, left, right, lbl));
aoqi@1 2627 }
aoqi@1 2628
aoqi@1 2629 void branch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, BasicType type, BlockBegin* block) {
aoqi@1 2630 append(new LIR_OpBranch(cond, left, right, type, block));
aoqi@1 2631 }
aoqi@1 2632
aoqi@1 2633 void branch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, BasicType type, CodeStub* stub) {
aoqi@1 2634 append(new LIR_OpBranch(cond, left, right, type, stub));
aoqi@1 2635 }
aoqi@1 2636
aoqi@1 2637 void branch(LIR_Condition cond, LIR_Opr left, LIR_Opr right, BasicType type,
aoqi@1 2638 BlockBegin* block, BlockBegin* unordered) {
aoqi@1 2639 append(new LIR_OpBranch(cond, left, right, type, block, unordered));
aoqi@1 2640 }
aoqi@1 2641
aoqi@1 2642 #endif
aoqi@0 2643
aoqi@0 2644 void shift_left(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
aoqi@0 2645 void shift_right(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
aoqi@0 2646 void unsigned_shift_right(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
aoqi@0 2647
aoqi@0 2648 void shift_left(LIR_Opr value, int count, LIR_Opr dst) { shift_left(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
aoqi@0 2649 void shift_right(LIR_Opr value, int count, LIR_Opr dst) { shift_right(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
aoqi@0 2650 void unsigned_shift_right(LIR_Opr value, int count, LIR_Opr dst) { unsigned_shift_right(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
aoqi@0 2651
aoqi@0 2652 void lcmp2int(LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_cmp_l2i, left, right, dst)); }
aoqi@0 2653 void fcmp2int(LIR_Opr left, LIR_Opr right, LIR_Opr dst, bool is_unordered_less);
aoqi@0 2654
aoqi@0 2655 void call_runtime_leaf(address routine, LIR_Opr tmp, LIR_Opr result, LIR_OprList* arguments) {
aoqi@0 2656 append(new LIR_OpRTCall(routine, tmp, result, arguments));
aoqi@0 2657 }
aoqi@0 2658
aoqi@0 2659 void call_runtime(address routine, LIR_Opr tmp, LIR_Opr result,
aoqi@0 2660 LIR_OprList* arguments, CodeEmitInfo* info) {
aoqi@0 2661 append(new LIR_OpRTCall(routine, tmp, result, arguments, info));
aoqi@0 2662 }
aoqi@0 2663
aoqi@0 2664 void load_stack_address_monitor(int monitor_ix, LIR_Opr dst) { append(new LIR_Op1(lir_monaddr, LIR_OprFact::intConst(monitor_ix), dst)); }
aoqi@0 2665 void unlock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub);
aoqi@0 2666 void lock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub, CodeEmitInfo* info);
aoqi@0 2667
aoqi@0 2668 void set_24bit_fpu() { append(new LIR_Op0(lir_24bit_FPU )); }
aoqi@0 2669 void restore_fpu() { append(new LIR_Op0(lir_reset_FPU )); }
aoqi@0 2670 void breakpoint() { append(new LIR_Op0(lir_breakpoint)); }
aoqi@0 2671
aoqi@0 2672 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)); }
aoqi@0 2673
aoqi@0 2674 void update_crc32(LIR_Opr crc, LIR_Opr val, LIR_Opr res) { append(new LIR_OpUpdateCRC32(crc, val, res)); }
aoqi@0 2675
aoqi@0 2676 void fpop_raw() { append(new LIR_Op0(lir_fpop_raw)); }
aoqi@0 2677
aoqi@0 2678 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);
aoqi@0 2679 void store_check(LIR_Opr object, LIR_Opr array, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception, ciMethod* profiled_method, int profiled_bci);
aoqi@0 2680
aoqi@0 2681 void checkcast (LIR_Opr result, LIR_Opr object, ciKlass* klass,
aoqi@0 2682 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,
aoqi@0 2683 CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub,
aoqi@0 2684 ciMethod* profiled_method, int profiled_bci);
aoqi@0 2685 // MethodData* profiling
aoqi@0 2686 void profile_call(ciMethod* method, int bci, ciMethod* callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* cha_klass) {
aoqi@0 2687 append(new LIR_OpProfileCall(method, bci, callee, mdo, recv, t1, cha_klass));
aoqi@0 2688 }
aoqi@0 2689 void profile_type(LIR_Address* mdp, LIR_Opr obj, ciKlass* exact_klass, intptr_t current_klass, LIR_Opr tmp, bool not_null, bool no_conflict) {
aoqi@0 2690 append(new LIR_OpProfileType(LIR_OprFact::address(mdp), obj, exact_klass, current_klass, tmp, not_null, no_conflict));
aoqi@0 2691 }
aoqi@0 2692
aoqi@0 2693 void xadd(LIR_Opr src, LIR_Opr add, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xadd, src, add, res, tmp)); }
aoqi@0 2694 void xchg(LIR_Opr src, LIR_Opr set, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xchg, src, set, res, tmp)); }
aoqi@0 2695 #ifdef ASSERT
aoqi@0 2696 void lir_assert(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, const char* msg, bool halt) { append(new LIR_OpAssert(condition, opr1, opr2, msg, halt)); }
aoqi@0 2697 #endif
aoqi@0 2698 };
aoqi@0 2699
aoqi@0 2700 void print_LIR(BlockList* blocks);
aoqi@0 2701
aoqi@0 2702 class LIR_InsertionBuffer : public CompilationResourceObj {
aoqi@0 2703 private:
aoqi@0 2704 LIR_List* _lir; // the lir list where ops of this buffer should be inserted later (NULL when uninitialized)
aoqi@0 2705
aoqi@0 2706 // list of insertion points. index and count are stored alternately:
aoqi@0 2707 // _index_and_count[i * 2]: the index into lir list where "count" ops should be inserted
aoqi@0 2708 // _index_and_count[i * 2 + 1]: the number of ops to be inserted at index
aoqi@0 2709 intStack _index_and_count;
aoqi@0 2710
aoqi@0 2711 // the LIR_Ops to be inserted
aoqi@0 2712 LIR_OpList _ops;
aoqi@0 2713
aoqi@0 2714 void append_new(int index, int count) { _index_and_count.append(index); _index_and_count.append(count); }
aoqi@0 2715 void set_index_at(int i, int value) { _index_and_count.at_put((i << 1), value); }
aoqi@0 2716 void set_count_at(int i, int value) { _index_and_count.at_put((i << 1) + 1, value); }
aoqi@0 2717
aoqi@0 2718 #ifdef ASSERT
aoqi@0 2719 void verify();
aoqi@0 2720 #endif
aoqi@0 2721 public:
aoqi@0 2722 LIR_InsertionBuffer() : _lir(NULL), _index_and_count(8), _ops(8) { }
aoqi@0 2723
aoqi@0 2724 // must be called before using the insertion buffer
aoqi@0 2725 void init(LIR_List* lir) { assert(!initialized(), "already initialized"); _lir = lir; _index_and_count.clear(); _ops.clear(); }
aoqi@0 2726 bool initialized() const { return _lir != NULL; }
aoqi@0 2727 // called automatically when the buffer is appended to the LIR_List
aoqi@0 2728 void finish() { _lir = NULL; }
aoqi@0 2729
aoqi@0 2730 // accessors
aoqi@0 2731 LIR_List* lir_list() const { return _lir; }
aoqi@0 2732 int number_of_insertion_points() const { return _index_and_count.length() >> 1; }
aoqi@0 2733 int index_at(int i) const { return _index_and_count.at((i << 1)); }
aoqi@0 2734 int count_at(int i) const { return _index_and_count.at((i << 1) + 1); }
aoqi@0 2735
aoqi@0 2736 int number_of_ops() const { return _ops.length(); }
aoqi@0 2737 LIR_Op* op_at(int i) const { return _ops.at(i); }
aoqi@0 2738
aoqi@0 2739 // append an instruction to the buffer
aoqi@0 2740 void append(int index, LIR_Op* op);
aoqi@0 2741
aoqi@0 2742 // instruction
aoqi@0 2743 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)); }
aoqi@0 2744 };
aoqi@0 2745
aoqi@0 2746
aoqi@0 2747 //
aoqi@0 2748 // LIR_OpVisitState is used for manipulating LIR_Ops in an abstract way.
aoqi@0 2749 // Calling a LIR_Op's visit function with a LIR_OpVisitState causes
aoqi@0 2750 // information about the input, output and temporaries used by the
aoqi@0 2751 // op to be recorded. It also records whether the op has call semantics
aoqi@0 2752 // and also records all the CodeEmitInfos used by this op.
aoqi@0 2753 //
aoqi@0 2754
aoqi@0 2755
aoqi@0 2756 class LIR_OpVisitState: public StackObj {
aoqi@0 2757 public:
aoqi@0 2758 typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode;
aoqi@0 2759
aoqi@0 2760 enum {
aoqi@0 2761 maxNumberOfOperands = 20,
aoqi@0 2762 maxNumberOfInfos = 4
aoqi@0 2763 };
aoqi@0 2764
aoqi@0 2765 private:
aoqi@0 2766 LIR_Op* _op;
aoqi@0 2767
aoqi@0 2768 // optimization: the operands and infos are not stored in a variable-length
aoqi@0 2769 // list, but in a fixed-size array to save time of size checks and resizing
aoqi@0 2770 int _oprs_len[numModes];
aoqi@0 2771 LIR_Opr* _oprs_new[numModes][maxNumberOfOperands];
aoqi@0 2772 int _info_len;
aoqi@0 2773 CodeEmitInfo* _info_new[maxNumberOfInfos];
aoqi@0 2774
aoqi@0 2775 bool _has_call;
aoqi@0 2776 bool _has_slow_case;
aoqi@0 2777
aoqi@0 2778
aoqi@0 2779 // only include register operands
aoqi@0 2780 // addresses are decomposed to the base and index registers
aoqi@0 2781 // constants and stack operands are ignored
aoqi@0 2782 void append(LIR_Opr& opr, OprMode mode) {
aoqi@0 2783 assert(opr->is_valid(), "should not call this otherwise");
aoqi@0 2784 assert(mode >= 0 && mode < numModes, "bad mode");
aoqi@0 2785
aoqi@0 2786 if (opr->is_register()) {
aoqi@0 2787 assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
aoqi@0 2788 _oprs_new[mode][_oprs_len[mode]++] = &opr;
aoqi@0 2789
aoqi@0 2790 } else if (opr->is_pointer()) {
aoqi@0 2791 LIR_Address* address = opr->as_address_ptr();
aoqi@0 2792 if (address != NULL) {
aoqi@0 2793 // special handling for addresses: add base and index register of the address
aoqi@0 2794 // both are always input operands or temp if we want to extend
aoqi@0 2795 // their liveness!
aoqi@0 2796 if (mode == outputMode) {
aoqi@0 2797 mode = inputMode;
aoqi@0 2798 }
aoqi@0 2799 assert (mode == inputMode || mode == tempMode, "input or temp only for addresses");
aoqi@0 2800 if (address->_base->is_valid()) {
aoqi@0 2801 assert(address->_base->is_register(), "must be");
aoqi@0 2802 assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
aoqi@0 2803 _oprs_new[mode][_oprs_len[mode]++] = &address->_base;
aoqi@0 2804 }
aoqi@0 2805 if (address->_index->is_valid()) {
aoqi@0 2806 assert(address->_index->is_register(), "must be");
aoqi@0 2807 assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
aoqi@0 2808 _oprs_new[mode][_oprs_len[mode]++] = &address->_index;
aoqi@0 2809 }
aoqi@0 2810
aoqi@0 2811 } else {
aoqi@0 2812 assert(opr->is_constant(), "constant operands are not processed");
aoqi@0 2813 }
aoqi@0 2814 } else {
aoqi@0 2815 assert(opr->is_stack(), "stack operands are not processed");
aoqi@0 2816 }
aoqi@0 2817 }
aoqi@0 2818
aoqi@0 2819 void append(CodeEmitInfo* info) {
aoqi@0 2820 assert(info != NULL, "should not call this otherwise");
aoqi@0 2821 assert(_info_len < maxNumberOfInfos, "array overflow");
aoqi@0 2822 _info_new[_info_len++] = info;
aoqi@0 2823 }
aoqi@0 2824
aoqi@0 2825 public:
aoqi@0 2826 LIR_OpVisitState() { reset(); }
aoqi@0 2827
aoqi@0 2828 LIR_Op* op() const { return _op; }
aoqi@0 2829 void set_op(LIR_Op* op) { reset(); _op = op; }
aoqi@0 2830
aoqi@0 2831 bool has_call() const { return _has_call; }
aoqi@0 2832 bool has_slow_case() const { return _has_slow_case; }
aoqi@0 2833
aoqi@0 2834 void reset() {
aoqi@0 2835 _op = NULL;
aoqi@0 2836 _has_call = false;
aoqi@0 2837 _has_slow_case = false;
aoqi@0 2838
aoqi@0 2839 _oprs_len[inputMode] = 0;
aoqi@0 2840 _oprs_len[tempMode] = 0;
aoqi@0 2841 _oprs_len[outputMode] = 0;
aoqi@0 2842 _info_len = 0;
aoqi@0 2843 }
aoqi@0 2844
aoqi@0 2845
aoqi@0 2846 int opr_count(OprMode mode) const {
aoqi@0 2847 assert(mode >= 0 && mode < numModes, "bad mode");
aoqi@0 2848 return _oprs_len[mode];
aoqi@0 2849 }
aoqi@0 2850
aoqi@0 2851 LIR_Opr opr_at(OprMode mode, int index) const {
aoqi@0 2852 assert(mode >= 0 && mode < numModes, "bad mode");
aoqi@0 2853 assert(index >= 0 && index < _oprs_len[mode], "index out of bound");
aoqi@0 2854 return *_oprs_new[mode][index];
aoqi@0 2855 }
aoqi@0 2856
aoqi@0 2857 void set_opr_at(OprMode mode, int index, LIR_Opr opr) const {
aoqi@0 2858 assert(mode >= 0 && mode < numModes, "bad mode");
aoqi@0 2859 assert(index >= 0 && index < _oprs_len[mode], "index out of bound");
aoqi@0 2860 *_oprs_new[mode][index] = opr;
aoqi@0 2861 }
aoqi@0 2862
aoqi@0 2863 int info_count() const {
aoqi@0 2864 return _info_len;
aoqi@0 2865 }
aoqi@0 2866
aoqi@0 2867 CodeEmitInfo* info_at(int index) const {
aoqi@0 2868 assert(index < _info_len, "index out of bounds");
aoqi@0 2869 return _info_new[index];
aoqi@0 2870 }
aoqi@0 2871
aoqi@0 2872 XHandlers* all_xhandler();
aoqi@0 2873
aoqi@0 2874 // collects all register operands of the instruction
aoqi@0 2875 void visit(LIR_Op* op);
aoqi@0 2876
aoqi@0 2877 #ifdef ASSERT
aoqi@0 2878 // check that an operation has no operands
aoqi@0 2879 bool no_operands(LIR_Op* op);
aoqi@0 2880 #endif
aoqi@0 2881
aoqi@0 2882 // LIR_Op visitor functions use these to fill in the state
aoqi@0 2883 void do_input(LIR_Opr& opr) { append(opr, LIR_OpVisitState::inputMode); }
aoqi@0 2884 void do_output(LIR_Opr& opr) { append(opr, LIR_OpVisitState::outputMode); }
aoqi@0 2885 void do_temp(LIR_Opr& opr) { append(opr, LIR_OpVisitState::tempMode); }
aoqi@0 2886 void do_info(CodeEmitInfo* info) { append(info); }
aoqi@0 2887
aoqi@0 2888 void do_stub(CodeStub* stub);
aoqi@0 2889 void do_call() { _has_call = true; }
aoqi@0 2890 void do_slow_case() { _has_slow_case = true; }
aoqi@0 2891 void do_slow_case(CodeEmitInfo* info) {
aoqi@0 2892 _has_slow_case = true;
aoqi@0 2893 append(info);
aoqi@0 2894 }
aoqi@0 2895 };
aoqi@0 2896
aoqi@0 2897
aoqi@0 2898 inline LIR_Opr LIR_OprDesc::illegalOpr() { return LIR_OprFact::illegalOpr; };
aoqi@0 2899
aoqi@0 2900 #endif // SHARE_VM_C1_C1_LIR_HPP

mercurial