917 //
918 // rmethod: Method*
919 // r13: senderSP must preserve for slow path, set SP to it on fast path
920
921 address entry = __ pc();
922
923 const int referent_offset = java_lang_ref_Reference::referent_offset;
924 guarantee(referent_offset > 0, "referent offset not initialized");
925
926 Label slow_path;
927 const Register local_0 = c_rarg0;
928 // Check if local 0 != NULL
929 // If the receiver is null then it is OK to jump to the slow path.
930 __ ldr(local_0, Address(esp, 0));
931 __ cbz(local_0, slow_path);
932
933 __ mov(r19, r13); // Move senderSP to a callee-saved register
934
935 // Load the value of the referent field.
936 const Address field_address(local_0, referent_offset);
937 BarrierSetAssembler *bs = Universe::heap()->barrier_set()->barrier_set_assembler();
938 bs->load_at(_masm, IN_HEAP | ON_WEAK_OOP_REF, T_OBJECT, local_0, field_address, /*tmp1*/ rscratch2, /*tmp2*/ rscratch1);
939
940 // areturn
941 __ andr(sp, r19, -16); // done with stack
942 __ ret(lr);
943
944 // generate a vanilla interpreter entry as the slow path
945 __ bind(slow_path);
946 __ jump_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals));
947 return entry;
948
949 }
950
951 /**
952 * Method entry for static native methods:
953 * int java.util.zip.CRC32.update(int crc, int b)
954 */
955 address TemplateInterpreterGenerator::generate_CRC32_update_entry() {
956 if (UseCRC32Intrinsics) {
957 address entry = __ pc();
|
917 //
918 // rmethod: Method*
919 // r13: senderSP must preserve for slow path, set SP to it on fast path
920
921 address entry = __ pc();
922
923 const int referent_offset = java_lang_ref_Reference::referent_offset;
924 guarantee(referent_offset > 0, "referent offset not initialized");
925
926 Label slow_path;
927 const Register local_0 = c_rarg0;
928 // Check if local 0 != NULL
929 // If the receiver is null then it is OK to jump to the slow path.
930 __ ldr(local_0, Address(esp, 0));
931 __ cbz(local_0, slow_path);
932
933 __ mov(r19, r13); // Move senderSP to a callee-saved register
934
935 // Load the value of the referent field.
936 const Address field_address(local_0, referent_offset);
937 BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
938 bs->load_at(_masm, IN_HEAP | ON_WEAK_OOP_REF, T_OBJECT, local_0, field_address, /*tmp1*/ rscratch2, /*tmp2*/ rscratch1);
939
940 // areturn
941 __ andr(sp, r19, -16); // done with stack
942 __ ret(lr);
943
944 // generate a vanilla interpreter entry as the slow path
945 __ bind(slow_path);
946 __ jump_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals));
947 return entry;
948
949 }
950
951 /**
952 * Method entry for static native methods:
953 * int java.util.zip.CRC32.update(int crc, int b)
954 */
955 address TemplateInterpreterGenerator::generate_CRC32_update_entry() {
956 if (UseCRC32Intrinsics) {
957 address entry = __ pc();
|