/* A preprocessor trick to avoid duplicating logic from vec.h */
#define gmx_stringify2(x) #x
#define gmx_stringify(x) gmx_stringify2(x)
- fprintf(fp, "invsqrt routine: %s\n", gmx_stringify(gmx_invsqrt(x)));
+ fprintf(fp, "invsqrt routine: %s\n", gmx_stringify(gmx_invsqrt_impl(x)));
fprintf(fp, "SIMD instructions: %s\n", GMX_SIMD_STRING);
fprintf(fp, "FFT library: %s\n", gmx_fft_get_version_info());
#ifdef HAVE_RDTSCP
return y; /* 5 Flops */
#endif
}
-#define gmx_invsqrt(x) gmx_software_invsqrt(x)
+
+#define gmx_invsqrt_impl(x) gmx_software_invsqrt(x)
#define INVSQRT_DONE
#endif /* gmx_invsqrt */
#ifndef INVSQRT_DONE
# ifdef GMX_DOUBLE
# ifdef HAVE_RSQRT
-# define gmx_invsqrt(x) rsqrt(x)
+# define gmx_invsqrt_impl(x) rsqrt(x)
# else
-# define gmx_invsqrt(x) (1.0/sqrt(x))
+# define gmx_invsqrt_impl(x) (1.0/sqrt(x))
# endif
# else /* single */
# ifdef HAVE_RSQRTF
-# define gmx_invsqrt(x) rsqrtf(x)
+# define gmx_invsqrt_impl(x) rsqrtf(x)
# elif defined HAVE_RSQRT
-# define gmx_invsqrt(x) rsqrt(x)
+# define gmx_invsqrt_impl(x) rsqrt(x)
# elif defined HAVE_SQRTF
-# define gmx_invsqrt(x) (1.0/sqrtf(x))
+# define gmx_invsqrt_impl(x) (1.0/sqrtf(x))
# else
-# define gmx_invsqrt(x) (1.0/sqrt(x))
+# define gmx_invsqrt_impl(x) (1.0/sqrt(x))
# endif
# endif
#endif
+#ifdef NDEBUG
+# define gmx_invsqrt(x) gmx_invsqrt_impl(x)
+#else
+# define gmx_invsqrt(x) ( (x > 0) ? gmx_invsqrt_impl(x) : 0.0 )
+#endif
static gmx_inline real sqr(real x)
{