Browse Source

simd improvements.

tags/v1.0.0
Andrew Belt 6 years ago
parent
commit
266a0701a3
1 changed files with 26 additions and 25 deletions
  1. +26
    -25
      include/simd.hpp

+ 26
- 25
include/simd.hpp View File

@@ -1,9 +1,7 @@
#include <x86intrin.h> #include <x86intrin.h>




#define ALIGN(n) __attribute__((aligned(n)))


namespace rack {
namespace simd { namespace simd {




@@ -18,9 +16,8 @@ struct f32<4> {


f32<4>() {} f32<4>() {}
f32<4>(__m128 v) : v(v) {} f32<4>(__m128 v) : v(v) {}
template <typename T>
f32<4>(T x) {
v = _mm_set_ps1((float) x);
f32<4>(float x) {
v = _mm_set_ps1(x);
} }
/** Reads an array of 4 values */ /** Reads an array of 4 values */
f32<4>(const float *x) { f32<4>(const float *x) {
@@ -33,19 +30,22 @@ struct f32<4> {
}; };




typedef f32<4> f32_4;


// Operator overloads // Operator overloads


#define DECLARE_F32_4_OPERATOR_INFIX(operator, func) \ #define DECLARE_F32_4_OPERATOR_INFIX(operator, func) \
inline f32<4> operator(f32<4> a, f32<4> b) { \
return f32<4>(func(a.v, b.v)); \
inline f32_4 operator(f32_4 a, f32_4 b) { \
return f32_4(func(a.v, b.v)); \
} \ } \
template <typename T> \ template <typename T> \
f32<4> operator(T a, f32<4> b) { \
return operator(f32<4>(a), b); \
f32_4 operator(T a, f32_4 b) { \
return operator(f32_4(a), b); \
} \ } \
template <typename T> \ template <typename T> \
f32<4> operator(f32<4> a, T b) { \
return operator(a, f32<4>(b)); \
f32_4 operator(f32_4 a, T b) { \
return operator(a, f32_4(b)); \
} }


DECLARE_F32_4_OPERATOR_INFIX(operator+, _mm_add_ps) DECLARE_F32_4_OPERATOR_INFIX(operator+, _mm_add_ps)
@@ -60,13 +60,13 @@ DECLARE_F32_4_OPERATOR_INFIX(operator<, _mm_cmplt_ps)
DECLARE_F32_4_OPERATOR_INFIX(operator!=, _mm_cmpneq_ps) DECLARE_F32_4_OPERATOR_INFIX(operator!=, _mm_cmpneq_ps)


#define DECLARE_F32_4_OPERATOR_INCREMENT(operator, func) \ #define DECLARE_F32_4_OPERATOR_INCREMENT(operator, func) \
inline f32<4> &operator(f32<4> &a, f32<4> b) { \
inline f32_4 &operator(f32_4 &a, f32_4 b) { \
a.v = func(a.v, b.v); \ a.v = func(a.v, b.v); \
return a; \ return a; \
} \ } \
template <typename T> \ template <typename T> \
f32<4> &operator(f32<4> &a, T b) { \
return operator(a, f32<4>(b)); \
f32_4 &operator(f32_4 &a, T b) { \
return operator(a, f32_4(b)); \
} }


DECLARE_F32_4_OPERATOR_INCREMENT(operator+=, _mm_add_ps); DECLARE_F32_4_OPERATOR_INCREMENT(operator+=, _mm_add_ps);
@@ -75,30 +75,31 @@ DECLARE_F32_4_OPERATOR_INCREMENT(operator*=, _mm_mul_ps);
DECLARE_F32_4_OPERATOR_INCREMENT(operator/=, _mm_div_ps); DECLARE_F32_4_OPERATOR_INCREMENT(operator/=, _mm_div_ps);




inline f32<4> rsqrt(f32<4> a) {
return f32<4>(_mm_rsqrt_ps(a.v));
inline f32_4 rsqrt(f32_4 a) {
return f32_4(_mm_rsqrt_ps(a.v));
} }


inline f32<4> rcp(f32<4> a) {
return f32<4>(_mm_rcp_ps(a.v));
inline f32_4 rcp(f32_4 a) {
return f32_4(_mm_rcp_ps(a.v));
} }




} // namespace simd } // namespace simd
} // namespace rack




namespace std { namespace std {


inline simd::f32<4> max(simd::f32<4> a, simd::f32<4> b) {
return simd::f32<4>(_mm_max_ps(a.v, b.v));
inline rack::simd::f32_4 max(rack::simd::f32_4 a, rack::simd::f32_4 b) {
return rack::simd::f32_4(_mm_max_ps(a.v, b.v));
} }


inline simd::f32<4> min(simd::f32<4> a, simd::f32<4> b) {
return simd::f32<4>(_mm_min_ps(a.v, b.v));
inline rack::simd::f32_4 min(rack::simd::f32_4 a, rack::simd::f32_4 b) {
return rack::simd::f32_4(_mm_min_ps(a.v, b.v));
} }


inline simd::f32<4> sqrt(simd::f32<4> a) {
return simd::f32<4>(_mm_sqrt_ps(a.v));
inline rack::simd::f32_4 sqrt(rack::simd::f32_4 a) {
return rack::simd::f32_4(_mm_sqrt_ps(a.v));
} }


} // namespace std } // namespace std


Loading…
Cancel
Save