changeset 18174:26d381457145

More efficient use of BitSet during install
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Fri, 24 Oct 2014 13:01:16 -0700
parents 8c079b8d0446
children cf09e921458f
files src/share/vm/graal/graalCodeInstaller.cpp
diffstat 1 files changed, 13 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Fri Oct 24 12:48:53 2014 -0700
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Fri Oct 24 13:01:16 2014 -0700
@@ -71,9 +71,8 @@
 
 const int MapWordBits = 64;
 
-static bool is_bit_set(oop bitset, int i) {
+static bool is_bit_set(typeArrayOop words, int i) {
   jint words_idx = i / MapWordBits;
-  typeArrayOop words = BitSet::words(bitset);
   assert(words_idx >= 0 && words_idx < words->length(), "unexpected index");
   jlong word = words->long_at(words_idx);
   return (word & (1LL << (i % MapWordBits))) != 0;
@@ -84,11 +83,11 @@
   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);
+static void set_vmreg_oops(OopMap* map, VMReg reg, typeArrayOop words, int idx) {
+  bool is_oop = is_bit_set(words, 3 * idx);
   if (is_oop) {
-    bool narrow1 = is_bit_set(bitset, 3 * idx + 1);
-    bool narrow2 = is_bit_set(bitset, 3 * idx + 2);
+    bool narrow1 = is_bit_set(words, 3 * idx + 1);
+    bool narrow2 = is_bit_set(words, 3 * idx + 2);
     if (narrow1 || narrow2) {
       if (narrow1) {
         map->set_narrowoop(reg);
@@ -113,15 +112,16 @@
   oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info);
 
   if (register_map != NULL) {
+    typeArrayOop words = BitSet::words(register_map);
     for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
-      set_vmreg_oops(map, as_Register(i)->as_VMReg(), register_map, i);
+      set_vmreg_oops(map, as_Register(i)->as_VMReg(), words, 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);
+        set_vmreg_oops(map, reg->next(2 * j), words, idx + j);
       }
     }
 #endif
@@ -129,15 +129,17 @@
     for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
       VMReg reg = as_FloatRegister(i)->as_VMReg();
       int idx = RegisterImpl::number_of_registers + i;
-      set_vmreg_oops(map, reg, register_map, idx);
+      set_vmreg_oops(map, reg, words, idx);
     }
 #endif
   }
 
-  for (jint i = 0; i < bitset_size(frame_map) / 3; i++) {
+  typeArrayOop words = BitSet::words(frame_map);
+  int size = bitset_size(frame_map) / 3;
+  for (jint i = 0; i < size; i++) {
     // HotSpot stack slots are 4 bytes
     VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
-    set_vmreg_oops(map, reg, frame_map, i);
+    set_vmreg_oops(map, reg, words, i);
   }
 
   if (callee_save_info != NULL) {