comparison src/share/vm/graal/graalCodeInstaller.cpp @ 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 c2270ad35f57
comparison
equal deleted inserted replaced
18173:8c079b8d0446 18174:26d381457145
69 return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method)); 69 return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method));
70 } 70 }
71 71
72 const int MapWordBits = 64; 72 const int MapWordBits = 64;
73 73
74 static bool is_bit_set(oop bitset, int i) { 74 static bool is_bit_set(typeArrayOop words, int i) {
75 jint words_idx = i / MapWordBits; 75 jint words_idx = i / MapWordBits;
76 typeArrayOop words = BitSet::words(bitset);
77 assert(words_idx >= 0 && words_idx < words->length(), "unexpected index"); 76 assert(words_idx >= 0 && words_idx < words->length(), "unexpected index");
78 jlong word = words->long_at(words_idx); 77 jlong word = words->long_at(words_idx);
79 return (word & (1LL << (i % MapWordBits))) != 0; 78 return (word & (1LL << (i % MapWordBits))) != 0;
80 } 79 }
81 80
82 static int bitset_size(oop bitset) { 81 static int bitset_size(oop bitset) {
83 typeArrayOop arr = BitSet::words(bitset); 82 typeArrayOop arr = BitSet::words(bitset);
84 return arr->length() * MapWordBits; 83 return arr->length() * MapWordBits;
85 } 84 }
86 85
87 static void set_vmreg_oops(OopMap* map, VMReg reg, oop bitset, int idx) { 86 static void set_vmreg_oops(OopMap* map, VMReg reg, typeArrayOop words, int idx) {
88 bool is_oop = is_bit_set(bitset, 3 * idx); 87 bool is_oop = is_bit_set(words, 3 * idx);
89 if (is_oop) { 88 if (is_oop) {
90 bool narrow1 = is_bit_set(bitset, 3 * idx + 1); 89 bool narrow1 = is_bit_set(words, 3 * idx + 1);
91 bool narrow2 = is_bit_set(bitset, 3 * idx + 2); 90 bool narrow2 = is_bit_set(words, 3 * idx + 2);
92 if (narrow1 || narrow2) { 91 if (narrow1 || narrow2) {
93 if (narrow1) { 92 if (narrow1) {
94 map->set_narrowoop(reg); 93 map->set_narrowoop(reg);
95 } 94 }
96 if (narrow2) { 95 if (narrow2) {
111 oop register_map = HotSpotReferenceMap::registerRefMap(reference_map); 110 oop register_map = HotSpotReferenceMap::registerRefMap(reference_map);
112 oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map); 111 oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map);
113 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info); 112 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info);
114 113
115 if (register_map != NULL) { 114 if (register_map != NULL) {
115 typeArrayOop words = BitSet::words(register_map);
116 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) { 116 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
117 set_vmreg_oops(map, as_Register(i)->as_VMReg(), register_map, i); 117 set_vmreg_oops(map, as_Register(i)->as_VMReg(), words, i);
118 } 118 }
119 #ifdef TARGET_ARCH_x86 119 #ifdef TARGET_ARCH_x86
120 for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) { 120 for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) {
121 VMReg reg = as_XMMRegister(i)->as_VMReg(); 121 VMReg reg = as_XMMRegister(i)->as_VMReg();
122 int idx = RegisterImpl::number_of_registers + 4 * i; 122 int idx = RegisterImpl::number_of_registers + 4 * i;
123 for (jint j = 0; j < 4; j++) { 123 for (jint j = 0; j < 4; j++) {
124 set_vmreg_oops(map, reg->next(2 * j), register_map, idx + j); 124 set_vmreg_oops(map, reg->next(2 * j), words, idx + j);
125 } 125 }
126 } 126 }
127 #endif 127 #endif
128 #ifdef TARGET_ARCH_sparc 128 #ifdef TARGET_ARCH_sparc
129 for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) { 129 for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
130 VMReg reg = as_FloatRegister(i)->as_VMReg(); 130 VMReg reg = as_FloatRegister(i)->as_VMReg();
131 int idx = RegisterImpl::number_of_registers + i; 131 int idx = RegisterImpl::number_of_registers + i;
132 set_vmreg_oops(map, reg, register_map, idx); 132 set_vmreg_oops(map, reg, words, idx);
133 } 133 }
134 #endif 134 #endif
135 } 135 }
136 136
137 for (jint i = 0; i < bitset_size(frame_map) / 3; i++) { 137 typeArrayOop words = BitSet::words(frame_map);
138 int size = bitset_size(frame_map) / 3;
139 for (jint i = 0; i < size; i++) {
138 // HotSpot stack slots are 4 bytes 140 // HotSpot stack slots are 4 bytes
139 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word); 141 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
140 set_vmreg_oops(map, reg, frame_map, i); 142 set_vmreg_oops(map, reg, words, i);
141 } 143 }
142 144
143 if (callee_save_info != NULL) { 145 if (callee_save_info != NULL) {
144 objArrayOop registers = RegisterSaveLayout::registers(callee_save_info); 146 objArrayOop registers = RegisterSaveLayout::registers(callee_save_info);
145 typeArrayOop slots = RegisterSaveLayout::slots(callee_save_info); 147 typeArrayOop slots = RegisterSaveLayout::slots(callee_save_info);