comparison src/share/vm/graal/graalCodeInstaller.cpp @ 13726:343541fb3b49

Support narrow oops in reference maps.
author Roland Schatz <roland.schatz@oracle.com>
date Wed, 22 Jan 2014 11:44:27 +0100
parents 8d8732e14447
children d006a6332db8
comparison
equal deleted inserted replaced
13725:8d8732e14447 13726:343541fb3b49
89 oop frame_map = ReferenceMap::frameRefMap(reference_map); 89 oop frame_map = ReferenceMap::frameRefMap(reference_map);
90 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info); 90 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info);
91 91
92 if (register_map != NULL) { 92 if (register_map != NULL) {
93 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) { 93 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
94 bool is_oop = is_bit_set(register_map, i); 94 bool is_oop = is_bit_set(register_map, 2 * i);
95 VMReg hotspot_reg = get_hotspot_reg(i); 95 VMReg hotspot_reg = get_hotspot_reg(i);
96 if (is_oop) { 96 if (is_oop) {
97 map->set_oop(hotspot_reg); 97 if (is_bit_set(register_map, 2 * i + 1)) {
98 map->set_narrowoop(hotspot_reg);
99 } else {
100 map->set_oop(hotspot_reg);
101 }
98 } else { 102 } else {
99 map->set_value(hotspot_reg); 103 map->set_value(hotspot_reg);
100 } 104 }
101 } 105 }
102 } 106 }
103 107
104 for (jint i = 0; i < bitset_size(frame_map); i++) { 108 for (jint i = 0; i < bitset_size(frame_map) / 3; i++) {
105 bool is_oop = is_bit_set(frame_map, i); 109 bool is_oop = is_bit_set(frame_map, i * 3);
106 // HotSpot stack slots are 4 bytes 110 // HotSpot stack slots are 4 bytes
107 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word); 111 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
108 if (is_oop) { 112 if (is_oop) {
109 map->set_oop(reg); 113 bool narrow1 = is_bit_set(frame_map, i * 3 + 1);
114 bool narrow2 = is_bit_set(frame_map, i * 3 + 2);
115 if(narrow1 || narrow2) {
116 if(narrow1) {
117 map->set_narrowoop(reg);
118 }
119 if(narrow2) {
120 VMReg reg2 = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word + 1);
121 map->set_narrowoop(reg2);
122 }
123 } else {
124 map->set_oop(reg);
125 }
110 } else { 126 } else {
111 map->set_value(reg); 127 map->set_value(reg);
112 } 128 }
113 } 129 }
114 130