Mercurial > hg > shark > hotspot
changeset 2515:1b3950b886f6
Implement adapter_opt_swap_2, adapter_opt_rot_2_up and
adapter_opt_rot_2_down, all untested.
author | Gary Benson <gbenson@redhat.com> |
---|---|
date | Fri, 01 Apr 2011 13:05:12 +0100 |
parents | 35989c0cf707 |
children | a2d9d486c555 |
files | src/cpu/zero/vm/cppInterpreter_zero.cpp |
diffstat | 1 files changed, 40 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Apr 01 12:52:34 2011 +0100 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Apr 01 13:05:12 2011 +0100 @@ -949,47 +949,55 @@ break; case MethodHandles::_adapter_opt_swap_1: + case MethodHandles::_adapter_opt_swap_2: + case MethodHandles::_adapter_opt_rot_1_up: + case MethodHandles::_adapter_opt_rot_1_down: + case MethodHandles::_adapter_opt_rot_2_up: + case MethodHandles::_adapter_opt_rot_2_down: { - int arg1 = java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int arg2 = MethodHandles::adapter_conversion_vminfo(conv); - - intptr_t tmp = *VMSLOTS_SLOT(arg1); - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(arg2), arg1); - SET_VMSLOTS_SLOT(&tmp, arg2); - } - break; - - case MethodHandles::_adapter_opt_rot_1_up: - { - int arg1 = java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); + int arg1 = + java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); int conv = java_lang_invoke_AdapterMethodHandle::conversion(method_handle); int arg2 = MethodHandles::adapter_conversion_vminfo(conv); - assert(arg1 - 1 > arg2, "should be"); + int swap_bytes = 0, rotate = 0; + MethodHandles::get_ek_adapter_opt_swap_rot_info( + entry_kind, swap_bytes, rotate); + int swap_slots = swap_bytes >> LogBytesPerWord; - intptr_t tmp = *VMSLOTS_SLOT(arg1); - for (int i = arg1 - 1; i >= arg2; i--) - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i + 1); - SET_VMSLOTS_SLOT(&tmp, arg2); - } - break; + intptr_t tmp; + switch (rotate) { + case 0: // swap + for (int i = 0; i < swap_slots; i++) { + tmp = *VMSLOTS_SLOT(arg1 + i); + SET_VMSLOTS_SLOT(VMSLOTS_SLOT(arg2 + i), arg1 + i); + SET_VMSLOTS_SLOT(&tmp, arg2 + i); + } + break; + + case 1: // up + assert(arg1 - swap_slots > arg2, "should be"); - case MethodHandles::_adapter_opt_rot_1_down: - { - int arg1 = java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int arg2 = MethodHandles::adapter_conversion_vminfo(conv); + tmp = *VMSLOTS_SLOT(arg1); + for (int i = arg1 - swap_slots; i >= arg2; i--) + SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i + swap_slots); + SET_VMSLOTS_SLOT(&tmp, arg2); + + break; + + case -1: // down + assert(arg2 - swap_slots > arg1, "should be"); - assert(arg2 - 1 > arg1, "should be"); + tmp = *VMSLOTS_SLOT(arg1); + for (int i = arg1 + swap_slots; i <= arg2; i++) + SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i - swap_slots); + SET_VMSLOTS_SLOT(&tmp, arg2); + break; - intptr_t tmp = *VMSLOTS_SLOT(arg1); - for (int i = arg1 + 1; i <= arg2; i++) - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i - 1); - SET_VMSLOTS_SLOT(&tmp, arg2); + default: + ShouldNotReachHere(); + } } break;