void InterpreterRuntime::SignatureHandlerGenerator::pass_word(int size_of_arg, int offset_in_arg) { Argument jni_arg(jni_offset() + offset_in_arg, false); Register Rtmp = O0; __ ld(Llocals, Interpreter::local_offset_in_bytes(offset()), Rtmp); __ store_argument(Rtmp, jni_arg); }
void InterpreterRuntime::SignatureHandlerGenerator::pass_object() { Argument jni_arg(jni_offset(), false); Argument java_arg( offset(), true); Register Rtmp1 = O0; Register Rtmp2 = jni_arg.is_register() ? jni_arg.as_register() : O0; Register Rtmp3 = G3_scratch; // the handle for a receiver will never be null bool do_NULL_check = offset() != 0 || is_static(); Address h_arg = Address(Llocals, Interpreter::local_offset_in_bytes(offset())); __ ld_ptr(h_arg, Rtmp1); if (!do_NULL_check) { __ add(h_arg.base(), h_arg.disp(), Rtmp2); } else { if (Rtmp1 == Rtmp2) __ tst(Rtmp1); else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair Label L; __ brx(Assembler::notZero, true, Assembler::pt, L); __ delayed()->add(h_arg.base(), h_arg.disp(), Rtmp2); __ bind(L); } __ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op }
void InterpreterRuntime::SignatureHandlerGenerator::pass_long() { Argument jni_arg(jni_offset(), false); Register Rtmp = O0; #ifdef ASSERT if (TaggedStackInterpreter) { // check at least one tag is okay Label ok; __ ld_ptr(Llocals, Interpreter::local_tag_offset_in_bytes(offset() + 1), Rtmp); __ cmp(Rtmp, G0); __ brx(Assembler::equal, false, Assembler::pt, ok); __ delayed()->nop(); __ stop("Native object has bad tag value"); __ bind(ok); } #endif // ASSERT #ifdef _LP64 __ ldx(Llocals, Interpreter::local_offset_in_bytes(offset() + 1), Rtmp); __ store_long_argument(Rtmp, jni_arg); #else __ ld(Llocals, Interpreter::local_offset_in_bytes(offset() + 1), Rtmp); __ store_argument(Rtmp, jni_arg); __ ld(Llocals, Interpreter::local_offset_in_bytes(offset() + 0), Rtmp); Argument successor(jni_arg.successor()); __ store_argument(Rtmp, successor); #endif }
void InterpreterRuntime::SignatureHandlerGenerator::pass_float() { Argument jni_arg(jni_offset(), false); #ifdef _LP64 FloatRegister Rtmp = F0; __ ldf(FloatRegisterImpl::S, Llocals, Interpreter::local_offset_in_bytes(offset()), Rtmp); __ store_float_argument(Rtmp, jni_arg); #else Register Rtmp = O0; __ ld(Llocals, Interpreter::local_offset_in_bytes(offset()), Rtmp); __ store_argument(Rtmp, jni_arg); #endif }
void InterpreterRuntime::SignatureHandlerGenerator::pass_double() { Argument jni_arg(jni_offset(), false); #ifdef _LP64 FloatRegister Rtmp = F0; __ ldf(FloatRegisterImpl::D, Llocals, -(offset() + 1) * wordSize, Rtmp); __ store_double_argument(Rtmp, jni_arg); #else Register Rtmp = O0; __ ld(Llocals, -(offset() + 1) * wordSize, Rtmp); __ store_argument(Rtmp, jni_arg); __ ld(Llocals, -offset() * wordSize, Rtmp); __ store_argument(Rtmp, jni_arg.successor()); #endif }
void InterpreterRuntime::SignatureHandlerGenerator::pass_long() { Argument jni_arg(jni_offset(), false); Register Rtmp = O0; #ifdef _LP64 __ ldx(Llocals, Interpreter::local_offset_in_bytes(offset() + 1), Rtmp); __ store_long_argument(Rtmp, jni_arg); #else __ ld(Llocals, Interpreter::local_offset_in_bytes(offset() + 1), Rtmp); __ store_argument(Rtmp, jni_arg); __ ld(Llocals, Interpreter::local_offset_in_bytes(offset() + 0), Rtmp); Argument successor(jni_arg.successor()); __ store_argument(Rtmp, successor); #endif }
void InterpreterRuntime::SignatureHandlerGenerator::pass_long() { Argument jni_arg(jni_offset(), false); Register Rtmp = O0; Register Rtmp1 = G3_scratch; #ifdef _LP64 __ ldx(Llocals, -(offset() + 1) * wordSize, Rtmp); __ store_long_argument(Rtmp, jni_arg); #else __ ld(Llocals, -(offset() + 1) * wordSize, Rtmp); __ store_argument(Rtmp, jni_arg ); __ ld(Llocals, -(offset() + 0) * wordSize, Rtmp); __ store_argument(Rtmp, jni_arg.successor()); #endif }
void InterpreterRuntime::SignatureHandlerGenerator::pass_object() { Argument jni_arg(jni_offset(), false); Argument java_arg( offset(), true); Register Rtmp1 = O0; Register Rtmp2 = jni_arg.is_register() ? jni_arg.as_register() : O0; Register Rtmp3 = G3_scratch; // the handle for a receiver will never be null bool do_NULL_check = offset() != 0 || is_static(); Address h_arg = Address(Llocals, Interpreter::local_offset_in_bytes(offset())); __ ld_ptr(h_arg, Rtmp1); #ifdef ASSERT if (TaggedStackInterpreter) { // check we have the obj and not the tag Label ok; __ mov(frame::TagReference, Rtmp3); __ cmp(Rtmp1, Rtmp3); __ brx(Assembler::notEqual, true, Assembler::pt, ok); __ delayed()->nop(); __ stop("Native object passed tag by mistake"); __ bind(ok); } #endif // ASSERT if (!do_NULL_check) { __ add(h_arg.base(), h_arg.disp(), Rtmp2); } else { if (Rtmp1 == Rtmp2) __ tst(Rtmp1); else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair Label L; __ brx(Assembler::notZero, true, Assembler::pt, L); __ delayed()->add(h_arg.base(), h_arg.disp(), Rtmp2); __ bind(L); } __ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op }
void InterpreterRuntime::SignatureHandlerGenerator::pass_prev(int slot_offset) { Argument jni_arg(_prev_jni_offset); Argument::Sig sig = _prev_sig; if (sig == Argument::no_sig) { return; } slot_offset += BytesPerWord; if (Argument::is_integral(sig)) { // Integral argument // Load either the output register or a very-local temp from the java stack // Bump java stack offset address if requested. const Register tmp = jni_arg.is_register() ? jni_arg.as_register() : GR2_SCRATCH; if (slot_offset == 0) { __ ld8(tmp, GR_I0); } else { __ ld8(tmp, GR_I0, -slot_offset); } if (Argument::is_4byte(sig)) { __ sxt4(tmp, tmp); } if (Argument::is_obj(sig)) { // Object, box if not null const PredicateRegister box = PR15_SCRATCH; __ cmp(box, PR0, 0, tmp, Assembler::notEqual); __ add(box, tmp, GR_I0, slot_offset); } if (!jni_arg.is_register()) { // Store into native memory parameter list __ add(GR3_SCRATCH, SP, jni_arg.jni_offset_in_frame()); __ st8(GR3_SCRATCH, tmp); } } else { // Floating point argument const FloatRegister tmp = jni_arg.is_register() ? as_FloatRegister(FR_I0->encoding() + _prev_float_reg_offset) : FR6; if (jni_arg.is_register()) { if (Argument::is_4byte(sig)) { // Single precision float if (slot_offset == 0) { __ ldfs(tmp, GR_I0); } else { __ ldfs(tmp, GR_I0, -slot_offset); } } else { // Double precision float if (slot_offset == 0) { __ ldfd(tmp, GR_I0); } else { __ ldfd(tmp, GR_I0, -slot_offset); } } } else { if (slot_offset == 0) { __ ld8(GR2_SCRATCH, GR_I0); } else { __ ld8(GR2_SCRATCH, GR_I0, -slot_offset); } __ add(GR3_SCRATCH, SP, jni_arg.jni_offset_in_frame()); __ st8(GR3_SCRATCH, GR2_SCRATCH); } } }
void InterpreterRuntime::SignatureHandlerGenerator::pass_float() { Argument jni_arg(jni_offset(), false); FloatRegister Rtmp = F0; __ ldf(FloatRegisterImpl::S, Llocals, -offset() * wordSize, Rtmp); __ store_float_argument(Rtmp, jni_arg); }