Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/methodHandles_x86.cpp @ 3442:f7d55ea6ee56
7045514: SPARC assembly code for JSR 292 ricochet frames
Reviewed-by: kvn, jrose
author | never |
---|---|
date | Fri, 03 Jun 2011 22:31:43 -0700 |
parents | a80577f854f9 |
children | 07c2e7ffd1fc |
comparison
equal
deleted
inserted
replaced
3441:f56542cb325a | 3442:f7d55ea6ee56 |
---|---|
137 return cookie; | 137 return cookie; |
138 } | 138 } |
139 | 139 |
140 void MethodHandles::RicochetFrame::generate_ricochet_blob(MacroAssembler* _masm, | 140 void MethodHandles::RicochetFrame::generate_ricochet_blob(MacroAssembler* _masm, |
141 // output params: | 141 // output params: |
142 int* frame_size_in_words, | |
143 int* bounce_offset, | 142 int* bounce_offset, |
144 int* exception_offset) { | 143 int* exception_offset, |
144 int* frame_size_in_words) { | |
145 (*frame_size_in_words) = RicochetFrame::frame_size_in_bytes() / wordSize; | 145 (*frame_size_in_words) = RicochetFrame::frame_size_in_bytes() / wordSize; |
146 | 146 |
147 address start = __ pc(); | 147 address start = __ pc(); |
148 | 148 |
149 #ifdef ASSERT | 149 #ifdef ASSERT |
364 | 364 |
365 void MethodHandles::load_stack_move(MacroAssembler* _masm, | 365 void MethodHandles::load_stack_move(MacroAssembler* _masm, |
366 Register rdi_stack_move, | 366 Register rdi_stack_move, |
367 Register rcx_amh, | 367 Register rcx_amh, |
368 bool might_be_negative) { | 368 bool might_be_negative) { |
369 BLOCK_COMMENT("load_stack_move"); | 369 BLOCK_COMMENT("load_stack_move {"); |
370 Address rcx_amh_conversion(rcx_amh, java_lang_invoke_AdapterMethodHandle::conversion_offset_in_bytes()); | 370 Address rcx_amh_conversion(rcx_amh, java_lang_invoke_AdapterMethodHandle::conversion_offset_in_bytes()); |
371 __ movl(rdi_stack_move, rcx_amh_conversion); | 371 __ movl(rdi_stack_move, rcx_amh_conversion); |
372 __ sarl(rdi_stack_move, CONV_STACK_MOVE_SHIFT); | 372 __ sarl(rdi_stack_move, CONV_STACK_MOVE_SHIFT); |
373 #ifdef _LP64 | 373 #ifdef _LP64 |
374 if (might_be_negative) { | 374 if (might_be_negative) { |
385 __ jcc(Assembler::greater, L_ok); | 385 __ jcc(Assembler::greater, L_ok); |
386 __ bind(L_bad); | 386 __ bind(L_bad); |
387 __ stop("load_stack_move of garbage value"); | 387 __ stop("load_stack_move of garbage value"); |
388 __ BIND(L_ok); | 388 __ BIND(L_ok); |
389 } | 389 } |
390 BLOCK_COMMENT("} load_stack_move"); | |
390 } | 391 } |
391 | 392 |
392 #ifdef ASSERT | 393 #ifdef ASSERT |
393 void MethodHandles::RicochetFrame::verify_offsets() { | 394 void MethodHandles::RicochetFrame::verify_offsets() { |
394 // Check compatibility of this struct with the more generally used offsets of class frame: | 395 // Check compatibility of this struct with the more generally used offsets of class frame: |
1145 | 1146 |
1146 address interp_entry = __ pc(); | 1147 address interp_entry = __ pc(); |
1147 | 1148 |
1148 trace_method_handle(_masm, entry_name(ek)); | 1149 trace_method_handle(_masm, entry_name(ek)); |
1149 | 1150 |
1150 BLOCK_COMMENT(entry_name(ek)); | 1151 BLOCK_COMMENT(err_msg("Entry %s {", entry_name(ek))); |
1151 | 1152 |
1152 switch ((int) ek) { | 1153 switch ((int) ek) { |
1153 case _raise_exception: | 1154 case _raise_exception: |
1154 { | 1155 { |
1155 // Not a real MH entry, but rather shared code for raising an | 1156 // Not a real MH entry, but rather shared code for raising an |
1290 case _bound_long_mh: | 1291 case _bound_long_mh: |
1291 case _bound_ref_direct_mh: | 1292 case _bound_ref_direct_mh: |
1292 case _bound_int_direct_mh: | 1293 case _bound_int_direct_mh: |
1293 case _bound_long_direct_mh: | 1294 case _bound_long_direct_mh: |
1294 { | 1295 { |
1295 bool direct_to_method = (ek >= _bound_ref_direct_mh); | 1296 const bool direct_to_method = (ek >= _bound_ref_direct_mh); |
1296 BasicType arg_type = ek_bound_mh_arg_type(ek); | 1297 BasicType arg_type = ek_bound_mh_arg_type(ek); |
1297 int arg_slots = type2size[arg_type]; | 1298 int arg_slots = type2size[arg_type]; |
1298 | 1299 |
1299 // make room for the new argument: | 1300 // make room for the new argument: |
1300 __ movl(rax_argslot, rcx_bmh_vmargslot); | 1301 __ movl(rax_argslot, rcx_bmh_vmargslot); |
1927 // Normal adjustment: ... keep1 | +dest+ | -collect- | keep2 | RF... | collect | | 1928 // Normal adjustment: ... keep1 | +dest+ | -collect- | keep2 | RF... | collect | |
1928 // If retaining args: ... keep1 | +dest+ | collect | keep2 | RF... | collect | | 1929 // If retaining args: ... keep1 | +dest+ | collect | keep2 | RF... | collect | |
1929 // In the non-retaining case, this might move keep2 either up or down. | 1930 // In the non-retaining case, this might move keep2 either up or down. |
1930 // We don't have to copy the whole | RF... collect | complex, | 1931 // We don't have to copy the whole | RF... collect | complex, |
1931 // but we must adjust RF.saved_args_base. | 1932 // but we must adjust RF.saved_args_base. |
1932 // Also, from now on, we will forget about the origial copy of |collect|. | 1933 // Also, from now on, we will forget about the original copy of |collect|. |
1933 // If we are retaining it, we will treat it as part of |keep2|. | 1934 // If we are retaining it, we will treat it as part of |keep2|. |
1934 // For clarity we will define |keep3| = |collect|keep2| or |keep2|. | 1935 // For clarity we will define |keep3| = |collect|keep2| or |keep2|. |
1935 | 1936 |
1936 BLOCK_COMMENT("adjust trailing arguments {"); | 1937 BLOCK_COMMENT("adjust trailing arguments {"); |
1937 // Compare the sizes of |+dest+| and |-collect-|, which are opposed opening and closing movements. | 1938 // Compare the sizes of |+dest+| and |-collect-|, which are opposed opening and closing movements. |
1984 | 1985 |
1985 // Old and new argument locations (based at slot 0). | 1986 // Old and new argument locations (based at slot 0). |
1986 // Net shift (&new_argv - &old_argv) is (close_count - open_count). | 1987 // Net shift (&new_argv - &old_argv) is (close_count - open_count). |
1987 bool zero_open_count = (open_count == 0); // remember this bit of info | 1988 bool zero_open_count = (open_count == 0); // remember this bit of info |
1988 if (move_keep3 && fix_arg_base) { | 1989 if (move_keep3 && fix_arg_base) { |
1989 // It will be easier t have everything in one register: | 1990 // It will be easier to have everything in one register: |
1990 if (close_count.is_register()) { | 1991 if (close_count.is_register()) { |
1991 // Deduct open_count from close_count register to get a clean +/- value. | 1992 // Deduct open_count from close_count register to get a clean +/- value. |
1992 __ subptr(close_count.as_register(), open_count); | 1993 __ subptr(close_count.as_register(), open_count); |
1993 } else { | 1994 } else { |
1994 close_count = close_count.as_constant() - open_count; | 1995 close_count = close_count.as_constant() - open_count; |
2394 default: | 2395 default: |
2395 // do not require all platforms to recognize all adapter types | 2396 // do not require all platforms to recognize all adapter types |
2396 __ nop(); | 2397 __ nop(); |
2397 return; | 2398 return; |
2398 } | 2399 } |
2400 BLOCK_COMMENT(err_msg("} Entry %s", entry_name(ek))); | |
2399 __ hlt(); | 2401 __ hlt(); |
2400 | 2402 |
2401 address me_cookie = MethodHandleEntry::start_compiled_entry(_masm, interp_entry); | 2403 address me_cookie = MethodHandleEntry::start_compiled_entry(_masm, interp_entry); |
2402 __ unimplemented(entry_name(ek)); // %%% FIXME: NYI | 2404 __ unimplemented(entry_name(ek)); // %%% FIXME: NYI |
2403 | 2405 |