1301 // reset handle block |
1301 // reset handle block |
1302 __ ld(t, thread, in_bytes(JavaThread::active_handles_offset())); |
1302 __ ld(t, thread, in_bytes(JavaThread::active_handles_offset())); |
1303 __ sw(R0, t, JNIHandleBlock::top_offset_in_bytes()); |
1303 __ sw(R0, t, JNIHandleBlock::top_offset_in_bytes()); |
1304 |
1304 |
1305 // If result was an oop then unbox and save it in the frame |
1305 // If result was an oop then unbox and save it in the frame |
1306 { Label L; |
1306 { |
1307 Label no_oop, store_result; |
1307 Label no_oop; |
1308 //FIXME, addi only support 16-bit imeditate |
1308 //FIXME, addi only support 16-bit imeditate |
1309 __ ld(AT, FP, frame::interpreter_frame_result_handler_offset*wordSize); |
1309 __ ld(AT, FP, frame::interpreter_frame_result_handler_offset*wordSize); |
1310 __ li(T0, AbstractInterpreter::result_handler(T_OBJECT)); |
1310 __ li(T0, AbstractInterpreter::result_handler(T_OBJECT)); |
1311 __ bne(AT, T0, no_oop); |
1311 __ bne(AT, T0, no_oop); |
1312 __ delayed()->nop(); |
1312 __ delayed()->nop(); |
1313 __ pop(ltos); |
1313 __ pop(ltos); |
1314 __ beq(V0, R0, store_result); |
1314 // Unbox oop result, e.g. JNIHandles::resolve value. |
1315 __ delayed()->nop(); |
1315 __ resolve_jobject(V0, thread, T9); |
1316 // unbox |
|
1317 __ ld(V0, V0, 0); |
|
1318 __ bind(store_result); |
|
1319 __ sd(V0, FP, (frame::interpreter_frame_oop_temp_offset)*wordSize); |
1316 __ sd(V0, FP, (frame::interpreter_frame_oop_temp_offset)*wordSize); |
1320 // keep stack depth as expected by pushing oop which will eventually be discarded |
1317 // keep stack depth as expected by pushing oop which will eventually be discarded |
1321 __ push(ltos); |
1318 __ push(ltos); |
1322 __ bind(no_oop); |
1319 __ bind(no_oop); |
1323 } |
1320 } |