1 /* 2 * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. 4 * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved. 5 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 6 * 7 * This code is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 only, as 9 * published by the Free Software Foundation. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 * 25 */ 26 27 #include "precompiled.hpp" 28 #include "asm/assembler.hpp" 29 #include "asm/macroAssembler.inline.hpp" 30 #include "c1/c1_CodeStubs.hpp" 31 #include "c1/c1_Compilation.hpp" 32 #include "c1/c1_LIRAssembler.hpp" 33 #include "c1/c1_MacroAssembler.hpp" 34 #include "c1/c1_Runtime1.hpp" 35 #include "c1/c1_ValueStack.hpp" 36 #include "ci/ciArrayKlass.hpp" 37 #include "ci/ciInstance.hpp" 38 #include "code/compiledIC.hpp" 39 #include "gc/shared/collectedHeap.hpp" 40 #include "nativeInst_riscv.hpp" 41 #include "oops/objArrayKlass.hpp" 42 #include "runtime/frame.inline.hpp" 43 #include "runtime/sharedRuntime.hpp" 44 #include "utilities/powerOfTwo.hpp" 45 #include "vmreg_riscv.inline.hpp" 46 47 #ifndef PRODUCT 48 #define COMMENT(x) do { __ block_comment(x); } while (0) 49 #else 50 #define COMMENT(x) 51 #endif 52 53 NEEDS_CLEANUP // remove this definitions ? 54 const Register IC_Klass = t1; // where the IC klass is cached 55 const Register SYNC_header = x10; // synchronization header 56 const Register SHIFT_count = x10; // where count for shift operations must be 57 58 #define __ _masm-> 59 60 static void select_different_registers(Register preserve, 61 Register extra, 62 Register &tmp1, 63 Register &tmp2) { 64 if (tmp1 == preserve) { 65 assert_different_registers(tmp1, tmp2, extra); 66 tmp1 = extra; 67 } else if (tmp2 == preserve) { 68 assert_different_registers(tmp1, tmp2, extra); 69 tmp2 = extra; 70 } 71 assert_different_registers(preserve, tmp1, tmp2); 72 } 73 74 static void select_different_registers(Register preserve, 75 Register extra, 76 Register &tmp1, 77 Register &tmp2, 78 Register &tmp3) { 79 if (tmp1 == preserve) { 80 assert_different_registers(tmp1, tmp2, tmp3, extra); 81 tmp1 = extra; 82 } else if (tmp2 == preserve) { 83 assert_different_registers(tmp1, tmp2, tmp3, extra); 84 tmp2 = extra; 85 } else if (tmp3 == preserve) { 86 assert_different_registers(tmp1, tmp2, tmp3, extra); 87 tmp3 = extra; 88 } 89 assert_different_registers(preserve, tmp1, tmp2, tmp3); 90 } 91 92 bool LIR_Assembler::is_small_constant(LIR_Opr opr) { Unimplemented(); return false; } 93 94 void LIR_Assembler::clinit_barrier(ciMethod* method) { 95 assert(VM_Version::supports_fast_class_init_checks(), "sanity"); 96 assert(!method->holder()->is_not_initialized(), "initialization should have been started"); 97 98 Label L_skip_barrier; 99 100 __ mov_metadata(t1, method->holder()->constant_encoding()); 101 __ clinit_barrier(t1, t0, &L_skip_barrier /* L_fast_path */); 102 __ far_jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub())); 103 __ bind(L_skip_barrier); 104 } 105 106 LIR_Opr LIR_Assembler::receiverOpr() { 107 return FrameMap::receiver_opr; 108 } 109 110 LIR_Opr LIR_Assembler::osrBufferPointer() { 111 return FrameMap::as_pointer_opr(receiverOpr()->as_register()); 112 } 113 114 void LIR_Assembler::breakpoint() { Unimplemented(); } 115 116 void LIR_Assembler::push(LIR_Opr opr) { Unimplemented(); } 117 118 void LIR_Assembler::pop(LIR_Opr opr) { Unimplemented(); } 119 120 static jlong as_long(LIR_Opr data) { 121 jlong result; 122 switch (data->type()) { 123 case T_INT: 124 result = (data->as_jint()); 125 break; 126 case T_LONG: 127 result = (data->as_jlong()); 128 break; 129 default: 130 ShouldNotReachHere(); 131 result = 0; // unreachable 132 } 133 return result; 134 } 135 136 Address LIR_Assembler::as_Address(LIR_Address* addr, Register tmp) { 137 if (addr->base()->is_illegal()) { 138 assert(addr->index()->is_illegal(), "must be illegal too"); 139 __ movptr(tmp, addr->disp()); 140 return Address(tmp, 0); 141 } 142 143 Register base = addr->base()->as_pointer_register(); 144 LIR_Opr index_opr = addr->index(); 145 146 if (index_opr->is_illegal()) { 147 return Address(base, addr->disp()); 148 } 149 150 int scale = addr->scale(); 151 if (index_opr->is_cpu_register()) { 152 Register index; 153 if (index_opr->is_single_cpu()) { 154 index = index_opr->as_register(); 155 } else { 156 index = index_opr->as_register_lo(); 157 } 158 if (scale != 0) { 159 __ shadd(tmp, index, base, tmp, scale); 160 } else { 161 __ add(tmp, base, index); 162 } 163 return Address(tmp, addr->disp()); 164 } else if (index_opr->is_constant()) { 165 intptr_t addr_offset = (((intptr_t)index_opr->as_constant_ptr()->as_jint()) << scale) + addr->disp(); 166 return Address(base, addr_offset); 167 } 168 169 Unimplemented(); 170 return Address(); 171 } 172 173 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) { 174 ShouldNotReachHere(); 175 return Address(); 176 } 177 178 Address LIR_Assembler::as_Address(LIR_Address* addr) { 179 return as_Address(addr, t0); 180 } 181 182 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) { 183 return as_Address(addr); 184 } 185 186 // Ensure a valid Address (base + offset) to a stack-slot. If stack access is 187 // not encodable as a base + (immediate) offset, generate an explicit address 188 // calculation to hold the address in t0. 189 Address LIR_Assembler::stack_slot_address(int index, uint size, int adjust) { 190 precond(size == 4 || size == 8); 191 Address addr = frame_map()->address_for_slot(index, adjust); 192 precond(addr.getMode() == Address::base_plus_offset); 193 precond(addr.base() == sp); 194 precond(addr.offset() > 0); 195 uint mask = size - 1; 196 assert((addr.offset() & mask) == 0, "scaled offsets only"); 197 198 return addr; 199 } 200 201 void LIR_Assembler::osr_entry() { 202 offsets()->set_value(CodeOffsets::OSR_Entry, code_offset()); 203 BlockBegin* osr_entry = compilation()->hir()->osr_entry(); 204 guarantee(osr_entry != nullptr, "null osr_entry!"); 205 ValueStack* entry_state = osr_entry->state(); 206 int number_of_locks = entry_state->locks_size(); 207 208 // we jump here if osr happens with the interpreter 209 // state set up to continue at the beginning of the 210 // loop that triggered osr - in particular, we have 211 // the following registers setup: 212 // 213 // x12: osr buffer 214 // 215 216 //build frame 217 ciMethod* m = compilation()->method(); 218 __ build_frame(initial_frame_size_in_bytes(), bang_size_in_bytes()); 219 220 // OSR buffer is 221 // 222 // locals[nlocals-1..0] 223 // monitors[0..number_of_locks] 224 // 225 // locals is a direct copy of the interpreter frame so in the osr buffer 226 // so first slot in the local array is the last local from the interpreter 227 // and last slot is local[0] (receiver) from the interpreter 228 // 229 // Similarly with locks. The first lock slot in the osr buffer is the nth lock 230 // from the interpreter frame, the nth lock slot in the osr buffer is 0th lock 231 // in the interpreter frame (the method lock if a sync method) 232 233 // Initialize monitors in the compiled activation. 234 // x12: pointer to osr buffer 235 // All other registers are dead at this point and the locals will be 236 // copied into place by code emitted in the IR. 237 238 Register OSR_buf = osrBufferPointer()->as_pointer_register(); 239 { 240 assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below"); 241 int monitor_offset = BytesPerWord * method()->max_locals() + 242 (2 * BytesPerWord) * (number_of_locks - 1); 243 // SharedRuntime::OSR_migration_begin() packs BasicObjectLocks in 244 // the OSR buffer using 2 word entries: first the lock and then 245 // the oop. 246 for (int i = 0; i < number_of_locks; i++) { 247 int slot_offset = monitor_offset - ((i * 2) * BytesPerWord); 248 #ifdef ASSERT 249 // verify the interpreter's monitor has a non-null object 250 { 251 Label L; 252 __ ld(t0, Address(OSR_buf, slot_offset + 1 * BytesPerWord)); 253 __ bnez(t0, L); 254 __ stop("locked object is null"); 255 __ bind(L); 256 } 257 #endif // ASSERT 258 __ ld(x9, Address(OSR_buf, slot_offset + 0)); 259 __ sd(x9, frame_map()->address_for_monitor_lock(i)); 260 __ ld(x9, Address(OSR_buf, slot_offset + 1 * BytesPerWord)); 261 __ sd(x9, frame_map()->address_for_monitor_object(i)); 262 } 263 } 264 } 265 266 // inline cache check; done before the frame is built. 267 int LIR_Assembler::check_icache() { 268 Register receiver = FrameMap::receiver_opr->as_register(); 269 Register ic_klass = IC_Klass; 270 int start_offset = __ offset(); 271 Label dont; 272 __ inline_cache_check(receiver, ic_klass, dont); 273 274 // if icache check fails, then jump to runtime routine 275 // Note: RECEIVER must still contain the receiver! 276 __ far_jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub())); 277 278 // We align the verified entry point unless the method body 279 // (including its inline cache check) will fit in a single 64-byte 280 // icache line. 281 if (!method()->is_accessor() || __ offset() - start_offset > 4 * 4) { 282 // force alignment after the cache check. 283 __ align(CodeEntryAlignment); 284 } 285 286 __ bind(dont); 287 return start_offset; 288 } 289 290 void LIR_Assembler::jobject2reg(jobject o, Register reg) { 291 if (o == nullptr) { 292 __ mv(reg, zr); 293 } else { 294 __ movoop(reg, o); 295 } 296 } 297 298 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) { 299 deoptimize_trap(info); 300 } 301 302 // This specifies the rsp decrement needed to build the frame 303 int LIR_Assembler::initial_frame_size_in_bytes() const { 304 // if rounding, must let FrameMap know! 305 306 return in_bytes(frame_map()->framesize_in_bytes()); 307 } 308 309 int LIR_Assembler::emit_exception_handler() { 310 // generate code for exception handler 311 address handler_base = __ start_a_stub(exception_handler_size()); 312 if (handler_base == nullptr) { 313 // not enough space left for the handler 314 bailout("exception handler overflow"); 315 return -1; 316 } 317 318 int offset = code_offset(); 319 320 // the exception oop and pc are in x10, and x13 321 // no other registers need to be preserved, so invalidate them 322 __ invalidate_registers(false, true, true, false, true, true); 323 324 // check that there is really an exception 325 __ verify_not_null_oop(x10); 326 327 // search an exception handler (x10: exception oop, x13: throwing pc) 328 __ far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::handle_exception_from_callee_id))); 329 __ should_not_reach_here(); 330 guarantee(code_offset() - offset <= exception_handler_size(), "overflow"); 331 __ end_a_stub(); 332 333 return offset; 334 } 335 336 // Emit the code to remove the frame from the stack in the exception 337 // unwind path. 338 int LIR_Assembler::emit_unwind_handler() { 339 #ifndef PRODUCT 340 if (CommentedAssembly) { 341 _masm->block_comment("Unwind handler"); 342 } 343 #endif // PRODUCT 344 345 int offset = code_offset(); 346 347 // Fetch the exception from TLS and clear out exception related thread state 348 __ ld(x10, Address(xthread, JavaThread::exception_oop_offset())); 349 __ sd(zr, Address(xthread, JavaThread::exception_oop_offset())); 350 __ sd(zr, Address(xthread, JavaThread::exception_pc_offset())); 351 352 __ bind(_unwind_handler_entry); 353 __ verify_not_null_oop(x10); 354 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { 355 __ mv(x9, x10); // Preserve the exception 356 } 357 358 // Perform needed unlocking 359 MonitorExitStub* stub = nullptr; 360 if (method()->is_synchronized()) { 361 monitor_address(0, FrameMap::r10_opr); 362 stub = new MonitorExitStub(FrameMap::r10_opr, true, 0); 363 if (LockingMode == LM_MONITOR) { 364 __ j(*stub->entry()); 365 } else { 366 __ unlock_object(x15, x14, x10, x16, *stub->entry()); 367 } 368 __ bind(*stub->continuation()); 369 } 370 371 if (compilation()->env()->dtrace_method_probes()) { 372 __ mv(c_rarg0, xthread); 373 __ mov_metadata(c_rarg1, method()->constant_encoding()); 374 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), c_rarg0, c_rarg1); 375 } 376 377 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) { 378 __ mv(x10, x9); // Restore the exception 379 } 380 381 // remove the activation and dispatch to the unwind handler 382 __ block_comment("remove_frame and dispatch to the unwind handler"); 383 __ remove_frame(initial_frame_size_in_bytes()); 384 __ far_jump(RuntimeAddress(Runtime1::entry_for(Runtime1::unwind_exception_id))); 385 386 // Emit the slow path assembly 387 if (stub != nullptr) { 388 stub->emit_code(this); 389 } 390 391 return offset; 392 } 393 394 int LIR_Assembler::emit_deopt_handler() { 395 // generate code for exception handler 396 address handler_base = __ start_a_stub(deopt_handler_size()); 397 if (handler_base == nullptr) { 398 // not enough space left for the handler 399 bailout("deopt handler overflow"); 400 return -1; 401 } 402 403 int offset = code_offset(); 404 405 __ auipc(ra, 0); 406 __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); 407 guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); 408 __ end_a_stub(); 409 410 return offset; 411 } 412 413 void LIR_Assembler::return_op(LIR_Opr result, C1SafepointPollStub* code_stub) { 414 assert(result->is_illegal() || !result->is_single_cpu() || result->as_register() == x10, "word returns are in x10"); 415 416 // Pop the stack before the safepoint code 417 __ remove_frame(initial_frame_size_in_bytes()); 418 419 if (StackReservedPages > 0 && compilation()->has_reserved_stack_access()) { 420 __ reserved_stack_check(); 421 } 422 423 code_stub->set_safepoint_offset(__ offset()); 424 __ relocate(relocInfo::poll_return_type); 425 __ safepoint_poll(*code_stub->entry(), true /* at_return */, false /* acquire */, true /* in_nmethod */); 426 __ ret(); 427 } 428 429 int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { 430 guarantee(info != nullptr, "Shouldn't be null"); 431 __ get_polling_page(t0, relocInfo::poll_type); 432 add_debug_info_for_branch(info); // This isn't just debug info: 433 // it's the oop map 434 __ read_polling_page(t0, 0, relocInfo::poll_type); 435 return __ offset(); 436 } 437 438 void LIR_Assembler::move_regs(Register from_reg, Register to_reg) { 439 __ mv(to_reg, from_reg); 440 } 441 442 void LIR_Assembler::swap_reg(Register a, Register b) { Unimplemented(); } 443 444 void LIR_Assembler::const2reg(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) { 445 assert(src->is_constant(), "should not call otherwise"); 446 assert(dest->is_register(), "should not call otherwise"); 447 LIR_Const* c = src->as_constant_ptr(); 448 address const_addr = nullptr; 449 450 switch (c->type()) { 451 case T_INT: 452 assert(patch_code == lir_patch_none, "no patching handled here"); 453 __ mv(dest->as_register(), c->as_jint()); 454 break; 455 456 case T_ADDRESS: 457 assert(patch_code == lir_patch_none, "no patching handled here"); 458 __ mv(dest->as_register(), c->as_jint()); 459 break; 460 461 case T_LONG: 462 assert(patch_code == lir_patch_none, "no patching handled here"); 463 __ mv(dest->as_register_lo(), (intptr_t)c->as_jlong()); 464 break; 465 466 case T_OBJECT: 467 case T_ARRAY: 468 if (patch_code == lir_patch_none) { 469 jobject2reg(c->as_jobject(), dest->as_register()); 470 } else { 471 jobject2reg_with_patching(dest->as_register(), info); 472 } 473 break; 474 475 case T_METADATA: 476 if (patch_code != lir_patch_none) { 477 klass2reg_with_patching(dest->as_register(), info); 478 } else { 479 __ mov_metadata(dest->as_register(), c->as_metadata()); 480 } 481 break; 482 483 case T_FLOAT: 484 const_addr = float_constant(c->as_jfloat()); 485 assert(const_addr != nullptr, "must create float constant in the constant table"); 486 __ flw(dest->as_float_reg(), InternalAddress(const_addr)); 487 break; 488 489 case T_DOUBLE: 490 const_addr = double_constant(c->as_jdouble()); 491 assert(const_addr != nullptr, "must create double constant in the constant table"); 492 __ fld(dest->as_double_reg(), InternalAddress(const_addr)); 493 break; 494 495 default: 496 ShouldNotReachHere(); 497 } 498 } 499 500 void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) { 501 assert(src->is_constant(), "should not call otherwise"); 502 assert(dest->is_stack(), "should not call otherwise"); 503 LIR_Const* c = src->as_constant_ptr(); 504 switch (c->type()) { 505 case T_OBJECT: 506 if (c->as_jobject() == nullptr) { 507 __ sd(zr, frame_map()->address_for_slot(dest->single_stack_ix())); 508 } else { 509 const2reg(src, FrameMap::t1_opr, lir_patch_none, nullptr); 510 reg2stack(FrameMap::t1_opr, dest, c->type(), false); 511 } 512 break; 513 case T_ADDRESS: // fall through 514 const2reg(src, FrameMap::t1_opr, lir_patch_none, nullptr); 515 reg2stack(FrameMap::t1_opr, dest, c->type(), false); 516 case T_INT: // fall through 517 case T_FLOAT: 518 if (c->as_jint_bits() == 0) { 519 __ sw(zr, frame_map()->address_for_slot(dest->single_stack_ix())); 520 } else { 521 __ mv(t1, c->as_jint_bits()); 522 __ sw(t1, frame_map()->address_for_slot(dest->single_stack_ix())); 523 } 524 break; 525 case T_LONG: // fall through 526 case T_DOUBLE: 527 if (c->as_jlong_bits() == 0) { 528 __ sd(zr, frame_map()->address_for_slot(dest->double_stack_ix(), 529 lo_word_offset_in_bytes)); 530 } else { 531 __ mv(t1, (intptr_t)c->as_jlong_bits()); 532 __ sd(t1, frame_map()->address_for_slot(dest->double_stack_ix(), 533 lo_word_offset_in_bytes)); 534 } 535 break; 536 default: 537 ShouldNotReachHere(); 538 } 539 } 540 541 void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info, bool wide) { 542 assert(src->is_constant(), "should not call otherwise"); 543 assert(dest->is_address(), "should not call otherwise"); 544 LIR_Const* c = src->as_constant_ptr(); 545 LIR_Address* to_addr = dest->as_address_ptr(); 546 void (MacroAssembler::* insn)(Register Rt, const Address &adr, Register temp); 547 switch (type) { 548 case T_ADDRESS: 549 assert(c->as_jint() == 0, "should be"); 550 insn = &MacroAssembler::sd; break; 551 case T_LONG: 552 assert(c->as_jlong() == 0, "should be"); 553 insn = &MacroAssembler::sd; break; 554 case T_DOUBLE: 555 assert(c->as_jdouble() == 0.0, "should be"); 556 insn = &MacroAssembler::sd; break; 557 case T_INT: 558 assert(c->as_jint() == 0, "should be"); 559 insn = &MacroAssembler::sw; break; 560 case T_FLOAT: 561 assert(c->as_jfloat() == 0.0f, "should be"); 562 insn = &MacroAssembler::sw; break; 563 case T_OBJECT: // fall through 564 case T_ARRAY: 565 assert(c->as_jobject() == 0, "should be"); 566 if (UseCompressedOops && !wide) { 567 insn = &MacroAssembler::sw; 568 } else { 569 insn = &MacroAssembler::sd; 570 } 571 break; 572 case T_CHAR: // fall through 573 case T_SHORT: 574 assert(c->as_jint() == 0, "should be"); 575 insn = &MacroAssembler::sh; 576 break; 577 case T_BOOLEAN: // fall through 578 case T_BYTE: 579 assert(c->as_jint() == 0, "should be"); 580 insn = &MacroAssembler::sb; break; 581 default: 582 ShouldNotReachHere(); 583 insn = &MacroAssembler::sd; // unreachable 584 } 585 if (info != nullptr) { 586 add_debug_info_for_null_check_here(info); 587 } 588 (_masm->*insn)(zr, as_Address(to_addr), t0); 589 } 590 591 void LIR_Assembler::reg2reg(LIR_Opr src, LIR_Opr dest) { 592 assert(src->is_register(), "should not call otherwise"); 593 assert(dest->is_register(), "should not call otherwise"); 594 595 // move between cpu-registers 596 if (dest->is_single_cpu()) { 597 if (src->type() == T_LONG) { 598 // Can do LONG -> OBJECT 599 move_regs(src->as_register_lo(), dest->as_register()); 600 return; 601 } 602 assert(src->is_single_cpu(), "must match"); 603 if (src->type() == T_OBJECT) { 604 __ verify_oop(src->as_register()); 605 } 606 move_regs(src->as_register(), dest->as_register()); 607 } else if (dest->is_double_cpu()) { 608 if (is_reference_type(src->type())) { 609 __ verify_oop(src->as_register()); 610 move_regs(src->as_register(), dest->as_register_lo()); 611 return; 612 } 613 assert(src->is_double_cpu(), "must match"); 614 Register f_lo = src->as_register_lo(); 615 Register f_hi = src->as_register_hi(); 616 Register t_lo = dest->as_register_lo(); 617 Register t_hi = dest->as_register_hi(); 618 assert(f_hi == f_lo, "must be same"); 619 assert(t_hi == t_lo, "must be same"); 620 move_regs(f_lo, t_lo); 621 } else if (dest->is_single_fpu()) { 622 assert(src->is_single_fpu(), "expect single fpu"); 623 __ fmv_s(dest->as_float_reg(), src->as_float_reg()); 624 } else if (dest->is_double_fpu()) { 625 assert(src->is_double_fpu(), "expect double fpu"); 626 __ fmv_d(dest->as_double_reg(), src->as_double_reg()); 627 } else { 628 ShouldNotReachHere(); 629 } 630 } 631 632 void LIR_Assembler::reg2stack(LIR_Opr src, LIR_Opr dest, BasicType type, bool pop_fpu_stack) { 633 precond(src->is_register() && dest->is_stack()); 634 635 uint const c_sz32 = sizeof(uint32_t); 636 uint const c_sz64 = sizeof(uint64_t); 637 638 assert(src->is_register(), "should not call otherwise"); 639 assert(dest->is_stack(), "should not call otherwise"); 640 if (src->is_single_cpu()) { 641 int index = dest->single_stack_ix(); 642 if (is_reference_type(type)) { 643 __ sd(src->as_register(), stack_slot_address(index, c_sz64)); 644 __ verify_oop(src->as_register()); 645 } else if (type == T_METADATA || type == T_DOUBLE || type == T_ADDRESS) { 646 __ sd(src->as_register(), stack_slot_address(index, c_sz64)); 647 } else { 648 __ sw(src->as_register(), stack_slot_address(index, c_sz32)); 649 } 650 } else if (src->is_double_cpu()) { 651 int index = dest->double_stack_ix(); 652 Address dest_addr_LO = stack_slot_address(index, c_sz64, lo_word_offset_in_bytes); 653 __ sd(src->as_register_lo(), dest_addr_LO); 654 } else if (src->is_single_fpu()) { 655 int index = dest->single_stack_ix(); 656 __ fsw(src->as_float_reg(), stack_slot_address(index, c_sz32)); 657 } else if (src->is_double_fpu()) { 658 int index = dest->double_stack_ix(); 659 __ fsd(src->as_double_reg(), stack_slot_address(index, c_sz64)); 660 } else { 661 ShouldNotReachHere(); 662 } 663 } 664 665 void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide) { 666 LIR_Address* to_addr = dest->as_address_ptr(); 667 // t0 was used as tmp reg in as_Address, so we use t1 as compressed_src 668 Register compressed_src = t1; 669 670 if (patch_code != lir_patch_none) { 671 deoptimize_trap(info); 672 return; 673 } 674 675 if (is_reference_type(type)) { 676 __ verify_oop(src->as_register()); 677 678 if (UseCompressedOops && !wide) { 679 __ encode_heap_oop(compressed_src, src->as_register()); 680 } else { 681 compressed_src = src->as_register(); 682 } 683 } 684 685 int null_check_here = code_offset(); 686 687 switch (type) { 688 case T_FLOAT: 689 __ fsw(src->as_float_reg(), as_Address(to_addr)); 690 break; 691 692 case T_DOUBLE: 693 __ fsd(src->as_double_reg(), as_Address(to_addr)); 694 break; 695 696 case T_ARRAY: // fall through 697 case T_OBJECT: 698 if (UseCompressedOops && !wide) { 699 __ sw(compressed_src, as_Address(to_addr)); 700 } else { 701 __ sd(compressed_src, as_Address(to_addr)); 702 } 703 break; 704 case T_METADATA: 705 // We get here to store a method pointer to the stack to pass to 706 // a dtrace runtime call. This can't work on 64 bit with 707 // compressed klass ptrs: T_METADATA can be compressed klass 708 // ptr or a 64 bit method pointer. 709 ShouldNotReachHere(); 710 __ sd(src->as_register(), as_Address(to_addr)); 711 break; 712 case T_ADDRESS: 713 __ sd(src->as_register(), as_Address(to_addr)); 714 break; 715 case T_INT: 716 __ sw(src->as_register(), as_Address(to_addr)); 717 break; 718 case T_LONG: 719 __ sd(src->as_register_lo(), as_Address(to_addr)); 720 break; 721 case T_BYTE: // fall through 722 case T_BOOLEAN: 723 __ sb(src->as_register(), as_Address(to_addr)); 724 break; 725 case T_CHAR: // fall through 726 case T_SHORT: 727 __ sh(src->as_register(), as_Address(to_addr)); 728 break; 729 default: 730 ShouldNotReachHere(); 731 } 732 733 if (info != nullptr) { 734 add_debug_info_for_null_check(null_check_here, info); 735 } 736 } 737 738 void LIR_Assembler::stack2reg(LIR_Opr src, LIR_Opr dest, BasicType type) { 739 precond(src->is_stack() && dest->is_register()); 740 741 uint const c_sz32 = sizeof(uint32_t); 742 uint const c_sz64 = sizeof(uint64_t); 743 744 if (dest->is_single_cpu()) { 745 int index = src->single_stack_ix(); 746 if (type == T_INT) { 747 __ lw(dest->as_register(), stack_slot_address(index, c_sz32)); 748 } else if (is_reference_type(type)) { 749 __ ld(dest->as_register(), stack_slot_address(index, c_sz64)); 750 __ verify_oop(dest->as_register()); 751 } else if (type == T_METADATA || type == T_ADDRESS) { 752 __ ld(dest->as_register(), stack_slot_address(index, c_sz64)); 753 } else { 754 __ lwu(dest->as_register(), stack_slot_address(index, c_sz32)); 755 } 756 } else if (dest->is_double_cpu()) { 757 int index = src->double_stack_ix(); 758 Address src_addr_LO = stack_slot_address(index, c_sz64, lo_word_offset_in_bytes); 759 __ ld(dest->as_register_lo(), src_addr_LO); 760 } else if (dest->is_single_fpu()) { 761 int index = src->single_stack_ix(); 762 __ flw(dest->as_float_reg(), stack_slot_address(index, c_sz32)); 763 } else if (dest->is_double_fpu()) { 764 int index = src->double_stack_ix(); 765 __ fld(dest->as_double_reg(), stack_slot_address(index, c_sz64)); 766 } else { 767 ShouldNotReachHere(); 768 } 769 } 770 771 void LIR_Assembler::klass2reg_with_patching(Register reg, CodeEmitInfo* info) { 772 deoptimize_trap(info); 773 } 774 775 void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) { 776 LIR_Opr temp; 777 if (type == T_LONG || type == T_DOUBLE) { 778 temp = FrameMap::t1_long_opr; 779 } else { 780 temp = FrameMap::t1_opr; 781 } 782 783 stack2reg(src, temp, src->type()); 784 reg2stack(temp, dest, dest->type(), false); 785 } 786 787 void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide) { 788 assert(src->is_address(), "should not call otherwise"); 789 assert(dest->is_register(), "should not call otherwise"); 790 791 LIR_Address* addr = src->as_address_ptr(); 792 LIR_Address* from_addr = src->as_address_ptr(); 793 794 if (addr->base()->type() == T_OBJECT) { 795 __ verify_oop(addr->base()->as_pointer_register()); 796 } 797 798 if (patch_code != lir_patch_none) { 799 deoptimize_trap(info); 800 return; 801 } 802 803 if (info != nullptr) { 804 add_debug_info_for_null_check_here(info); 805 } 806 807 int null_check_here = code_offset(); 808 switch (type) { 809 case T_FLOAT: 810 __ flw(dest->as_float_reg(), as_Address(from_addr)); 811 break; 812 case T_DOUBLE: 813 __ fld(dest->as_double_reg(), as_Address(from_addr)); 814 break; 815 case T_ARRAY: // fall through 816 case T_OBJECT: 817 if (UseCompressedOops && !wide) { 818 __ lwu(dest->as_register(), as_Address(from_addr)); 819 } else { 820 __ ld(dest->as_register(), as_Address(from_addr)); 821 } 822 break; 823 case T_METADATA: 824 // We get here to store a method pointer to the stack to pass to 825 // a dtrace runtime call. This can't work on 64 bit with 826 // compressed klass ptrs: T_METADATA can be a compressed klass 827 // ptr or a 64 bit method pointer. 828 ShouldNotReachHere(); 829 __ ld(dest->as_register(), as_Address(from_addr)); 830 break; 831 case T_ADDRESS: 832 __ ld(dest->as_register(), as_Address(from_addr)); 833 break; 834 case T_INT: 835 __ lw(dest->as_register(), as_Address(from_addr)); 836 break; 837 case T_LONG: 838 __ ld(dest->as_register_lo(), as_Address_lo(from_addr)); 839 break; 840 case T_BYTE: 841 __ lb(dest->as_register(), as_Address(from_addr)); 842 break; 843 case T_BOOLEAN: 844 __ lbu(dest->as_register(), as_Address(from_addr)); 845 break; 846 case T_CHAR: 847 __ lhu(dest->as_register(), as_Address(from_addr)); 848 break; 849 case T_SHORT: 850 __ lh(dest->as_register(), as_Address(from_addr)); 851 break; 852 default: 853 ShouldNotReachHere(); 854 } 855 856 if (is_reference_type(type)) { 857 if (UseCompressedOops && !wide) { 858 __ decode_heap_oop(dest->as_register()); 859 } 860 861 if (!(UseZGC && !ZGenerational)) { 862 // Load barrier has not yet been applied, so ZGC can't verify the oop here 863 __ verify_oop(dest->as_register()); 864 } 865 } 866 } 867 868 void LIR_Assembler::emit_op3(LIR_Op3* op) { 869 switch (op->code()) { 870 case lir_idiv: // fall through 871 case lir_irem: 872 arithmetic_idiv(op->code(), 873 op->in_opr1(), 874 op->in_opr2(), 875 op->in_opr3(), 876 op->result_opr(), 877 op->info()); 878 break; 879 case lir_fmad: 880 __ fmadd_d(op->result_opr()->as_double_reg(), 881 op->in_opr1()->as_double_reg(), 882 op->in_opr2()->as_double_reg(), 883 op->in_opr3()->as_double_reg()); 884 break; 885 case lir_fmaf: 886 __ fmadd_s(op->result_opr()->as_float_reg(), 887 op->in_opr1()->as_float_reg(), 888 op->in_opr2()->as_float_reg(), 889 op->in_opr3()->as_float_reg()); 890 break; 891 default: 892 ShouldNotReachHere(); 893 } 894 } 895 896 void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type, 897 LIR_Opr cmp_opr1, LIR_Opr cmp_opr2) { 898 Label label; 899 900 emit_branch(condition, cmp_opr1, cmp_opr2, label, /* is_far */ false, 901 /* is_unordered */ (condition == lir_cond_greaterEqual || condition == lir_cond_greater) ? false : true); 902 903 Label done; 904 move_op(opr2, result, type, lir_patch_none, nullptr, 905 false, // pop_fpu_stack 906 false); // wide 907 __ j(done); 908 __ bind(label); 909 move_op(opr1, result, type, lir_patch_none, nullptr, 910 false, // pop_fpu_stack 911 false); // wide 912 __ bind(done); 913 } 914 915 void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) { 916 LIR_Condition condition = op->cond(); 917 if (condition == lir_cond_always) { 918 if (op->info() != nullptr) { 919 add_debug_info_for_branch(op->info()); 920 } 921 } else { 922 assert(op->in_opr1() != LIR_OprFact::illegalOpr && op->in_opr2() != LIR_OprFact::illegalOpr, "conditional branches must have legal operands"); 923 } 924 bool is_unordered = (op->ublock() == op->block()); 925 emit_branch(condition, op->in_opr1(), op->in_opr2(), *op->label(), /* is_far */ true, is_unordered); 926 } 927 928 void LIR_Assembler::emit_branch(LIR_Condition cmp_flag, LIR_Opr cmp1, LIR_Opr cmp2, Label& label, 929 bool is_far, bool is_unordered) { 930 931 if (cmp_flag == lir_cond_always) { 932 __ j(label); 933 return; 934 } 935 936 if (cmp1->is_cpu_register()) { 937 Register reg1 = as_reg(cmp1); 938 if (cmp2->is_cpu_register()) { 939 Register reg2 = as_reg(cmp2); 940 __ c1_cmp_branch(cmp_flag, reg1, reg2, label, cmp1->type(), is_far); 941 } else if (cmp2->is_constant()) { 942 const2reg_helper(cmp2); 943 __ c1_cmp_branch(cmp_flag, reg1, t0, label, cmp2->type(), is_far); 944 } else { 945 ShouldNotReachHere(); 946 } 947 } else if (cmp1->is_single_fpu()) { 948 assert(cmp2->is_single_fpu(), "expect single float register"); 949 __ c1_float_cmp_branch(cmp_flag, cmp1->as_float_reg(), cmp2->as_float_reg(), label, is_far, is_unordered); 950 } else if (cmp1->is_double_fpu()) { 951 assert(cmp2->is_double_fpu(), "expect double float register"); 952 __ c1_float_cmp_branch(cmp_flag | C1_MacroAssembler::c1_double_branch_mask, 953 cmp1->as_double_reg(), cmp2->as_double_reg(), label, is_far, is_unordered); 954 } else { 955 ShouldNotReachHere(); 956 } 957 } 958 959 void LIR_Assembler::emit_opConvert(LIR_OpConvert* op) { 960 LIR_Opr src = op->in_opr(); 961 LIR_Opr dest = op->result_opr(); 962 963 switch (op->bytecode()) { 964 case Bytecodes::_i2f: 965 __ fcvt_s_w(dest->as_float_reg(), src->as_register()); break; 966 case Bytecodes::_i2d: 967 __ fcvt_d_w(dest->as_double_reg(), src->as_register()); break; 968 case Bytecodes::_l2d: 969 __ fcvt_d_l(dest->as_double_reg(), src->as_register_lo()); break; 970 case Bytecodes::_l2f: 971 __ fcvt_s_l(dest->as_float_reg(), src->as_register_lo()); break; 972 case Bytecodes::_f2d: 973 __ fcvt_d_s(dest->as_double_reg(), src->as_float_reg()); break; 974 case Bytecodes::_d2f: 975 __ fcvt_s_d(dest->as_float_reg(), src->as_double_reg()); break; 976 case Bytecodes::_i2c: 977 __ zero_extend(dest->as_register(), src->as_register(), 16); break; 978 case Bytecodes::_i2l: 979 __ sign_extend(dest->as_register_lo(), src->as_register(), 32); break; 980 case Bytecodes::_i2s: 981 __ sign_extend(dest->as_register(), src->as_register(), 16); break; 982 case Bytecodes::_i2b: 983 __ sign_extend(dest->as_register(), src->as_register(), 8); break; 984 case Bytecodes::_l2i: 985 __ sign_extend(dest->as_register(), src->as_register_lo(), 32); break; 986 case Bytecodes::_d2l: 987 __ fcvt_l_d_safe(dest->as_register_lo(), src->as_double_reg()); break; 988 case Bytecodes::_f2i: 989 __ fcvt_w_s_safe(dest->as_register(), src->as_float_reg()); break; 990 case Bytecodes::_f2l: 991 __ fcvt_l_s_safe(dest->as_register_lo(), src->as_float_reg()); break; 992 case Bytecodes::_d2i: 993 __ fcvt_w_d_safe(dest->as_register(), src->as_double_reg()); break; 994 default: 995 ShouldNotReachHere(); 996 } 997 } 998 999 void LIR_Assembler::emit_alloc_obj(LIR_OpAllocObj* op) { 1000 if (op->init_check()) { 1001 __ lbu(t0, Address(op->klass()->as_register(), 1002 InstanceKlass::init_state_offset())); 1003 __ mv(t1, (u1)InstanceKlass::fully_initialized); 1004 add_debug_info_for_null_check_here(op->stub()->info()); 1005 __ bne(t0, t1, *op->stub()->entry(), /* is_far */ true); 1006 } 1007 1008 __ allocate_object(op->obj()->as_register(), 1009 op->tmp1()->as_register(), 1010 op->tmp2()->as_register(), 1011 op->header_size(), 1012 op->object_size(), 1013 op->klass()->as_register(), 1014 *op->stub()->entry()); 1015 1016 __ bind(*op->stub()->continuation()); 1017 } 1018 1019 void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) { 1020 Register len = op->len()->as_register(); 1021 1022 if (UseSlowPath || 1023 (!UseFastNewObjectArray && is_reference_type(op->type())) || 1024 (!UseFastNewTypeArray && !is_reference_type(op->type()))) { 1025 __ j(*op->stub()->entry()); 1026 } else { 1027 Register tmp1 = op->tmp1()->as_register(); 1028 Register tmp2 = op->tmp2()->as_register(); 1029 Register tmp3 = op->tmp3()->as_register(); 1030 if (len == tmp1) { 1031 tmp1 = tmp3; 1032 } else if (len == tmp2) { 1033 tmp2 = tmp3; 1034 } else if (len == tmp3) { 1035 // everything is ok 1036 } else { 1037 __ mv(tmp3, len); 1038 } 1039 __ allocate_array(op->obj()->as_register(), 1040 len, 1041 tmp1, 1042 tmp2, 1043 arrayOopDesc::base_offset_in_bytes(op->type()), 1044 array_element_size(op->type()), 1045 op->klass()->as_register(), 1046 *op->stub()->entry()); 1047 } 1048 __ bind(*op->stub()->continuation()); 1049 } 1050 1051 void LIR_Assembler::type_profile_helper(Register mdo, ciMethodData *md, ciProfileData *data, 1052 Register recv, Label* update_done) { 1053 for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) { 1054 Label next_test; 1055 // See if the receiver is receiver[n]. 1056 __ ld(t1, Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i)))); 1057 __ bne(recv, t1, next_test); 1058 Address data_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i))); 1059 __ increment(data_addr, DataLayout::counter_increment); 1060 __ j(*update_done); 1061 __ bind(next_test); 1062 } 1063 1064 // Didn't find receiver; find next empty slot and fill it in 1065 for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) { 1066 Label next_test; 1067 Address recv_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i))); 1068 __ ld(t1, recv_addr); 1069 __ bnez(t1, next_test); 1070 __ sd(recv, recv_addr); 1071 __ mv(t1, DataLayout::counter_increment); 1072 __ sd(t1, Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i)))); 1073 __ j(*update_done); 1074 __ bind(next_test); 1075 } 1076 } 1077 1078 void LIR_Assembler::data_check(LIR_OpTypeCheck *op, ciMethodData **md, ciProfileData **data) { 1079 ciMethod* method = op->profiled_method(); 1080 assert(method != nullptr, "Should have method"); 1081 int bci = op->profiled_bci(); 1082 *md = method->method_data_or_null(); 1083 guarantee(*md != nullptr, "Sanity"); 1084 *data = ((*md)->bci_to_data(bci)); 1085 assert(*data != nullptr, "need data for type check"); 1086 assert((*data)->is_ReceiverTypeData(), "need ReceiverTypeData for type check"); 1087 } 1088 1089 void LIR_Assembler::typecheck_helper_slowcheck(ciKlass *k, Register obj, Register Rtmp1, 1090 Register k_RInfo, Register klass_RInfo, 1091 Label *failure_target, Label *success_target) { 1092 // get object class 1093 // not a safepoint as obj null check happens earlier 1094 __ load_klass(klass_RInfo, obj); 1095 if (k->is_loaded()) { 1096 // See if we get an immediate positive hit 1097 __ ld(t0, Address(klass_RInfo, int64_t(k->super_check_offset()))); 1098 if ((juint)in_bytes(Klass::secondary_super_cache_offset()) != k->super_check_offset()) { 1099 __ bne(k_RInfo, t0, *failure_target, /* is_far */ true); 1100 // successful cast, fall through to profile or jump 1101 } else { 1102 // See if we get an immediate positive hit 1103 __ beq(k_RInfo, t0, *success_target); 1104 // check for self 1105 __ beq(klass_RInfo, k_RInfo, *success_target); 1106 1107 __ addi(sp, sp, -2 * wordSize); // 2: store k_RInfo and klass_RInfo 1108 __ sd(k_RInfo, Address(sp, 0)); // sub klass 1109 __ sd(klass_RInfo, Address(sp, wordSize)); // super klass 1110 __ far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); 1111 // load result to k_RInfo 1112 __ ld(k_RInfo, Address(sp, 0)); 1113 __ addi(sp, sp, 2 * wordSize); // 2: pop out k_RInfo and klass_RInfo 1114 // result is a boolean 1115 __ beqz(k_RInfo, *failure_target, /* is_far */ true); 1116 // successful cast, fall through to profile or jump 1117 } 1118 } else { 1119 // perform the fast part of the checking logic 1120 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, nullptr); 1121 // call out-of-line instance of __ check_klass_subtytpe_slow_path(...) 1122 __ addi(sp, sp, -2 * wordSize); // 2: store k_RInfo and klass_RInfo 1123 __ sd(klass_RInfo, Address(sp, wordSize)); // sub klass 1124 __ sd(k_RInfo, Address(sp, 0)); // super klass 1125 __ far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); 1126 // load result to k_RInfo 1127 __ ld(k_RInfo, Address(sp, 0)); 1128 __ addi(sp, sp, 2 * wordSize); // 2: pop out k_RInfo and klass_RInfo 1129 // result is a boolean 1130 __ beqz(k_RInfo, *failure_target, /* is_far */ true); 1131 // successful cast, fall thriugh to profile or jump 1132 } 1133 } 1134 1135 void LIR_Assembler::profile_object(ciMethodData* md, ciProfileData* data, Register obj, 1136 Register klass_RInfo, Label* obj_is_null) { 1137 Label not_null; 1138 __ bnez(obj, not_null); 1139 // Object is null, update MDO and exit 1140 Register mdo = klass_RInfo; 1141 __ mov_metadata(mdo, md->constant_encoding()); 1142 Address data_addr = __ form_address(t1, mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset())); 1143 __ lbu(t0, data_addr); 1144 __ ori(t0, t0, BitData::null_seen_byte_constant()); 1145 __ sb(t0, data_addr); 1146 __ j(*obj_is_null); 1147 __ bind(not_null); 1148 } 1149 1150 void LIR_Assembler::typecheck_loaded(LIR_OpTypeCheck *op, ciKlass* k, Register k_RInfo) { 1151 if (!k->is_loaded()) { 1152 klass2reg_with_patching(k_RInfo, op->info_for_patch()); 1153 } else { 1154 __ mov_metadata(k_RInfo, k->constant_encoding()); 1155 } 1156 } 1157 1158 void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, Label* failure, Label* obj_is_null) { 1159 Register obj = op->object()->as_register(); 1160 Register k_RInfo = op->tmp1()->as_register(); 1161 Register klass_RInfo = op->tmp2()->as_register(); 1162 Register dst = op->result_opr()->as_register(); 1163 ciKlass* k = op->klass(); 1164 Register Rtmp1 = noreg; 1165 1166 // check if it needs to be profiled 1167 ciMethodData* md = nullptr; 1168 ciProfileData* data = nullptr; 1169 1170 const bool should_profile = op->should_profile(); 1171 if (should_profile) { 1172 data_check(op, &md, &data); 1173 } 1174 Label profile_cast_success, profile_cast_failure; 1175 Label *success_target = should_profile ? &profile_cast_success : success; 1176 Label *failure_target = should_profile ? &profile_cast_failure : failure; 1177 1178 if (obj == k_RInfo) { 1179 k_RInfo = dst; 1180 } else if (obj == klass_RInfo) { 1181 klass_RInfo = dst; 1182 } 1183 if (k->is_loaded() && !UseCompressedClassPointers) { 1184 select_different_registers(obj, dst, k_RInfo, klass_RInfo); 1185 } else { 1186 Rtmp1 = op->tmp3()->as_register(); 1187 select_different_registers(obj, dst, k_RInfo, klass_RInfo, Rtmp1); 1188 } 1189 1190 assert_different_registers(obj, k_RInfo, klass_RInfo); 1191 1192 if (should_profile) { 1193 profile_object(md, data, obj, klass_RInfo, obj_is_null); 1194 } else { 1195 __ beqz(obj, *obj_is_null); 1196 } 1197 1198 typecheck_loaded(op, k, k_RInfo); 1199 __ verify_oop(obj); 1200 1201 if (op->fast_check()) { 1202 // get object class 1203 // not a safepoint as obj null check happens earlier 1204 __ load_klass(t0, obj, t1); 1205 __ bne(t0, k_RInfo, *failure_target, /* is_far */ true); 1206 // successful cast, fall through to profile or jump 1207 } else { 1208 typecheck_helper_slowcheck(k, obj, Rtmp1, k_RInfo, klass_RInfo, failure_target, success_target); 1209 } 1210 if (should_profile) { 1211 type_profile(obj, md, klass_RInfo, k_RInfo, data, success, failure, profile_cast_success, profile_cast_failure); 1212 } 1213 __ j(*success); 1214 } 1215 1216 void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) { 1217 const bool should_profile = op->should_profile(); 1218 1219 LIR_Code code = op->code(); 1220 if (code == lir_store_check) { 1221 typecheck_lir_store(op, should_profile); 1222 } else if (code == lir_checkcast) { 1223 Register obj = op->object()->as_register(); 1224 Register dst = op->result_opr()->as_register(); 1225 Label success; 1226 emit_typecheck_helper(op, &success, op->stub()->entry(), &success); 1227 __ bind(success); 1228 if (dst != obj) { 1229 __ mv(dst, obj); 1230 } 1231 } else if (code == lir_instanceof) { 1232 Register obj = op->object()->as_register(); 1233 Register dst = op->result_opr()->as_register(); 1234 Label success, failure, done; 1235 emit_typecheck_helper(op, &success, &failure, &failure); 1236 __ bind(failure); 1237 __ mv(dst, zr); 1238 __ j(done); 1239 __ bind(success); 1240 __ mv(dst, 1); 1241 __ bind(done); 1242 } else { 1243 ShouldNotReachHere(); 1244 } 1245 } 1246 1247 void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) { 1248 assert(VM_Version::supports_cx8(), "wrong machine"); 1249 Register addr; 1250 if (op->addr()->is_register()) { 1251 addr = as_reg(op->addr()); 1252 } else { 1253 assert(op->addr()->is_address(), "what else?"); 1254 LIR_Address* addr_ptr = op->addr()->as_address_ptr(); 1255 assert(addr_ptr->disp() == 0, "need 0 disp"); 1256 assert(addr_ptr->index() == LIR_Opr::illegalOpr(), "need 0 index"); 1257 addr = as_reg(addr_ptr->base()); 1258 } 1259 Register newval = as_reg(op->new_value()); 1260 Register cmpval = as_reg(op->cmp_value()); 1261 1262 if (op->code() == lir_cas_obj) { 1263 if (UseCompressedOops) { 1264 Register tmp1 = op->tmp1()->as_register(); 1265 assert(op->tmp1()->is_valid(), "must be"); 1266 Register tmp2 = op->tmp2()->as_register(); 1267 assert(op->tmp2()->is_valid(), "must be"); 1268 1269 __ encode_heap_oop(tmp1, cmpval); 1270 cmpval = tmp1; 1271 __ encode_heap_oop(tmp2, newval); 1272 newval = tmp2; 1273 caswu(addr, newval, cmpval); 1274 } else { 1275 casl(addr, newval, cmpval); 1276 } 1277 } else if (op->code() == lir_cas_int) { 1278 casw(addr, newval, cmpval); 1279 } else { 1280 casl(addr, newval, cmpval); 1281 } 1282 1283 if (op->result_opr()->is_valid()) { 1284 assert(op->result_opr()->is_register(), "need a register"); 1285 __ mv(as_reg(op->result_opr()), t0); // cas result in t0, and 0 for success 1286 } 1287 } 1288 1289 void LIR_Assembler::intrinsic_op(LIR_Code code, LIR_Opr value, LIR_Opr unused, LIR_Opr dest, LIR_Op* op) { 1290 switch (code) { 1291 case lir_abs: __ fabs_d(dest->as_double_reg(), value->as_double_reg()); break; 1292 case lir_sqrt: __ fsqrt_d(dest->as_double_reg(), value->as_double_reg()); break; 1293 default: ShouldNotReachHere(); 1294 } 1295 } 1296 1297 void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst) { 1298 assert(left->is_single_cpu() || left->is_double_cpu(), "expect single or double register"); 1299 Register Rleft = left->is_single_cpu() ? left->as_register() : left->as_register_lo(); 1300 if (dst->is_single_cpu()) { 1301 Register Rdst = dst->as_register(); 1302 if (right->is_constant()) { 1303 int right_const = right->as_jint(); 1304 if (Assembler::is_simm12(right_const)) { 1305 logic_op_imm(Rdst, Rleft, right_const, code); 1306 __ sign_extend(Rdst, Rdst, 32); 1307 } else { 1308 __ mv(t0, right_const); 1309 logic_op_reg32(Rdst, Rleft, t0, code); 1310 } 1311 } else { 1312 Register Rright = right->is_single_cpu() ? right->as_register() : right->as_register_lo(); 1313 logic_op_reg32(Rdst, Rleft, Rright, code); 1314 } 1315 } else { 1316 Register Rdst = dst->as_register_lo(); 1317 if (right->is_constant()) { 1318 long right_const = right->as_jlong(); 1319 if (Assembler::is_simm12(right_const)) { 1320 logic_op_imm(Rdst, Rleft, right_const, code); 1321 } else { 1322 __ mv(t0, right_const); 1323 logic_op_reg(Rdst, Rleft, t0, code); 1324 } 1325 } else { 1326 Register Rright = right->is_single_cpu() ? right->as_register() : right->as_register_lo(); 1327 logic_op_reg(Rdst, Rleft, Rright, code); 1328 } 1329 } 1330 } 1331 1332 void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr src, LIR_Opr result, LIR_Op2* op) { 1333 ShouldNotCallThis(); 1334 } 1335 1336 void LIR_Assembler::comp_fl2i(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst, LIR_Op2* op) { 1337 if (code == lir_cmp_fd2i || code == lir_ucmp_fd2i) { 1338 bool is_unordered_less = (code == lir_ucmp_fd2i); 1339 if (left->is_single_fpu()) { 1340 __ float_cmp(true, is_unordered_less ? -1 : 1, 1341 left->as_float_reg(), right->as_float_reg(), dst->as_register()); 1342 } else if (left->is_double_fpu()) { 1343 __ float_cmp(false, is_unordered_less ? -1 : 1, 1344 left->as_double_reg(), right->as_double_reg(), dst->as_register()); 1345 } else { 1346 ShouldNotReachHere(); 1347 } 1348 } else if (code == lir_cmp_l2i) { 1349 __ cmp_l2i(dst->as_register(), left->as_register_lo(), right->as_register_lo()); 1350 } else { 1351 ShouldNotReachHere(); 1352 } 1353 } 1354 1355 void LIR_Assembler::align_call(LIR_Code code) { 1356 // With RVC a call instruction may get 2-byte aligned. 1357 // The address of the call instruction needs to be 4-byte aligned to 1358 // ensure that it does not span a cache line so that it can be patched. 1359 __ align(NativeInstruction::instruction_size); 1360 } 1361 1362 void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) { 1363 address call = __ trampoline_call(Address(op->addr(), rtype)); 1364 if (call == nullptr) { 1365 bailout("trampoline stub overflow"); 1366 return; 1367 } 1368 add_call_info(code_offset(), op->info()); 1369 __ post_call_nop(); 1370 } 1371 1372 void LIR_Assembler::ic_call(LIR_OpJavaCall* op) { 1373 address call = __ ic_call(op->addr()); 1374 if (call == nullptr) { 1375 bailout("trampoline stub overflow"); 1376 return; 1377 } 1378 add_call_info(code_offset(), op->info()); 1379 __ post_call_nop(); 1380 } 1381 1382 void LIR_Assembler::emit_static_call_stub() { 1383 address call_pc = __ pc(); 1384 MacroAssembler::assert_alignment(call_pc); 1385 address stub = __ start_a_stub(call_stub_size()); 1386 if (stub == nullptr) { 1387 bailout("static call stub overflow"); 1388 return; 1389 } 1390 1391 int start = __ offset(); 1392 1393 __ relocate(static_stub_Relocation::spec(call_pc)); 1394 __ emit_static_call_stub(); 1395 1396 assert(__ offset() - start + CompiledStaticCall::to_trampoline_stub_size() 1397 <= call_stub_size(), "stub too big"); 1398 __ end_a_stub(); 1399 } 1400 1401 void LIR_Assembler::throw_op(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmitInfo* info) { 1402 assert(exceptionOop->as_register() == x10, "must match"); 1403 assert(exceptionPC->as_register() == x13, "must match"); 1404 1405 // exception object is not added to oop map by LinearScan 1406 // (LinearScan assumes that no oops are in fixed registers) 1407 info->add_register_oop(exceptionOop); 1408 Runtime1::StubID unwind_id; 1409 1410 // get current pc information 1411 // pc is only needed if the method has an exception handler, the unwind code does not need it. 1412 if (compilation()->debug_info_recorder()->last_pc_offset() == __ offset()) { 1413 // As no instructions have been generated yet for this LIR node it's 1414 // possible that an oop map already exists for the current offset. 1415 // In that case insert an dummy NOP here to ensure all oop map PCs 1416 // are unique. See JDK-8237483. 1417 __ nop(); 1418 } 1419 int pc_for_athrow_offset = __ offset(); 1420 InternalAddress pc_for_athrow(__ pc()); 1421 __ relocate(pc_for_athrow.rspec(), [&] { 1422 int32_t offset; 1423 __ la_patchable(exceptionPC->as_register(), pc_for_athrow, offset); 1424 __ addi(exceptionPC->as_register(), exceptionPC->as_register(), offset); 1425 }); 1426 add_call_info(pc_for_athrow_offset, info); // for exception handler 1427 1428 __ verify_not_null_oop(x10); 1429 // search an exception handler (x10: exception oop, x13: throwing pc) 1430 if (compilation()->has_fpu_code()) { 1431 unwind_id = Runtime1::handle_exception_id; 1432 } else { 1433 unwind_id = Runtime1::handle_exception_nofpu_id; 1434 } 1435 __ far_call(RuntimeAddress(Runtime1::entry_for(unwind_id))); 1436 __ nop(); 1437 } 1438 1439 void LIR_Assembler::unwind_op(LIR_Opr exceptionOop) { 1440 assert(exceptionOop->as_register() == x10, "must match"); 1441 __ j(_unwind_handler_entry); 1442 } 1443 1444 void LIR_Assembler::shift_op(LIR_Code code, LIR_Opr left, LIR_Opr count, LIR_Opr dest, LIR_Opr tmp) { 1445 Register left_reg = left->is_single_cpu() ? left->as_register() : left->as_register_lo(); 1446 Register dest_reg = dest->is_single_cpu() ? dest->as_register() : dest->as_register_lo(); 1447 Register count_reg = count->as_register(); 1448 if (dest->is_single_cpu()) { 1449 assert (dest->type() == T_INT, "unexpected result type"); 1450 assert (left->type() == T_INT, "unexpected left type"); 1451 __ andi(t0, count_reg, 31); // should not shift more than 31 bits 1452 switch (code) { 1453 case lir_shl: __ sllw(dest_reg, left_reg, t0); break; 1454 case lir_shr: __ sraw(dest_reg, left_reg, t0); break; 1455 case lir_ushr: __ srlw(dest_reg, left_reg, t0); break; 1456 default: ShouldNotReachHere(); 1457 } 1458 } else if (dest->is_double_cpu()) { 1459 __ andi(t0, count_reg, 63); // should not shift more than 63 bits 1460 switch (code) { 1461 case lir_shl: __ sll(dest_reg, left_reg, t0); break; 1462 case lir_shr: __ sra(dest_reg, left_reg, t0); break; 1463 case lir_ushr: __ srl(dest_reg, left_reg, t0); break; 1464 default: ShouldNotReachHere(); 1465 } 1466 } else { 1467 ShouldNotReachHere(); 1468 } 1469 } 1470 1471 void LIR_Assembler::shift_op(LIR_Code code, LIR_Opr left, jint count, LIR_Opr dest) { 1472 Register left_reg = left->is_single_cpu() ? left->as_register() : left->as_register_lo(); 1473 Register dest_reg = dest->is_single_cpu() ? dest->as_register() : dest->as_register_lo(); 1474 if (dest->is_single_cpu()) { 1475 assert (dest->type() == T_INT, "unexpected result type"); 1476 assert (left->type() == T_INT, "unexpected left type"); 1477 count &= 0x1f; 1478 if (count != 0) { 1479 switch (code) { 1480 case lir_shl: __ slliw(dest_reg, left_reg, count); break; 1481 case lir_shr: __ sraiw(dest_reg, left_reg, count); break; 1482 case lir_ushr: __ srliw(dest_reg, left_reg, count); break; 1483 default: ShouldNotReachHere(); 1484 } 1485 } else { 1486 move_regs(left_reg, dest_reg); 1487 } 1488 } else if (dest->is_double_cpu()) { 1489 count &= 0x3f; 1490 if (count != 0) { 1491 switch (code) { 1492 case lir_shl: __ slli(dest_reg, left_reg, count); break; 1493 case lir_shr: __ srai(dest_reg, left_reg, count); break; 1494 case lir_ushr: __ srli(dest_reg, left_reg, count); break; 1495 default: ShouldNotReachHere(); 1496 } 1497 } else { 1498 move_regs(left->as_register_lo(), dest->as_register_lo()); 1499 } 1500 } else { 1501 ShouldNotReachHere(); 1502 } 1503 } 1504 1505 void LIR_Assembler::emit_lock(LIR_OpLock* op) { 1506 Register obj = op->obj_opr()->as_register(); // may not be an oop 1507 Register hdr = op->hdr_opr()->as_register(); 1508 Register lock = op->lock_opr()->as_register(); 1509 Register temp = op->scratch_opr()->as_register(); 1510 if (LockingMode == LM_MONITOR) { 1511 if (op->info() != nullptr) { 1512 add_debug_info_for_null_check_here(op->info()); 1513 __ null_check(obj, -1); 1514 } 1515 __ j(*op->stub()->entry()); 1516 } else if (op->code() == lir_lock) { 1517 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header"); 1518 // add debug info for NullPointerException only if one is possible 1519 int null_check_offset = __ lock_object(hdr, obj, lock, temp, *op->stub()->entry()); 1520 if (op->info() != nullptr) { 1521 add_debug_info_for_null_check(null_check_offset, op->info()); 1522 } 1523 } else if (op->code() == lir_unlock) { 1524 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header"); 1525 __ unlock_object(hdr, obj, lock, temp, *op->stub()->entry()); 1526 } else { 1527 Unimplemented(); 1528 } 1529 __ bind(*op->stub()->continuation()); 1530 } 1531 1532 void LIR_Assembler::emit_load_klass(LIR_OpLoadKlass* op) { 1533 Register obj = op->obj()->as_pointer_register(); 1534 Register result = op->result_opr()->as_pointer_register(); 1535 1536 CodeEmitInfo* info = op->info(); 1537 if (info != nullptr) { 1538 add_debug_info_for_null_check_here(info); 1539 } 1540 1541 if (UseCompressedClassPointers) { 1542 __ lwu(result, Address(obj, oopDesc::klass_offset_in_bytes())); 1543 __ decode_klass_not_null(result); 1544 } else { 1545 __ ld(result, Address(obj, oopDesc::klass_offset_in_bytes())); 1546 } 1547 } 1548 1549 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) { 1550 ciMethod* method = op->profiled_method(); 1551 int bci = op->profiled_bci(); 1552 1553 // Update counter for all call types 1554 ciMethodData* md = method->method_data_or_null(); 1555 guarantee(md != nullptr, "Sanity"); 1556 ciProfileData* data = md->bci_to_data(bci); 1557 assert(data != nullptr && data->is_CounterData(), "need CounterData for calls"); 1558 assert(op->mdo()->is_single_cpu(), "mdo must be allocated"); 1559 Register mdo = op->mdo()->as_register(); 1560 __ mov_metadata(mdo, md->constant_encoding()); 1561 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset())); 1562 // Perform additional virtual call profiling for invokevirtual and 1563 // invokeinterface bytecodes 1564 if (op->should_profile_receiver_type()) { 1565 assert(op->recv()->is_single_cpu(), "recv must be allocated"); 1566 Register recv = op->recv()->as_register(); 1567 assert_different_registers(mdo, recv); 1568 assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls"); 1569 ciKlass* known_klass = op->known_holder(); 1570 if (C1OptimizeVirtualCallProfiling && known_klass != nullptr) { 1571 // We know the type that will be seen at this call site; we can 1572 // statically update the MethodData* rather than needing to do 1573 // dynamic tests on the receiver type 1574 // NOTE: we should probably put a lock around this search to 1575 // avoid collisions by concurrent compilations 1576 ciVirtualCallData* vc_data = (ciVirtualCallData*) data; 1577 uint i; 1578 for (i = 0; i < VirtualCallData::row_limit(); i++) { 1579 ciKlass* receiver = vc_data->receiver(i); 1580 if (known_klass->equals(receiver)) { 1581 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i))); 1582 __ increment(data_addr, DataLayout::counter_increment); 1583 return; 1584 } 1585 } 1586 1587 // Receiver type not found in profile data; select an empty slot 1588 // Note that this is less efficient than it should be because it 1589 // always does a write to the receiver part of the 1590 // VirtualCallData rather than just the first time 1591 for (i = 0; i < VirtualCallData::row_limit(); i++) { 1592 ciKlass* receiver = vc_data->receiver(i); 1593 if (receiver == nullptr) { 1594 Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i))); 1595 __ mov_metadata(t1, known_klass->constant_encoding()); 1596 __ sd(t1, recv_addr); 1597 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i))); 1598 __ increment(data_addr, DataLayout::counter_increment); 1599 return; 1600 } 1601 } 1602 } else { 1603 __ load_klass(recv, recv); 1604 Label update_done; 1605 type_profile_helper(mdo, md, data, recv, &update_done); 1606 // Receiver did not match any saved receiver and there is no empty row for it. 1607 // Increment total counter to indicate polymorphic case. 1608 __ increment(counter_addr, DataLayout::counter_increment); 1609 1610 __ bind(update_done); 1611 } 1612 } else { 1613 // Static call 1614 __ increment(counter_addr, DataLayout::counter_increment); 1615 } 1616 } 1617 1618 void LIR_Assembler::emit_delay(LIR_OpDelay*) { Unimplemented(); } 1619 1620 void LIR_Assembler::monitor_address(int monitor_no, LIR_Opr dst) { 1621 __ la(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no)); 1622 } 1623 1624 void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) { Unimplemented(); } 1625 1626 void LIR_Assembler::check_conflict(ciKlass* exact_klass, intptr_t current_klass, 1627 Register tmp, Label &next, Label &none, 1628 Address mdo_addr) { 1629 if (exact_klass == nullptr || TypeEntries::is_type_none(current_klass)) { 1630 if (exact_klass != nullptr) { 1631 __ mov_metadata(tmp, exact_klass->constant_encoding()); 1632 } else { 1633 __ load_klass(tmp, tmp); 1634 } 1635 1636 __ ld(t1, mdo_addr); 1637 __ xorr(tmp, tmp, t1); 1638 __ andi(t0, tmp, TypeEntries::type_klass_mask); 1639 // klass seen before, nothing to do. The unknown bit may have been 1640 // set already but no need to check. 1641 __ beqz(t0, next); 1642 1643 // already unknown. Nothing to do anymore. 1644 __ test_bit(t0, tmp, exact_log2(TypeEntries::type_unknown)); 1645 __ bnez(t0, next); 1646 1647 if (TypeEntries::is_type_none(current_klass)) { 1648 __ beqz(t1, none); 1649 __ mv(t0, (u1)TypeEntries::null_seen); 1650 __ beq(t0, t1, none); 1651 // There is a chance that the checks above 1652 // fail if another thread has just set the 1653 // profiling to this obj's klass 1654 __ membar(MacroAssembler::LoadLoad); 1655 __ xorr(tmp, tmp, t1); // get back original value before XOR 1656 __ ld(t1, mdo_addr); 1657 __ xorr(tmp, tmp, t1); 1658 __ andi(t0, tmp, TypeEntries::type_klass_mask); 1659 __ beqz(t0, next); 1660 } 1661 } else { 1662 assert(ciTypeEntries::valid_ciklass(current_klass) != nullptr && 1663 ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "conflict only"); 1664 1665 __ ld(tmp, mdo_addr); 1666 // already unknown. Nothing to do anymore. 1667 __ test_bit(t0, tmp, exact_log2(TypeEntries::type_unknown)); 1668 __ bnez(t0, next); 1669 } 1670 1671 // different than before. Cannot keep accurate profile. 1672 __ ld(t1, mdo_addr); 1673 __ ori(t1, t1, TypeEntries::type_unknown); 1674 __ sd(t1, mdo_addr); 1675 1676 if (TypeEntries::is_type_none(current_klass)) { 1677 __ j(next); 1678 1679 __ bind(none); 1680 // first time here. Set profile type. 1681 __ sd(tmp, mdo_addr); 1682 #ifdef ASSERT 1683 __ andi(tmp, tmp, TypeEntries::type_mask); 1684 __ verify_klass_ptr(tmp); 1685 #endif 1686 } 1687 } 1688 1689 void LIR_Assembler::check_no_conflict(ciKlass* exact_klass, intptr_t current_klass, Register tmp, 1690 Address mdo_addr, Label &next) { 1691 // There's a single possible klass at this profile point 1692 assert(exact_klass != nullptr, "should be"); 1693 if (TypeEntries::is_type_none(current_klass)) { 1694 __ mov_metadata(tmp, exact_klass->constant_encoding()); 1695 __ ld(t1, mdo_addr); 1696 __ xorr(tmp, tmp, t1); 1697 __ andi(t0, tmp, TypeEntries::type_klass_mask); 1698 __ beqz(t0, next); 1699 #ifdef ASSERT 1700 { 1701 Label ok; 1702 __ ld(t0, mdo_addr); 1703 __ beqz(t0, ok); 1704 __ mv(t1, (u1)TypeEntries::null_seen); 1705 __ beq(t0, t1, ok); 1706 // may have been set by another thread 1707 __ membar(MacroAssembler::LoadLoad); 1708 __ mov_metadata(t0, exact_klass->constant_encoding()); 1709 __ ld(t1, mdo_addr); 1710 __ xorr(t1, t0, t1); 1711 __ andi(t1, t1, TypeEntries::type_mask); 1712 __ beqz(t1, ok); 1713 1714 __ stop("unexpected profiling mismatch"); 1715 __ bind(ok); 1716 } 1717 #endif 1718 // first time here. Set profile type. 1719 __ sd(tmp, mdo_addr); 1720 #ifdef ASSERT 1721 __ andi(tmp, tmp, TypeEntries::type_mask); 1722 __ verify_klass_ptr(tmp); 1723 #endif 1724 } else { 1725 assert(ciTypeEntries::valid_ciklass(current_klass) != nullptr && 1726 ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "inconsistent"); 1727 1728 __ ld(tmp, mdo_addr); 1729 // already unknown. Nothing to do anymore. 1730 __ test_bit(t0, tmp, exact_log2(TypeEntries::type_unknown)); 1731 __ bnez(t0, next); 1732 1733 __ ori(tmp, tmp, TypeEntries::type_unknown); 1734 __ sd(tmp, mdo_addr); 1735 } 1736 } 1737 1738 void LIR_Assembler::check_null(Register tmp, Label &update, intptr_t current_klass, 1739 Address mdo_addr, bool do_update, Label &next) { 1740 __ bnez(tmp, update); 1741 if (!TypeEntries::was_null_seen(current_klass)) { 1742 __ ld(t1, mdo_addr); 1743 __ ori(t1, t1, TypeEntries::null_seen); 1744 __ sd(t1, mdo_addr); 1745 } 1746 if (do_update) { 1747 __ j(next); 1748 } 1749 } 1750 1751 void LIR_Assembler::emit_profile_type(LIR_OpProfileType* op) { 1752 COMMENT("emit_profile_type {"); 1753 Register obj = op->obj()->as_register(); 1754 Register tmp = op->tmp()->as_pointer_register(); 1755 Address mdo_addr = as_Address(op->mdp()->as_address_ptr()); 1756 ciKlass* exact_klass = op->exact_klass(); 1757 intptr_t current_klass = op->current_klass(); 1758 bool not_null = op->not_null(); 1759 bool no_conflict = op->no_conflict(); 1760 1761 Label update, next, none; 1762 1763 bool do_null = !not_null; 1764 bool exact_klass_set = exact_klass != nullptr && ciTypeEntries::valid_ciklass(current_klass) == exact_klass; 1765 bool do_update = !TypeEntries::is_type_unknown(current_klass) && !exact_klass_set; 1766 1767 assert(do_null || do_update, "why are we here?"); 1768 assert(!TypeEntries::was_null_seen(current_klass) || do_update, "why are we here?"); 1769 assert_different_registers(tmp, t0, t1, mdo_addr.base()); 1770 1771 __ verify_oop(obj); 1772 1773 if (tmp != obj) { 1774 __ mv(tmp, obj); 1775 } 1776 if (do_null) { 1777 check_null(tmp, update, current_klass, mdo_addr, do_update, next); 1778 #ifdef ASSERT 1779 } else { 1780 __ bnez(tmp, update); 1781 __ stop("unexpected null obj"); 1782 #endif 1783 } 1784 1785 __ bind(update); 1786 1787 if (do_update) { 1788 #ifdef ASSERT 1789 if (exact_klass != nullptr) { 1790 check_exact_klass(tmp, exact_klass); 1791 } 1792 #endif 1793 if (!no_conflict) { 1794 check_conflict(exact_klass, current_klass, tmp, next, none, mdo_addr); 1795 } else { 1796 check_no_conflict(exact_klass, current_klass, tmp, mdo_addr, next); 1797 } 1798 1799 __ bind(next); 1800 } 1801 COMMENT("} emit_profile_type"); 1802 } 1803 1804 void LIR_Assembler::align_backward_branch_target() { } 1805 1806 void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) { 1807 // tmp must be unused 1808 assert(tmp->is_illegal(), "wasting a register if tmp is allocated"); 1809 1810 if (left->is_single_cpu()) { 1811 assert(dest->is_single_cpu(), "expect single result reg"); 1812 __ negw(dest->as_register(), left->as_register()); 1813 } else if (left->is_double_cpu()) { 1814 assert(dest->is_double_cpu(), "expect double result reg"); 1815 __ neg(dest->as_register_lo(), left->as_register_lo()); 1816 } else if (left->is_single_fpu()) { 1817 assert(dest->is_single_fpu(), "expect single float result reg"); 1818 __ fneg_s(dest->as_float_reg(), left->as_float_reg()); 1819 } else { 1820 assert(left->is_double_fpu(), "expect double float operand reg"); 1821 assert(dest->is_double_fpu(), "expect double float result reg"); 1822 __ fneg_d(dest->as_double_reg(), left->as_double_reg()); 1823 } 1824 } 1825 1826 1827 void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) { 1828 if (patch_code != lir_patch_none) { 1829 deoptimize_trap(info); 1830 return; 1831 } 1832 1833 LIR_Address* adr = addr->as_address_ptr(); 1834 Register dst = dest->as_register_lo(); 1835 1836 assert_different_registers(dst, t0); 1837 if (adr->base()->is_valid() && dst == adr->base()->as_pointer_register() && (!adr->index()->is_cpu_register())) { 1838 int scale = adr->scale(); 1839 intptr_t offset = adr->disp(); 1840 LIR_Opr index_op = adr->index(); 1841 if (index_op->is_constant()) { 1842 offset += ((intptr_t)index_op->as_constant_ptr()->as_jint()) << scale; 1843 } 1844 1845 if (!Assembler::is_simm12(offset)) { 1846 __ la(t0, as_Address(adr)); 1847 __ mv(dst, t0); 1848 return; 1849 } 1850 } 1851 1852 __ la(dst, as_Address(adr)); 1853 } 1854 1855 1856 void LIR_Assembler::rt_call(LIR_Opr result, address dest, const LIR_OprList* args, LIR_Opr tmp, CodeEmitInfo* info) { 1857 assert(!tmp->is_valid(), "don't need temporary"); 1858 1859 CodeBlob *cb = CodeCache::find_blob(dest); 1860 if (cb != nullptr) { 1861 __ far_call(RuntimeAddress(dest)); 1862 } else { 1863 RuntimeAddress target(dest); 1864 __ relocate(target.rspec(), [&] { 1865 int32_t offset; 1866 __ la_patchable(t0, target, offset); 1867 __ jalr(x1, t0, offset); 1868 }); 1869 } 1870 1871 if (info != nullptr) { 1872 add_call_info_here(info); 1873 } 1874 __ post_call_nop(); 1875 } 1876 1877 void LIR_Assembler::volatile_move_op(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info) { 1878 if (dest->is_address() || src->is_address()) { 1879 move_op(src, dest, type, lir_patch_none, info, /* pop_fpu_stack */ false, /* wide */ false); 1880 } else { 1881 ShouldNotReachHere(); 1882 } 1883 } 1884 1885 #ifdef ASSERT 1886 // emit run-time assertion 1887 void LIR_Assembler::emit_assert(LIR_OpAssert* op) { 1888 assert(op->code() == lir_assert, "must be"); 1889 1890 Label ok; 1891 if (op->in_opr1()->is_valid()) { 1892 assert(op->in_opr2()->is_valid(), "both operands must be valid"); 1893 bool is_unordered = false; 1894 LIR_Condition cond = op->condition(); 1895 emit_branch(cond, op->in_opr1(), op->in_opr2(), ok, /* is_far */ false, 1896 /* is_unordered */(cond == lir_cond_greaterEqual || cond == lir_cond_greater) ? false : true); 1897 } else { 1898 assert(op->in_opr2()->is_illegal(), "both operands must be illegal"); 1899 assert(op->condition() == lir_cond_always, "no other conditions allowed"); 1900 } 1901 1902 if (op->halt()) { 1903 const char* str = __ code_string(op->msg()); 1904 __ stop(str); 1905 } else { 1906 breakpoint(); 1907 } 1908 __ bind(ok); 1909 } 1910 #endif 1911 1912 #ifndef PRODUCT 1913 #define COMMENT(x) do { __ block_comment(x); } while (0) 1914 #else 1915 #define COMMENT(x) 1916 #endif 1917 1918 void LIR_Assembler::membar() { 1919 COMMENT("membar"); 1920 __ membar(MacroAssembler::AnyAny); 1921 } 1922 1923 void LIR_Assembler::membar_acquire() { 1924 __ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore); 1925 } 1926 1927 void LIR_Assembler::membar_release() { 1928 __ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore); 1929 } 1930 1931 void LIR_Assembler::membar_loadload() { 1932 __ membar(MacroAssembler::LoadLoad); 1933 } 1934 1935 void LIR_Assembler::membar_storestore() { 1936 __ membar(MacroAssembler::StoreStore); 1937 } 1938 1939 void LIR_Assembler::membar_loadstore() { __ membar(MacroAssembler::LoadStore); } 1940 1941 void LIR_Assembler::membar_storeload() { __ membar(MacroAssembler::StoreLoad); } 1942 1943 void LIR_Assembler::on_spin_wait() { 1944 __ pause(); 1945 } 1946 1947 void LIR_Assembler::get_thread(LIR_Opr result_reg) { 1948 __ mv(result_reg->as_register(), xthread); 1949 } 1950 1951 void LIR_Assembler::peephole(LIR_List *lir) {} 1952 1953 void LIR_Assembler::atomic_op(LIR_Code code, LIR_Opr src, LIR_Opr data, LIR_Opr dest, LIR_Opr tmp_op) { 1954 Address addr = as_Address(src->as_address_ptr()); 1955 BasicType type = src->type(); 1956 bool is_oop = is_reference_type(type); 1957 1958 get_op(type); 1959 1960 switch (code) { 1961 case lir_xadd: 1962 { 1963 RegisterOrConstant inc; 1964 Register tmp = as_reg(tmp_op); 1965 Register dst = as_reg(dest); 1966 if (data->is_constant()) { 1967 inc = RegisterOrConstant(as_long(data)); 1968 assert_different_registers(dst, addr.base(), tmp); 1969 assert_different_registers(tmp, t0); 1970 } else { 1971 inc = RegisterOrConstant(as_reg(data)); 1972 assert_different_registers(inc.as_register(), dst, addr.base(), tmp); 1973 } 1974 __ la(tmp, addr); 1975 (_masm->*add)(dst, inc, tmp); 1976 break; 1977 } 1978 case lir_xchg: 1979 { 1980 Register tmp = tmp_op->as_register(); 1981 Register obj = as_reg(data); 1982 Register dst = as_reg(dest); 1983 if (is_oop && UseCompressedOops) { 1984 __ encode_heap_oop(t0, obj); 1985 obj = t0; 1986 } 1987 assert_different_registers(obj, addr.base(), tmp); 1988 assert_different_registers(dst, addr.base(), tmp); 1989 __ la(tmp, addr); 1990 (_masm->*xchg)(dst, obj, tmp); 1991 if (is_oop && UseCompressedOops) { 1992 __ decode_heap_oop(dst); 1993 } 1994 } 1995 break; 1996 default: 1997 ShouldNotReachHere(); 1998 } 1999 __ membar(MacroAssembler::AnyAny); 2000 } 2001 2002 int LIR_Assembler::array_element_size(BasicType type) const { 2003 int elem_size = type2aelembytes(type); 2004 return exact_log2(elem_size); 2005 } 2006 2007 // helper functions which checks for overflow and sets bailout if it 2008 // occurs. Always returns a valid embeddable pointer but in the 2009 // bailout case the pointer won't be to unique storage. 2010 address LIR_Assembler::float_constant(float f) { 2011 address const_addr = __ float_constant(f); 2012 if (const_addr == nullptr) { 2013 bailout("const section overflow"); 2014 return __ code()->consts()->start(); 2015 } else { 2016 return const_addr; 2017 } 2018 } 2019 2020 address LIR_Assembler::double_constant(double d) { 2021 address const_addr = __ double_constant(d); 2022 if (const_addr == nullptr) { 2023 bailout("const section overflow"); 2024 return __ code()->consts()->start(); 2025 } else { 2026 return const_addr; 2027 } 2028 } 2029 2030 address LIR_Assembler::int_constant(jlong n) { 2031 address const_addr = __ long_constant(n); 2032 if (const_addr == nullptr) { 2033 bailout("const section overflow"); 2034 return __ code()->consts()->start(); 2035 } else { 2036 return const_addr; 2037 } 2038 } 2039 2040 void LIR_Assembler::casw(Register addr, Register newval, Register cmpval) { 2041 __ cmpxchg(addr, cmpval, newval, Assembler::int32, Assembler::aq /* acquire */, 2042 Assembler::rl /* release */, t0, true /* result as bool */); 2043 __ seqz(t0, t0); // cmpxchg not equal, set t0 to 1 2044 __ membar(MacroAssembler::AnyAny); 2045 } 2046 2047 void LIR_Assembler::caswu(Register addr, Register newval, Register cmpval) { 2048 __ cmpxchg(addr, cmpval, newval, Assembler::uint32, Assembler::aq /* acquire */, 2049 Assembler::rl /* release */, t0, true /* result as bool */); 2050 __ seqz(t0, t0); // cmpxchg not equal, set t0 to 1 2051 __ membar(MacroAssembler::AnyAny); 2052 } 2053 2054 void LIR_Assembler::casl(Register addr, Register newval, Register cmpval) { 2055 __ cmpxchg(addr, cmpval, newval, Assembler::int64, Assembler::aq /* acquire */, 2056 Assembler::rl /* release */, t0, true /* result as bool */); 2057 __ seqz(t0, t0); // cmpxchg not equal, set t0 to 1 2058 __ membar(MacroAssembler::AnyAny); 2059 } 2060 2061 void LIR_Assembler::deoptimize_trap(CodeEmitInfo *info) { 2062 address target = nullptr; 2063 2064 switch (patching_id(info)) { 2065 case PatchingStub::access_field_id: 2066 target = Runtime1::entry_for(Runtime1::access_field_patching_id); 2067 break; 2068 case PatchingStub::load_klass_id: 2069 target = Runtime1::entry_for(Runtime1::load_klass_patching_id); 2070 break; 2071 case PatchingStub::load_mirror_id: 2072 target = Runtime1::entry_for(Runtime1::load_mirror_patching_id); 2073 break; 2074 case PatchingStub::load_appendix_id: 2075 target = Runtime1::entry_for(Runtime1::load_appendix_patching_id); 2076 break; 2077 default: ShouldNotReachHere(); 2078 } 2079 2080 __ far_call(RuntimeAddress(target)); 2081 add_call_info_here(info); 2082 } 2083 2084 void LIR_Assembler::check_exact_klass(Register tmp, ciKlass* exact_klass) { 2085 Label ok; 2086 __ load_klass(tmp, tmp); 2087 __ mov_metadata(t0, exact_klass->constant_encoding()); 2088 __ beq(tmp, t0, ok); 2089 __ stop("exact klass and actual klass differ"); 2090 __ bind(ok); 2091 } 2092 2093 void LIR_Assembler::get_op(BasicType type) { 2094 switch (type) { 2095 case T_INT: 2096 xchg = &MacroAssembler::atomic_xchgalw; 2097 add = &MacroAssembler::atomic_addalw; 2098 break; 2099 case T_LONG: 2100 xchg = &MacroAssembler::atomic_xchgal; 2101 add = &MacroAssembler::atomic_addal; 2102 break; 2103 case T_OBJECT: 2104 case T_ARRAY: 2105 if (UseCompressedOops) { 2106 xchg = &MacroAssembler::atomic_xchgalwu; 2107 add = &MacroAssembler::atomic_addalw; 2108 } else { 2109 xchg = &MacroAssembler::atomic_xchgal; 2110 add = &MacroAssembler::atomic_addal; 2111 } 2112 break; 2113 default: 2114 ShouldNotReachHere(); 2115 } 2116 } 2117 2118 // emit_opTypeCheck sub functions 2119 void LIR_Assembler::typecheck_lir_store(LIR_OpTypeCheck* op, bool should_profile) { 2120 Register value = op->object()->as_register(); 2121 Register array = op->array()->as_register(); 2122 Register k_RInfo = op->tmp1()->as_register(); 2123 Register klass_RInfo = op->tmp2()->as_register(); 2124 Register Rtmp1 = op->tmp3()->as_register(); 2125 2126 CodeStub* stub = op->stub(); 2127 2128 // check if it needs to be profiled 2129 ciMethodData* md = nullptr; 2130 ciProfileData* data = nullptr; 2131 2132 if (should_profile) { 2133 data_check(op, &md, &data); 2134 } 2135 Label profile_cast_success, profile_cast_failure, done; 2136 Label *success_target = should_profile ? &profile_cast_success : &done; 2137 Label *failure_target = should_profile ? &profile_cast_failure : stub->entry(); 2138 2139 if (should_profile) { 2140 profile_object(md, data, value, klass_RInfo, &done); 2141 } else { 2142 __ beqz(value, done); 2143 } 2144 2145 add_debug_info_for_null_check_here(op->info_for_exception()); 2146 __ load_klass(k_RInfo, array); 2147 __ load_klass(klass_RInfo, value); 2148 2149 lir_store_slowcheck(k_RInfo, klass_RInfo, Rtmp1, success_target, failure_target); 2150 2151 // fall through to the success case 2152 if (should_profile) { 2153 Register mdo = klass_RInfo; 2154 Register recv = k_RInfo; 2155 __ bind(profile_cast_success); 2156 __ mov_metadata(mdo, md->constant_encoding()); 2157 __ load_klass(recv, value); 2158 type_profile_helper(mdo, md, data, recv, &done); 2159 __ j(done); 2160 2161 __ bind(profile_cast_failure); 2162 __ mov_metadata(mdo, md->constant_encoding()); 2163 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset())); 2164 __ ld(t1, counter_addr); 2165 __ addi(t1, t1, -DataLayout::counter_increment); 2166 __ sd(t1, counter_addr); 2167 __ j(*stub->entry()); 2168 } 2169 2170 __ bind(done); 2171 } 2172 2173 void LIR_Assembler::type_profile(Register obj, ciMethodData* md, Register klass_RInfo, Register k_RInfo, 2174 ciProfileData* data, Label* success, Label* failure, 2175 Label& profile_cast_success, Label& profile_cast_failure) { 2176 Register mdo = klass_RInfo; 2177 Register recv = k_RInfo; 2178 __ bind(profile_cast_success); 2179 __ mov_metadata(mdo, md->constant_encoding()); 2180 __ load_klass(recv, obj); 2181 Label update_done; 2182 type_profile_helper(mdo, md, data, recv, success); 2183 __ j(*success); 2184 2185 __ bind(profile_cast_failure); 2186 __ mov_metadata(mdo, md->constant_encoding()); 2187 Address counter_addr = __ form_address(t1, mdo, md->byte_offset_of_slot(data, CounterData::count_offset())); 2188 __ ld(t0, counter_addr); 2189 __ addi(t0, t0, -DataLayout::counter_increment); 2190 __ sd(t0, counter_addr); 2191 __ j(*failure); 2192 } 2193 2194 void LIR_Assembler::lir_store_slowcheck(Register k_RInfo, Register klass_RInfo, Register Rtmp1, 2195 Label* success_target, Label* failure_target) { 2196 // get instance klass (it's already uncompressed) 2197 __ ld(k_RInfo, Address(k_RInfo, ObjArrayKlass::element_klass_offset())); 2198 // perform the fast part of the checking logic 2199 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, nullptr); 2200 // call out-of-line instance of __ check_klass_subtype_slow_path(...) 2201 __ addi(sp, sp, -2 * wordSize); // 2: store k_RInfo and klass_RInfo 2202 __ sd(klass_RInfo, Address(sp, wordSize)); // sub klass 2203 __ sd(k_RInfo, Address(sp, 0)); // super klass 2204 __ far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id))); 2205 // load result to k_RInfo 2206 __ ld(k_RInfo, Address(sp, 0)); 2207 __ addi(sp, sp, 2 * wordSize); // 2: pop out k_RInfo and klass_RInfo 2208 // result is a boolean 2209 __ beqz(k_RInfo, *failure_target, /* is_far */ true); 2210 } 2211 2212 void LIR_Assembler::const2reg_helper(LIR_Opr src) { 2213 switch (src->as_constant_ptr()->type()) { 2214 case T_INT: 2215 case T_ADDRESS: 2216 case T_OBJECT: 2217 case T_ARRAY: 2218 case T_METADATA: 2219 const2reg(src, FrameMap::t0_opr, lir_patch_none, nullptr); 2220 break; 2221 case T_LONG: 2222 const2reg(src, FrameMap::t0_long_opr, lir_patch_none, nullptr); 2223 break; 2224 case T_FLOAT: 2225 case T_DOUBLE: 2226 default: 2227 ShouldNotReachHere(); 2228 } 2229 } 2230 2231 void LIR_Assembler::logic_op_reg32(Register dst, Register left, Register right, LIR_Code code) { 2232 switch (code) { 2233 case lir_logic_and: __ andrw(dst, left, right); break; 2234 case lir_logic_or: __ orrw (dst, left, right); break; 2235 case lir_logic_xor: __ xorrw(dst, left, right); break; 2236 default: ShouldNotReachHere(); 2237 } 2238 } 2239 2240 void LIR_Assembler::logic_op_reg(Register dst, Register left, Register right, LIR_Code code) { 2241 switch (code) { 2242 case lir_logic_and: __ andr(dst, left, right); break; 2243 case lir_logic_or: __ orr (dst, left, right); break; 2244 case lir_logic_xor: __ xorr(dst, left, right); break; 2245 default: ShouldNotReachHere(); 2246 } 2247 } 2248 2249 void LIR_Assembler::logic_op_imm(Register dst, Register left, int right, LIR_Code code) { 2250 switch (code) { 2251 case lir_logic_and: __ andi(dst, left, right); break; 2252 case lir_logic_or: __ ori (dst, left, right); break; 2253 case lir_logic_xor: __ xori(dst, left, right); break; 2254 default: ShouldNotReachHere(); 2255 } 2256 } 2257 2258 void LIR_Assembler::store_parameter(Register r, int offset_from_rsp_in_words) { 2259 assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp"); 2260 int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord; 2261 assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset"); 2262 __ sd(r, Address(sp, offset_from_rsp_in_bytes)); 2263 } 2264 2265 void LIR_Assembler::store_parameter(jint c, int offset_from_rsp_in_words) { 2266 assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp"); 2267 int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord; 2268 assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset"); 2269 __ mv(t0, c); 2270 __ sd(t0, Address(sp, offset_from_rsp_in_bytes)); 2271 } 2272 2273 #undef __