Mercurial > hg > truffle
diff 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 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp Wed Jan 22 11:27:28 2014 +0100 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Wed Jan 22 11:44:27 2014 +0100 @@ -91,22 +91,38 @@ if (register_map != NULL) { for (jint i = 0; i < RegisterImpl::number_of_registers; i++) { - bool is_oop = is_bit_set(register_map, i); + bool is_oop = is_bit_set(register_map, 2 * i); VMReg hotspot_reg = get_hotspot_reg(i); if (is_oop) { - map->set_oop(hotspot_reg); + if (is_bit_set(register_map, 2 * i + 1)) { + map->set_narrowoop(hotspot_reg); + } else { + map->set_oop(hotspot_reg); + } } else { map->set_value(hotspot_reg); } } } - for (jint i = 0; i < bitset_size(frame_map); i++) { - bool is_oop = is_bit_set(frame_map, i); + for (jint i = 0; i < bitset_size(frame_map) / 3; i++) { + bool is_oop = is_bit_set(frame_map, i * 3); // HotSpot stack slots are 4 bytes VMReg reg = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word); if (is_oop) { - map->set_oop(reg); + bool narrow1 = is_bit_set(frame_map, i * 3 + 1); + bool narrow2 = is_bit_set(frame_map, i * 3 + 2); + if(narrow1 || narrow2) { + if(narrow1) { + map->set_narrowoop(reg); + } + if(narrow2) { + VMReg reg2 = VMRegImpl::stack2reg(i * VMRegImpl::slots_per_word + 1); + map->set_narrowoop(reg2); + } + } else { + map->set_oop(reg); + } } else { map->set_value(reg); }