src/cpu/x86/vm/methodHandles_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 7009361 Sdiff src/cpu/x86/vm

src/cpu/x86/vm/methodHandles_x86.cpp

Print this page




 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 


src/cpu/x86/vm/methodHandles_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File