src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2412
037c727f35fb
child 3153
5cceda753a4a
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

duke@435 1 /*
johnc@2781 2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "c1/c1_Compilation.hpp"
stefank@2314 27 #include "c1/c1_FrameMap.hpp"
stefank@2314 28 #include "c1/c1_Instruction.hpp"
stefank@2314 29 #include "c1/c1_LIRAssembler.hpp"
stefank@2314 30 #include "c1/c1_LIRGenerator.hpp"
stefank@2314 31 #include "c1/c1_Runtime1.hpp"
stefank@2314 32 #include "c1/c1_ValueStack.hpp"
stefank@2314 33 #include "ci/ciArray.hpp"
stefank@2314 34 #include "ci/ciObjArrayKlass.hpp"
stefank@2314 35 #include "ci/ciTypeArrayKlass.hpp"
stefank@2314 36 #include "runtime/sharedRuntime.hpp"
stefank@2314 37 #include "runtime/stubRoutines.hpp"
stefank@2314 38 #include "vmreg_sparc.inline.hpp"
duke@435 39
duke@435 40 #ifdef ASSERT
duke@435 41 #define __ gen()->lir(__FILE__, __LINE__)->
duke@435 42 #else
duke@435 43 #define __ gen()->lir()->
duke@435 44 #endif
duke@435 45
duke@435 46 void LIRItem::load_byte_item() {
duke@435 47 // byte loads use same registers as other loads
duke@435 48 load_item();
duke@435 49 }
duke@435 50
duke@435 51
duke@435 52 void LIRItem::load_nonconstant() {
duke@435 53 LIR_Opr r = value()->operand();
duke@435 54 if (_gen->can_inline_as_constant(value())) {
duke@435 55 if (!r->is_constant()) {
duke@435 56 r = LIR_OprFact::value_type(value()->type());
duke@435 57 }
duke@435 58 _result = r;
duke@435 59 } else {
duke@435 60 load_item();
duke@435 61 }
duke@435 62 }
duke@435 63
duke@435 64
duke@435 65 //--------------------------------------------------------------
duke@435 66 // LIRGenerator
duke@435 67 //--------------------------------------------------------------
duke@435 68
duke@435 69 LIR_Opr LIRGenerator::exceptionOopOpr() { return FrameMap::Oexception_opr; }
duke@435 70 LIR_Opr LIRGenerator::exceptionPcOpr() { return FrameMap::Oissuing_pc_opr; }
duke@435 71 LIR_Opr LIRGenerator::syncTempOpr() { return new_register(T_OBJECT); }
duke@435 72 LIR_Opr LIRGenerator::getThreadTemp() { return rlock_callee_saved(T_INT); }
duke@435 73
duke@435 74 LIR_Opr LIRGenerator::result_register_for(ValueType* type, bool callee) {
duke@435 75 LIR_Opr opr;
duke@435 76 switch (type->tag()) {
duke@435 77 case intTag: opr = callee ? FrameMap::I0_opr : FrameMap::O0_opr; break;
duke@435 78 case objectTag: opr = callee ? FrameMap::I0_oop_opr : FrameMap::O0_oop_opr; break;
duke@435 79 case longTag: opr = callee ? FrameMap::in_long_opr : FrameMap::out_long_opr; break;
duke@435 80 case floatTag: opr = FrameMap::F0_opr; break;
duke@435 81 case doubleTag: opr = FrameMap::F0_double_opr; break;
duke@435 82
duke@435 83 case addressTag:
duke@435 84 default: ShouldNotReachHere(); return LIR_OprFact::illegalOpr;
duke@435 85 }
duke@435 86
duke@435 87 assert(opr->type_field() == as_OprType(as_BasicType(type)), "type mismatch");
duke@435 88 return opr;
duke@435 89 }
duke@435 90
duke@435 91 LIR_Opr LIRGenerator::rlock_callee_saved(BasicType type) {
duke@435 92 LIR_Opr reg = new_register(type);
duke@435 93 set_vreg_flag(reg, callee_saved);
duke@435 94 return reg;
duke@435 95 }
duke@435 96
duke@435 97
duke@435 98 LIR_Opr LIRGenerator::rlock_byte(BasicType type) {
duke@435 99 return new_register(T_INT);
duke@435 100 }
duke@435 101
duke@435 102
duke@435 103
duke@435 104
duke@435 105
duke@435 106 //--------- loading items into registers --------------------------------
duke@435 107
duke@435 108 // SPARC cannot inline all constants
duke@435 109 bool LIRGenerator::can_store_as_constant(Value v, BasicType type) const {
duke@435 110 if (v->type()->as_IntConstant() != NULL) {
duke@435 111 return v->type()->as_IntConstant()->value() == 0;
duke@435 112 } else if (v->type()->as_LongConstant() != NULL) {
duke@435 113 return v->type()->as_LongConstant()->value() == 0L;
duke@435 114 } else if (v->type()->as_ObjectConstant() != NULL) {
duke@435 115 return v->type()->as_ObjectConstant()->value()->is_null_object();
duke@435 116 } else {
duke@435 117 return false;
duke@435 118 }
duke@435 119 }
duke@435 120
duke@435 121
duke@435 122 // only simm13 constants can be inlined
duke@435 123 bool LIRGenerator:: can_inline_as_constant(Value i) const {
duke@435 124 if (i->type()->as_IntConstant() != NULL) {
duke@435 125 return Assembler::is_simm13(i->type()->as_IntConstant()->value());
duke@435 126 } else {
duke@435 127 return can_store_as_constant(i, as_BasicType(i->type()));
duke@435 128 }
duke@435 129 }
duke@435 130
duke@435 131
duke@435 132 bool LIRGenerator:: can_inline_as_constant(LIR_Const* c) const {
duke@435 133 if (c->type() == T_INT) {
duke@435 134 return Assembler::is_simm13(c->as_jint());
duke@435 135 }
duke@435 136 return false;
duke@435 137 }
duke@435 138
duke@435 139
duke@435 140 LIR_Opr LIRGenerator::safepoint_poll_register() {
duke@435 141 return new_register(T_INT);
duke@435 142 }
duke@435 143
duke@435 144
duke@435 145
duke@435 146 LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
duke@435 147 int shift, int disp, BasicType type) {
duke@435 148 assert(base->is_register(), "must be");
duke@435 149
duke@435 150 // accumulate fixed displacements
duke@435 151 if (index->is_constant()) {
duke@435 152 disp += index->as_constant_ptr()->as_jint() << shift;
duke@435 153 index = LIR_OprFact::illegalOpr;
duke@435 154 }
duke@435 155
duke@435 156 if (index->is_register()) {
duke@435 157 // apply the shift and accumulate the displacement
duke@435 158 if (shift > 0) {
roland@1495 159 LIR_Opr tmp = new_pointer_register();
duke@435 160 __ shift_left(index, shift, tmp);
duke@435 161 index = tmp;
duke@435 162 }
duke@435 163 if (disp != 0) {
roland@1495 164 LIR_Opr tmp = new_pointer_register();
duke@435 165 if (Assembler::is_simm13(disp)) {
roland@1495 166 __ add(tmp, LIR_OprFact::intptrConst(disp), tmp);
duke@435 167 index = tmp;
duke@435 168 } else {
roland@1495 169 __ move(LIR_OprFact::intptrConst(disp), tmp);
duke@435 170 __ add(tmp, index, tmp);
duke@435 171 index = tmp;
duke@435 172 }
duke@435 173 disp = 0;
duke@435 174 }
duke@435 175 } else if (disp != 0 && !Assembler::is_simm13(disp)) {
duke@435 176 // index is illegal so replace it with the displacement loaded into a register
roland@1495 177 index = new_pointer_register();
roland@1495 178 __ move(LIR_OprFact::intptrConst(disp), index);
duke@435 179 disp = 0;
duke@435 180 }
duke@435 181
duke@435 182 // at this point we either have base + index or base + displacement
duke@435 183 if (disp == 0) {
duke@435 184 return new LIR_Address(base, index, type);
duke@435 185 } else {
duke@435 186 assert(Assembler::is_simm13(disp), "must be");
duke@435 187 return new LIR_Address(base, disp, type);
duke@435 188 }
duke@435 189 }
duke@435 190
duke@435 191
duke@435 192 LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_opr,
duke@435 193 BasicType type, bool needs_card_mark) {
kvn@464 194 int elem_size = type2aelembytes(type);
duke@435 195 int shift = exact_log2(elem_size);
duke@435 196
duke@435 197 LIR_Opr base_opr;
duke@435 198 int offset = arrayOopDesc::base_offset_in_bytes(type);
duke@435 199
duke@435 200 if (index_opr->is_constant()) {
duke@435 201 int i = index_opr->as_constant_ptr()->as_jint();
duke@435 202 int array_offset = i * elem_size;
duke@435 203 if (Assembler::is_simm13(array_offset + offset)) {
duke@435 204 base_opr = array_opr;
duke@435 205 offset = array_offset + offset;
duke@435 206 } else {
duke@435 207 base_opr = new_pointer_register();
duke@435 208 if (Assembler::is_simm13(array_offset)) {
duke@435 209 __ add(array_opr, LIR_OprFact::intptrConst(array_offset), base_opr);
duke@435 210 } else {
duke@435 211 __ move(LIR_OprFact::intptrConst(array_offset), base_opr);
duke@435 212 __ add(base_opr, array_opr, base_opr);
duke@435 213 }
duke@435 214 }
duke@435 215 } else {
duke@435 216 #ifdef _LP64
duke@435 217 if (index_opr->type() == T_INT) {
duke@435 218 LIR_Opr tmp = new_register(T_LONG);
duke@435 219 __ convert(Bytecodes::_i2l, index_opr, tmp);
duke@435 220 index_opr = tmp;
duke@435 221 }
duke@435 222 #endif
duke@435 223
duke@435 224 base_opr = new_pointer_register();
duke@435 225 assert (index_opr->is_register(), "Must be register");
duke@435 226 if (shift > 0) {
duke@435 227 __ shift_left(index_opr, shift, base_opr);
duke@435 228 __ add(base_opr, array_opr, base_opr);
duke@435 229 } else {
duke@435 230 __ add(index_opr, array_opr, base_opr);
duke@435 231 }
duke@435 232 }
duke@435 233 if (needs_card_mark) {
duke@435 234 LIR_Opr ptr = new_pointer_register();
duke@435 235 __ add(base_opr, LIR_OprFact::intptrConst(offset), ptr);
iveresov@1927 236 return new LIR_Address(ptr, type);
duke@435 237 } else {
duke@435 238 return new LIR_Address(base_opr, offset, type);
duke@435 239 }
duke@435 240 }
duke@435 241
iveresov@2138 242 LIR_Opr LIRGenerator::load_immediate(int x, BasicType type) {
iveresov@2138 243 LIR_Opr r;
iveresov@2138 244 if (type == T_LONG) {
iveresov@2138 245 r = LIR_OprFact::longConst(x);
iveresov@2138 246 } else if (type == T_INT) {
iveresov@2138 247 r = LIR_OprFact::intConst(x);
iveresov@2138 248 } else {
iveresov@2138 249 ShouldNotReachHere();
iveresov@2138 250 }
iveresov@2138 251 if (!Assembler::is_simm13(x)) {
iveresov@2138 252 LIR_Opr tmp = new_register(type);
iveresov@2138 253 __ move(r, tmp);
iveresov@2138 254 return tmp;
iveresov@2138 255 }
iveresov@2138 256 return r;
iveresov@2138 257 }
duke@435 258
iveresov@2138 259 void LIRGenerator::increment_counter(address counter, BasicType type, int step) {
duke@435 260 LIR_Opr pointer = new_pointer_register();
duke@435 261 __ move(LIR_OprFact::intptrConst(counter), pointer);
iveresov@2138 262 LIR_Address* addr = new LIR_Address(pointer, type);
duke@435 263 increment_counter(addr, step);
duke@435 264 }
duke@435 265
duke@435 266 void LIRGenerator::increment_counter(LIR_Address* addr, int step) {
iveresov@2138 267 LIR_Opr temp = new_register(addr->type());
duke@435 268 __ move(addr, temp);
iveresov@2138 269 __ add(temp, load_immediate(step, addr->type()), temp);
duke@435 270 __ move(temp, addr);
duke@435 271 }
duke@435 272
duke@435 273 void LIRGenerator::cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info) {
duke@435 274 LIR_Opr o7opr = FrameMap::O7_opr;
duke@435 275 __ load(new LIR_Address(base, disp, T_INT), o7opr, info);
duke@435 276 __ cmp(condition, o7opr, c);
duke@435 277 }
duke@435 278
duke@435 279
duke@435 280 void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base, int disp, BasicType type, CodeEmitInfo* info) {
duke@435 281 LIR_Opr o7opr = FrameMap::O7_opr;
duke@435 282 __ load(new LIR_Address(base, disp, type), o7opr, info);
duke@435 283 __ cmp(condition, reg, o7opr);
duke@435 284 }
duke@435 285
duke@435 286
duke@435 287 void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base, LIR_Opr disp, BasicType type, CodeEmitInfo* info) {
duke@435 288 LIR_Opr o7opr = FrameMap::O7_opr;
duke@435 289 __ load(new LIR_Address(base, disp, type), o7opr, info);
duke@435 290 __ cmp(condition, reg, o7opr);
duke@435 291 }
duke@435 292
duke@435 293
duke@435 294 bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
duke@435 295 assert(left != result, "should be different registers");
duke@435 296 if (is_power_of_2(c + 1)) {
duke@435 297 __ shift_left(left, log2_intptr(c + 1), result);
duke@435 298 __ sub(result, left, result);
duke@435 299 return true;
duke@435 300 } else if (is_power_of_2(c - 1)) {
duke@435 301 __ shift_left(left, log2_intptr(c - 1), result);
duke@435 302 __ add(result, left, result);
duke@435 303 return true;
duke@435 304 }
duke@435 305 return false;
duke@435 306 }
duke@435 307
duke@435 308
duke@435 309 void LIRGenerator::store_stack_parameter (LIR_Opr item, ByteSize offset_from_sp) {
duke@435 310 BasicType t = item->type();
duke@435 311 LIR_Opr sp_opr = FrameMap::SP_opr;
duke@435 312 if ((t == T_LONG || t == T_DOUBLE) &&
duke@435 313 ((in_bytes(offset_from_sp) - STACK_BIAS) % 8 != 0)) {
duke@435 314 __ unaligned_move(item, new LIR_Address(sp_opr, in_bytes(offset_from_sp), t));
duke@435 315 } else {
duke@435 316 __ move(item, new LIR_Address(sp_opr, in_bytes(offset_from_sp), t));
duke@435 317 }
duke@435 318 }
duke@435 319
duke@435 320 //----------------------------------------------------------------------
duke@435 321 // visitor functions
duke@435 322 //----------------------------------------------------------------------
duke@435 323
duke@435 324
duke@435 325 void LIRGenerator::do_StoreIndexed(StoreIndexed* x) {
roland@2174 326 assert(x->is_pinned(),"");
duke@435 327 bool needs_range_check = true;
duke@435 328 bool use_length = x->length() != NULL;
duke@435 329 bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT;
duke@435 330 bool needs_store_check = obj_store && (x->value()->as_Constant() == NULL ||
duke@435 331 !get_jobject_constant(x->value())->is_null_object());
duke@435 332
duke@435 333 LIRItem array(x->array(), this);
duke@435 334 LIRItem index(x->index(), this);
duke@435 335 LIRItem value(x->value(), this);
duke@435 336 LIRItem length(this);
duke@435 337
duke@435 338 array.load_item();
duke@435 339 index.load_nonconstant();
duke@435 340
duke@435 341 if (use_length) {
duke@435 342 needs_range_check = x->compute_needs_range_check();
duke@435 343 if (needs_range_check) {
duke@435 344 length.set_instruction(x->length());
duke@435 345 length.load_item();
duke@435 346 }
duke@435 347 }
duke@435 348 if (needs_store_check) {
duke@435 349 value.load_item();
duke@435 350 } else {
duke@435 351 value.load_for_store(x->elt_type());
duke@435 352 }
duke@435 353
duke@435 354 set_no_result(x);
duke@435 355
duke@435 356 // the CodeEmitInfo must be duplicated for each different
duke@435 357 // LIR-instruction because spilling can occur anywhere between two
duke@435 358 // instructions and so the debug information must be different
duke@435 359 CodeEmitInfo* range_check_info = state_for(x);
duke@435 360 CodeEmitInfo* null_check_info = NULL;
duke@435 361 if (x->needs_null_check()) {
duke@435 362 null_check_info = new CodeEmitInfo(range_check_info);
duke@435 363 }
duke@435 364
duke@435 365 // emit array address setup early so it schedules better
duke@435 366 LIR_Address* array_addr = emit_array_address(array.result(), index.result(), x->elt_type(), obj_store);
duke@435 367
duke@435 368 if (GenerateRangeChecks && needs_range_check) {
duke@435 369 if (use_length) {
duke@435 370 __ cmp(lir_cond_belowEqual, length.result(), index.result());
duke@435 371 __ branch(lir_cond_belowEqual, T_INT, new RangeCheckStub(range_check_info, index.result()));
duke@435 372 } else {
duke@435 373 array_range_check(array.result(), index.result(), null_check_info, range_check_info);
duke@435 374 // range_check also does the null check
duke@435 375 null_check_info = NULL;
duke@435 376 }
duke@435 377 }
duke@435 378
duke@435 379 if (GenerateArrayStoreCheck && needs_store_check) {
duke@435 380 LIR_Opr tmp1 = FrameMap::G1_opr;
duke@435 381 LIR_Opr tmp2 = FrameMap::G3_opr;
duke@435 382 LIR_Opr tmp3 = FrameMap::G5_opr;
duke@435 383
duke@435 384 CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info);
duke@435 385 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info);
duke@435 386 }
duke@435 387
ysr@777 388 if (obj_store) {
ysr@777 389 // Needs GC write barriers.
johnc@2781 390 pre_barrier(LIR_OprFact::address(array_addr), LIR_OprFact::illegalOpr /* pre_val */,
johnc@2781 391 true /* do_load */, false /* patch */, NULL);
ysr@777 392 }
duke@435 393 __ move(value.result(), array_addr, null_check_info);
duke@435 394 if (obj_store) {
never@1254 395 // Precise card mark
duke@435 396 post_barrier(LIR_OprFact::address(array_addr), value.result());
duke@435 397 }
duke@435 398 }
duke@435 399
duke@435 400
duke@435 401 void LIRGenerator::do_MonitorEnter(MonitorEnter* x) {
roland@2174 402 assert(x->is_pinned(),"");
duke@435 403 LIRItem obj(x->obj(), this);
duke@435 404 obj.load_item();
duke@435 405
duke@435 406 set_no_result(x);
duke@435 407
duke@435 408 LIR_Opr lock = FrameMap::G1_opr;
duke@435 409 LIR_Opr scratch = FrameMap::G3_opr;
duke@435 410 LIR_Opr hdr = FrameMap::G4_opr;
duke@435 411
duke@435 412 CodeEmitInfo* info_for_exception = NULL;
duke@435 413 if (x->needs_null_check()) {
roland@2174 414 info_for_exception = state_for(x);
duke@435 415 }
duke@435 416
duke@435 417 // this CodeEmitInfo must not have the xhandlers because here the
duke@435 418 // object is already locked (xhandlers expects object to be unlocked)
duke@435 419 CodeEmitInfo* info = state_for(x, x->state(), true);
duke@435 420 monitor_enter(obj.result(), lock, hdr, scratch, x->monitor_no(), info_for_exception, info);
duke@435 421 }
duke@435 422
duke@435 423
duke@435 424 void LIRGenerator::do_MonitorExit(MonitorExit* x) {
roland@2174 425 assert(x->is_pinned(),"");
duke@435 426 LIRItem obj(x->obj(), this);
duke@435 427 obj.dont_load_item();
duke@435 428
duke@435 429 set_no_result(x);
duke@435 430 LIR_Opr lock = FrameMap::G1_opr;
duke@435 431 LIR_Opr hdr = FrameMap::G3_opr;
duke@435 432 LIR_Opr obj_temp = FrameMap::G4_opr;
bobv@2036 433 monitor_exit(obj_temp, lock, hdr, LIR_OprFact::illegalOpr, x->monitor_no());
duke@435 434 }
duke@435 435
duke@435 436
duke@435 437 // _ineg, _lneg, _fneg, _dneg
duke@435 438 void LIRGenerator::do_NegateOp(NegateOp* x) {
duke@435 439 LIRItem value(x->x(), this);
duke@435 440 value.load_item();
duke@435 441 LIR_Opr reg = rlock_result(x);
duke@435 442 __ negate(value.result(), reg);
duke@435 443 }
duke@435 444
duke@435 445
duke@435 446
duke@435 447 // for _fadd, _fmul, _fsub, _fdiv, _frem
duke@435 448 // _dadd, _dmul, _dsub, _ddiv, _drem
duke@435 449 void LIRGenerator::do_ArithmeticOp_FPU(ArithmeticOp* x) {
duke@435 450 switch (x->op()) {
duke@435 451 case Bytecodes::_fadd:
duke@435 452 case Bytecodes::_fmul:
duke@435 453 case Bytecodes::_fsub:
duke@435 454 case Bytecodes::_fdiv:
duke@435 455 case Bytecodes::_dadd:
duke@435 456 case Bytecodes::_dmul:
duke@435 457 case Bytecodes::_dsub:
duke@435 458 case Bytecodes::_ddiv: {
duke@435 459 LIRItem left(x->x(), this);
duke@435 460 LIRItem right(x->y(), this);
duke@435 461 left.load_item();
duke@435 462 right.load_item();
duke@435 463 rlock_result(x);
duke@435 464 arithmetic_op_fpu(x->op(), x->operand(), left.result(), right.result(), x->is_strictfp());
duke@435 465 }
duke@435 466 break;
duke@435 467
duke@435 468 case Bytecodes::_frem:
duke@435 469 case Bytecodes::_drem: {
duke@435 470 address entry;
duke@435 471 switch (x->op()) {
duke@435 472 case Bytecodes::_frem:
duke@435 473 entry = CAST_FROM_FN_PTR(address, SharedRuntime::frem);
duke@435 474 break;
duke@435 475 case Bytecodes::_drem:
duke@435 476 entry = CAST_FROM_FN_PTR(address, SharedRuntime::drem);
duke@435 477 break;
duke@435 478 default:
duke@435 479 ShouldNotReachHere();
duke@435 480 }
duke@435 481 LIR_Opr result = call_runtime(x->x(), x->y(), entry, x->type(), NULL);
duke@435 482 set_result(x, result);
duke@435 483 }
duke@435 484 break;
duke@435 485
duke@435 486 default: ShouldNotReachHere();
duke@435 487 }
duke@435 488 }
duke@435 489
duke@435 490
duke@435 491 // for _ladd, _lmul, _lsub, _ldiv, _lrem
duke@435 492 void LIRGenerator::do_ArithmeticOp_Long(ArithmeticOp* x) {
duke@435 493 switch (x->op()) {
duke@435 494 case Bytecodes::_lrem:
duke@435 495 case Bytecodes::_lmul:
duke@435 496 case Bytecodes::_ldiv: {
duke@435 497
duke@435 498 if (x->op() == Bytecodes::_ldiv || x->op() == Bytecodes::_lrem) {
duke@435 499 LIRItem right(x->y(), this);
duke@435 500 right.load_item();
duke@435 501
duke@435 502 CodeEmitInfo* info = state_for(x);
duke@435 503 LIR_Opr item = right.result();
duke@435 504 assert(item->is_register(), "must be");
duke@435 505 __ cmp(lir_cond_equal, item, LIR_OprFact::longConst(0));
duke@435 506 __ branch(lir_cond_equal, T_LONG, new DivByZeroStub(info));
duke@435 507 }
duke@435 508
duke@435 509 address entry;
duke@435 510 switch (x->op()) {
duke@435 511 case Bytecodes::_lrem:
duke@435 512 entry = CAST_FROM_FN_PTR(address, SharedRuntime::lrem);
duke@435 513 break; // check if dividend is 0 is done elsewhere
duke@435 514 case Bytecodes::_ldiv:
duke@435 515 entry = CAST_FROM_FN_PTR(address, SharedRuntime::ldiv);
duke@435 516 break; // check if dividend is 0 is done elsewhere
duke@435 517 case Bytecodes::_lmul:
duke@435 518 entry = CAST_FROM_FN_PTR(address, SharedRuntime::lmul);
duke@435 519 break;
duke@435 520 default:
duke@435 521 ShouldNotReachHere();
duke@435 522 }
duke@435 523
duke@435 524 // order of arguments to runtime call is reversed.
duke@435 525 LIR_Opr result = call_runtime(x->y(), x->x(), entry, x->type(), NULL);
duke@435 526 set_result(x, result);
duke@435 527 break;
duke@435 528 }
duke@435 529 case Bytecodes::_ladd:
duke@435 530 case Bytecodes::_lsub: {
duke@435 531 LIRItem left(x->x(), this);
duke@435 532 LIRItem right(x->y(), this);
duke@435 533 left.load_item();
duke@435 534 right.load_item();
duke@435 535 rlock_result(x);
duke@435 536
duke@435 537 arithmetic_op_long(x->op(), x->operand(), left.result(), right.result(), NULL);
duke@435 538 break;
duke@435 539 }
duke@435 540 default: ShouldNotReachHere();
duke@435 541 }
duke@435 542 }
duke@435 543
duke@435 544
duke@435 545 // Returns if item is an int constant that can be represented by a simm13
duke@435 546 static bool is_simm13(LIR_Opr item) {
duke@435 547 if (item->is_constant() && item->type() == T_INT) {
duke@435 548 return Assembler::is_simm13(item->as_constant_ptr()->as_jint());
duke@435 549 } else {
duke@435 550 return false;
duke@435 551 }
duke@435 552 }
duke@435 553
duke@435 554
duke@435 555 // for: _iadd, _imul, _isub, _idiv, _irem
duke@435 556 void LIRGenerator::do_ArithmeticOp_Int(ArithmeticOp* x) {
duke@435 557 bool is_div_rem = x->op() == Bytecodes::_idiv || x->op() == Bytecodes::_irem;
duke@435 558 LIRItem left(x->x(), this);
duke@435 559 LIRItem right(x->y(), this);
duke@435 560 // missing test if instr is commutative and if we should swap
duke@435 561 right.load_nonconstant();
duke@435 562 assert(right.is_constant() || right.is_register(), "wrong state of right");
duke@435 563 left.load_item();
duke@435 564 rlock_result(x);
duke@435 565 if (is_div_rem) {
duke@435 566 CodeEmitInfo* info = state_for(x);
duke@435 567 LIR_Opr tmp = FrameMap::G1_opr;
duke@435 568 if (x->op() == Bytecodes::_irem) {
duke@435 569 __ irem(left.result(), right.result(), x->operand(), tmp, info);
duke@435 570 } else if (x->op() == Bytecodes::_idiv) {
duke@435 571 __ idiv(left.result(), right.result(), x->operand(), tmp, info);
duke@435 572 }
duke@435 573 } else {
duke@435 574 arithmetic_op_int(x->op(), x->operand(), left.result(), right.result(), FrameMap::G1_opr);
duke@435 575 }
duke@435 576 }
duke@435 577
duke@435 578
duke@435 579 void LIRGenerator::do_ArithmeticOp(ArithmeticOp* x) {
duke@435 580 ValueTag tag = x->type()->tag();
duke@435 581 assert(x->x()->type()->tag() == tag && x->y()->type()->tag() == tag, "wrong parameters");
duke@435 582 switch (tag) {
duke@435 583 case floatTag:
duke@435 584 case doubleTag: do_ArithmeticOp_FPU(x); return;
duke@435 585 case longTag: do_ArithmeticOp_Long(x); return;
duke@435 586 case intTag: do_ArithmeticOp_Int(x); return;
duke@435 587 }
duke@435 588 ShouldNotReachHere();
duke@435 589 }
duke@435 590
duke@435 591
duke@435 592 // _ishl, _lshl, _ishr, _lshr, _iushr, _lushr
duke@435 593 void LIRGenerator::do_ShiftOp(ShiftOp* x) {
duke@435 594 LIRItem value(x->x(), this);
duke@435 595 LIRItem count(x->y(), this);
duke@435 596 // Long shift destroys count register
duke@435 597 if (value.type()->is_long()) {
duke@435 598 count.set_destroys_register();
duke@435 599 }
duke@435 600 value.load_item();
duke@435 601 // the old backend doesn't support this
duke@435 602 if (count.is_constant() && count.type()->as_IntConstant() != NULL && value.type()->is_int()) {
duke@435 603 jint c = count.get_jint_constant() & 0x1f;
duke@435 604 assert(c >= 0 && c < 32, "should be small");
duke@435 605 count.dont_load_item();
duke@435 606 } else {
duke@435 607 count.load_item();
duke@435 608 }
duke@435 609 LIR_Opr reg = rlock_result(x);
duke@435 610 shift_op(x->op(), reg, value.result(), count.result(), LIR_OprFact::illegalOpr);
duke@435 611 }
duke@435 612
duke@435 613
duke@435 614 // _iand, _land, _ior, _lor, _ixor, _lxor
duke@435 615 void LIRGenerator::do_LogicOp(LogicOp* x) {
duke@435 616 LIRItem left(x->x(), this);
duke@435 617 LIRItem right(x->y(), this);
duke@435 618
duke@435 619 left.load_item();
duke@435 620 right.load_nonconstant();
duke@435 621 LIR_Opr reg = rlock_result(x);
duke@435 622
duke@435 623 logic_op(x->op(), reg, left.result(), right.result());
duke@435 624 }
duke@435 625
duke@435 626
duke@435 627
duke@435 628 // _lcmp, _fcmpl, _fcmpg, _dcmpl, _dcmpg
duke@435 629 void LIRGenerator::do_CompareOp(CompareOp* x) {
duke@435 630 LIRItem left(x->x(), this);
duke@435 631 LIRItem right(x->y(), this);
duke@435 632 left.load_item();
duke@435 633 right.load_item();
duke@435 634 LIR_Opr reg = rlock_result(x);
duke@435 635 if (x->x()->type()->is_float_kind()) {
duke@435 636 Bytecodes::Code code = x->op();
duke@435 637 __ fcmp2int(left.result(), right.result(), reg, (code == Bytecodes::_fcmpl || code == Bytecodes::_dcmpl));
duke@435 638 } else if (x->x()->type()->tag() == longTag) {
duke@435 639 __ lcmp2int(left.result(), right.result(), reg);
duke@435 640 } else {
duke@435 641 Unimplemented();
duke@435 642 }
duke@435 643 }
duke@435 644
duke@435 645
duke@435 646 void LIRGenerator::do_AttemptUpdate(Intrinsic* x) {
duke@435 647 assert(x->number_of_arguments() == 3, "wrong type");
duke@435 648 LIRItem obj (x->argument_at(0), this); // AtomicLong object
duke@435 649 LIRItem cmp_value (x->argument_at(1), this); // value to compare with field
duke@435 650 LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value
duke@435 651
duke@435 652 obj.load_item();
duke@435 653 cmp_value.load_item();
duke@435 654 new_value.load_item();
duke@435 655
duke@435 656 // generate compare-and-swap and produce zero condition if swap occurs
duke@435 657 int value_offset = sun_misc_AtomicLongCSImpl::value_offset();
duke@435 658 LIR_Opr addr = FrameMap::O7_opr;
duke@435 659 __ add(obj.result(), LIR_OprFact::intConst(value_offset), addr);
duke@435 660 LIR_Opr t1 = FrameMap::G1_opr; // temp for 64-bit value
duke@435 661 LIR_Opr t2 = FrameMap::G3_opr; // temp for 64-bit value
duke@435 662 __ cas_long(addr, cmp_value.result(), new_value.result(), t1, t2);
duke@435 663
duke@435 664 // generate conditional move of boolean result
duke@435 665 LIR_Opr result = rlock_result(x);
iveresov@2412 666 __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0), result, T_LONG);
duke@435 667 }
duke@435 668
duke@435 669
duke@435 670 void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) {
duke@435 671 assert(x->number_of_arguments() == 4, "wrong type");
duke@435 672 LIRItem obj (x->argument_at(0), this); // object
duke@435 673 LIRItem offset(x->argument_at(1), this); // offset of field
duke@435 674 LIRItem cmp (x->argument_at(2), this); // value to compare with field
duke@435 675 LIRItem val (x->argument_at(3), this); // replace field with val if matches cmp
duke@435 676
duke@435 677 // Use temps to avoid kills
duke@435 678 LIR_Opr t1 = FrameMap::G1_opr;
duke@435 679 LIR_Opr t2 = FrameMap::G3_opr;
never@2228 680 LIR_Opr addr = new_pointer_register();
duke@435 681
duke@435 682 // get address of field
duke@435 683 obj.load_item();
duke@435 684 offset.load_item();
duke@435 685 cmp.load_item();
duke@435 686 val.load_item();
duke@435 687
duke@435 688 __ add(obj.result(), offset.result(), addr);
duke@435 689
ysr@777 690 if (type == objectType) { // Write-barrier needed for Object fields.
johnc@2781 691 pre_barrier(addr, LIR_OprFact::illegalOpr /* pre_val */,
johnc@2781 692 true /* do_load */, false /* patch */, NULL);
ysr@777 693 }
ysr@777 694
duke@435 695 if (type == objectType)
duke@435 696 __ cas_obj(addr, cmp.result(), val.result(), t1, t2);
duke@435 697 else if (type == intType)
duke@435 698 __ cas_int(addr, cmp.result(), val.result(), t1, t2);
duke@435 699 else if (type == longType)
duke@435 700 __ cas_long(addr, cmp.result(), val.result(), t1, t2);
duke@435 701 else {
duke@435 702 ShouldNotReachHere();
duke@435 703 }
duke@435 704 // generate conditional move of boolean result
duke@435 705 LIR_Opr result = rlock_result(x);
iveresov@2412 706 __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0),
iveresov@2412 707 result, as_BasicType(type));
duke@435 708 if (type == objectType) { // Write-barrier needed for Object fields.
never@1254 709 // Precise card mark since could either be object or array
ysr@777 710 post_barrier(addr, val.result());
duke@435 711 }
duke@435 712 }
duke@435 713
duke@435 714
duke@435 715 void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
duke@435 716 switch (x->id()) {
duke@435 717 case vmIntrinsics::_dabs:
duke@435 718 case vmIntrinsics::_dsqrt: {
duke@435 719 assert(x->number_of_arguments() == 1, "wrong type");
duke@435 720 LIRItem value(x->argument_at(0), this);
duke@435 721 value.load_item();
duke@435 722 LIR_Opr dst = rlock_result(x);
duke@435 723
duke@435 724 switch (x->id()) {
duke@435 725 case vmIntrinsics::_dsqrt: {
duke@435 726 __ sqrt(value.result(), dst, LIR_OprFact::illegalOpr);
duke@435 727 break;
duke@435 728 }
duke@435 729 case vmIntrinsics::_dabs: {
duke@435 730 __ abs(value.result(), dst, LIR_OprFact::illegalOpr);
duke@435 731 break;
duke@435 732 }
duke@435 733 }
duke@435 734 break;
duke@435 735 }
duke@435 736 case vmIntrinsics::_dlog10: // fall through
duke@435 737 case vmIntrinsics::_dlog: // fall through
duke@435 738 case vmIntrinsics::_dsin: // fall through
duke@435 739 case vmIntrinsics::_dtan: // fall through
duke@435 740 case vmIntrinsics::_dcos: {
duke@435 741 assert(x->number_of_arguments() == 1, "wrong type");
duke@435 742
duke@435 743 address runtime_entry = NULL;
duke@435 744 switch (x->id()) {
duke@435 745 case vmIntrinsics::_dsin:
duke@435 746 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin);
duke@435 747 break;
duke@435 748 case vmIntrinsics::_dcos:
duke@435 749 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos);
duke@435 750 break;
duke@435 751 case vmIntrinsics::_dtan:
duke@435 752 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan);
duke@435 753 break;
duke@435 754 case vmIntrinsics::_dlog:
duke@435 755 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog);
duke@435 756 break;
duke@435 757 case vmIntrinsics::_dlog10:
duke@435 758 runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10);
duke@435 759 break;
duke@435 760 default:
duke@435 761 ShouldNotReachHere();
duke@435 762 }
duke@435 763
duke@435 764 LIR_Opr result = call_runtime(x->argument_at(0), runtime_entry, x->type(), NULL);
duke@435 765 set_result(x, result);
duke@435 766 }
duke@435 767 }
duke@435 768 }
duke@435 769
duke@435 770
duke@435 771 void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
duke@435 772 assert(x->number_of_arguments() == 5, "wrong type");
never@1363 773
never@1363 774 // Make all state_for calls early since they can emit code
never@1363 775 CodeEmitInfo* info = state_for(x, x->state());
never@1363 776
duke@435 777 // Note: spill caller save before setting the item
duke@435 778 LIRItem src (x->argument_at(0), this);
duke@435 779 LIRItem src_pos (x->argument_at(1), this);
duke@435 780 LIRItem dst (x->argument_at(2), this);
duke@435 781 LIRItem dst_pos (x->argument_at(3), this);
duke@435 782 LIRItem length (x->argument_at(4), this);
duke@435 783 // load all values in callee_save_registers, as this makes the
duke@435 784 // parameter passing to the fast case simpler
duke@435 785 src.load_item_force (rlock_callee_saved(T_OBJECT));
duke@435 786 src_pos.load_item_force (rlock_callee_saved(T_INT));
duke@435 787 dst.load_item_force (rlock_callee_saved(T_OBJECT));
duke@435 788 dst_pos.load_item_force (rlock_callee_saved(T_INT));
duke@435 789 length.load_item_force (rlock_callee_saved(T_INT));
duke@435 790
duke@435 791 int flags;
duke@435 792 ciArrayKlass* expected_type;
duke@435 793 arraycopy_helper(x, &flags, &expected_type);
duke@435 794
duke@435 795 __ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(),
duke@435 796 length.result(), rlock_callee_saved(T_INT),
duke@435 797 expected_type, flags, info);
duke@435 798 set_no_result(x);
duke@435 799 }
duke@435 800
duke@435 801 // _i2l, _i2f, _i2d, _l2i, _l2f, _l2d, _f2i, _f2l, _f2d, _d2i, _d2l, _d2f
duke@435 802 // _i2b, _i2c, _i2s
duke@435 803 void LIRGenerator::do_Convert(Convert* x) {
duke@435 804
duke@435 805 switch (x->op()) {
duke@435 806 case Bytecodes::_f2l:
duke@435 807 case Bytecodes::_d2l:
duke@435 808 case Bytecodes::_d2i:
duke@435 809 case Bytecodes::_l2f:
duke@435 810 case Bytecodes::_l2d: {
duke@435 811
duke@435 812 address entry;
duke@435 813 switch (x->op()) {
duke@435 814 case Bytecodes::_l2f:
duke@435 815 entry = CAST_FROM_FN_PTR(address, SharedRuntime::l2f);
duke@435 816 break;
duke@435 817 case Bytecodes::_l2d:
duke@435 818 entry = CAST_FROM_FN_PTR(address, SharedRuntime::l2d);
duke@435 819 break;
duke@435 820 case Bytecodes::_f2l:
duke@435 821 entry = CAST_FROM_FN_PTR(address, SharedRuntime::f2l);
duke@435 822 break;
duke@435 823 case Bytecodes::_d2l:
duke@435 824 entry = CAST_FROM_FN_PTR(address, SharedRuntime::d2l);
duke@435 825 break;
duke@435 826 case Bytecodes::_d2i:
duke@435 827 entry = CAST_FROM_FN_PTR(address, SharedRuntime::d2i);
duke@435 828 break;
duke@435 829 default:
duke@435 830 ShouldNotReachHere();
duke@435 831 }
duke@435 832 LIR_Opr result = call_runtime(x->value(), entry, x->type(), NULL);
duke@435 833 set_result(x, result);
duke@435 834 break;
duke@435 835 }
duke@435 836
duke@435 837 case Bytecodes::_i2f:
duke@435 838 case Bytecodes::_i2d: {
duke@435 839 LIRItem value(x->value(), this);
duke@435 840
duke@435 841 LIR_Opr reg = rlock_result(x);
duke@435 842 // To convert an int to double, we need to load the 32-bit int
duke@435 843 // from memory into a single precision floating point register
duke@435 844 // (even numbered). Then the sparc fitod instruction takes care
duke@435 845 // of the conversion. This is a bit ugly, but is the best way to
duke@435 846 // get the int value in a single precision floating point register
duke@435 847 value.load_item();
duke@435 848 LIR_Opr tmp = force_to_spill(value.result(), T_FLOAT);
duke@435 849 __ convert(x->op(), tmp, reg);
duke@435 850 break;
duke@435 851 }
duke@435 852 break;
duke@435 853
duke@435 854 case Bytecodes::_i2l:
duke@435 855 case Bytecodes::_i2b:
duke@435 856 case Bytecodes::_i2c:
duke@435 857 case Bytecodes::_i2s:
duke@435 858 case Bytecodes::_l2i:
duke@435 859 case Bytecodes::_f2d:
duke@435 860 case Bytecodes::_d2f: { // inline code
duke@435 861 LIRItem value(x->value(), this);
duke@435 862
duke@435 863 value.load_item();
duke@435 864 LIR_Opr reg = rlock_result(x);
duke@435 865 __ convert(x->op(), value.result(), reg, false);
duke@435 866 }
duke@435 867 break;
duke@435 868
duke@435 869 case Bytecodes::_f2i: {
duke@435 870 LIRItem value (x->value(), this);
duke@435 871 value.set_destroys_register();
duke@435 872 value.load_item();
duke@435 873 LIR_Opr reg = rlock_result(x);
duke@435 874 set_vreg_flag(reg, must_start_in_memory);
duke@435 875 __ convert(x->op(), value.result(), reg, false);
duke@435 876 }
duke@435 877 break;
duke@435 878
duke@435 879 default: ShouldNotReachHere();
duke@435 880 }
duke@435 881 }
duke@435 882
duke@435 883
duke@435 884 void LIRGenerator::do_NewInstance(NewInstance* x) {
duke@435 885 // This instruction can be deoptimized in the slow path : use
duke@435 886 // O0 as result register.
duke@435 887 const LIR_Opr reg = result_register_for(x->type());
roland@2174 888 #ifndef PRODUCT
duke@435 889 if (PrintNotLoaded && !x->klass()->is_loaded()) {
roland@2174 890 tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
duke@435 891 }
roland@2174 892 #endif
duke@435 893 CodeEmitInfo* info = state_for(x, x->state());
duke@435 894 LIR_Opr tmp1 = FrameMap::G1_oop_opr;
duke@435 895 LIR_Opr tmp2 = FrameMap::G3_oop_opr;
duke@435 896 LIR_Opr tmp3 = FrameMap::G4_oop_opr;
duke@435 897 LIR_Opr tmp4 = FrameMap::O1_oop_opr;
duke@435 898 LIR_Opr klass_reg = FrameMap::G5_oop_opr;
duke@435 899 new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
duke@435 900 LIR_Opr result = rlock_result(x);
duke@435 901 __ move(reg, result);
duke@435 902 }
duke@435 903
duke@435 904
duke@435 905 void LIRGenerator::do_NewTypeArray(NewTypeArray* x) {
never@1363 906 // Evaluate state_for early since it may emit code
never@1363 907 CodeEmitInfo* info = state_for(x, x->state());
never@1363 908
duke@435 909 LIRItem length(x->length(), this);
duke@435 910 length.load_item();
duke@435 911
duke@435 912 LIR_Opr reg = result_register_for(x->type());
duke@435 913 LIR_Opr tmp1 = FrameMap::G1_oop_opr;
duke@435 914 LIR_Opr tmp2 = FrameMap::G3_oop_opr;
duke@435 915 LIR_Opr tmp3 = FrameMap::G4_oop_opr;
duke@435 916 LIR_Opr tmp4 = FrameMap::O1_oop_opr;
duke@435 917 LIR_Opr klass_reg = FrameMap::G5_oop_opr;
duke@435 918 LIR_Opr len = length.result();
duke@435 919 BasicType elem_type = x->elt_type();
duke@435 920
jrose@1424 921 __ oop2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
duke@435 922
duke@435 923 CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info);
duke@435 924 __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path);
duke@435 925
duke@435 926 LIR_Opr result = rlock_result(x);
duke@435 927 __ move(reg, result);
duke@435 928 }
duke@435 929
duke@435 930
duke@435 931 void LIRGenerator::do_NewObjectArray(NewObjectArray* x) {
never@1363 932 // Evaluate state_for early since it may emit code.
never@1363 933 CodeEmitInfo* info = state_for(x, x->state());
duke@435 934 // in case of patching (i.e., object class is not yet loaded), we need to reexecute the instruction
duke@435 935 // and therefore provide the state before the parameters have been consumed
duke@435 936 CodeEmitInfo* patching_info = NULL;
duke@435 937 if (!x->klass()->is_loaded() || PatchALot) {
duke@435 938 patching_info = state_for(x, x->state_before());
duke@435 939 }
duke@435 940
never@1363 941 LIRItem length(x->length(), this);
duke@435 942 length.load_item();
duke@435 943
duke@435 944 const LIR_Opr reg = result_register_for(x->type());
duke@435 945 LIR_Opr tmp1 = FrameMap::G1_oop_opr;
duke@435 946 LIR_Opr tmp2 = FrameMap::G3_oop_opr;
duke@435 947 LIR_Opr tmp3 = FrameMap::G4_oop_opr;
duke@435 948 LIR_Opr tmp4 = FrameMap::O1_oop_opr;
duke@435 949 LIR_Opr klass_reg = FrameMap::G5_oop_opr;
duke@435 950 LIR_Opr len = length.result();
duke@435 951
duke@435 952 CodeStub* slow_path = new NewObjectArrayStub(klass_reg, len, reg, info);
duke@435 953 ciObject* obj = (ciObject*) ciObjArrayKlass::make(x->klass());
duke@435 954 if (obj == ciEnv::unloaded_ciobjarrayklass()) {
duke@435 955 BAILOUT("encountered unloaded_ciobjarrayklass due to out of memory error");
duke@435 956 }
duke@435 957 jobject2reg_with_patching(klass_reg, obj, patching_info);
duke@435 958 __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, T_OBJECT, klass_reg, slow_path);
duke@435 959
duke@435 960 LIR_Opr result = rlock_result(x);
duke@435 961 __ move(reg, result);
duke@435 962 }
duke@435 963
duke@435 964
duke@435 965 void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
duke@435 966 Values* dims = x->dims();
duke@435 967 int i = dims->length();
duke@435 968 LIRItemList* items = new LIRItemList(dims->length(), NULL);
duke@435 969 while (i-- > 0) {
duke@435 970 LIRItem* size = new LIRItem(dims->at(i), this);
duke@435 971 items->at_put(i, size);
duke@435 972 }
duke@435 973
never@1363 974 // Evaluate state_for early since it may emit code.
duke@435 975 CodeEmitInfo* patching_info = NULL;
duke@435 976 if (!x->klass()->is_loaded() || PatchALot) {
duke@435 977 patching_info = state_for(x, x->state_before());
duke@435 978
duke@435 979 // cannot re-use same xhandlers for multiple CodeEmitInfos, so
never@1368 980 // clone all handlers. This is handled transparently in other
never@1368 981 // places by the CodeEmitInfo cloning logic but is handled
never@1368 982 // specially here because a stub isn't being used.
duke@435 983 x->set_exception_handlers(new XHandlers(x->exception_handlers()));
duke@435 984 }
never@1368 985 CodeEmitInfo* info = state_for(x, x->state());
duke@435 986
duke@435 987 i = dims->length();
duke@435 988 while (i-- > 0) {
duke@435 989 LIRItem* size = items->at(i);
duke@435 990 size->load_item();
duke@435 991 store_stack_parameter (size->result(),
duke@435 992 in_ByteSize(STACK_BIAS +
never@739 993 frame::memory_parameter_word_sp_offset * wordSize +
never@739 994 i * sizeof(jint)));
duke@435 995 }
duke@435 996
duke@435 997 // This instruction can be deoptimized in the slow path : use
duke@435 998 // O0 as result register.
duke@435 999 const LIR_Opr reg = result_register_for(x->type());
duke@435 1000 jobject2reg_with_patching(reg, x->klass(), patching_info);
duke@435 1001 LIR_Opr rank = FrameMap::O1_opr;
duke@435 1002 __ move(LIR_OprFact::intConst(x->rank()), rank);
duke@435 1003 LIR_Opr varargs = FrameMap::as_pointer_opr(O2);
duke@435 1004 int offset_from_sp = (frame::memory_parameter_word_sp_offset * wordSize) + STACK_BIAS;
duke@435 1005 __ add(FrameMap::SP_opr,
duke@435 1006 LIR_OprFact::intptrConst(offset_from_sp),
duke@435 1007 varargs);
duke@435 1008 LIR_OprList* args = new LIR_OprList(3);
duke@435 1009 args->append(reg);
duke@435 1010 args->append(rank);
duke@435 1011 args->append(varargs);
duke@435 1012 __ call_runtime(Runtime1::entry_for(Runtime1::new_multi_array_id),
duke@435 1013 LIR_OprFact::illegalOpr,
duke@435 1014 reg, args, info);
duke@435 1015
duke@435 1016 LIR_Opr result = rlock_result(x);
duke@435 1017 __ move(reg, result);
duke@435 1018 }
duke@435 1019
duke@435 1020
duke@435 1021 void LIRGenerator::do_BlockBegin(BlockBegin* x) {
duke@435 1022 }
duke@435 1023
duke@435 1024
duke@435 1025 void LIRGenerator::do_CheckCast(CheckCast* x) {
duke@435 1026 LIRItem obj(x->obj(), this);
duke@435 1027 CodeEmitInfo* patching_info = NULL;
duke@435 1028 if (!x->klass()->is_loaded() || (PatchALot && !x->is_incompatible_class_change_check())) {
duke@435 1029 // must do this before locking the destination register as an oop register,
duke@435 1030 // and before the obj is loaded (so x->obj()->item() is valid for creating a debug info location)
duke@435 1031 patching_info = state_for(x, x->state_before());
duke@435 1032 }
duke@435 1033 obj.load_item();
duke@435 1034 LIR_Opr out_reg = rlock_result(x);
duke@435 1035 CodeStub* stub;
roland@2174 1036 CodeEmitInfo* info_for_exception = state_for(x);
duke@435 1037
duke@435 1038 if (x->is_incompatible_class_change_check()) {
duke@435 1039 assert(patching_info == NULL, "can't patch this");
duke@435 1040 stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
duke@435 1041 } else {
duke@435 1042 stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
duke@435 1043 }
duke@435 1044 LIR_Opr tmp1 = FrameMap::G1_oop_opr;
duke@435 1045 LIR_Opr tmp2 = FrameMap::G3_oop_opr;
duke@435 1046 LIR_Opr tmp3 = FrameMap::G4_oop_opr;
duke@435 1047 __ checkcast(out_reg, obj.result(), x->klass(), tmp1, tmp2, tmp3,
duke@435 1048 x->direct_compare(), info_for_exception, patching_info, stub,
duke@435 1049 x->profiled_method(), x->profiled_bci());
duke@435 1050 }
duke@435 1051
duke@435 1052
duke@435 1053 void LIRGenerator::do_InstanceOf(InstanceOf* x) {
duke@435 1054 LIRItem obj(x->obj(), this);
duke@435 1055 CodeEmitInfo* patching_info = NULL;
duke@435 1056 if (!x->klass()->is_loaded() || PatchALot) {
duke@435 1057 patching_info = state_for(x, x->state_before());
duke@435 1058 }
duke@435 1059 // ensure the result register is not the input register because the result is initialized before the patching safepoint
duke@435 1060 obj.load_item();
duke@435 1061 LIR_Opr out_reg = rlock_result(x);
duke@435 1062 LIR_Opr tmp1 = FrameMap::G1_oop_opr;
duke@435 1063 LIR_Opr tmp2 = FrameMap::G3_oop_opr;
duke@435 1064 LIR_Opr tmp3 = FrameMap::G4_oop_opr;
iveresov@2146 1065 __ instanceof(out_reg, obj.result(), x->klass(), tmp1, tmp2, tmp3,
iveresov@2146 1066 x->direct_compare(), patching_info,
iveresov@2146 1067 x->profiled_method(), x->profiled_bci());
duke@435 1068 }
duke@435 1069
duke@435 1070
duke@435 1071 void LIRGenerator::do_If(If* x) {
duke@435 1072 assert(x->number_of_sux() == 2, "inconsistency");
duke@435 1073 ValueTag tag = x->x()->type()->tag();
duke@435 1074 LIRItem xitem(x->x(), this);
duke@435 1075 LIRItem yitem(x->y(), this);
duke@435 1076 LIRItem* xin = &xitem;
duke@435 1077 LIRItem* yin = &yitem;
duke@435 1078 If::Condition cond = x->cond();
duke@435 1079
duke@435 1080 if (tag == longTag) {
duke@435 1081 // for longs, only conditions "eql", "neq", "lss", "geq" are valid;
duke@435 1082 // mirror for other conditions
duke@435 1083 if (cond == If::gtr || cond == If::leq) {
duke@435 1084 // swap inputs
duke@435 1085 cond = Instruction::mirror(cond);
duke@435 1086 xin = &yitem;
duke@435 1087 yin = &xitem;
duke@435 1088 }
duke@435 1089 xin->set_destroys_register();
duke@435 1090 }
duke@435 1091
duke@435 1092 LIR_Opr left = LIR_OprFact::illegalOpr;
duke@435 1093 LIR_Opr right = LIR_OprFact::illegalOpr;
duke@435 1094
duke@435 1095 xin->load_item();
duke@435 1096 left = xin->result();
duke@435 1097
duke@435 1098 if (is_simm13(yin->result())) {
duke@435 1099 // inline int constants which are small enough to be immediate operands
duke@435 1100 right = LIR_OprFact::value_type(yin->value()->type());
duke@435 1101 } else if (tag == longTag && yin->is_constant() && yin->get_jlong_constant() == 0 &&
duke@435 1102 (cond == If::eql || cond == If::neq)) {
duke@435 1103 // inline long zero
duke@435 1104 right = LIR_OprFact::value_type(yin->value()->type());
duke@435 1105 } else if (tag == objectTag && yin->is_constant() && (yin->get_jobject_constant()->is_null_object())) {
duke@435 1106 right = LIR_OprFact::value_type(yin->value()->type());
duke@435 1107 } else {
duke@435 1108 yin->load_item();
duke@435 1109 right = yin->result();
duke@435 1110 }
duke@435 1111 set_no_result(x);
duke@435 1112
duke@435 1113 // add safepoint before generating condition code so it can be recomputed
duke@435 1114 if (x->is_safepoint()) {
duke@435 1115 // increment backedge counter if needed
iveresov@2138 1116 increment_backedge_counter(state_for(x, x->state_before()), x->profiled_bci());
duke@435 1117 __ safepoint(new_register(T_INT), state_for(x, x->state_before()));
duke@435 1118 }
duke@435 1119
duke@435 1120 __ cmp(lir_cond(cond), left, right);
iveresov@2138 1121 // Generate branch profiling. Profiling code doesn't kill flags.
duke@435 1122 profile_branch(x, cond);
duke@435 1123 move_to_phi(x->state());
duke@435 1124 if (x->x()->type()->is_float_kind()) {
duke@435 1125 __ branch(lir_cond(cond), right->type(), x->tsux(), x->usux());
duke@435 1126 } else {
duke@435 1127 __ branch(lir_cond(cond), right->type(), x->tsux());
duke@435 1128 }
duke@435 1129 assert(x->default_sux() == x->fsux(), "wrong destination above");
duke@435 1130 __ jump(x->default_sux());
duke@435 1131 }
duke@435 1132
duke@435 1133
duke@435 1134 LIR_Opr LIRGenerator::getThreadPointer() {
duke@435 1135 return FrameMap::as_pointer_opr(G2);
duke@435 1136 }
duke@435 1137
duke@435 1138
duke@435 1139 void LIRGenerator::trace_block_entry(BlockBegin* block) {
duke@435 1140 __ move(LIR_OprFact::intConst(block->block_id()), FrameMap::O0_opr);
duke@435 1141 LIR_OprList* args = new LIR_OprList(1);
duke@435 1142 args->append(FrameMap::O0_opr);
duke@435 1143 address func = CAST_FROM_FN_PTR(address, Runtime1::trace_block_entry);
duke@435 1144 __ call_runtime_leaf(func, rlock_callee_saved(T_INT), LIR_OprFact::illegalOpr, args);
duke@435 1145 }
duke@435 1146
duke@435 1147
duke@435 1148 void LIRGenerator::volatile_field_store(LIR_Opr value, LIR_Address* address,
duke@435 1149 CodeEmitInfo* info) {
duke@435 1150 #ifdef _LP64
duke@435 1151 __ store(value, address, info);
duke@435 1152 #else
duke@435 1153 __ volatile_store_mem_reg(value, address, info);
duke@435 1154 #endif
duke@435 1155 }
duke@435 1156
duke@435 1157 void LIRGenerator::volatile_field_load(LIR_Address* address, LIR_Opr result,
duke@435 1158 CodeEmitInfo* info) {
duke@435 1159 #ifdef _LP64
duke@435 1160 __ load(address, result, info);
duke@435 1161 #else
duke@435 1162 __ volatile_load_mem_reg(address, result, info);
duke@435 1163 #endif
duke@435 1164 }
duke@435 1165
duke@435 1166
duke@435 1167 void LIRGenerator::put_Object_unsafe(LIR_Opr src, LIR_Opr offset, LIR_Opr data,
duke@435 1168 BasicType type, bool is_volatile) {
duke@435 1169 LIR_Opr base_op = src;
duke@435 1170 LIR_Opr index_op = offset;
duke@435 1171
duke@435 1172 bool is_obj = (type == T_ARRAY || type == T_OBJECT);
duke@435 1173 #ifndef _LP64
duke@435 1174 if (is_volatile && type == T_LONG) {
duke@435 1175 __ volatile_store_unsafe_reg(data, src, offset, type, NULL, lir_patch_none);
duke@435 1176 } else
duke@435 1177 #endif
duke@435 1178 {
duke@435 1179 if (type == T_BOOLEAN) {
duke@435 1180 type = T_BYTE;
duke@435 1181 }
duke@435 1182 LIR_Address* addr;
duke@435 1183 if (type == T_ARRAY || type == T_OBJECT) {
duke@435 1184 LIR_Opr tmp = new_pointer_register();
duke@435 1185 __ add(base_op, index_op, tmp);
iveresov@1927 1186 addr = new LIR_Address(tmp, type);
duke@435 1187 } else {
duke@435 1188 addr = new LIR_Address(base_op, index_op, type);
duke@435 1189 }
duke@435 1190
ysr@777 1191 if (is_obj) {
johnc@2781 1192 pre_barrier(LIR_OprFact::address(addr), LIR_OprFact::illegalOpr /* pre_val */,
johnc@2781 1193 true /* do_load */, false /* patch */, NULL);
ysr@777 1194 // _bs->c1_write_barrier_pre(this, LIR_OprFact::address(addr));
ysr@777 1195 }
duke@435 1196 __ move(data, addr);
duke@435 1197 if (is_obj) {
duke@435 1198 // This address is precise
duke@435 1199 post_barrier(LIR_OprFact::address(addr), data);
duke@435 1200 }
duke@435 1201 }
duke@435 1202 }
duke@435 1203
duke@435 1204
duke@435 1205 void LIRGenerator::get_Object_unsafe(LIR_Opr dst, LIR_Opr src, LIR_Opr offset,
duke@435 1206 BasicType type, bool is_volatile) {
duke@435 1207 #ifndef _LP64
duke@435 1208 if (is_volatile && type == T_LONG) {
duke@435 1209 __ volatile_load_unsafe_reg(src, offset, dst, type, NULL, lir_patch_none);
duke@435 1210 } else
duke@435 1211 #endif
duke@435 1212 {
duke@435 1213 LIR_Address* addr = new LIR_Address(src, offset, type);
duke@435 1214 __ load(addr, dst);
duke@435 1215 }
duke@435 1216 }

mercurial