Mercurial > hg > graal-compiler
comparison src/share/vm/graal/graalCodeInstaller.cpp @ 20981:92fc95e8667d
Add more efficient implementation of HotSpotReferenceMap
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Wed, 15 Apr 2015 10:09:13 -0700 |
parents | c1f116cd4b67 |
children | c8166c23047d |
comparison
equal
deleted
inserted
replaced
20980:abc059cb0acf | 20981:92fc95e8667d |
---|---|
69 return asMethod(HotSpotResolvedJavaMethodImpl::metaspaceMethod(hotspot_method)); | 69 return asMethod(HotSpotResolvedJavaMethodImpl::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(typeArrayOop words, int i) { | 74 static int entry_value(typeArrayOop words, int i) { |
75 jint words_idx = i / MapWordBits; | 75 jint words_idx = i / MapWordBits; |
76 assert(words_idx >= 0 && words_idx < words->length(), "unexpected index"); | 76 assert(words_idx >= 0 && words_idx < words->length(), "unexpected index"); |
77 jlong word = words->long_at(words_idx); | 77 jlong word = words->long_at(words_idx); |
78 return (word & (1LL << (i % MapWordBits))) != 0; | 78 return (word >> (i % MapWordBits)) & 15LL; |
79 } | 79 } |
80 | 80 |
81 static int bitset_size(oop bitset) { | 81 static int fixedmap_size(oop bitset) { |
82 typeArrayOop arr = BitSet::words(bitset); | 82 typeArrayOop arr = HotSpotOopMap::words(bitset); |
83 return arr->length() * MapWordBits; | 83 return arr->length() * MapWordBits; |
84 } | 84 } |
85 | 85 |
86 static void set_vmreg_oops(OopMap* map, VMReg reg, typeArrayOop words, int idx) { | 86 static void set_vmreg_oops(OopMap* map, VMReg reg, typeArrayOop words, int idx) { |
87 bool is_oop = is_bit_set(words, 3 * idx); | 87 int value = entry_value(words, 4 * idx); |
88 if (is_oop) { | 88 switch (value) { |
89 bool narrow1 = is_bit_set(words, 3 * idx + 1); | 89 case 10: |
90 bool narrow2 = is_bit_set(words, 3 * idx + 2); | |
91 if (narrow1 || narrow2) { | |
92 if (narrow1) { | |
93 map->set_narrowoop(reg); | |
94 } | |
95 if (narrow2) { | |
96 map->set_narrowoop(reg->next()); | |
97 } | |
98 } else { | |
99 map->set_oop(reg); | 90 map->set_oop(reg); |
100 } | 91 break; |
101 } else { | 92 case 5: |
102 map->set_value(reg); | 93 map->set_narrowoop(reg); |
94 map->set_narrowoop(reg->next()); | |
95 break; | |
96 case 1: | |
97 map->set_narrowoop(reg); | |
98 break; | |
99 case 4: | |
100 map->set_narrowoop(reg->next()); | |
101 break; | |
102 case 0: | |
103 break; | |
104 default: | |
105 assert(false, err_msg("unexpected bit pattern at %d = 0x%x", idx, value)); | |
106 ShouldNotReachHere(); | |
103 } | 107 } |
104 } | 108 } |
105 | 109 |
106 // creates a HotSpot oop map out of the byte arrays provided by DebugInfo | 110 // creates a HotSpot oop map out of the byte arrays provided by DebugInfo |
107 static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) { | 111 static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) { |
110 oop register_map = HotSpotReferenceMap::registerRefMap(reference_map); | 114 oop register_map = HotSpotReferenceMap::registerRefMap(reference_map); |
111 oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map); | 115 oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map); |
112 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info); | 116 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info); |
113 | 117 |
114 if (register_map != NULL) { | 118 if (register_map != NULL) { |
115 typeArrayOop words = BitSet::words(register_map); | 119 typeArrayOop words = HotSpotOopMap::words(register_map); |
120 int mapIdx = 0; | |
116 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) { | 121 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) { |
117 set_vmreg_oops(map, as_Register(i)->as_VMReg(), words, i); | 122 set_vmreg_oops(map, as_Register(i)->as_VMReg(), words, mapIdx); |
123 mapIdx++; | |
118 } | 124 } |
119 #ifdef TARGET_ARCH_x86 | 125 #ifdef TARGET_ARCH_x86 |
120 for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) { | 126 for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) { |
121 VMReg reg = as_XMMRegister(i)->as_VMReg(); | 127 VMReg reg = as_XMMRegister(i)->as_VMReg(); |
122 int idx = RegisterImpl::number_of_registers + 4 * i; | |
123 for (jint j = 0; j < 4; j++) { | 128 for (jint j = 0; j < 4; j++) { |
124 set_vmreg_oops(map, reg->next(2 * j), words, idx + j); | 129 set_vmreg_oops(map, reg->next(2 * j), words, mapIdx++); |
125 } | 130 } |
126 } | 131 } |
127 #endif | 132 #endif |
128 #ifdef TARGET_ARCH_sparc | 133 #ifdef TARGET_ARCH_sparc |
129 for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) { | 134 for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) { |
130 VMReg reg = as_FloatRegister(i)->as_VMReg(); | 135 VMReg reg = as_FloatRegister(i)->as_VMReg(); |
131 int idx = RegisterImpl::number_of_registers + i; | 136 set_vmreg_oops(map, reg, words, mapIdx++); |
132 set_vmreg_oops(map, reg, words, idx); | 137 } |
133 } | 138 #endif |
134 #endif | 139 } |
135 } | 140 |
136 | 141 typeArrayOop words = HotSpotOopMap::words(frame_map); |
137 typeArrayOop words = BitSet::words(frame_map); | 142 int size = fixedmap_size(frame_map) / 4; |
138 int size = bitset_size(frame_map) / 3; | |
139 for (jint i = 0; i < size; i++) { | 143 for (jint i = 0; i < size; i++) { |
140 // HotSpot stack slots are 4 bytes | 144 // HotSpot stack slots are 4 bytes |
141 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word); | 145 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word); |
142 set_vmreg_oops(map, reg, words, i); | 146 set_vmreg_oops(map, reg, words, i); |
143 } | 147 } |
159 VMReg hotspot_slot_hi_as_reg = VMRegImpl::stack2reg(hotspot_slot + 1); | 163 VMReg hotspot_slot_hi_as_reg = VMRegImpl::stack2reg(hotspot_slot + 1); |
160 map->set_callee_saved(hotspot_slot_hi_as_reg, hotspot_reg->next()); | 164 map->set_callee_saved(hotspot_slot_hi_as_reg, hotspot_reg->next()); |
161 #endif | 165 #endif |
162 } | 166 } |
163 } | 167 } |
164 | |
165 return map; | 168 return map; |
166 } | 169 } |
167 | 170 |
168 static void record_metadata_reference(oop obj, jlong prim, jboolean compressed, OopRecorder* oop_recorder) { | 171 static void record_metadata_reference(oop obj, jlong prim, jboolean compressed, OopRecorder* oop_recorder) { |
169 if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { | 172 if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { |