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