review (S) for 6982370: SIGBUS in jbyte_fill
Vladimir Kozlov
vladimir.kozlov at oracle.com
Fri Sep 3 13:25:24 PDT 2010
Tom Rodriguez wrote:
>> Could you use shifts?:
>>
>> __ sllx(O3, 60, O3);
>> __ srlx(O3, 60, O3);
>
> Yep. You mean 48 don't you?
Yes, sorry mmy mistake.
>
>> instead of:
>>
>> 1641 __ set(0xffff, O3); << 2 instructions
>> 1642 __ and3(value, O3, value);
>>
>> Tom, sorry I don't like your changes which increase the code.
>
> The normal path doesn't have to split the loads since it knows they are aligned so it seems like a waste to emit extra stores there just so it can be used in the case where it's very small. I could consolidate the slow path more but I don't want to make the main path slower.
OK, I got it. Now I agree with your code. It is good to go.
Thanks,
Vladimir
>
> tom
>
>> How about this:
>>
>> __ BIND(L_fill_4_bytes);
>> __ brx(Assembler::zero, false, Assembler::pt, L_fill_2_bytes);
>> if (t == T_BYTE || t == T_SHORT) {
>> __ delayed()->andcc(count, 1<<(shift-1), G0);
>> + if (t == T_SHORT) {
>> + __ sth(value, to, 0);
>> + __ sth(value, to, 2);
>> + } else {
>> + __ stb(value, to, 0);
>> + __ stb(value, to, 1);
>> + __ stb(value, to, 2);
>> + __ stb(value, to, 3);
>> + }
>> } else {
>> __ delayed()->nop();
>> + __ stw(value, to, 0);
>> }
>> - __ stw(value, to, 0);
>> if (t == T_BYTE || t == T_SHORT) {
>> __ inc(to, 4);
>> // fill trailing 2 bytes
>> __ andcc(count, 1<<(shift-1), G0); // in delay slot of branches
>> __ BIND(L_fill_2_bytes);
>> __ brx(Assembler::zero, false, Assembler::pt, L_fill_byte);
>> __ delayed()->andcc(count, 1, count);
>> - __ sth(value, to, 0);
>> if (t == T_BYTE) {
>> + __ stb(value, to, 0);
>> + __ stb(value, to, 1);
>> __ inc(to, 2);
>> // fill trailing byte
>> __ andcc(count, 1, count); // in delay slot of branches
>> __ BIND(L_fill_byte);
>> __ brx(Assembler::zero, false, Assembler::pt, L_exit);
>> __ delayed()->nop();
>> __ stb(value, to, 0);
>> } else {
>> + __ sth(value, to, 0);
>> __ BIND(L_fill_byte);
>> }
>> } else {
>> __ BIND(L_fill_2_bytes);
>> }
>> __ BIND(L_exit);
>>
>> Vladimir
>>
>> Tom Rodriguez wrote:
>>> http://cr.openjdk.java.net/~never/6982370
>>> 6982370: SIGBUS in jbyte_fill
>>> Summary:
>>> Reviewed-by:
>>> In the new fill routines copy less than 8 bytes long skip over the
>>> main code and go the final cleanup stage. On sparc this isn't right
>>> since it still hasn't accounted for alignment. The fix is to have a
>>> special path for handling that. The code doesn't crash on 32 bit
>>> sparc because handling of misaligned stores seems to be enabled.
>>> Additionally I noticed a problem with the logic for clearing the high
>>> bits of a short value. The logic I wrote works correctly for clean
>>> ints but doesn't work for 64 bit signed extended ints resulting in
>>> invalid fill values in some cases. Tested with failing nightly and
>>> new test case to exercise the various alignments.
>
More information about the hotspot-compiler-dev
mailing list