// -*-C++-*- #ifndef VEC_TEST_H #define VEC_TEST_H #include "floatprops.h" #include "mathfuncs.h" #include "vec_base.h" #include #ifndef VML_NO_IOSTREAM #include #endif namespace vecmathlib { template struct booltestvec; template struct inttestvec; template struct realtestvec; template struct booltestvec : floatprops { typedef typename floatprops::int_t int_t; typedef typename floatprops::uint_t uint_t; typedef typename floatprops::real_t real_t; static int const size = N; typedef bool scalar_t; typedef bool bvector_t[size]; static int const alignment = sizeof(bool); typedef booltestvec boolvec_t; typedef inttestvec intvec_t; typedef realtestvec realvec_t; // short names for type casts typedef real_t R; typedef int_t I; typedef uint_t U; typedef realvec_t RV; typedef intvec_t IV; typedef boolvec_t BV; typedef floatprops FP; typedef mathfuncs MF; bvector_t v; booltestvec() {} // can't have a non-trivial copy constructor; if so, objects won't // be passed in registers // booltestvec(booltestvec const& x): v(x.v) {} // booltestvec& operator=(booltestvec const& x) { return v=x.v, *this; } // booltestvec(vector_t x): v(x) {} booltestvec(bool a) { for (int d = 0; d < size; ++d) v[d] = a; } booltestvec(bool const *as) { for (int d = 0; d < size; ++d) v[d] = as[d]; } bool operator[](int n) const { return v[n]; } boolvec_t &set_elt(int n, bool a) { return v[n] = a, *this; } intvec_t as_int() const; // defined after inttestvec intvec_t convert_int() const; // defined after inttestvec boolvec_t operator!() const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = !v[d]; return res; } boolvec_t operator&&(boolvec_t x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] && x.v[d]; return res; } boolvec_t operator||(boolvec_t x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] || x.v[d]; return res; } boolvec_t operator==(boolvec_t x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] == x.v[d]; return res; } boolvec_t operator!=(boolvec_t x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] != x.v[d]; return res; } bool all() const { bool res = v[0]; for (int d = 1; d < size; ++d) res = res && v[d]; return res; } bool any() const { bool res = v[0]; for (int d = 1; d < size; ++d) res = res || v[d]; return res; } // ifthen(condition, then-value, else-value) boolvec_t ifthen(boolvec_t x, boolvec_t y) const; intvec_t ifthen(intvec_t x, intvec_t y) const; // defined after inttestvec realvec_t ifthen(realvec_t x, realvec_t y) const; // defined after realtestvec }; template struct inttestvec : floatprops { typedef typename floatprops::int_t int_t; typedef typename floatprops::uint_t uint_t; typedef typename floatprops::real_t real_t; static int const size = N; typedef int_t scalar_t; typedef int_t ivector_t[size]; static int const alignment = sizeof(int_t); typedef booltestvec boolvec_t; typedef inttestvec intvec_t; typedef realtestvec realvec_t; // short names for type casts typedef real_t R; typedef int_t I; typedef uint_t U; typedef realvec_t RV; typedef intvec_t IV; typedef boolvec_t BV; typedef floatprops FP; typedef mathfuncs MF; ivector_t v; inttestvec() {} // can't have a non-trivial copy constructor; if so, objects won't // be passed in registers // inttestvec(inttestvec const& x): v(x.v) {} // inttestvec& operator=(inttestvec const& x) { return v=x.v, *this; } // inttestvec(vector_t x): v(x) {} inttestvec(int_t a) { for (int d = 0; d < size; ++d) v[d] = a; } inttestvec(int_t const *as) { for (int d = 0; d < size; ++d) v[d] = as[d]; } static intvec_t iota() { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = d; return res; } int_t operator[](int n) const { return v[n]; } intvec_t &set_elt(int n, int_t a) { return v[n] = a, *this; } boolvec_t as_bool() const { return convert_bool(); } boolvec_t convert_bool() const { // result: convert_bool(0)=false, convert_bool(else)=true boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d]; return res; } realvec_t as_float() const; // defined after realtestvec realvec_t convert_float() const; // defined after realtestvec intvec_t operator+() const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = +v[d]; return res; } intvec_t operator-() const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = -v[d]; return res; } intvec_t &operator+=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] += x.v[d]; return *this; } intvec_t &operator-=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] -= x.v[d]; return *this; } intvec_t &operator*=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] *= x.v[d]; return *this; } intvec_t &operator/=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] /= x.v[d]; return *this; } intvec_t &operator%=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] %= x.v[d]; return *this; } intvec_t operator+(intvec_t x) const { intvec_t res = *this; return res += x; } intvec_t operator-(intvec_t x) const { intvec_t res = *this; return res -= x; } intvec_t operator*(intvec_t x) const { intvec_t res = *this; return res *= x; } intvec_t operator/(intvec_t x) const { intvec_t res = *this; return res /= x; } intvec_t operator%(intvec_t x) const { intvec_t res = *this; return res %= x; } intvec_t operator~() const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = ~v[d]; return res; } intvec_t &operator&=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] &= x.v[d]; return *this; } intvec_t &operator|=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] |= x.v[d]; return *this; } intvec_t &operator^=(intvec_t const &x) { for (int d = 0; d < size; ++d) v[d] ^= x.v[d]; return *this; } intvec_t operator&(intvec_t x) const { intvec_t res = *this; return res &= x; } intvec_t operator|(intvec_t x) const { intvec_t res = *this; return res |= x; } intvec_t operator^(intvec_t x) const { intvec_t res = *this; return res ^= x; } intvec_t bitifthen(intvec_t x, intvec_t y) const { return MF::vml_bitifthen(*this, x, y); } intvec_t lsr(int_t n) const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = I(U(v[d]) >> U(n)); return res; } intvec_t rotate(int_t n) const { return MF::vml_rotate(*this, n); } intvec_t &operator>>=(int_t n) { for (int d = 0; d < size; ++d) v[d] >>= n; return *this; } intvec_t &operator<<=(int_t n) { for (int d = 0; d < size; ++d) v[d] <<= n; return *this; } intvec_t operator>>(int_t n) const { intvec_t res = *this; return res >>= n; } intvec_t operator<<(int_t n) const { intvec_t res = *this; return res <<= n; } intvec_t lsr(intvec_t n) const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = I(U(v[d]) >> U(n.v[d])); return res; } intvec_t rotate(intvec_t n) const { return MF::vml_rotate(*this, n); } intvec_t &operator>>=(intvec_t n) { for (int d = 0; d < size; ++d) v[d] >>= n.v[d]; return *this; } intvec_t &operator<<=(intvec_t n) { for (int d = 0; d < size; ++d) v[d] <<= n.v[d]; return *this; } intvec_t operator>>(intvec_t n) const { intvec_t res = *this; return res >>= n; } intvec_t operator<<(intvec_t n) const { intvec_t res = *this; return res <<= n; } intvec_t clz() const { return MF::vml_clz(*this); } intvec_t popcount() const { return MF::vml_popcount(*this); } boolvec_t operator==(intvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] == x.v[d]; return res; } boolvec_t operator!=(intvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] != x.v[d]; return res; } boolvec_t operator<(intvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] < x.v[d]; return res; } boolvec_t operator<=(intvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] <= x.v[d]; return res; } boolvec_t operator>(intvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] > x.v[d]; return res; } boolvec_t operator>=(intvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] >= x.v[d]; return res; } intvec_t abs() const { return MF::vml_abs(*this); } boolvec_t isignbit() const { return MF::vml_isignbit(*this); } intvec_t max(intvec_t x) const { return MF::vml_max(*this, x); } intvec_t min(intvec_t x) const { return MF::vml_min(*this, x); } }; template struct realtestvec : floatprops { typedef typename floatprops::int_t int_t; typedef typename floatprops::uint_t uint_t; typedef typename floatprops::real_t real_t; static int const size = N; typedef real_t scalar_t; typedef real_t vector_t[size]; static int const alignment = sizeof(real_t); #ifndef VML_NO_IOSTREAM static char const *name() { static std::string name_; if (name_.empty()) { std::stringstream buf; buf << ""; name_ = buf.str(); } return name_.c_str(); } #endif void barrier() { #if defined __GNUC__ && !defined __clang__ && !defined __ICC // GCC crashes when +X is used as constraint #if defined __SSE2__ for (int d = 0; d < size; ++d) __asm__("" : "+x"(v[d])); #elif defined __PPC64__ // maybe also __PPC__ for (int d = 0; d < size; ++d) __asm__("" : "+f"(v[d])); #elif defined __arm__ for (int d = 0; d < size; ++d) __asm__("" : "+w"(v[d])); #else #error "Floating point barrier undefined on this architecture" #endif #elif defined __clang__ for (int d = 0; d < size; ++d) __asm__("" : "+X"(v[d])); #elif defined __ICC for (int d = 0; d < size; ++d) { real_t tmp = v[d]; __asm__("" : "+X"(tmp)); v[d] = tmp; } #elif defined __IBMCPP__ for (int d = 0; d < size; ++d) __asm__("" : "+f"(v[d])); #else #error "Floating point barrier undefined on this architecture" #endif } typedef booltestvec boolvec_t; typedef inttestvec intvec_t; typedef realtestvec realvec_t; // short names for type casts typedef real_t R; typedef int_t I; typedef uint_t U; typedef realvec_t RV; typedef intvec_t IV; typedef boolvec_t BV; typedef floatprops FP; typedef mathfuncs MF; vector_t v; realtestvec() {} // can't have a non-trivial copy constructor; if so, objects won't // be passed in registers // realtestvec(realtestvec const& x): v(x.v) {} // realtestvec& operator=(realtestvec const& x) { return v=x.v, *this; } // realtestvec(vector_t x): v(x) {} realtestvec(real_t a) { for (int d = 0; d < size; ++d) v[d] = a; } realtestvec(real_t const *as) { for (int d = 0; d < size; ++d) v[d] = as[d]; } real_t operator[](int n) const { return v[n]; } realvec_t &set_elt(int n, real_t a) { return v[n] = a, *this; } typedef vecmathlib::mask_t mask_t; static realvec_t loada(real_t const *p) { VML_ASSERT(intptr_t(p) % alignment == 0); return loadu(p); } static realvec_t loadu(real_t const *p) { realvec_t res; for (int d = 0; d < size; ++d) res.v[d] = p[d]; return res; } static realvec_t loadu(real_t const *p, size_t ioff) { VML_ASSERT(intptr_t(p) % alignment == 0); return loadu(p + ioff); } realvec_t loada(real_t const *p, mask_t const &m) const { return m.m.ifthen(loada(p), *this); } realvec_t loadu(real_t const *p, mask_t const &m) const { return m.m.ifthen(loadu(p), *this); } realvec_t loadu(real_t const *p, size_t ioff, mask_t const &m) const { return m.m.ifthen(loadu(p, ioff), *this); } void storea(real_t *p) const { VML_ASSERT(intptr_t(p) % alignment == 0); storeu(p); } void storeu(real_t *p) const { for (int d = 0; d < size; ++d) p[d] = v[d]; } void storeu(real_t *p, size_t ioff) const { VML_ASSERT(intptr_t(p) % alignment == 0); storeu(p + ioff); } void storea(real_t *p, mask_t const &m) const { VML_ASSERT(intptr_t(p) % alignment == 0); storeu(p, m); } void storeu(real_t *p, mask_t const &m) const { for (int d = 0; d < size; ++d) if (m.m[d]) p[d] = v[d]; } void storeu(real_t *p, size_t ioff, mask_t const &m) const { VML_ASSERT(intptr_t(p) % alignment == 0); storeu(p + ioff, m); } intvec_t as_int() const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = FP::as_int(v[d]); return res; } intvec_t convert_int() const { return MF::vml_convert_int(*this); } realvec_t operator+() const { realvec_t res; for (int d = 0; d < size; ++d) res.v[d] = +v[d]; return res; } realvec_t operator-() const { realvec_t res; for (int d = 0; d < size; ++d) res.v[d] = -v[d]; return res; } realvec_t &operator+=(realvec_t const &x) { for (int d = 0; d < size; ++d) v[d] += x.v[d]; return *this; } realvec_t &operator-=(realvec_t const &x) { for (int d = 0; d < size; ++d) v[d] -= x.v[d]; return *this; } realvec_t &operator*=(realvec_t const &x) { for (int d = 0; d < size; ++d) v[d] *= x.v[d]; return *this; } realvec_t &operator/=(realvec_t const &x) { for (int d = 0; d < size; ++d) v[d] /= x.v[d]; return *this; } realvec_t operator+(realvec_t x) const { realvec_t res = *this; return res += x; } realvec_t operator-(realvec_t x) const { realvec_t res = *this; return res -= x; } realvec_t operator*(realvec_t x) const { realvec_t res = *this; return res *= x; } realvec_t operator/(realvec_t x) const { realvec_t res = *this; return res /= x; } real_t maxval() const { real_t res = v[0]; for (int d = 1; d < size; ++d) res = vml_std::fmax(res, v[d]); return res; } real_t minval() const { real_t res = v[0]; for (int d = 1; d < size; ++d) res = vml_std::fmin(res, v[d]); return res; } real_t prod() const { real_t res = v[0]; for (int d = 1; d < size; ++d) res *= v[d]; return res; } real_t sum() const { real_t res = v[0]; for (int d = 1; d < size; ++d) res += v[d]; return res; } boolvec_t operator==(realvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] == x.v[d]; return res; } boolvec_t operator!=(realvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] != x.v[d]; return res; } boolvec_t operator<(realvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] < x.v[d]; return res; } boolvec_t operator<=(realvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] <= x.v[d]; return res; } boolvec_t operator>(realvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] > x.v[d]; return res; } boolvec_t operator>=(realvec_t const &x) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] >= x.v[d]; return res; } realvec_t acos() const { return MF::vml_acos(*this); } realvec_t acosh() const { return MF::vml_acosh(*this); } realvec_t asin() const { return MF::vml_asin(*this); } realvec_t asinh() const { return MF::vml_asinh(*this); } realvec_t atan() const { return MF::vml_atan(*this); } realvec_t atan2(realvec_t y) const { return MF::vml_atan2(*this, y); } realvec_t atanh() const { return MF::vml_atanh(*this); } realvec_t cbrt() const { return MF::vml_cbrt(*this); } realvec_t ceil() const { return MF::vml_ceil(*this); } realvec_t copysign(realvec_t y) const { return MF::vml_copysign(*this, y); } realvec_t cos() const { return MF::vml_cos(*this); } realvec_t cosh() const { return MF::vml_cosh(*this); } realvec_t exp() const { return MF::vml_exp(*this); } realvec_t exp10() const { return MF::vml_exp10(*this); } realvec_t exp2() const { return MF::vml_exp2(*this); } realvec_t expm1() const { return MF::vml_expm1(*this); } realvec_t fabs() const { return MF::vml_fabs(*this); } realvec_t fdim(realvec_t y) const { return MF::vml_fdim(*this, y); } realvec_t floor() const { return MF::vml_floor(*this); } realvec_t fma(realvec_t y, realvec_t z) const { return MF::vml_fma(*this, y, z); } realvec_t fmax(realvec_t y) const { return MF::vml_fmax(*this, y); } realvec_t fmin(realvec_t y) const { return MF::vml_fmin(*this, y); } realvec_t fmod(realvec_t y) const { return MF::vml_fmod(*this, y); } realvec_t frexp(intvec_t *r) const { return MF::vml_frexp(*this, r); } realvec_t hypot(realvec_t y) const { return MF::vml_hypot(*this, y); } intvec_t ilogb() const { return MF::vml_ilogb(*this); } boolvec_t isfinite() const { return MF::vml_isfinite(*this); } boolvec_t isinf() const { return MF::vml_isinf(*this); } boolvec_t isnan() const { return MF::vml_isnan(*this); } boolvec_t isnormal() const { return MF::vml_isnormal(*this); } realvec_t ldexp(int_t n) const { return MF::vml_ldexp(*this, n); } realvec_t ldexp(intvec_t n) const { return MF::vml_ldexp(*this, n); } realvec_t log() const { return MF::vml_log(*this); } realvec_t log10() const { return MF::vml_log10(*this); } realvec_t log1p() const { return MF::vml_log1p(*this); } realvec_t log2() const { return MF::vml_log2(*this); } intvec_t lrint() const { return MF::vml_lrint(*this); } realvec_t mad(realvec_t y, realvec_t z) const { return MF::vml_mad(*this, y, z); } realvec_t nextafter(realvec_t y) const { return MF::vml_nextafter(*this, y); } realvec_t pow(realvec_t y) const { return MF::vml_pow(*this, y); } realvec_t rcp() const { return MF::vml_rcp(*this); } realvec_t remainder(realvec_t y) const { return MF::vml_remainder(*this, y); } realvec_t rint() const { return MF::vml_rint(*this); } realvec_t round() const { return MF::vml_round(*this); } realvec_t rsqrt() const { return MF::vml_rsqrt(*this); } boolvec_t signbit() const { return MF::vml_signbit(*this); } realvec_t sin() const { return MF::vml_sin(*this); } realvec_t sinh() const { return MF::vml_sinh(*this); } realvec_t sqrt() const { return MF::vml_sqrt(*this); } realvec_t tan() const { return MF::vml_tan(*this); } realvec_t tanh() const { return MF::vml_tanh(*this); } realvec_t trunc() const { return MF::vml_trunc(*this); } }; // booltestvec definitions template inline typename booltestvec::intvec_t booltestvec::as_int() const { return convert_int(); } template inline typename booltestvec::intvec_t booltestvec::convert_int() const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d]; return res; } template inline typename booltestvec::boolvec_t booltestvec::ifthen(boolvec_t x, boolvec_t y) const { boolvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] ? x.v[d] : y.v[d]; return res; } template inline typename booltestvec::intvec_t booltestvec::ifthen(intvec_t x, intvec_t y) const { intvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] ? x.v[d] : y.v[d]; return res; } template inline typename booltestvec::realvec_t booltestvec::ifthen(realvec_t x, realvec_t y) const { realvec_t res; for (int d = 0; d < size; ++d) res.v[d] = v[d] ? x.v[d] : y.v[d]; return res; } // inttestvec definitions template inline typename inttestvec::realvec_t inttestvec::as_float() const { realvec_t res; for (int d = 0; d < size; ++d) res.v[d] = FP::as_float(v[d]); return res; } template inline typename inttestvec::realvec_t inttestvec::convert_float() const { return MF::vml_convert_float(*this); } // Wrappers // booltestvec wrappers template inline inttestvec as_int(booltestvec x) { return x.as_int(); } template inline inttestvec convert_int(booltestvec x) { return x.convert_int(); } template inline bool all(booltestvec x) { return x.all(); } template inline bool any(booltestvec x) { return x.any(); } template inline booltestvec ifthen(booltestvec c, booltestvec x, booltestvec y) { return c.ifthen(x, y); } template inline inttestvec ifthen(booltestvec c, inttestvec x, inttestvec y) { return c.ifthen(x, y); } template inline realtestvec ifthen(booltestvec c, realtestvec x, realtestvec y) { return c.ifthen(x, y); } // inttestvec wrappers template inline inttestvec abs(inttestvec x) { return x.abs(); } template inline booltestvec as_bool(inttestvec x) { return x.as_bool(); } template inline realtestvec as_float(inttestvec x) { return x.as_float(); } template inline inttestvec bitifthen(inttestvec x, inttestvec y, inttestvec z) { return x.bitifthen(y, z); } template inline inttestvec clz(inttestvec x) { return x.clz(); } template inline booltestvec convert_bool(inttestvec x) { return x.convert_bool(); } template inline realtestvec convert_float(inttestvec x) { return x.convert_float(); } template inline booltestvec isignbit(inttestvec x) { return x.isignbit(); } template inline inttestvec lsr(inttestvec x, typename inttestvec::int_t n) { return x.lsr(n); } template inline inttestvec lsr(inttestvec x, inttestvec n) { return x.lsr(n); } template inline inttestvec max(inttestvec x, inttestvec y) { return x.max(y); } template inline inttestvec min(inttestvec x, inttestvec y) { return x.min(y); } template inline inttestvec popcount(inttestvec x) { return x.popcount(); } template inline inttestvec rotate(inttestvec x, typename inttestvec::int_t n) { return x.rotate(n); } template inline inttestvec rotate(inttestvec x, inttestvec n) { return x.rotate(n); } // realtestvec wrappers template inline realtestvec loada(real_t const *p, realtestvec x, typename realtestvec::mask_t const &m) { return x.loada(p, m); } template inline realtestvec loadu(real_t const *p, realtestvec x, typename realtestvec::mask_t const &m) { return x.loadu(p, m); } template inline realtestvec loadu(real_t const *p, size_t ioff, realtestvec x, typename realtestvec::mask_t const &m) { return x.loadu(p, ioff, m); } template inline void storea(realtestvec x, real_t *p) { return x.storea(p); } template inline void storeu(realtestvec x, real_t *p) { return x.storeu(p); } template inline void storeu(realtestvec x, real_t *p, size_t ioff) { return x.storeu(p, ioff); } template inline void storea(realtestvec x, real_t *p, typename realtestvec::mask_t const &m) { return x.storea(p, m); } template inline void storeu(realtestvec x, real_t *p, typename realtestvec::mask_t const &m) { return x.storeu(p, m); } template inline void storeu(realtestvec x, real_t *p, size_t ioff, typename realtestvec::mask_t const &m) { return x.storeu(p, ioff, m); } template inline inttestvec as_int(realtestvec x) { return x.as_int(); } template inline inttestvec convert_int(realtestvec x) { return x.convert_int(); } template inline real_t maxval(realtestvec x) { return x.maxval(); } template inline real_t minval(realtestvec x) { return x.minval(); } template inline real_t prod(realtestvec x) { return x.prod(); } template inline real_t sum(realtestvec x) { return x.sum(); } template inline realtestvec acos(realtestvec x) { return x.acos(); } template inline realtestvec acosh(realtestvec x) { return x.acosh(); } template inline realtestvec asin(realtestvec x) { return x.asin(); } template inline realtestvec asinh(realtestvec x) { return x.asinh(); } template inline realtestvec atan(realtestvec x) { return x.atan(); } template inline realtestvec atan2(realtestvec x, realtestvec y) { return x.atan2(y); } template inline realtestvec atanh(realtestvec x) { return x.atanh(); } template inline realtestvec cbrt(realtestvec x) { return x.cbrt(); } template inline realtestvec ceil(realtestvec x) { return x.ceil(); } template inline realtestvec copysign(realtestvec x, realtestvec y) { return x.copysign(y); } template inline realtestvec cos(realtestvec x) { return x.cos(); } template inline realtestvec cosh(realtestvec x) { return x.cosh(); } template inline realtestvec exp(realtestvec x) { return x.exp(); } template inline realtestvec exp10(realtestvec x) { return x.exp10(); } template inline realtestvec exp2(realtestvec x) { return x.exp2(); } template inline realtestvec expm1(realtestvec x) { return x.expm1(); } template inline realtestvec fabs(realtestvec x) { return x.fabs(); } template inline realtestvec floor(realtestvec x) { return x.floor(); } template inline realtestvec fdim(realtestvec x, realtestvec y) { return x.fdim(y); } template inline realtestvec fma(realtestvec x, realtestvec y, realtestvec z) { return x.fma(y, z); } template inline realtestvec fmax(realtestvec x, realtestvec y) { return x.fmax(y); } template inline realtestvec fmin(realtestvec x, realtestvec y) { return x.fmin(y); } template inline realtestvec fmod(realtestvec x, realtestvec y) { return x.fmod(y); } template inline realtestvec frexp(realtestvec x, inttestvec *r) { return x.frexp(r); } template inline realtestvec hypot(realtestvec x, realtestvec y) { return x.hypot(y); } template inline inttestvec ilogb(realtestvec x) { return x.ilogb(); } template inline booltestvec isfinite(realtestvec x) { return x.isfinite(); } template inline booltestvec isinf(realtestvec x) { return x.isinf(); } template inline booltestvec isnan(realtestvec x) { return x.isnan(); } template inline booltestvec isnormal(realtestvec x) { return x.isnormal(); } template inline realtestvec ldexp(realtestvec x, typename inttestvec::int_t n) { return x.ldexp(n); } template inline realtestvec ldexp(realtestvec x, inttestvec n) { return x.ldexp(n); } template inline realtestvec log(realtestvec x) { return x.log(); } template inline realtestvec log10(realtestvec x) { return x.log10(); } template inline realtestvec log1p(realtestvec x) { return x.log1p(); } template inline realtestvec log2(realtestvec x) { return x.log2(); } template inline inttestvec lrint(realtestvec x) { return x.lrint(); } template inline realtestvec mad(realtestvec x, realtestvec y, realtestvec z) { return x.mad(y, z); } template inline realtestvec nextafter(realtestvec x, realtestvec y) { return x.nextafter(y); } template inline realtestvec pow(realtestvec x, realtestvec y) { return x.pow(y); } template inline realtestvec rcp(realtestvec x) { return x.rcp(); } template inline realtestvec remainder(realtestvec x, realtestvec y) { return x.remainder(y); } template inline realtestvec rint(realtestvec x) { return x.rint(); } template inline realtestvec round(realtestvec x) { return x.round(); } template inline realtestvec rsqrt(realtestvec x) { return x.rsqrt(); } template inline booltestvec signbit(realtestvec x) { return x.signbit(); } template inline realtestvec sin(realtestvec x) { return x.sin(); } template inline realtestvec sinh(realtestvec x) { return x.sinh(); } template inline realtestvec sqrt(realtestvec x) { return x.sqrt(); } template inline realtestvec tan(realtestvec x) { return x.tan(); } template inline realtestvec tanh(realtestvec x) { return x.tanh(); } template inline realtestvec trunc(realtestvec x) { return x.trunc(); } #ifndef VML_NO_IOSTREAM template std::ostream &operator<<(std::ostream &os, booltestvec const &x) { os << "["; for (int i = 0; i < size; ++i) { if (i != 0) os << ","; os << x[i]; } os << "]"; return os; } template std::ostream &operator<<(std::ostream &os, inttestvec const &x) { os << "["; for (int i = 0; i < size; ++i) { if (i != 0) os << ","; os << x[i]; } os << "]"; return os; } template std::ostream &operator<<(std::ostream &os, realtestvec const &x) { os << "["; for (int i = 0; i < size; ++i) { if (i != 0) os << ","; os << x[i]; } os << "]"; return os; } #endif } // namespace vecmathlib #endif // #ifndef VEC_TEST_H