Value array element size represented as log2
David Simms
david.simms at oracle.com
Tue Oct 2 08:31:33 UTC 2018
> What is it you are asking here ? That you want to 20 bytes rather than
> pow 2 aligned ?
>
> A long time ago we discussed that mul was too expensive compared to
> shift, so that encoding is intentional (addressing uses shift)
On 2/10/2018 8:47 a.m., John Rose wrote:
> I support this; I would even support burning a couple more bits to put in a
> multiplier of 1/3/5/7. This would reduce the fragmentation from 0-50-100%
> to 0-13-25%.
The current layout helper format for arrays has 8 bits. Bits 24-28 are
also vacant, we have used 29 for Valhalla, and might need another one
(maybe 28), so there may be 4 more bits.
If using a limited multiplier (going against earlier conclusions), what
should that be ? Number of heap-words (8 bytes on x86_64) ? So max
element 8 * 256 = 2048 bytes ?
This may be a reasonable limit to refuse flattening past this size, thus
avoiding multiple addressing schemes (i.e. using the other bits to
indicate shift).
Looking at the instruction latency, imul 3-4c vs shl 1c, might be worth
benchmarking...
/D
> On Oct 1, 2018, at 11:01 PM, Ioi Lam <ioi.lam at oracle.com> wrote:
>> (Not sure if this has been discussed before. I did a quick JBS search of "valueArrayKlass" but couldn't find anything).
>>
>> For example, if my VT has 5 integers (20 bytes) it will take up 32 bytes inside the array. This seems kind of wasteful, especially when you have larger VT types.
>>
>> See:
>>
>> http://hg.openjdk.java.net/valhalla/valhalla/file/e0c13ab0b852/src/hotspot/share/oops/valueArrayKlass.cpp#l182
>>
>> jint ValueArrayKlass::array_layout_helper(ValueKlass* vk) {
>> BasicType etype = T_VALUETYPE;
>> int atag = _lh_array_tag_vt_value;
>> int esize = upper_log2(vk->raw_value_byte_size());
>>
>> klass.hpp:
>>
>> // For arrays, layout helper is a negative number, containing four
>> // distinct bytes, as follows:
>> // MSB:[tag, hsz, ebt, log2(esz)]:LSB
>> // where:
>> // tag is 0x80 if the elements are oops, 0xC0 if non-oops
>> // hsz is array header size in bytes (i.e., offset of first element)
>> // ebt is the BasicType of the elements
>> // esz is the element size in bytes
>>
>>
More information about the valhalla-dev
mailing list