* \ingroup module_simd
*/
+#include "config.h"
+
#include <math.h>
#include "gromacs/math/utilities.h"
gmx_simd_xor_sign_f(gmx_simd_float_t a, gmx_simd_float_t b)
{
#ifdef GMX_SIMD_HAVE_LOGICAL
- return gmx_simd_xor_f(a, gmx_simd_and_f(gmx_simd_set1_f(-0.0), b));
+ return gmx_simd_xor_f(a, gmx_simd_and_f(gmx_simd_set1_f(GMX_FLOAT_NEGZERO), b));
#else
return gmx_simd_blendv_f(a, gmx_simd_fneg_f(a), gmx_simd_cmplt_f(b, gmx_simd_setzero_f()));
#endif
}
+#ifndef gmx_simd_rsqrt_iter_f
/*! \brief Perform one Newton-Raphson iteration to improve 1/sqrt(x) for SIMD float.
*
* This is a low-level routine that should only be used by SIMD math routine
return gmx_simd_mul_f(gmx_simd_set1_f(0.5f), gmx_simd_mul_f(gmx_simd_sub_f(gmx_simd_set1_f(3.0f), gmx_simd_mul_f(gmx_simd_mul_f(lu, lu), x)), lu));
# endif
}
+#endif
/*! \brief Calculate 1/sqrt(x) for SIMD float.
*
*out1 = gmx_simd_invsqrt_f(x1);
}
+#ifndef gmx_simd_rcp_iter_f
/*! \brief Perform one Newton-Raphson iteration to improve 1/x for SIMD float.
*
* This is a low-level routine that should only be used by SIMD math routine
{
return gmx_simd_mul_f(lu, gmx_simd_fnmadd_f(lu, x, gmx_simd_set1_f(2.0f)));
}
+#endif
/*! \brief Calculate 1/x for SIMD float.
*
y = gmx_simd_round_f(z);
mask = gmx_simd_cvt_fib2fb(gmx_simd_cmpeq_fi(gmx_simd_and_fi(iy, ione), gmx_simd_setzero_fi()));
- ssign = gmx_simd_blendzero_f(gmx_simd_set1_f(-0.0f), gmx_simd_cvt_fib2fb(gmx_simd_cmpeq_fi(gmx_simd_and_fi(iy, itwo), itwo)));
- csign = gmx_simd_blendzero_f(gmx_simd_set1_f(-0.0f), gmx_simd_cvt_fib2fb(gmx_simd_cmpeq_fi(gmx_simd_and_fi(gmx_simd_add_fi(iy, ione), itwo), itwo)));
+ ssign = gmx_simd_blendzero_f(gmx_simd_set1_f(GMX_FLOAT_NEGZERO), gmx_simd_cvt_fib2fb(gmx_simd_cmpeq_fi(gmx_simd_and_fi(iy, itwo), itwo)));
+ csign = gmx_simd_blendzero_f(gmx_simd_set1_f(GMX_FLOAT_NEGZERO), gmx_simd_cvt_fib2fb(gmx_simd_cmpeq_fi(gmx_simd_and_fi(gmx_simd_add_fi(iy, ione), itwo), itwo)));
#else
const gmx_simd_float_t quarter = gmx_simd_set1_f(0.25f);
const gmx_simd_float_t minusquarter = gmx_simd_set1_f(-0.25f);
* active or inactive - you will get errors if only one is used.
*/
# ifdef GMX_SIMD_HAVE_LOGICAL
- ssign = gmx_simd_and_f(ssign, gmx_simd_set1_f(-0.0f));
- csign = gmx_simd_andnot_f(q, gmx_simd_set1_f(-0.0f));
+ ssign = gmx_simd_and_f(ssign, gmx_simd_set1_f(GMX_FLOAT_NEGZERO));
+ csign = gmx_simd_andnot_f(q, gmx_simd_set1_f(GMX_FLOAT_NEGZERO));
ssign = gmx_simd_xor_f(ssign, csign);
# else
csign = gmx_simd_xor_sign_f(gmx_simd_set1_f(-1.0f), q);
x = gmx_simd_fnmadd_f(y, argred1, x);
x = gmx_simd_fnmadd_f(y, argred2, x);
x = gmx_simd_fnmadd_f(y, argred3, x);
- x = gmx_simd_xor_f(gmx_simd_blendzero_f(gmx_simd_set1_f(-0.0f), mask), x);
+ x = gmx_simd_xor_f(gmx_simd_blendzero_f(gmx_simd_set1_f(GMX_FLOAT_NEGZERO), mask), x);
#else
const gmx_simd_float_t quarter = gmx_simd_set1_f(0.25f);
const gmx_simd_float_t half = gmx_simd_set1_f(0.5f);
gmx_simd_xor_sign_d(gmx_simd_double_t a, gmx_simd_double_t b)
{
#ifdef GMX_SIMD_HAVE_LOGICAL
- return gmx_simd_xor_d(a, gmx_simd_and_d(gmx_simd_set1_d(-0.0), b));
+ return gmx_simd_xor_d(a, gmx_simd_and_d(gmx_simd_set1_d(GMX_DOUBLE_NEGZERO), b));
#else
return gmx_simd_blendv_d(a, gmx_simd_fneg_d(a), gmx_simd_cmplt_d(b, gmx_simd_setzero_d()));
#endif
}
+#ifndef gmx_simd_rsqrt_iter_d
/*! \brief Perform one Newton-Raphson iteration to improve 1/sqrt(x) for SIMD double.
*
* \copydetails gmx_simd_rsqrt_iter_f
return gmx_simd_mul_d(gmx_simd_set1_d(0.5), gmx_simd_mul_d(gmx_simd_sub_d(gmx_simd_set1_d(3.0), gmx_simd_mul_d(gmx_simd_mul_d(lu, lu), x)), lu));
#endif
}
-
+#endif
/*! \brief Calculate 1/sqrt(x) for SIMD double
*
#endif
}
+#ifndef gmx_simd_rcp_iter_d
/*! \brief Perform one Newton-Raphson iteration to improve 1/x for SIMD double.
*
* \copydetails gmx_simd_rcp_iter_f
{
return gmx_simd_mul_d(lu, gmx_simd_fnmadd_d(lu, x, gmx_simd_set1_d(2.0)));
}
+#endif
/*! \brief Calculate 1/x for SIMD double.
*
y = gmx_simd_round_d(z);
mask = gmx_simd_cvt_dib2db(gmx_simd_cmpeq_di(gmx_simd_and_di(iy, ione), gmx_simd_setzero_di()));
- ssign = gmx_simd_blendzero_d(gmx_simd_set1_d(-0.0), gmx_simd_cvt_dib2db(gmx_simd_cmpeq_di(gmx_simd_and_di(iy, itwo), itwo)));
- csign = gmx_simd_blendzero_d(gmx_simd_set1_d(-0.0), gmx_simd_cvt_dib2db(gmx_simd_cmpeq_di(gmx_simd_and_di(gmx_simd_add_di(iy, ione), itwo), itwo)));
+ ssign = gmx_simd_blendzero_d(gmx_simd_set1_d(GMX_DOUBLE_NEGZERO), gmx_simd_cvt_dib2db(gmx_simd_cmpeq_di(gmx_simd_and_di(iy, itwo), itwo)));
+ csign = gmx_simd_blendzero_d(gmx_simd_set1_d(GMX_DOUBLE_NEGZERO), gmx_simd_cvt_dib2db(gmx_simd_cmpeq_di(gmx_simd_and_di(gmx_simd_add_di(iy, ione), itwo), itwo)));
#else
const gmx_simd_double_t quarter = gmx_simd_set1_d(0.25);
const gmx_simd_double_t minusquarter = gmx_simd_set1_d(-0.25);
* active or inactive - you will get errors if only one is used.
*/
# ifdef GMX_SIMD_HAVE_LOGICAL
- ssign = gmx_simd_and_d(ssign, gmx_simd_set1_d(-0.0));
- csign = gmx_simd_andnot_d(q, gmx_simd_set1_d(-0.0));
+ ssign = gmx_simd_and_d(ssign, gmx_simd_set1_d(GMX_DOUBLE_NEGZERO));
+ csign = gmx_simd_andnot_d(q, gmx_simd_set1_d(GMX_DOUBLE_NEGZERO));
ssign = gmx_simd_xor_d(ssign, csign);
# else
csign = gmx_simd_xor_sign_d(gmx_simd_set1_d(-1.0), q);
x = gmx_simd_fnmadd_d(y, argred1, x);
x = gmx_simd_fnmadd_d(y, argred2, x);
x = gmx_simd_fnmadd_d(y, argred3, x);
- x = gmx_simd_xor_d(gmx_simd_blendzero_d(gmx_simd_set1_d(-0.0), mask), x);
+ x = gmx_simd_xor_d(gmx_simd_blendzero_d(gmx_simd_set1_d(GMX_DOUBLE_NEGZERO), mask), x);
#else
const gmx_simd_double_t quarter = gmx_simd_set1_d(0.25);
const gmx_simd_double_t half = gmx_simd_set1_d(0.5);