4 #ifndef VECTORIZE_SQRT_CORE_H 
    5 #define VECTORIZE_SQRT_CORE_H 
   25 VECLL_CONST(sqrt_mask1,0x7fffffffffffffff);
 
   28 VECLL_CONST(sqrt_magic,0x5fe6eb50c7b537a9);
 
   30 VECL_CONST(sqrt_magic,0x5fe6eb50c7b537a9);
 
   35 inline v8df v1sqrtd_core(v8df x)
 
   38         v8di ir = _mm512_castpd_si512(x);
 
   39         ir = _mm512_srli_epi64(ir, 1);
 
   40         ir = _mm512_sub_epi64(sqrt_magic, ir);
 
   41         v8df r = _mm512_castsi512_pd(ir);
 
   42         __mmask8 zmask = _mm512_cmp_pd_mask(x, dbl_min, _CMP_LT_OQ);
 
   43         r = _mm512_mask_load_pd(r, zmask, &
zero);
 
   46         v8df rx = _mm512_mul_pd(r, x);
 
   47         v8df rx2 = _mm512_mul_pd(rx, mhalf);
 
   48         v8df y = _mm512_fmadd_pd(rx2, r, c1p5);
 
   49         r = _mm512_mul_pd(r, y);
 
   50         rx = _mm512_mul_pd(r, x);
 
   51         rx2 = _mm512_mul_pd(rx, mhalf);
 
   52         y = _mm512_fmadd_pd(rx2, r, c1p5);
 
   53         r = _mm512_mul_pd(r, y);
 
   54         rx = _mm512_mul_pd(r, x);
 
   55         rx2 = _mm512_mul_pd(rx, mhalf);
 
   56         y = _mm512_fmadd_pd(rx2, r, c1p5);
 
   57         r = _mm512_mul_pd(r, y);
 
   58         rx = _mm512_mul_pd(r, x);
 
   59         rx2 = _mm512_mul_pd(rx, mhalf);
 
   60         y = _mm512_fmadd_pd(rx2, r, c1p5);
 
   61         r = _mm512_mul_pd(r, y);
 
   62         return _mm512_mul_pd(x, r);
 
   64         return _mm512_sqrt_pd(x);
 
   68 inline v8df v1hypotd_core(v8df x, v8df y)
 
   70         v8df xp = _mm512_max_pd(x, y);
 
   71         v8df yp = _mm512_min_pd(x, y);
 
   72         __mmask8 zmask = _mm512_cmp_pd_mask(xp, 
zero, _CMP_NEQ_OQ);
 
   73         v8df arg = _mm512_mask_div_pd(
zero, zmask, yp, xp);
 
   74         arg = _mm512_fmadd_pd(arg, arg, one);
 
   75         v8df s = v1sqrtd_core(arg);
 
   76         return _mm512_mul_pd(xp, s);
 
   81 inline v4df v1sqrtd_core(v4df x)
 
   85         v4di ir = _mm256_castpd_si256(x);
 
   86         ir = _mm256_srli_epi64(ir, 1);
 
   87         ir = _mm256_sub_epi64(sqrt_magic, ir);
 
   89         v2df xl = _mm256_extractf128_pd(x, 0);
 
   90         v2df xh = _mm256_extractf128_pd(x, 1);
 
   91         v2di ixl = _mm_castpd_si128(xl);
 
   92         v2di ixh = _mm_castpd_si128(xh);
 
   93         ixl = _mm_srli_epi64(ixl, 1);
 
   94         ixh = _mm_srli_epi64(ixh, 1);
 
   95         ixl = _mm_sub_epi64(sqrt_magic, ixl);
 
   96         ixh = _mm_sub_epi64(sqrt_magic, ixh);
 
   97         v4di ir = _mm256_setzero_si256();
 
   98         ir = _mm256_insertf128_si256(ir, ixl, 0);
 
   99         ir = _mm256_insertf128_si256(ir, ixh, 1);
 
  101         v4df r = _mm256_castsi256_pd(ir);
 
  102         v4df zmask = _mm256_cmp_pd(x, dbl_min, _CMP_LT_OQ);
 
  103         r = _mm256_blendv_pd(r, 
zero, zmask);
 
  106         v4df rx = _mm256_mul_pd(r, x);
 
  107         v4df rx2 = _mm256_mul_pd(rx, mhalf);
 
  109         v4df y = _mm256_fmadd_pd(rx2, r, c1p5);
 
  111         v4df y = _mm256_mul_pd(rx2, r);
 
  112         y = _mm256_add_pd(y, c1p5);
 
  114         r = _mm256_mul_pd(r, y);
 
  115         rx = _mm256_mul_pd(r, x);
 
  116         rx2 = _mm256_mul_pd(rx, mhalf);
 
  118         y = _mm256_fmadd_pd(rx2, r, c1p5);
 
  120         y = _mm256_mul_pd(rx2, r);
 
  121         y = _mm256_add_pd(y, c1p5);
 
  123         r = _mm256_mul_pd(r, y);
 
  124         rx = _mm256_mul_pd(r, x);
 
  125         rx2 = _mm256_mul_pd(rx, mhalf);
 
  127         y = _mm256_fmadd_pd(rx2, r, c1p5);
 
  129         y = _mm256_mul_pd(rx2, r);
 
  130         y = _mm256_add_pd(y, c1p5);
 
  132         r = _mm256_mul_pd(r, y);
 
  133         rx = _mm256_mul_pd(r, x);
 
  134         rx2 = _mm256_mul_pd(rx, mhalf);
 
  136         y = _mm256_fmadd_pd(rx2, r, c1p5);
 
  138         y = _mm256_mul_pd(rx2, r);
 
  139         y = _mm256_add_pd(y, c1p5);
 
  141         r = _mm256_mul_pd(r, y);
 
  142         return _mm256_mul_pd(x, r);
 
  144         return _mm256_sqrt_pd(x);
 
  148 inline v4df v1hypotd_core(v4df x, v4df y)
 
  150         v4df xp = _mm256_max_pd(x, y);
 
  151         v4df yp = _mm256_min_pd(x, y);
 
  152         v4df zmask = _mm256_cmp_pd(xp, 
zero, _CMP_EQ_OQ);
 
  153         xp = _mm256_blendv_pd(xp, one, zmask);
 
  154         v4df arg = _mm256_div_pd(yp, xp);
 
  155         xp = _mm256_blendv_pd(xp, 
zero, zmask);
 
  157         arg = _mm256_fmadd_pd(arg, arg, one);
 
  159         arg = _mm256_mul_pd(arg, arg);
 
  160         arg = _mm256_add_pd(arg, one);
 
  162         v4df s = v1sqrtd_core(arg);
 
  163         return _mm256_mul_pd(xp, s);
 
  166 #endif // __AVX512F__ 
  168 VECII_CONST(sqrt_mask1f,0x7fffffff);
 
  171 VECII_CONST(sqrt_magicf,0x5f375a86);
 
  173 VECI_CONST(sqrt_magicf,0x5f375a86);
 
  178 inline v16sf v1sqrtf_core(v16sf x)
 
  181         v16si ir = _mm512_castps_si512(x);
 
  182         ir = _mm512_srli_epi32(ir, 1);
 
  183         ir = _mm512_sub_epi32(sqrt_magicf,ir);
 
  184         v16sf r = _mm512_castsi512_ps(ir);
 
  185         __mmask16 zmask = _mm512_cmp_ps_mask(x, flt_min, _CMP_LT_OS);
 
  186         r = _mm512_mask_load_ps(r, zmask, &zerof);
 
  189         v16sf rx = _mm512_mul_ps(r, x);
 
  190         v16sf rx2 = _mm512_mul_ps(rx, mhalff);
 
  191         v16sf y = _mm512_fmadd_ps(rx2, r, c1p5f);
 
  192         r = _mm512_mul_ps(r, y);
 
  193         rx = _mm512_mul_ps(r, x);
 
  194         rx2 = _mm512_mul_ps(rx, mhalff);
 
  195         y = _mm512_fmadd_ps(rx2, r, c1p5f);
 
  196         r = _mm512_mul_ps(r, y);
 
  197         rx = _mm512_mul_ps(r, x);
 
  198         rx2 = _mm512_mul_ps(rx, mhalff);
 
  199         y = _mm512_fmadd_ps(rx2, r, c1p5f);
 
  200         r = _mm512_mul_ps(r, y);
 
  201         return _mm512_mul_ps(x, r);
 
  203         return _mm512_sqrt_ps(x);
 
  207 inline v16sf v1hypotf_core(v16sf x, v16sf y)
 
  209         v16sf xp = _mm512_max_ps(x, y);
 
  210         v16sf yp = _mm512_min_ps(x, y);
 
  211         __mmask16 zmask = _mm512_cmp_ps_mask(xp, zerof, _CMP_NEQ_OQ);
 
  212         v16sf arg = _mm512_mask_div_ps(zerof, zmask, yp, xp);
 
  213         arg = _mm512_fmadd_ps(arg, arg, onef);
 
  214         v16sf s = v1sqrtf_core(arg);
 
  215         return _mm512_mul_ps(xp, s);
 
  220 inline v8sf v1sqrtf_core(v8sf x)
 
  224         v8si ir = _mm256_castps_si256(x);
 
  225         ir = _mm256_srli_epi32(ir, 1);
 
  226         ir = _mm256_sub_epi32(sqrt_magicf,ir);
 
  228         v4sf xl = _mm256_extractf128_ps(x, 0);
 
  229         v4sf xh = _mm256_extractf128_ps(x, 1);
 
  230         v4si ixl = _mm_castps_si128(xl);
 
  231         v4si ixh = _mm_castps_si128(xh);
 
  232         ixl = _mm_srli_epi32(ixl, 1);
 
  233         ixh = _mm_srli_epi32(ixh, 1);
 
  234         ixl = _mm_sub_epi32(sqrt_magicf,ixl);
 
  235         ixh = _mm_sub_epi32(sqrt_magicf,ixh);
 
  236         v8si ir = _mm256_setzero_si256();
 
  237         ir = _mm256_insertf128_si256(ir, ixl, 0);
 
  238         ir = _mm256_insertf128_si256(ir, ixh, 1);
 
  240         v8sf r = _mm256_castsi256_ps(ir);
 
  241         v8sf zmask = _mm256_cmp_ps(x, flt_min, _CMP_LT_OQ);
 
  242         r = _mm256_blendv_ps(r, zerof, zmask);
 
  245         v8sf rx = _mm256_mul_ps(r, x);
 
  246         v8sf rx2 = _mm256_mul_ps(rx, mhalff);
 
  248         v8sf y = _mm256_fmadd_ps(rx2, r, c1p5f);
 
  250         v8sf y = _mm256_mul_ps(rx2, r);
 
  251         y = _mm256_add_ps(y, c1p5f);
 
  253         r = _mm256_mul_ps(r, y);
 
  254         rx = _mm256_mul_ps(r, x);
 
  255         rx2 = _mm256_mul_ps(rx, mhalff);
 
  257         y = _mm256_fmadd_ps(rx2, r, c1p5f);
 
  259         y = _mm256_mul_ps(rx2, r);
 
  260         y = _mm256_add_ps(y, c1p5f);
 
  262         r = _mm256_mul_ps(r, y);
 
  263         rx = _mm256_mul_ps(r, x);
 
  264         rx2 = _mm256_mul_ps(rx, mhalff);
 
  266         y = _mm256_fmadd_ps(rx2, r, c1p5f);
 
  268         y = _mm256_mul_ps(rx2, r);
 
  269         y = _mm256_add_ps(y, c1p5f);
 
  271         r = _mm256_mul_ps(r, y);
 
  272         return _mm256_mul_ps(x, r);
 
  274         return _mm256_sqrt_ps(x);
 
  278 inline v8sf v1hypotf_core(v8sf x, v8sf y)
 
  280         v8sf xp = _mm256_max_ps(x, y);
 
  281         v8sf yp = _mm256_min_ps(x, y);
 
  282         v8sf zmask = _mm256_cmp_ps(xp, zerof, _CMP_EQ_OQ);
 
  283         xp = _mm256_blendv_ps(xp, onef, zmask);
 
  284         v8sf arg = _mm256_div_ps(yp, xp);
 
  285         xp = _mm256_blendv_ps(xp, zerof, zmask);
 
  287         arg = _mm256_fmadd_ps(arg, arg, onef);
 
  289         arg = _mm256_mul_ps(arg, arg);
 
  290         arg = _mm256_add_ps(arg, onef);
 
  292         v8sf s = v1sqrtf_core(arg);
 
  293         return _mm256_mul_ps(xp, s);
 
  296 #endif // __AVX512F__ 
void zero(void)
Definition: zero.cpp:30