8255349: Vector API issues on Big Endian
Reviewed-by: psandoz, rrich
This commit is contained in:
parent
e8b75b13dc
commit
9b5a2a6b24
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user