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())) {