review (S) for 6982370: SIGBUS in jbyte_fill
Vladimir Kozlov
vladimir.kozlov at oracle.com
Fri Sep 3 13:11:18 PDT 2010
Tom,
Did you run your new test on x86 (32- and 64-bit)?
I don't see that O4 and O5 are used after you save 'to', 'count'.
Could you use shifts?:
__ sllx(O3, 60, O3);
__ srlx(O3, 60, O3);
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.
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