comparison src/share/vm/graal/graalCodeInstaller.cpp @ 16093:39be5bc00046

Support XMM registers in oop maps.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 13 Jun 2014 11:11:44 +0200
parents 22f56c3eadb7
children 9a07bf8467a6
comparison
equal deleted inserted replaced
16092:51ba6c521922 16093:39be5bc00046
86 static int bitset_size(oop bitset) { 86 static int bitset_size(oop bitset) {
87 arrayOop arr = (arrayOop) BitSet::words(bitset); 87 arrayOop arr = (arrayOop) BitSet::words(bitset);
88 return arr->length() * MapWordBits; 88 return arr->length() * MapWordBits;
89 } 89 }
90 90
91 static void set_vmreg_oops(OopMap* map, VMReg reg, oop bitset, int idx) {
92 bool is_oop = is_bit_set(bitset, 3 * idx);
93 if (is_oop) {
94 bool narrow1 = is_bit_set(bitset, 3 * idx + 1);
95 bool narrow2 = is_bit_set(bitset, 3 * idx + 2);
96 if (narrow1 || narrow2) {
97 if (narrow1) {
98 map->set_narrowoop(reg);
99 }
100 if (narrow2) {
101 map->set_narrowoop(reg->next());
102 }
103 } else {
104 map->set_oop(reg);
105 }
106 } else {
107 map->set_value(reg);
108 }
109 }
110
91 // creates a HotSpot oop map out of the byte arrays provided by DebugInfo 111 // creates a HotSpot oop map out of the byte arrays provided by DebugInfo
92 static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) { 112 static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) {
93 OopMap* map = new OopMap(total_frame_size, parameter_count); 113 OopMap* map = new OopMap(total_frame_size, parameter_count);
94 oop reference_map = DebugInfo::referenceMap(debug_info); 114 oop reference_map = DebugInfo::referenceMap(debug_info);
95 oop register_map = HotSpotReferenceMap::registerRefMap(reference_map); 115 oop register_map = HotSpotReferenceMap::registerRefMap(reference_map);
96 oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map); 116 oop frame_map = HotSpotReferenceMap::frameRefMap(reference_map);
97 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info); 117 oop callee_save_info = (oop) DebugInfo::calleeSaveInfo(debug_info);
98 118
99 if (register_map != NULL) { 119 if (register_map != NULL) {
100 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) { 120 for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
101 bool is_oop = is_bit_set(register_map, 2 * i); 121 set_vmreg_oops(map, as_Register(i)->as_VMReg(), register_map, i);
102 VMReg hotspot_reg = get_hotspot_reg(i); 122 }
103 if (is_oop) { 123 #ifdef TARGET_ARCH_x86
104 if (is_bit_set(register_map, 2 * i + 1)) { 124 for (jint i = 0; i < XMMRegisterImpl::number_of_registers; i++) {
105 map->set_narrowoop(hotspot_reg); 125 VMReg reg = as_XMMRegister(i)->as_VMReg();
106 } else { 126 int idx = RegisterImpl::number_of_registers + 4 * i;
107 map->set_oop(hotspot_reg); 127 for (jint j = 0; j < 4; j++) {
108 } 128 set_vmreg_oops(map, reg->next(2 * j), register_map, idx + j);
109 } else { 129 }
110 map->set_value(hotspot_reg); 130 }
111 } 131 #endif
112 }
113 } 132 }
114 133
115 for (jint i = 0; i < bitset_size(frame_map) / 3; i++) { 134 for (jint i = 0; i < bitset_size(frame_map) / 3; i++) {
116 bool is_oop = is_bit_set(frame_map, i * 3);
117 // HotSpot stack slots are 4 bytes 135 // HotSpot stack slots are 4 bytes
118 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word); 136 VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word);
119 if (is_oop) { 137 set_vmreg_oops(map, reg, frame_map, i);
120 bool narrow1 = is_bit_set(frame_map, i * 3 + 1);
121 bool narrow2 = is_bit_set(frame_map, i * 3 + 2);
122 if(narrow1 || narrow2) {
123 if(narrow1) {
124 map->set_narrowoop(reg);
125 }
126 if(narrow2) {
127 VMReg reg2 = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word + 1);
128 map->set_narrowoop(reg2);
129 }
130 } else {
131 map->set_oop(reg);
132 }
133 } else {
134 map->set_value(reg);
135 }
136 } 138 }
137 139
138 if (callee_save_info != NULL) { 140 if (callee_save_info != NULL) {
139 objArrayOop registers = (objArrayOop) RegisterSaveLayout::registers(callee_save_info); 141 objArrayOop registers = (objArrayOop) RegisterSaveLayout::registers(callee_save_info);
140 arrayOop slots = (arrayOop) RegisterSaveLayout::slots(callee_save_info); 142 arrayOop slots = (arrayOop) RegisterSaveLayout::slots(callee_save_info);