1#ifndef AMPGEN_AVX_TYPES
2#define AMPGEN_AVX_TYPES 1
13 extern "C" void _ZGVdN8vvv_sincos(__m256 x, __m256i ptrs, __m256i ptrc);
14#define libmvec_alias(F, O) \
15 extern "C" __m256 _ZGVcN8v_##F(__m256 x); \
16 inline real_v O( const real_v& v ){ return _ZGVcN8v_##F(v) ; }
18#define libmvec_alias(F, O) \
19 inline real_v O( const real_v& v ){ auto arr = v.to_ptr(); return real_v( \
20 std::F(arr[0]), std::F(arr[1]), std::F(arr[2]), std::F(arr[3]), \
21 std::F(arr[4]), std::F(arr[5]), std::F(arr[6]), std::F(arr[7]) ) ; }
28 static constexpr unsigned size = 8 ;
39 data = _mm256_set_ps(x7,x6,x5,x4,x3,x2,x1,x0);
43 std::array<scalar_type, 8>
to_array()
const { std::array<scalar_type, 8> b;
store( &b[0] );
return b; }
47 operator __m256()
const {
return data ; }
52 inline __m256i
to_int()
const {
return _mm256_cvtps_epi32(
data); }
72 inline real_v real_v::operator+=(
const real_v& rhs ){ *
this = *
this + rhs;
return *
this; }
73 inline real_v real_v::operator-=(
const real_v& rhs ){ *
this = *
this - rhs;
return *
this; }
74 inline real_v real_v::operator*=(
const real_v& rhs ){ *
this = *
this * rhs;
return *
this; }
75 inline real_v real_v::operator/=(
const real_v& rhs ){ *
this = *
this / rhs;
return *
this; }
80 inline std::array<int32_t,
real_v::size>
store( const __m256i& v )
82 alignas(32) std::array<int32_t, real_v::size> rt;
83 _mm256_store_si256( (__m256i*)&rt[0], v);
94 std::pair<real_v, real_v> rt;
95 sincos( v, rt.first, rt.second );
104 inline real_v abs (
const real_v& v ) {
return v & _mm256_castsi256_ps( _mm256_set1_epi32( 0x7FFFFFFF ) ); }
111 const auto* bx = x.
to_ptr();
112 const auto* by = y.
to_ptr();
114 for(
unsigned i = 0 ; i != real_v::size ; ++i ) rt.
to_ptr()[i] = std::atan2( by[i] , bx[i] );
120 std::array<float, real_v::size> tmp;
123 for(
int i = 0 ; i != real_v::size; ++i ) tmp[i] = real_v::scalar_type( base_addr[ptr[i]] );
124 return real_v( tmp.data() );
130 return select( a > 0., r, -r );
135 for(
unsigned i = 0 ; i != real_v::size; ++i ) os << buffer[i] <<
" ";
144 #pragma omp declare reduction(+: real_v: \
145 omp_out = omp_out + omp_in)
146 #pragma omp declare reduction(+: complex_v: \
147 omp_out = omp_out + omp_in)
real_v operator&(const real_v &lhs, const real_v &rhs)
real_v operator-(const real_v &lhs, const real_v &rhs)
real_v sqrt(const real_v &v)
real_v operator+(const real_v &lhs, const real_v &rhs)
real_v operator||(const real_v &lhs, const real_v &rhs)
real_v abs(const real_v &v)
void sincos(const real_v &v, real_v &s, real_v &c)
real_v operator==(const real_v &lhs, const real_v &rhs)
real_v fmadd(const real_v &a, const real_v &b, const real_v &c)
real_v select(const real_v &mask, const real_v &a, const real_v &b)
real_v operator/(const real_v &lhs, const real_v &rhs)
real_v sin(const real_v &v)
real_v fmod(const real_v &a, const real_v &b)
Complex< real_v > complex_v
real_v tan(const real_v &v)
real_v operator>=(const real_v &lhs, const real_v &rhs)
real_v operator!(const real_v &x)
real_v operator^(const real_v &lhs, const real_v &rhs)
std::array< int32_t, real_v::size > store(const __m256i &v)
real_v operator*(const real_v &lhs, const real_v &rhs)
std::ostream & operator<<(std::ostream &os, const real_v &obj)
real_v exp(const real_v &v)
real_v operator|(const real_v &lhs, const real_v &rhs)
real_v cos(const real_v &v)
real_v operator>(const real_v &lhs, const real_v &rhs)
real_v log(const real_v &v)
real_v gather(const double *base_addr, const real_v &offsets)
real_v operator<(const real_v &lhs, const real_v &rhs)
real_v remainder(const real_v &a, const real_v &b)
real_v operator&&(const real_v &lhs, const real_v &rhs)
real_v sign(const real_v &v)
real_v atan2(const real_v &y, const real_v &x)
real_v operator<=(const real_v &lhs, const real_v &rhs)
real_v operator/=(const real_v &rhs)
real_v operator+=(const real_v &rhs)
const scalar_type * to_ptr() const
real_v(const scalar_type &f)
real_v(const scalar_type &x0, const scalar_type &x1, const scalar_type &x2, const scalar_type &x3, const scalar_type &x4, const scalar_type &x5, const scalar_type &x6, const scalar_type &x7)
scalar_type at(const unsigned i) const
void store(scalar_type *ptr) const
std::array< scalar_type, 8 > to_array() const
real_v operator*=(const real_v &rhs)
real_v(const scalar_type *f)
real_v operator-=(const real_v &rhs)
static constexpr unsigned size