508 address entry = __ pc();
509
510 const int referent_offset = java_lang_ref_Reference::referent_offset;
511 guarantee(referent_offset > 0, "referent offset not initialized");
512
513 Label slow_path;
514
515 // Debugging not possible, so can't use __ skip_if_jvmti_mode(slow_path, GR31_SCRATCH);
516
517 // In the G1 code we don't check if we need to reach a safepoint. We
518 // continue and the thread will safepoint at the next bytecode dispatch.
519
520 // If the receiver is null then it is OK to jump to the slow path.
521 __ ld(R3_RET, Interpreter::stackElementSize, R15_esp); // get receiver
522
523 // Check if receiver == NULL and go the slow path.
524 __ cmpdi(CCR0, R3_RET, 0);
525 __ beq(CCR0, slow_path);
526
527 // Load the value of the referent field.
528 BarrierSetAssembler *bs = Universe::heap()->barrier_set()->barrier_set_assembler();
529 bs->load_at(_masm, IN_HEAP | ON_WEAK_OOP_REF, T_OBJECT,
530 R3_RET, referent_offset, R3_RET,
531 /* non-volatile temp */ R31, R11_scratch1, true);
532
533 // Generate the G1 pre-barrier code to log the value of
534 // the referent field in an SATB buffer. Note with
535 // these parameters the pre-barrier does not generate
536 // the load of the previous value.
537
538 // Restore caller sp for c2i case.
539 #ifdef ASSERT
540 __ ld(R9_ARG7, 0, R1_SP);
541 __ ld(R10_ARG8, 0, R21_sender_SP);
542 __ cmpd(CCR0, R9_ARG7, R10_ARG8);
543 __ asm_assert_eq("backlink", 0x544);
544 #endif // ASSERT
545 __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started.
546
547 __ blr();
548
|
508 address entry = __ pc();
509
510 const int referent_offset = java_lang_ref_Reference::referent_offset;
511 guarantee(referent_offset > 0, "referent offset not initialized");
512
513 Label slow_path;
514
515 // Debugging not possible, so can't use __ skip_if_jvmti_mode(slow_path, GR31_SCRATCH);
516
517 // In the G1 code we don't check if we need to reach a safepoint. We
518 // continue and the thread will safepoint at the next bytecode dispatch.
519
520 // If the receiver is null then it is OK to jump to the slow path.
521 __ ld(R3_RET, Interpreter::stackElementSize, R15_esp); // get receiver
522
523 // Check if receiver == NULL and go the slow path.
524 __ cmpdi(CCR0, R3_RET, 0);
525 __ beq(CCR0, slow_path);
526
527 // Load the value of the referent field.
528 BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
529 bs->load_at(_masm, IN_HEAP | ON_WEAK_OOP_REF, T_OBJECT,
530 R3_RET, referent_offset, R3_RET,
531 /* non-volatile temp */ R31, R11_scratch1, true);
532
533 // Generate the G1 pre-barrier code to log the value of
534 // the referent field in an SATB buffer. Note with
535 // these parameters the pre-barrier does not generate
536 // the load of the previous value.
537
538 // Restore caller sp for c2i case.
539 #ifdef ASSERT
540 __ ld(R9_ARG7, 0, R1_SP);
541 __ ld(R10_ARG8, 0, R21_sender_SP);
542 __ cmpd(CCR0, R9_ARG7, R10_ARG8);
543 __ asm_assert_eq("backlink", 0x544);
544 #endif // ASSERT
545 __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started.
546
547 __ blr();
548
|