1#ifndef AMPGEN_ARM128d_TYPES
2#define AMPGEN_ARM128d_TYPES 1
15extern "C" void _ZGVdN4vvv_sincos(__m256d x, __m256i ptrs, __m256i ptrc);
16#define libmvec_alias( function_name) \
17 extern "C" __m256d _ZGVcN4v_##function_name(__m256d x); \
18inline real_v function_name( const real_v& v ){ return _ZGVcN4v_##function_name (v) ; }
20#define libmvec_alias( F ) \
21 inline real_v F( const real_v& v ){ auto arr = v.to_ptr(); return real_v( std::F(arr[0]), std::F(arr[1]) ); }
29 static constexpr unsigned size = 2;
42 real_v(
const std::array<scalar_type, size> f ) :
data( vld1q_f64( f.
data() ) ) {}
46 std::array<scalar_type, size>
to_array()
const { std::array<scalar_type, size> b;
store( &b[0] );
return b; }
48 double at(
const unsigned i)
const {
return to_ptr()[i]; }
49 operator float64x2_t()
const {
return data ; }
78 inline real_v real_v::operator+=(
const real_v& rhs ){ *
this = *
this + rhs;
return *
this; }
79 inline real_v real_v::operator-=(
const real_v& rhs ){ *
this = *
this - rhs;
return *
this; }
80 inline real_v real_v::operator*=(
const real_v& rhs ){ *
this = *
this * rhs;
return *
this; }
81 inline real_v real_v::operator/=(
const real_v& rhs ){ *
this = *
this / rhs;
return *
this; }
93 std::pair<real_v, real_v> rt;
94 sincos( v, rt.first, rt.second );
102 inline std::array<uint64_t, real_v::size>
store(
const int_v& v )
104 std::array<uint64_t, real_v::size> rt;
105 vst1q_u64( rt.data(), v );
113 const double* bx = x.
to_ptr();
114 const double* by = y.
to_ptr();
115 return real_v ( std::atan2(by[0], bx[0]), std::atan2( by[1], bx[1]) );
119 std::array<int64_t, real_v::size> offsets_p;
120 vst1q_s64( offsets_p.data(), offsets.
to_int() );
121 return real_v ( base_addr[offsets_p[0]], base_addr[offsets_p[1]] );
125 return vmlaq_f64(a, b, c);
132 for(
unsigned i = 0 ; i != 4; ++i ) os << data[i] <<
" ";
Complex< real_v > complex_v
void sincos(const real_v &v, real_v &s, real_v &c)
real_v tan(const real_v &v)
int_v operator==(const real_v &lhs, const real_v &rhs)
real_v operator+(const real_v &lhs, const real_v &rhs)
int_v operator>(const real_v &lhs, const real_v &rhs)
real_v sin(const real_v &v)
std::array< uint64_t, real_v::size > store(const int_v &v)
int_v operator<=(const real_v &lhs, const real_v &rhs)
real_v atan2(const real_v &y, const real_v &x)
real_v remainder(const real_v &a, const real_v &b)
int_v operator&&(const int_v &lhs, const int_v &rhs)
real_v operator/(const real_v &lhs, const real_v &rhs)
real_v conj(const real_v &arg)
real_v operator*(const real_v &lhs, const real_v &rhs)
real_v fmod(const real_v &a, const real_v &b)
real_v sign(const real_v &v)
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 select(const int_v &mask, const real_v &a, const real_v &b)
int_v operator<(const real_v &lhs, const real_v &rhs)
int_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 sqrt(const real_v &v)
real_v abs(const real_v &v)
std::ostream & operator<<(std::ostream &os, const real_v &obj)
int_v operator||(const int_v &lhs, const int_v &rhs)
real_v exp(const real_v &v)
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)
void store(scalar_type *ptr) const
real_v operator/=(const real_v &rhs)
real_v operator-=(const real_v &rhs)
static constexpr unsigned size
real_v operator*=(const real_v &rhs)
real_v(const std::array< scalar_type, size > f)
real_v(const scalar_type *f)
std::array< scalar_type, size > to_array() const
double at(const unsigned i) const
real_v(uint64x2_t &&data)