# HG changeset patch # User Tom Rodriguez # Date 1414180876 25200 # Node ID 26d381457145adc64e4218c6e7f89696bd2b1372 # Parent 8c079b8d0446b3b4555c6f09a4012f722b02892b More efficient use of BitSet during install diff -r 8c079b8d0446 -r 26d381457145 src/share/vm/graal/graalCodeInstaller.cpp --- 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) {