855 __ stp(zr, zr, Address(sp, 12 * wordSize));
856 } else {
857 __ sub(esp, sp, 12 * wordSize);
858 __ ldr(rscratch1, Address(rmethod, Method::const_offset())); // get ConstMethod
859 __ add(rbcp, rscratch1, in_bytes(ConstMethod::codes_offset())); // get codebase
860 __ stp(esp, rbcp, Address(__ pre(sp, -12 * wordSize)));
861 }
862
863 if (ProfileInterpreter) {
864 Label method_data_continue;
865 __ ldr(rscratch1, Address(rmethod, Method::method_data_offset()));
866 __ cbz(rscratch1, method_data_continue);
867 __ lea(rscratch1, Address(rscratch1, in_bytes(MethodData::data_offset())));
868 __ bind(method_data_continue);
869 __ stp(rscratch1, rmethod, Address(sp, 6 * wordSize)); // save Method* and mdp (method data pointer)
870 } else {
871 __ stp(zr, rmethod, Address(sp, 6 * wordSize)); // save Method* (no mdp)
872 }
873
874 // Get mirror and store it in the frame as GC root for this Method*
875 __ load_mirror(rscratch1, rmethod);
876 __ stp(rscratch1, zr, Address(sp, 4 * wordSize));
877
878 __ ldr(rcpool, Address(rmethod, Method::const_offset()));
879 __ ldr(rcpool, Address(rcpool, ConstMethod::constants_offset()));
880 __ ldr(rcpool, Address(rcpool, ConstantPool::cache_offset_in_bytes()));
881 __ stp(rlocals, rcpool, Address(sp, 2 * wordSize));
882
883 __ stp(rfp, lr, Address(sp, 10 * wordSize));
884 __ lea(rfp, Address(sp, 10 * wordSize));
885
886 // set sender sp
887 // leave last_sp as null
888 __ stp(zr, r13, Address(sp, 8 * wordSize));
889
890 // Move SP out of the way
891 if (! native_call) {
892 __ ldr(rscratch1, Address(rmethod, Method::const_offset()));
893 __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset()));
894 __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() + 2);
895 __ sub(rscratch1, sp, rscratch1, ext::uxtw, 3);
896 __ andr(sp, rscratch1, -16);
|
855 __ stp(zr, zr, Address(sp, 12 * wordSize));
856 } else {
857 __ sub(esp, sp, 12 * wordSize);
858 __ ldr(rscratch1, Address(rmethod, Method::const_offset())); // get ConstMethod
859 __ add(rbcp, rscratch1, in_bytes(ConstMethod::codes_offset())); // get codebase
860 __ stp(esp, rbcp, Address(__ pre(sp, -12 * wordSize)));
861 }
862
863 if (ProfileInterpreter) {
864 Label method_data_continue;
865 __ ldr(rscratch1, Address(rmethod, Method::method_data_offset()));
866 __ cbz(rscratch1, method_data_continue);
867 __ lea(rscratch1, Address(rscratch1, in_bytes(MethodData::data_offset())));
868 __ bind(method_data_continue);
869 __ stp(rscratch1, rmethod, Address(sp, 6 * wordSize)); // save Method* and mdp (method data pointer)
870 } else {
871 __ stp(zr, rmethod, Address(sp, 6 * wordSize)); // save Method* (no mdp)
872 }
873
874 // Get mirror and store it in the frame as GC root for this Method*
875 __ load_mirror(r10, rmethod);
876 __ stp(r10, zr, Address(sp, 4 * wordSize));
877
878 __ ldr(rcpool, Address(rmethod, Method::const_offset()));
879 __ ldr(rcpool, Address(rcpool, ConstMethod::constants_offset()));
880 __ ldr(rcpool, Address(rcpool, ConstantPool::cache_offset_in_bytes()));
881 __ stp(rlocals, rcpool, Address(sp, 2 * wordSize));
882
883 __ stp(rfp, lr, Address(sp, 10 * wordSize));
884 __ lea(rfp, Address(sp, 10 * wordSize));
885
886 // set sender sp
887 // leave last_sp as null
888 __ stp(zr, r13, Address(sp, 8 * wordSize));
889
890 // Move SP out of the way
891 if (! native_call) {
892 __ ldr(rscratch1, Address(rmethod, Method::const_offset()));
893 __ ldrh(rscratch1, Address(rscratch1, ConstMethod::max_stack_offset()));
894 __ add(rscratch1, rscratch1, frame::interpreter_frame_monitor_size() + 2);
895 __ sub(rscratch1, sp, rscratch1, ext::uxtw, 3);
896 __ andr(sp, rscratch1, -16);
|