// -*-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 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> 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>= n; return *this; } intvec_t& operator<<=(int_t n) { for (int d=0; d>(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> 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>= n.v[d]; return *this; } intvec_t& operator<<=(intvec_t n) { for (int d=0; d>(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(intvec_t const& x) const { boolvec_t res; for (int d=0; d x.v[d]; return res; } boolvec_t operator>=(intvec_t const& x) const { boolvec_t res; for (int d=0; 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 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 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(realvec_t const& x) const { boolvec_t res; for (int d=0; d x.v[d]; return res; } boolvec_t operator>=(realvec_t const& x) const { boolvec_t res; for (int d=0; 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 inline typename booltestvec::boolvec_t booltestvec::ifthen(boolvec_t x, boolvec_t y) const { boolvec_t res; for (int d=0; d inline typename booltestvec::intvec_t booltestvec::ifthen(intvec_t x, intvec_t y) const { intvec_t res; for (int d=0; d inline typename booltestvec::realvec_t booltestvec::ifthen(realvec_t x, realvec_t y) const { realvec_t res; for (int d=0; d inline typename inttestvec::realvec_t inttestvec::as_float() const { realvec_t res; for (int d=0; d 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(); } template std::ostream& operator<<(std::ostream& os, booltestvec const& x) { os << "["; for (int i=0; i std::ostream& operator<<(std::ostream& os, inttestvec const& x) { os << "["; for (int i=0; i std::ostream& operator<<(std::ostream& os, realtestvec const& x) { os << "["; for (int i=0; i