333 __ brx(Assembler::greaterEqual, false, Assembler::pt, loop); 334 __ delayed()->nop(); // FILLME 335 } 336 337 // Now move the argslot up, to point to the just-copied block. 338 __ add(Gargs, offset, Gargs); 339 // And adjust the argslot address to point at the deletion point. 340 __ add(argslot_reg, offset, argslot_reg); 341 342 // Keep the stack pointer 2*wordSize aligned. 343 const int TwoWordAlignmentMask = right_n_bits(LogBytesPerWord + 1); 344 RegisterOrConstant masked_offset = __ regcon_andn_ptr(offset, TwoWordAlignmentMask, temp_reg); 345 __ add(SP, masked_offset, SP); 346 BLOCK_COMMENT("} remove_arg_slots"); 347 } 348 349 350 #ifndef PRODUCT 351 extern "C" void print_method_handle(oop mh); 352 void trace_method_handle_stub(const char* adaptername, 353 oopDesc* mh) { 354 printf("MH %s mh="INTPTR_FORMAT"\n", adaptername, (intptr_t) mh); 355 print_method_handle(mh); 356 } 357 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { 358 if (!TraceMethodHandles) return; 359 BLOCK_COMMENT("trace_method_handle {"); 360 // save: Gargs, O5_savedSP 361 __ save_frame(16); 362 __ set((intptr_t) adaptername, O0); 363 __ mov(G3_method_handle, O1); 364 __ mov(G3_method_handle, L3); 365 __ mov(Gargs, L4); 366 __ mov(G5_method_type, L5); 367 __ call_VM_leaf(L7, CAST_FROM_FN_PTR(address, trace_method_handle_stub)); 368 369 __ mov(L3, G3_method_handle); 370 __ mov(L4, Gargs); 371 __ mov(L5, G5_method_type); 372 __ restore(); 373 BLOCK_COMMENT("} trace_method_handle"); 374 } 375 #endif // PRODUCT 376 377 // which conversion op types are implemented here? 378 int MethodHandles::adapter_conversion_ops_supported_mask() { 379 return ((1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY) 380 |(1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW) 381 |(1<<java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST) 382 |(1<<java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM) 383 |(1<<java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM) | 333 __ brx(Assembler::greaterEqual, false, Assembler::pt, loop); 334 __ delayed()->nop(); // FILLME 335 } 336 337 // Now move the argslot up, to point to the just-copied block. 338 __ add(Gargs, offset, Gargs); 339 // And adjust the argslot address to point at the deletion point. 340 __ add(argslot_reg, offset, argslot_reg); 341 342 // Keep the stack pointer 2*wordSize aligned. 343 const int TwoWordAlignmentMask = right_n_bits(LogBytesPerWord + 1); 344 RegisterOrConstant masked_offset = __ regcon_andn_ptr(offset, TwoWordAlignmentMask, temp_reg); 345 __ add(SP, masked_offset, SP); 346 BLOCK_COMMENT("} remove_arg_slots"); 347 } 348 349 350 #ifndef PRODUCT 351 extern "C" void print_method_handle(oop mh); 352 void trace_method_handle_stub(const char* adaptername, 353 oopDesc* mh, 354 intptr_t* saved_sp) { 355 tty->print_cr("MH %s mh="INTPTR_FORMAT " saved_sp=" INTPTR_FORMAT, adaptername, (intptr_t) mh, saved_sp); 356 print_method_handle(mh); 357 } 358 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { 359 if (!TraceMethodHandles) return; 360 BLOCK_COMMENT("trace_method_handle {"); 361 // save: Gargs, O5_savedSP 362 __ save_frame(16); 363 __ set((intptr_t) adaptername, O0); 364 __ mov(G3_method_handle, O1); 365 __ mov(I5_savedSP, O2); 366 __ mov(G3_method_handle, L3); 367 __ mov(Gargs, L4); 368 __ mov(G5_method_type, L5); 369 __ call_VM_leaf(L7, CAST_FROM_FN_PTR(address, trace_method_handle_stub)); 370 371 __ mov(L3, G3_method_handle); 372 __ mov(L4, Gargs); 373 __ mov(L5, G5_method_type); 374 __ restore(); 375 BLOCK_COMMENT("} trace_method_handle"); 376 } 377 #endif // PRODUCT 378 379 // which conversion op types are implemented here? 380 int MethodHandles::adapter_conversion_ops_supported_mask() { 381 return ((1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY) 382 |(1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW) 383 |(1<<java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST) 384 |(1<<java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM) 385 |(1<<java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM) |