Mercurial > hg > graal-jvmci-8
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); |