divide each signed 16-bit element by a precomputed divisor (round towards zero)
| 132 | } |
| 133 | // divide each signed 16-bit element by a precomputed divisor (round towards zero) |
| 134 | NPY_FINLINE npyv_s16 npyv_divc_s16(npyv_s16 a, const npyv_s16x3 divisor) |
| 135 | { |
| 136 | // high part of signed multiplication |
| 137 | __m128i mulhi = _mm_mulhi_epi16(a, divisor.val[0]); |
| 138 | // q = ((a + mulhi) >> sh1) - XSIGN(a) |
| 139 | // trunc(a/d) = (q ^ dsign) - dsign |
| 140 | __m128i q = _mm_sra_epi16(_mm_add_epi16(a, mulhi), divisor.val[1]); |
| 141 | q = _mm_sub_epi16(q, _mm_srai_epi16(a, 15)); |
| 142 | q = _mm_sub_epi16(_mm_xor_si128(q, divisor.val[2]), divisor.val[2]); |
| 143 | return q; |
| 144 | } |
| 145 | // divide each unsigned 32-bit element by a precomputed divisor |
| 146 | NPY_FINLINE npyv_u32 npyv_divc_u32(npyv_u32 a, const npyv_u32x3 divisor) |
| 147 | { |