Skip to content

Commit 663107d

Browse files
Fix test_packbits.py::test_packbits_large on s390x
Only 16-byte vectorization path is tested for big endian.
1 parent 5557dcb commit 663107d

1 file changed

Lines changed: 25 additions & 0 deletions

File tree

numpy/_core/src/multiarray/compiled_base.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,9 +1615,29 @@ pack_inner(const char *inptr,
16151615
#else
16161616
npy_uint64 arr[4] = {bb[0], bb[1], bb[2], bb[3]};
16171617
#endif
1618+
1619+
#if NPY_BYTE_ORDER == NPY_BIG_ENDIAN
1620+
#if NPY_SIMD_WIDTH == 16
1621+
arr[0] = npy_bswap8(arr[0]);
1622+
#elif NPY_SIMD_WIDTH == 32
1623+
arr[0] = npy_bswap8(arr[0]);
1624+
arr[1] = npy_bswap8(arr[1]);
1625+
#else
1626+
arr[0] = npy_bswap8(arr[0]);
1627+
arr[1] = npy_bswap8(arr[1]);
1628+
arr[2] = npy_bswap8(arr[2]);
1629+
arr[3] = npy_bswap8(arr[3]);
1630+
#endif
1631+
#endif
16181632
memcpy(outptr, arr, sizeof(arr));
16191633
outptr += vstepx4;
16201634
} else {
1635+
#if NPY_BYTE_ORDER == NPY_BIG_ENDIAN
1636+
bb[0] = npy_bswap8(bb[0]);
1637+
bb[1] = npy_bswap8(bb[1]);
1638+
bb[2] = npy_bswap8(bb[2]);
1639+
bb[3] = npy_bswap8(bb[3]);
1640+
#endif
16211641
for(int i = 0; i < 4; i++) {
16221642
for (int j = 0; j < vstep; j++) {
16231643
memcpy(outptr, (char*)&bb[i] + j, 1);
@@ -1632,6 +1652,11 @@ pack_inner(const char *inptr,
16321652
va = npyv_rev64_u8(va);
16331653
}
16341654
npy_uint64 bb = npyv_tobits_b8(npyv_cmpneq_u8(va, v_zero));
1655+
1656+
#if NPY_BYTE_ORDER == NPY_BIG_ENDIAN
1657+
bb = npy_bswap8(bb);
1658+
#endif
1659+
16351660
for (int i = 0; i < vstep; ++i) {
16361661
memcpy(outptr, (char*)&bb + i, 1);
16371662
outptr += out_stride;

0 commit comments

Comments
 (0)