diff src/share/vm/graal/graalCodeInstaller.cpp @ 13726:343541fb3b49

Support narrow oops in reference maps.
author Roland Schatz <roland.schatz@oracle.com>
date Wed, 22 Jan 2014 11:44:27 +0100
parents 8d8732e14447
children d006a6332db8
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Wed Jan 22 11:27:28 2014 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Wed Jan 22 11:44:27 2014 +0100
@@ -91,22 +91,38 @@
 
   if (register_map != NULL) {
     for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
-      bool is_oop = is_bit_set(register_map, i);
+      bool is_oop = is_bit_set(register_map, 2 * i);
       VMReg hotspot_reg = get_hotspot_reg(i);
       if (is_oop) {
-        map->set_oop(hotspot_reg);
+        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);
       }
     }
   }
 
-  for (jint i = 0; i < bitset_size(frame_map); i++) {
-    bool is_oop = is_bit_set(frame_map, i);
+  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) {
-      map->set_oop(reg);
+      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);
     }