// -*-C++-*- #ifndef VEC_TEST_H #define VEC_TEST_H #include "floatprops.h" #include "mathfuncs.h" #include "vec_base.h" #include 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; } inttestvec& operator>>=(int_t n) { for (int d=0; d>= n; return *this; } inttestvec& operator<<=(int_t n) { for (int d=0; d>(int_t n) const { inttestvec res = *this; return res >>= n; } inttestvec operator<<(int_t n) const { inttestvec res = *this; return res <<= n; } inttestvec lsr(inttestvec n) const { inttestvec res; for (int d=0; d> U(n.v[d])); return res; } inttestvec& operator>>=(inttestvec n) { for (int d=0; d>= n.v[d]; return *this; } inttestvec& operator<<=(inttestvec n) { for (int d=0; d>(inttestvec n) const { inttestvec res = *this; return res >>= n; } inttestvec operator<<(inttestvec n) const { inttestvec res = *this; return res <<= n; } boolvec_t signbit() const { boolvec_t res; for (int d=0; d(inttestvec const& x) const { boolvec_t res; for (int d=0; d x.v[d]; return res; } boolvec_t operator>=(inttestvec const& x) const { boolvec_t res; for (int d=0; d= x.v[d]; return res; } }; 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); static char const* name() { static std::string name_; if (name_.empty()) { std::stringstream buf; buf << ""; name_ = buf.str(); } return name_.c_str(); } 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(realtestvec const& x) const { boolvec_t res; for (int d=0; d x.v[d]; return res; } boolvec_t operator>=(realtestvec const& x) const { boolvec_t res; for (int d=0; d= x.v[d]; return res; } realtestvec acos() const { return MF::vml_acos(*this); } realtestvec acosh() const { return MF::vml_acosh(*this); } realtestvec asin() const { return MF::vml_asin(*this); } realtestvec asinh() const { return MF::vml_asinh(*this); } realtestvec atan() const { return MF::vml_atan(*this); } realtestvec atan2(realtestvec y) const { return MF::vml_atan2(*this, y); } realtestvec atanh() const { return MF::vml_atanh(*this); } realtestvec cbrt() const { return MF::vml_cbrt(*this); } realtestvec ceil() const { return MF::vml_ceil(*this); } realtestvec copysign(realtestvec y) const { return MF::vml_copysign(*this, y); } realtestvec cos() const { return MF::vml_cos(*this); } realtestvec cosh() const { return MF::vml_cosh(*this); } realtestvec exp() const { return MF::vml_exp(*this); } realtestvec exp10() const { return MF::vml_exp10(*this); } realtestvec exp2() const { return MF::vml_exp2(*this); } realtestvec expm1() const { return MF::vml_expm1(*this); } realtestvec fabs() const { return MF::vml_fabs(*this); } realtestvec fdim(realtestvec y) const { return MF::vml_fdim(*this, y); } realtestvec floor() const { return MF::vml_floor(*this); } realtestvec fma(realtestvec y, realtestvec z) const { return MF::vml_fma(*this, y, z); } realtestvec fmax(realtestvec y) const { return MF::vml_fmax(*this, y); } realtestvec fmin(realtestvec y) const { return MF::vml_fmin(*this, y); } realtestvec fmod(realtestvec y) const { return MF::vml_fmod(*this, y); } realtestvec frexp(intvec_t* r) const { return MF::vml_frexp(*this, r); } realtestvec hypot(realtestvec 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); } realtestvec ldexp(int_t n) const { return MF::vml_ldexp(*this, n); } realtestvec ldexp(intvec_t n) const { return MF::vml_ldexp(*this, n); } realtestvec log() const { return MF::vml_log(*this); } realtestvec log10() const { return MF::vml_log10(*this); } realtestvec log1p() const { return MF::vml_log1p(*this); } realtestvec log2() const { return MF::vml_log2(*this); } realtestvec nextafter(realtestvec y) const { return MF::vml_nextafter(*this, y); } realtestvec pow(realtestvec y) const { return MF::vml_pow(*this, y); } realtestvec rcp() const { return MF::vml_rcp(*this); } realtestvec remainder(realtestvec y) const { return MF::vml_remainder(*this, y); } realtestvec rint() const { return MF::vml_rint(*this); } realtestvec round() const { return MF::vml_round(*this); } realtestvec rsqrt() const { return MF::vml_rsqrt(*this); } boolvec_t signbit() const { return MF::vml_signbit(*this); } realtestvec sin() const { return MF::vml_sin(*this); } realtestvec sinh() const { return MF::vml_sinh(*this); } realtestvec sqrt() const { return MF::vml_sqrt(*this); } realtestvec tan() const { return MF::vml_tan(*this); } realtestvec tanh() const { return MF::vml_tanh(*this); } realtestvec 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 booltestvec as_bool(inttestvec x) { return x.as_bool(); } template inline booltestvec convert_bool(inttestvec x) { return x.convert_bool(); } template inline realtestvec as_float(inttestvec x) { return x.as_float(); } template inline realtestvec convert_float(inttestvec x) { return x.convert_float(); } 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 booltestvec signbit(inttestvec x) { return x.signbit(); } // 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 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