298 Label loop; 299 __ BIND(loop); 300 // pull one word up each time through the loop 301 __ movptr(rbx_temp, Address(rdx_temp, 0)); 302 __ movptr(Address(rdx_temp, arg_slots, Address::times_ptr), rbx_temp); 303 __ addptr(rdx_temp, -wordSize); 304 __ cmpptr(rdx_temp, rsp); 305 __ jccb(Assembler::greaterEqual, loop); 306 } 307 308 // Now move the argslot up, to point to the just-copied block. 309 __ lea(rsp, Address(rsp, arg_slots, Address::times_ptr)); 310 // And adjust the argslot address to point at the deletion point. 311 __ lea(rax_argslot, Address(rax_argslot, arg_slots, Address::times_ptr)); 312 BLOCK_COMMENT("} remove_arg_slots"); 313 } 314 315 #ifndef PRODUCT 316 extern "C" void print_method_handle(oop mh); 317 void trace_method_handle_stub(const char* adaptername, 318 oop mh, 319 intptr_t* saved_regs, 320 intptr_t* entry_sp, 321 intptr_t* saved_sp, 322 intptr_t* saved_bp) { 323 // called as a leaf from native code: do not block the JVM! 324 intptr_t* last_sp = (intptr_t*) saved_bp[frame::interpreter_frame_last_sp_offset]; 325 intptr_t* base_sp = (intptr_t*) saved_bp[frame::interpreter_frame_monitor_block_top_offset]; 326 printf("MH %s mh="INTPTR_FORMAT" sp=("INTPTR_FORMAT"+"INTX_FORMAT") stack_size="INTX_FORMAT" bp="INTPTR_FORMAT"\n", 327 adaptername, (intptr_t)mh, (intptr_t)entry_sp, (intptr_t)(saved_sp - entry_sp), (intptr_t)(base_sp - last_sp), (intptr_t)saved_bp); 328 if (last_sp != saved_sp && last_sp != NULL) 329 printf("*** last_sp="INTPTR_FORMAT"\n", (intptr_t)last_sp); 330 if (Verbose) { 331 printf(" reg dump: "); 332 int saved_regs_count = (entry_sp-1) - saved_regs; 333 // 32 bit: rdi rsi rbp rsp; rbx rdx rcx (*) rax 334 int i; 335 for (i = 0; i <= saved_regs_count; i++) { 336 if (i > 0 && i % 4 == 0 && i != saved_regs_count) 337 printf("\n + dump: "); 338 printf(" %d: "INTPTR_FORMAT, i, saved_regs[i]); 339 } 340 printf("\n"); 341 int stack_dump_count = 16; 342 if (stack_dump_count < (int)(saved_bp + 2 - saved_sp)) 343 stack_dump_count = (int)(saved_bp + 2 - saved_sp); 344 if (stack_dump_count > 64) stack_dump_count = 48; 345 for (i = 0; i < stack_dump_count; i += 4) { 346 printf(" dump at SP[%d] "INTPTR_FORMAT": "INTPTR_FORMAT" "INTPTR_FORMAT" "INTPTR_FORMAT" "INTPTR_FORMAT"\n", 347 i, (intptr_t) &entry_sp[i+0], entry_sp[i+0], entry_sp[i+1], entry_sp[i+2], entry_sp[i+3]); 348 } 349 print_method_handle(mh); 350 } 351 } 352 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { 353 if (!TraceMethodHandles) return; 354 BLOCK_COMMENT("trace_method_handle {"); 355 __ push(rax); 356 __ lea(rax, Address(rsp, wordSize*6)); // entry_sp 357 __ pusha(); 358 // arguments: 359 __ push(rbp); // interpreter frame pointer 360 __ push(rsi); // saved_sp 361 __ push(rax); // entry_sp 362 __ push(rcx); // mh 363 __ push(rcx); 364 __ movptr(Address(rsp, 0), (intptr_t) adaptername); 365 __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub), 5); 366 __ popa(); 367 __ pop(rax); 368 BLOCK_COMMENT("} trace_method_handle"); 369 } 370 #endif //PRODUCT 371 372 // which conversion op types are implemented here? 373 int MethodHandles::adapter_conversion_ops_supported_mask() { 374 return ((1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY) 375 |(1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW) 376 |(1<<java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST) 377 |(1<<java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM) 378 |(1<<java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM) 379 |(1<<java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS) 380 |(1<<java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS) 381 |(1<<java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS) 382 |(1<<java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS) 383 //|(1<<java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS) //BUG! 384 ); 385 // FIXME: MethodHandlesTest gets a crash if we enable OP_SPREAD_ARGS. 386 } 387 | 298 Label loop; 299 __ BIND(loop); 300 // pull one word up each time through the loop 301 __ movptr(rbx_temp, Address(rdx_temp, 0)); 302 __ movptr(Address(rdx_temp, arg_slots, Address::times_ptr), rbx_temp); 303 __ addptr(rdx_temp, -wordSize); 304 __ cmpptr(rdx_temp, rsp); 305 __ jccb(Assembler::greaterEqual, loop); 306 } 307 308 // Now move the argslot up, to point to the just-copied block. 309 __ lea(rsp, Address(rsp, arg_slots, Address::times_ptr)); 310 // And adjust the argslot address to point at the deletion point. 311 __ lea(rax_argslot, Address(rax_argslot, arg_slots, Address::times_ptr)); 312 BLOCK_COMMENT("} remove_arg_slots"); 313 } 314 315 #ifndef PRODUCT 316 extern "C" void print_method_handle(oop mh); 317 void trace_method_handle_stub(const char* adaptername, 318 intptr_t* saved_sp, 319 oop mh, 320 intptr_t* sp) { 321 // called as a leaf from native code: do not block the JVM! 322 intptr_t* entry_sp = sp + LP64_ONLY(16) NOT_LP64(8); 323 tty->print_cr("MH %s mh="INTPTR_FORMAT" sp="INTPTR_FORMAT" saved_sp="INTPTR_FORMAT")", 324 adaptername, (intptr_t)mh, (intptr_t)entry_sp, saved_sp); 325 if (Verbose) { 326 print_method_handle(mh); 327 } 328 } 329 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { 330 if (!TraceMethodHandles) return; 331 BLOCK_COMMENT("trace_method_handle {"); 332 __ pusha(); 333 #ifdef _LP64 334 // arguments: 335 __ mov(c_rarg2, rcx); // mh 336 __ mov(c_rarg1, r13); // saved sp 337 __ mov(c_rarg3, rsp); // sp 338 __ movptr(c_rarg0, (intptr_t) adaptername); 339 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub), c_rarg0, c_rarg1, c_rarg2, c_rarg3); 340 #else 341 // arguments: 342 __ movptr(rbx, (intptr_t) adaptername); 343 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub), rbx, rsi, rcx, rsp); 344 #endif 345 __ popa(); 346 BLOCK_COMMENT("} trace_method_handle"); 347 } 348 #endif //PRODUCT 349 350 // which conversion op types are implemented here? 351 int MethodHandles::adapter_conversion_ops_supported_mask() { 352 return ((1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY) 353 |(1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW) 354 |(1<<java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST) 355 |(1<<java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM) 356 |(1<<java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM) 357 |(1<<java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS) 358 |(1<<java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS) 359 |(1<<java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS) 360 |(1<<java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS) 361 //|(1<<java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS) //BUG! 362 ); 363 // FIXME: MethodHandlesTest gets a crash if we enable OP_SPREAD_ARGS. 364 } 365 |