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

Function libdivide_s32_do_vector

numpy/core/include/numpy/libdivide/libdivide.h:1339–1366  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1337////////// SINT32
1338
1339__m512i libdivide_s32_do_vector(__m512i numers, const struct libdivide_s32_t *denom) {
1340 uint8_t more = denom->more;
1341 if (!denom->magic) {
1342 uint32_t shift = more & LIBDIVIDE_32_SHIFT_MASK;
1343 uint32_t mask = (1U << shift) - 1;
1344 __m512i roundToZeroTweak = _mm512_set1_epi32(mask);
1345 // q = numer + ((numer >> 31) & roundToZeroTweak);
1346 __m512i q = _mm512_add_epi32(numers, _mm512_and_si512(_mm512_srai_epi32(numers, 31), roundToZeroTweak));
1347 q = _mm512_srai_epi32(q, shift);
1348 __m512i sign = _mm512_set1_epi32((int8_t)more >> 7);
1349 // q = (q ^ sign) - sign;
1350 q = _mm512_sub_epi32(_mm512_xor_si512(q, sign), sign);
1351 return q;
1352 }
1353 else {
1354 __m512i q = libdivide_mullhi_s32_vector(numers, _mm512_set1_epi32(denom->magic));
1355 if (more & LIBDIVIDE_ADD_MARKER) {
1356 // must be arithmetic shift
1357 __m512i sign = _mm512_set1_epi32((int8_t)more >> 7);
1358 // q += ((numer ^ sign) - sign);
1359 q = _mm512_add_epi32(q, _mm512_sub_epi32(_mm512_xor_si512(numers, sign), sign));
1360 }
1361 // q >>= shift
1362 q = _mm512_srai_epi32(q, more & LIBDIVIDE_32_SHIFT_MASK);
1363 q = _mm512_add_epi32(q, _mm512_srli_epi32(q, 31)); // q += (q < 0)
1364 return q;
1365 }
1366}
1367
1368__m512i libdivide_s32_branchfree_do_vector(__m512i numers, const struct libdivide_s32_branchfree_t *denom) {
1369 int32_t magic = denom->magic;

Callers

nothing calls this directly

Calls 1

Tested by

no test coverage detected