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

src/cpu/x86/vm/methodHandles_x86.cpp

Print this page




 110 
 111   // given the MethodType, find out where the MH argument is buried
 112   __ movptr(rdx_temp, Address(rax_mtype,
 113                               __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rbx_temp)));
 114   __ movl(rdx_temp, Address(rdx_temp,
 115                             __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, rbx_temp)));
 116   __ movptr(rcx_recv, __ argument_address(rdx_temp));
 117 
 118   __ check_method_handle_type(rax_mtype, rcx_recv, rdx_temp, wrong_method_type);
 119   __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 120 
 121   return entry_point;
 122 }
 123 
 124 // Helper to insert argument slots into the stack.
 125 // arg_slots must be a multiple of stack_move_unit() and <= 0
 126 void MethodHandles::insert_arg_slots(MacroAssembler* _masm,
 127                                      RegisterOrConstant arg_slots,
 128                                      int arg_mask,
 129                                      Register rax_argslot,
 130                                      Register rbx_temp, Register rdx_temp) {

 131   assert_different_registers(rax_argslot, rbx_temp, rdx_temp,
 132                              (!arg_slots.is_register() ? rsp : arg_slots.as_register()));
 133 
 134 #ifdef ASSERT
 135   verify_argslot(_masm, rax_argslot, "insertion point must fall within current frame");
 136   if (arg_slots.is_register()) {
 137     Label L_ok, L_bad;
 138     __ cmpptr(arg_slots.as_register(), (int32_t) NULL_WORD);
 139     __ jccb(Assembler::greater, L_bad);
 140     __ testl(arg_slots.as_register(), -stack_move_unit() - 1);
 141     __ jccb(Assembler::zero, L_ok);
 142     __ bind(L_bad);
 143     __ stop("assert arg_slots <= 0 and clear low bits");
 144     __ bind(L_ok);
 145   } else {
 146     assert(arg_slots.as_constant() <= 0, "");
 147     assert(arg_slots.as_constant() % -stack_move_unit() == 0, "");
 148   }
 149 #endif //ASSERT
 150 


 168   {
 169     Label loop;
 170     __ bind(loop);
 171     // pull one word down each time through the loop
 172     __ movptr(rbx_temp, Address(rdx_temp, 0));
 173     __ movptr(Address(rdx_temp, arg_slots, Address::times_ptr), rbx_temp);
 174     __ addptr(rdx_temp, wordSize);
 175     __ cmpptr(rdx_temp, rax_argslot);
 176     __ jccb(Assembler::less, loop);
 177   }
 178 
 179   // Now move the argslot down, to point to the opened-up space.
 180   __ lea(rax_argslot, Address(rax_argslot, arg_slots, Address::times_ptr));
 181 }
 182 
 183 // Helper to remove argument slots from the stack.
 184 // arg_slots must be a multiple of stack_move_unit() and >= 0
 185 void MethodHandles::remove_arg_slots(MacroAssembler* _masm,
 186                                     RegisterOrConstant arg_slots,
 187                                     Register rax_argslot,
 188                                     Register rbx_temp, Register rdx_temp) {

 189   assert_different_registers(rax_argslot, rbx_temp, rdx_temp,
 190                              (!arg_slots.is_register() ? rsp : arg_slots.as_register()));
 191 
 192 #ifdef ASSERT
 193   // Verify that [argslot..argslot+size) lies within (rsp, rbp).
 194   __ lea(rbx_temp, Address(rax_argslot, arg_slots, Address::times_ptr));
 195   verify_argslot(_masm, rbx_temp, "deleted argument(s) must fall within current frame");
 196   if (arg_slots.is_register()) {
 197     Label L_ok, L_bad;
 198     __ cmpptr(arg_slots.as_register(), (int32_t) NULL_WORD);
 199     __ jccb(Assembler::less, L_bad);
 200     __ testl(arg_slots.as_register(), -stack_move_unit() - 1);
 201     __ jccb(Assembler::zero, L_ok);
 202     __ bind(L_bad);
 203     __ stop("assert arg_slots >= 0 and clear low bits");
 204     __ bind(L_ok);
 205   } else {
 206     assert(arg_slots.as_constant() >= 0, "");
 207     assert(arg_slots.as_constant() % -stack_move_unit() == 0, "");
 208   }




 110 
 111   // given the MethodType, find out where the MH argument is buried
 112   __ movptr(rdx_temp, Address(rax_mtype,
 113                               __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rbx_temp)));
 114   __ movl(rdx_temp, Address(rdx_temp,
 115                             __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, rbx_temp)));
 116   __ movptr(rcx_recv, __ argument_address(rdx_temp));
 117 
 118   __ check_method_handle_type(rax_mtype, rcx_recv, rdx_temp, wrong_method_type);
 119   __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 120 
 121   return entry_point;
 122 }
 123 
 124 // Helper to insert argument slots into the stack.
 125 // arg_slots must be a multiple of stack_move_unit() and <= 0
 126 void MethodHandles::insert_arg_slots(MacroAssembler* _masm,
 127                                      RegisterOrConstant arg_slots,
 128                                      int arg_mask,
 129                                      Register rax_argslot,
 130                                      Register rbx_temp, Register rdx_temp, Register temp3_reg) {
 131   assert(temp3_reg == noreg, "temp3 not required");
 132   assert_different_registers(rax_argslot, rbx_temp, rdx_temp,
 133                              (!arg_slots.is_register() ? rsp : arg_slots.as_register()));
 134 
 135 #ifdef ASSERT
 136   verify_argslot(_masm, rax_argslot, "insertion point must fall within current frame");
 137   if (arg_slots.is_register()) {
 138     Label L_ok, L_bad;
 139     __ cmpptr(arg_slots.as_register(), (int32_t) NULL_WORD);
 140     __ jccb(Assembler::greater, L_bad);
 141     __ testl(arg_slots.as_register(), -stack_move_unit() - 1);
 142     __ jccb(Assembler::zero, L_ok);
 143     __ bind(L_bad);
 144     __ stop("assert arg_slots <= 0 and clear low bits");
 145     __ bind(L_ok);
 146   } else {
 147     assert(arg_slots.as_constant() <= 0, "");
 148     assert(arg_slots.as_constant() % -stack_move_unit() == 0, "");
 149   }
 150 #endif //ASSERT
 151 


 169   {
 170     Label loop;
 171     __ bind(loop);
 172     // pull one word down each time through the loop
 173     __ movptr(rbx_temp, Address(rdx_temp, 0));
 174     __ movptr(Address(rdx_temp, arg_slots, Address::times_ptr), rbx_temp);
 175     __ addptr(rdx_temp, wordSize);
 176     __ cmpptr(rdx_temp, rax_argslot);
 177     __ jccb(Assembler::less, loop);
 178   }
 179 
 180   // Now move the argslot down, to point to the opened-up space.
 181   __ lea(rax_argslot, Address(rax_argslot, arg_slots, Address::times_ptr));
 182 }
 183 
 184 // Helper to remove argument slots from the stack.
 185 // arg_slots must be a multiple of stack_move_unit() and >= 0
 186 void MethodHandles::remove_arg_slots(MacroAssembler* _masm,
 187                                     RegisterOrConstant arg_slots,
 188                                     Register rax_argslot,
 189                                      Register rbx_temp, Register rdx_temp, Register temp3_reg) {
 190   assert(temp3_reg == noreg, "temp3 not required");
 191   assert_different_registers(rax_argslot, rbx_temp, rdx_temp,
 192                              (!arg_slots.is_register() ? rsp : arg_slots.as_register()));
 193 
 194 #ifdef ASSERT
 195   // Verify that [argslot..argslot+size) lies within (rsp, rbp).
 196   __ lea(rbx_temp, Address(rax_argslot, arg_slots, Address::times_ptr));
 197   verify_argslot(_masm, rbx_temp, "deleted argument(s) must fall within current frame");
 198   if (arg_slots.is_register()) {
 199     Label L_ok, L_bad;
 200     __ cmpptr(arg_slots.as_register(), (int32_t) NULL_WORD);
 201     __ jccb(Assembler::less, L_bad);
 202     __ testl(arg_slots.as_register(), -stack_move_unit() - 1);
 203     __ jccb(Assembler::zero, L_ok);
 204     __ bind(L_bad);
 205     __ stop("assert arg_slots >= 0 and clear low bits");
 206     __ bind(L_ok);
 207   } else {
 208     assert(arg_slots.as_constant() >= 0, "");
 209     assert(arg_slots.as_constant() % -stack_move_unit() == 0, "");
 210   }


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