| 2522 | } |
| 2523 | |
| 2524 | static inline NPY_GCC_OPT_3 npy_intp |
| 2525 | count_nonzero_u32(const char *data, npy_intp bstride, npy_uintp len) |
| 2526 | { |
| 2527 | npy_intp count = 0; |
| 2528 | #if NPY_SIMD |
| 2529 | if (bstride == sizeof(npy_uint32)) { |
| 2530 | const npy_uintp max_iter = NPY_MAX_UINT32*npyv_nlanes_u32; |
| 2531 | const npy_uintp len_m = (len > max_iter ? max_iter : len) & -npyv_nlanes_u32; |
| 2532 | const npyv_u32 vone = npyv_setall_u32(1); |
| 2533 | const npyv_u32 vzero = npyv_zero_u32(); |
| 2534 | |
| 2535 | npyv_u32 vsum32 = npyv_zero_u32(); |
| 2536 | for (const char *end = data + len_m*bstride; data < end; data += NPY_SIMD_WIDTH) { |
| 2537 | npyv_u32 mask = npyv_cvt_u32_b32(npyv_cmpeq_u32(npyv_load_u32((npy_uint32*)data), vzero)); |
| 2538 | mask = npyv_and_u32(mask, vone); |
| 2539 | vsum32 = npyv_add_u32(vsum32, mask); |
| 2540 | } |
| 2541 | const npyv_u32 maskevn = npyv_reinterpret_u32_u64(npyv_setall_u64(0xffffffffULL)); |
| 2542 | npyv_u64 odd = npyv_shri_u64(npyv_reinterpret_u64_u32(vsum32), 32); |
| 2543 | npyv_u64 even = npyv_reinterpret_u64_u32(npyv_and_u32(vsum32, maskevn)); |
| 2544 | count = len_m - npyv_sum_u64(npyv_add_u64(odd, even)); |
| 2545 | len -= len_m; |
| 2546 | } |
| 2547 | #endif |
| 2548 | for (; len > 0; --len, data += bstride) { |
| 2549 | count += (*(npy_uint32*)data != 0); |
| 2550 | } |
| 2551 | return count; |
| 2552 | } |
| 2553 | |
| 2554 | static inline NPY_GCC_OPT_3 npy_intp |
| 2555 | count_nonzero_u64(const char *data, npy_intp bstride, npy_uintp len) |
nothing calls this directly
no test coverage detected