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;