17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "c1/c1_MacroAssembler.hpp"
27 #include "c1/c1_Runtime1.hpp"
28 #include "compiler/compilerDefinitions.inline.hpp"
29 #include "gc/shared/barrierSet.hpp"
30 #include "gc/shared/barrierSetAssembler.hpp"
31 #include "gc/shared/collectedHeap.hpp"
32 #include "gc/shared/tlab_globals.hpp"
33 #include "interpreter/interpreter.hpp"
34 #include "oops/arrayOop.hpp"
35 #include "oops/markWord.hpp"
36 #include "runtime/basicLock.hpp"
37 #include "runtime/os.hpp"
38 #include "runtime/sharedRuntime.hpp"
39 #include "runtime/stubRoutines.hpp"
40 #include "utilities/checkedCast.hpp"
41
42 int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register tmp, Label& slow_case) {
43 const int aligned_mask = BytesPerWord -1;
44 const int hdr_offset = oopDesc::mark_offset_in_bytes();
45 assert(hdr == rax, "hdr must be rax, for the cmpxchg instruction");
46 assert_different_registers(hdr, obj, disp_hdr, tmp);
47 int null_check_offset = -1;
48
49 verify_oop(obj);
50
51 // save object being locked into the BasicObjectLock
52 movptr(Address(disp_hdr, BasicObjectLock::obj_offset()), obj);
53
54 null_check_offset = offset();
55
56 if (DiagnoseSyncOnValueBasedClasses != 0) {
58 movl(hdr, Address(hdr, Klass::access_flags_offset()));
59 testl(hdr, JVM_ACC_IS_VALUE_BASED_CLASS);
60 jcc(Assembler::notZero, slow_case);
61 }
62
63 // Load object header
64 movptr(hdr, Address(obj, hdr_offset));
65
66 if (LockingMode == LM_LIGHTWEIGHT) {
67 #ifdef _LP64
68 const Register thread = r15_thread;
69 #else
70 const Register thread = disp_hdr;
71 get_thread(thread);
72 #endif
73 lightweight_lock(obj, hdr, thread, tmp, slow_case);
74 } else if (LockingMode == LM_LEGACY) {
75 Label done;
76 // and mark it as unlocked
77 orptr(hdr, markWord::unlocked_value);
78 // save unlocked object header into the displaced header location on the stack
79 movptr(Address(disp_hdr, 0), hdr);
80 // test if object header is still the same (i.e. unlocked), and if so, store the
81 // displaced header address in the object header - if it is not the same, get the
82 // object header instead
83 MacroAssembler::lock(); // must be immediately before cmpxchg!
84 cmpxchgptr(disp_hdr, Address(obj, hdr_offset));
85 // if the object header was the same, we're done
86 jcc(Assembler::equal, done);
87 // if the object header was not the same, it is now in the hdr register
88 // => test if it is a stack pointer into the same stack (recursive locking), i.e.:
89 //
90 // 1) (hdr & aligned_mask) == 0
91 // 2) rsp <= hdr
92 // 3) hdr <= rsp + page_size
93 //
94 // these 3 tests can be done by evaluating the following expression:
95 //
96 // (hdr - rsp) & (aligned_mask - page_size)
97 //
148 jcc(Assembler::notEqual, slow_case);
149 // done
150 }
151 bind(done);
152 dec_held_monitor_count();
153 }
154
155
156 // Defines obj, preserves var_size_in_bytes
157 void C1_MacroAssembler::try_allocate(Register obj, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, Label& slow_case) {
158 if (UseTLAB) {
159 tlab_allocate(noreg, obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
160 } else {
161 jmp(slow_case);
162 }
163 }
164
165
166 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
167 assert_different_registers(obj, klass, len);
168 movptr(Address(obj, oopDesc::mark_offset_in_bytes()), checked_cast<int32_t>(markWord::prototype().value()));
169 #ifdef _LP64
170 if (UseCompressedClassPointers) { // Take care not to kill klass
171 movptr(t1, klass);
172 encode_klass_not_null(t1, rscratch1);
173 movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1);
174 } else
175 #endif
176 {
177 movptr(Address(obj, oopDesc::klass_offset_in_bytes()), klass);
178 }
179
180 if (len->is_valid()) {
181 movl(Address(obj, arrayOopDesc::length_offset_in_bytes()), len);
182 }
183 #ifdef _LP64
184 else if (UseCompressedClassPointers) {
185 xorptr(t1, t1);
186 store_klass_gap(obj, t1);
187 }
188 #endif
301 verify_oop(receiver);
302 // explicit null check not needed since load from [klass_offset] causes a trap
303 // check against inline cache
304 assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()), "must add explicit null check");
305 int start_offset = offset();
306
307 if (UseCompressedClassPointers) {
308 load_klass(rscratch1, receiver, rscratch2);
309 cmpptr(rscratch1, iCache);
310 } else {
311 cmpptr(iCache, Address(receiver, oopDesc::klass_offset_in_bytes()));
312 }
313 // if icache check fails, then jump to runtime routine
314 // Note: RECEIVER must still contain the receiver!
315 jump_cc(Assembler::notEqual,
316 RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
317 const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
318 assert(UseCompressedClassPointers || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
319 }
320
321
322 void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes) {
323 assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
324 // Make sure there is enough stack space for this method's activation.
325 // Note that we do this before doing an enter(). This matches the
326 // ordering of C2's stack overflow check / rsp decrement and allows
327 // the SharedRuntime stack overflow handling to be consistent
328 // between the two compilers.
329 generate_stack_overflow_check(bang_size_in_bytes);
330
331 push(rbp);
332 if (PreserveFramePointer) {
333 mov(rbp, rsp);
334 }
335 #if !defined(_LP64) && defined(COMPILER2)
336 if (UseSSE < 2 && !CompilerConfig::is_c1_only_no_jvmci()) {
337 // c2 leaves fpu stack dirty. Clean it on entry
338 empty_FPU_stack();
339 }
340 #endif // !_LP64 && COMPILER2
341 decrement(rsp, frame_size_in_bytes); // does not emit code for frame_size == 0
342
343 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
344 // C1 code is not hot enough to micro optimize the nmethod entry barrier with an out-of-line stub
345 bs->nmethod_entry_barrier(this, nullptr /* slow_path */, nullptr /* continuation */);
346 }
347
348
349 void C1_MacroAssembler::remove_frame(int frame_size_in_bytes) {
350 increment(rsp, frame_size_in_bytes); // Does not emit code for frame_size == 0
351 pop(rbp);
352 }
353
354
355 void C1_MacroAssembler::verified_entry(bool breakAtEntry) {
356 if (breakAtEntry || VerifyFPU) {
357 // Verified Entry first instruction should be 5 bytes long for correct
358 // patching by patch_verified_entry().
359 //
360 // Breakpoint and VerifyFPU have one byte first instruction.
361 // Also first instruction will be one byte "push(rbp)" if stack banging
362 // code is not generated (see build_frame() above).
363 // For all these cases generate long instruction first.
364 fat_nop();
365 }
366 if (breakAtEntry) int3();
367 // build frame
368 IA32_ONLY( verify_FPU(0, "method_entry"); )
369 }
370
371 void C1_MacroAssembler::load_parameter(int offset_in_words, Register reg) {
372 // rbp, + 0: link
373 // + 1: return address
374 // + 2: argument with offset 0
375 // + 3: argument with offset 1
376 // + 4: ...
377
378 movptr(reg, Address(rbp, (offset_in_words + 2) * BytesPerWord));
379 }
380
381 #ifndef PRODUCT
382
383 void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
384 if (!VerifyOops) return;
385 verify_oop_addr(Address(rsp, stack_offset));
386 }
387
388 void C1_MacroAssembler::verify_not_null_oop(Register r) {
389 if (!VerifyOops) return;
390 Label not_null;
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "c1/c1_MacroAssembler.hpp"
27 #include "c1/c1_Runtime1.hpp"
28 #include "compiler/compilerDefinitions.inline.hpp"
29 #include "gc/shared/barrierSet.hpp"
30 #include "gc/shared/barrierSetAssembler.hpp"
31 #include "gc/shared/collectedHeap.hpp"
32 #include "gc/shared/tlab_globals.hpp"
33 #include "interpreter/interpreter.hpp"
34 #include "oops/arrayOop.hpp"
35 #include "oops/markWord.hpp"
36 #include "runtime/basicLock.hpp"
37 #include "runtime/frame.inline.hpp"
38 #include "runtime/os.hpp"
39 #include "runtime/sharedRuntime.hpp"
40 #include "runtime/stubRoutines.hpp"
41 #include "utilities/checkedCast.hpp"
42
43 int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register tmp, Label& slow_case) {
44 const int aligned_mask = BytesPerWord -1;
45 const int hdr_offset = oopDesc::mark_offset_in_bytes();
46 assert(hdr == rax, "hdr must be rax, for the cmpxchg instruction");
47 assert_different_registers(hdr, obj, disp_hdr, tmp);
48 int null_check_offset = -1;
49
50 verify_oop(obj);
51
52 // save object being locked into the BasicObjectLock
53 movptr(Address(disp_hdr, BasicObjectLock::obj_offset()), obj);
54
55 null_check_offset = offset();
56
57 if (DiagnoseSyncOnValueBasedClasses != 0) {
59 movl(hdr, Address(hdr, Klass::access_flags_offset()));
60 testl(hdr, JVM_ACC_IS_VALUE_BASED_CLASS);
61 jcc(Assembler::notZero, slow_case);
62 }
63
64 // Load object header
65 movptr(hdr, Address(obj, hdr_offset));
66
67 if (LockingMode == LM_LIGHTWEIGHT) {
68 #ifdef _LP64
69 const Register thread = r15_thread;
70 #else
71 const Register thread = disp_hdr;
72 get_thread(thread);
73 #endif
74 lightweight_lock(obj, hdr, thread, tmp, slow_case);
75 } else if (LockingMode == LM_LEGACY) {
76 Label done;
77 // and mark it as unlocked
78 orptr(hdr, markWord::unlocked_value);
79 if (EnableValhalla) {
80 // Mask inline_type bit such that we go to the slow path if object is an inline type
81 andptr(hdr, ~((int) markWord::inline_type_bit_in_place));
82 }
83 // save unlocked object header into the displaced header location on the stack
84 movptr(Address(disp_hdr, 0), hdr);
85 // test if object header is still the same (i.e. unlocked), and if so, store the
86 // displaced header address in the object header - if it is not the same, get the
87 // object header instead
88 MacroAssembler::lock(); // must be immediately before cmpxchg!
89 cmpxchgptr(disp_hdr, Address(obj, hdr_offset));
90 // if the object header was the same, we're done
91 jcc(Assembler::equal, done);
92 // if the object header was not the same, it is now in the hdr register
93 // => test if it is a stack pointer into the same stack (recursive locking), i.e.:
94 //
95 // 1) (hdr & aligned_mask) == 0
96 // 2) rsp <= hdr
97 // 3) hdr <= rsp + page_size
98 //
99 // these 3 tests can be done by evaluating the following expression:
100 //
101 // (hdr - rsp) & (aligned_mask - page_size)
102 //
153 jcc(Assembler::notEqual, slow_case);
154 // done
155 }
156 bind(done);
157 dec_held_monitor_count();
158 }
159
160
161 // Defines obj, preserves var_size_in_bytes
162 void C1_MacroAssembler::try_allocate(Register obj, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, Label& slow_case) {
163 if (UseTLAB) {
164 tlab_allocate(noreg, obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
165 } else {
166 jmp(slow_case);
167 }
168 }
169
170
171 void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register t1, Register t2) {
172 assert_different_registers(obj, klass, len);
173 if (EnableValhalla) {
174 // Need to copy markWord::prototype header for klass
175 assert_different_registers(obj, klass, len, t1, t2);
176 movptr(t1, Address(klass, Klass::prototype_header_offset()));
177 movptr(Address(obj, oopDesc::mark_offset_in_bytes()), t1);
178 } else {
179 // This assumes that all prototype bits fit in an int32_t
180 movptr(Address(obj, oopDesc::mark_offset_in_bytes()), checked_cast<int32_t>(markWord::prototype().value()));
181 }
182 #ifdef _LP64
183 if (UseCompressedClassPointers) { // Take care not to kill klass
184 movptr(t1, klass);
185 encode_klass_not_null(t1, rscratch1);
186 movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1);
187 } else
188 #endif
189 {
190 movptr(Address(obj, oopDesc::klass_offset_in_bytes()), klass);
191 }
192
193 if (len->is_valid()) {
194 movl(Address(obj, arrayOopDesc::length_offset_in_bytes()), len);
195 }
196 #ifdef _LP64
197 else if (UseCompressedClassPointers) {
198 xorptr(t1, t1);
199 store_klass_gap(obj, t1);
200 }
201 #endif
314 verify_oop(receiver);
315 // explicit null check not needed since load from [klass_offset] causes a trap
316 // check against inline cache
317 assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()), "must add explicit null check");
318 int start_offset = offset();
319
320 if (UseCompressedClassPointers) {
321 load_klass(rscratch1, receiver, rscratch2);
322 cmpptr(rscratch1, iCache);
323 } else {
324 cmpptr(iCache, Address(receiver, oopDesc::klass_offset_in_bytes()));
325 }
326 // if icache check fails, then jump to runtime routine
327 // Note: RECEIVER must still contain the receiver!
328 jump_cc(Assembler::notEqual,
329 RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
330 const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
331 assert(UseCompressedClassPointers || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
332 }
333
334 void C1_MacroAssembler::build_frame_helper(int frame_size_in_bytes, int sp_offset_for_orig_pc, int sp_inc, bool reset_orig_pc, bool needs_stack_repair) {
335 push(rbp);
336 if (PreserveFramePointer) {
337 mov(rbp, rsp);
338 }
339 #if !defined(_LP64) && defined(COMPILER2)
340 if (UseSSE < 2 && !CompilerConfig::is_c1_only_no_jvmci()) {
341 // c2 leaves fpu stack dirty. Clean it on entry
342 empty_FPU_stack();
343 }
344 #endif // !_LP64 && COMPILER2
345 decrement(rsp, frame_size_in_bytes);
346
347 if (needs_stack_repair) {
348 // Save stack increment (also account for fixed framesize and rbp)
349 assert((sp_inc & (StackAlignmentInBytes-1)) == 0, "stack increment not aligned");
350 int real_frame_size = sp_inc + frame_size_in_bytes + wordSize;
351 movptr(Address(rsp, frame_size_in_bytes - wordSize), real_frame_size);
352 }
353 if (reset_orig_pc) {
354 // Zero orig_pc to detect deoptimization during buffering in the entry points
355 movptr(Address(rsp, sp_offset_for_orig_pc), 0);
356 }
357 }
358
359 void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes, int sp_offset_for_orig_pc, bool needs_stack_repair, bool has_scalarized_args, Label* verified_inline_entry_label) {
360 // Make sure there is enough stack space for this method's activation.
361 // Note that we do this before doing an enter(). This matches the
362 // ordering of C2's stack overflow check / rsp decrement and allows
363 // the SharedRuntime stack overflow handling to be consistent
364 // between the two compilers.
365 assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
366 generate_stack_overflow_check(bang_size_in_bytes);
367
368 build_frame_helper(frame_size_in_bytes, sp_offset_for_orig_pc, 0, has_scalarized_args, needs_stack_repair);
369
370 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
371 // C1 code is not hot enough to micro optimize the nmethod entry barrier with an out-of-line stub
372 bs->nmethod_entry_barrier(this, nullptr /* slow_path */, nullptr /* continuation */);
373
374 if (verified_inline_entry_label != nullptr) {
375 // Jump here from the scalarized entry points that already created the frame.
376 bind(*verified_inline_entry_label);
377 }
378 }
379
380 void C1_MacroAssembler::verified_entry(bool breakAtEntry) {
381 if (breakAtEntry || VerifyFPU) {
382 // Verified Entry first instruction should be 5 bytes long for correct
383 // patching by patch_verified_entry().
384 //
385 // Breakpoint and VerifyFPU have one byte first instruction.
386 // Also first instruction will be one byte "push(rbp)" if stack banging
387 // code is not generated (see build_frame() above).
388 // For all these cases generate long instruction first.
389 fat_nop();
390 }
391 if (breakAtEntry) int3();
392 // build frame
393 IA32_ONLY( verify_FPU(0, "method_entry"); )
394 }
395
396 int C1_MacroAssembler::scalarized_entry(const CompiledEntrySignature* ces, int frame_size_in_bytes, int bang_size_in_bytes, int sp_offset_for_orig_pc, Label& verified_inline_entry_label, bool is_inline_ro_entry) {
397 assert(InlineTypePassFieldsAsArgs, "sanity");
398 // Make sure there is enough stack space for this method's activation.
399 assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
400 generate_stack_overflow_check(bang_size_in_bytes);
401
402 GrowableArray<SigEntry>* sig = ces->sig();
403 GrowableArray<SigEntry>* sig_cc = is_inline_ro_entry ? ces->sig_cc_ro() : ces->sig_cc();
404 VMRegPair* regs = ces->regs();
405 VMRegPair* regs_cc = is_inline_ro_entry ? ces->regs_cc_ro() : ces->regs_cc();
406 int args_on_stack = ces->args_on_stack();
407 int args_on_stack_cc = is_inline_ro_entry ? ces->args_on_stack_cc_ro() : ces->args_on_stack_cc();
408
409 assert(sig->length() <= sig_cc->length(), "Zero-sized inline class not allowed!");
410 BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sig_cc->length());
411 int args_passed = sig->length();
412 int args_passed_cc = SigEntry::fill_sig_bt(sig_cc, sig_bt);
413
414 // Create a temp frame so we can call into the runtime. It must be properly set up to accommodate GC.
415 build_frame_helper(frame_size_in_bytes, sp_offset_for_orig_pc, 0, true, ces->c1_needs_stack_repair());
416
417 // The runtime call might safepoint, make sure nmethod entry barrier is executed
418 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
419 // C1 code is not hot enough to micro optimize the nmethod entry barrier with an out-of-line stub
420 bs->nmethod_entry_barrier(this, nullptr /* slow_path */, nullptr /* continuation */);
421
422 // FIXME -- call runtime only if we cannot in-line allocate all the incoming inline type args.
423 movptr(rbx, (intptr_t)(ces->method()));
424 if (is_inline_ro_entry) {
425 call(RuntimeAddress(Runtime1::entry_for(Runtime1::buffer_inline_args_no_receiver_id)));
426 } else {
427 call(RuntimeAddress(Runtime1::entry_for(Runtime1::buffer_inline_args_id)));
428 }
429 int rt_call_offset = offset();
430
431 // Remove the temp frame
432 addptr(rsp, frame_size_in_bytes);
433 pop(rbp);
434
435 // Check if we need to extend the stack for packing
436 int sp_inc = 0;
437 if (args_on_stack > args_on_stack_cc) {
438 sp_inc = extend_stack_for_inline_args(args_on_stack);
439 }
440
441 shuffle_inline_args(true, is_inline_ro_entry, sig_cc,
442 args_passed_cc, args_on_stack_cc, regs_cc, // from
443 args_passed, args_on_stack, regs, // to
444 sp_inc, rax);
445
446 // Create the real frame. Below jump will then skip over the stack banging and frame
447 // setup code in the verified_inline_entry (which has a different real_frame_size).
448 build_frame_helper(frame_size_in_bytes, sp_offset_for_orig_pc, sp_inc, false, ces->c1_needs_stack_repair());
449
450 jmp(verified_inline_entry_label);
451 return rt_call_offset;
452 }
453
454 void C1_MacroAssembler::load_parameter(int offset_in_words, Register reg) {
455 // rbp, + 0: link
456 // + 1: return address
457 // + 2: argument with offset 0
458 // + 3: argument with offset 1
459 // + 4: ...
460
461 movptr(reg, Address(rbp, (offset_in_words + 2) * BytesPerWord));
462 }
463
464 #ifndef PRODUCT
465
466 void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
467 if (!VerifyOops) return;
468 verify_oop_addr(Address(rsp, stack_offset));
469 }
470
471 void C1_MacroAssembler::verify_not_null_oop(Register r) {
472 if (!VerifyOops) return;
473 Label not_null;
|