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 }
|