8255349: Vector API issues on Big Endian

Reviewed-by: psandoz, rrich
This commit is contained in:
Martin Doerr 2020-10-26 15:29:51 +00:00
parent e8b75b13dc
commit 9b5a2a6b24
2 changed files with 30 additions and 9 deletions

View File

@ -500,7 +500,7 @@ abstract class AbstractVector<E> extends Vector<E> {
final <F>
AbstractVector<F> defaultReinterpret(AbstractSpecies<F> rsp) {
int blen = Math.max(this.bitSize(), rsp.vectorBitSize()) / Byte.SIZE;
ByteOrder bo = ByteOrder.LITTLE_ENDIAN;
ByteOrder bo = ByteOrder.nativeOrder();
ByteBuffer bb = ByteBuffer.allocate(blen);
this.intoByteBuffer(bb, 0, bo);
VectorMask<F> m = rsp.maskAll(true);

View File

@ -800,20 +800,41 @@ public class VectorReshapeTests {
int count = data.length / asize;
assert(data.length == count * asize);
byte[] result = new byte[count * bsize];
int rp = 0, dp = 0;
int minsize = Math.min(asize, bsize);
int size_diff = bsize - asize;
ByteOrder bo = ByteOrder.nativeOrder();
int rp = 0, dp = 0;
for (int i = 0; i < count; i++) {
int nextrp = rp + bsize;
byte b = 0;
for (int j = 0; j < asize; j++) {
b = data[dp++];
if (j < minsize) result[rp++] = b;
if (bo == ByteOrder.BIG_ENDIAN) {
if (size_diff > 0) {
byte sign = (byte)(data[dp] >> 7); // sign extend
for (int j = 0; j < size_diff; j++) {
result[rp++] = sign;
}
} else {
dp -= size_diff; // step forward if needed
}
}
byte b = 0;
for (int j = 0; j < minsize; j++) {
b = data[dp++];
result[rp++] = b;
}
if (bo == ByteOrder.LITTLE_ENDIAN) {
if (size_diff > 0) {
byte sign = (byte)(b >> 7); // sign extend
for (int j = 0; j < size_diff; j++) {
result[rp++] = sign;
}
} else {
dp -= size_diff; // step forward if needed
}
}
b >>= 7; // sign extend
while (rp < nextrp) result[rp++] = b;
}
assert(dp == data.length);
assert(rp == result.length);
return result;
}