src/share/vm/c1/c1_LIR.hpp

Mon, 28 May 2018 09:00:08 +0800

author
fujie
date
Mon, 28 May 2018 09:00:08 +0800
changeset 9126
bc5b8e3dcb6b
parent 8863
5376ce0dc552
child 9138
b56ab8e56604
permissions
-rw-r--r--

#7083 [C1] Fix an assert error during linear scan reg allocation for MIPS.

# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (/home/fool/c1/jdk8-mips-c1/hotspot/src/share/vm/c1/c1_LinearScan.cpp:2132), pid=18499, tid=0x000000ff96a0f1f0
# assert(interval->assigned_regHi() == any_reg) failed: must not have hi register
#
# JRE version: OpenJDK Runtime Environment (8.0) (build 1.8.0-internal-debug-fool_2018_05_23_17_44-b00) (Loongson 8-loongson3a-Loongnix)
# Java VM: OpenJDK 64-Bit Server VM (25.71-b00-debug compiled mode linux-mips64 compressed oops

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

mercurial