MCPcopy Create free account
hub / github.com/numpy/numpy / libdivide_s64_do_vector

Function libdivide_s64_do_vector

numpy/core/include/numpy/libdivide/libdivide.h:1391–1419  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1389////////// SINT64
1390
1391__m512i libdivide_s64_do_vector(__m512i numers, const struct libdivide_s64_t *denom) {
1392 uint8_t more = denom->more;
1393 int64_t magic = denom->magic;
1394 if (magic == 0) { // shift path
1395 uint32_t shift = more & LIBDIVIDE_64_SHIFT_MASK;
1396 uint64_t mask = (1ULL << shift) - 1;
1397 __m512i roundToZeroTweak = _mm512_set1_epi64(mask);
1398 // q = numer + ((numer >> 63) & roundToZeroTweak);
1399 __m512i q = _mm512_add_epi64(numers, _mm512_and_si512(libdivide_s64_signbits(numers), roundToZeroTweak));
1400 q = libdivide_s64_shift_right_vector(q, shift);
1401 __m512i sign = _mm512_set1_epi32((int8_t)more >> 7);
1402 // q = (q ^ sign) - sign;
1403 q = _mm512_sub_epi64(_mm512_xor_si512(q, sign), sign);
1404 return q;
1405 }
1406 else {
1407 __m512i q = libdivide_mullhi_s64_vector(numers, _mm512_set1_epi64(magic));
1408 if (more & LIBDIVIDE_ADD_MARKER) {
1409 // must be arithmetic shift
1410 __m512i sign = _mm512_set1_epi32((int8_t)more >> 7);
1411 // q += ((numer ^ sign) - sign);
1412 q = _mm512_add_epi64(q, _mm512_sub_epi64(_mm512_xor_si512(numers, sign), sign));
1413 }
1414 // q >>= denom->mult_path.shift
1415 q = libdivide_s64_shift_right_vector(q, more & LIBDIVIDE_64_SHIFT_MASK);
1416 q = _mm512_add_epi64(q, _mm512_srli_epi64(q, 63)); // q += (q < 0)
1417 return q;
1418 }
1419}
1420
1421__m512i libdivide_s64_branchfree_do_vector(__m512i numers, const struct libdivide_s64_branchfree_t *denom) {
1422 int64_t magic = denom->magic;

Callers

nothing calls this directly

Calls 3

libdivide_s64_signbitsFunction · 0.85

Tested by

no test coverage detected