diff src/share/vm/graal/graalCodeInstaller.cpp @ 16093:39be5bc00046

Support XMM registers in oop maps.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 13 Jun 2014 11:11:44 +0200
parents 22f56c3eadb7
children 9a07bf8467a6
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Fri Jun 13 11:08:16 2014 +0200
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Fri Jun 13 11:11:44 2014 +0200
@@ -88,6 +88,26 @@
   return arr->length() * MapWordBits;
 }
 
+static void set_vmreg_oops(OopMap* map, VMReg reg, oop bitset, int idx) {
+  bool is_oop = is_bit_set(bitset, 3 * idx);
+  if (is_oop) {
+    bool narrow1 = is_bit_set(bitset, 3 * idx + 1);
+    bool narrow2 = is_bit_set(bitset, 3 * idx + 2);
+    if (narrow1 || narrow2) {
+      if (narrow1) {
+        map->set_narrowoop(reg);
+      }
+      if (narrow2) {
+        map->set_narrowoop(reg->next());
+      }
+    } else {
+      map->set_oop(reg);
+    }
+  } else {
+    map->set_value(reg);
+  }
+}
+
 // creates a HotSpot oop map out of the byte arrays provided by DebugInfo
 static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) {
   OopMap* map = new OopMap(total_frame_size, parameter_count);
@@ -98,41 +118,23 @@
 
   if (register_map != NULL) {
     for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
-      bool is_oop = is_bit_set(register_map, 2 * i);
-      VMReg hotspot_reg = get_hotspot_reg(i);
-      if (is_oop) {
-        if (is_bit_set(register_map, 2 * i + 1)) {
-          map->set_narrowoop(hotspot_reg);
-        } else {
-          map->set_oop(hotspot_reg);
-        }
-      } else {
-        map->set_value(hotspot_reg);
+      set_vmreg_oops(map, as_Register(i)->as_VMReg(), register_map, i);
+    }
+#ifdef TARGET_ARCH_x86
+    for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) {
+      VMReg reg = as_XMMRegister(i)->as_VMReg();
+      int idx = RegisterImpl::number_of_registers + 4 * i;
+      for (jint j = 0; j < 4; j++) {
+        set_vmreg_oops(map, reg->next(2 * j), register_map, idx + j);
       }
     }
+#endif
   }
 
   for (jint i = 0; i < bitset_size(frame_map) / 3; i++) {
-    bool is_oop = is_bit_set(frame_map, i * 3);
     // HotSpot stack slots are 4 bytes
     VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
-    if (is_oop) {
-      bool narrow1 = is_bit_set(frame_map, i * 3 + 1);
-      bool narrow2 = is_bit_set(frame_map, i * 3 + 2);
-      if(narrow1 || narrow2) {
-        if(narrow1) {
-          map->set_narrowoop(reg);
-        }
-        if(narrow2) {
-          VMReg reg2 = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word + 1);
-          map->set_narrowoop(reg2);
-        }
-      } else {
-        map->set_oop(reg);
-      }
-    } else {
-      map->set_value(reg);
-    }
+    set_vmreg_oops(map, reg, frame_map, i);
   }
 
   if (callee_save_info != NULL) {