Verified Commit 0bc28754 authored by Michael R. Crusoe's avatar Michael R. Crusoe 🏳️‍🌈
Browse files

update SIMDe to 37c74d3

parent 7115000b
Loading
Loading
Loading
Loading
+565 −187

File changed.

Preview size limit exceeded, changes collapsed.

+54 −23
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@
  HEDLEY_TINYC_VERSION_CHECK(0,9,24) || \
  HEDLEY_TI_VERSION_CHECK(8,1,0)
#  define SIMDE_ALIGN(alignment) __attribute__((aligned(alignment)))
#elif defined(_MSC_VER) && (!defined(_M_IX86) || defined(_M_AMD64))
#elif defined(_MSC_VER) && !(defined(_M_ARM) && !defined(_M_ARM64))
#  define SIMDE_ALIGN(alignment) __declspec(align(alignment))
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
#  define SIMDE_ALIGN(alignment) _Alignas(alignment)
@@ -50,22 +50,22 @@
#endif

#define simde_assert_aligned(alignment, val) \
  simde_assert_int(((uintptr_t) (val)) % (alignment), ==, 0)
  simde_assert_int(HEDLEY_REINTERPRET_CAST(const uintptr_t, (val)) % (alignment), ==, 0)

/* TODO: this should really do something like
   HEDLEY_STATIC_CAST(T, (simde_assert_int(alignment, v), v))
   but I need to think about how to handle it in all compilers...
   may end up moving to Hedley, too. */
#if HEDLEY_HAS_BUILTIN(__builtin_assume_aligned)
#  define SIMDE_CAST_ALIGN(alignment, T, v) ((T) __builtin_assume_aligned(v, alignment))
#  define SIMDE_CAST_ALIGN(alignment, T, v) HEDLEY_REINTERPRET_CAST(T, __builtin_assume_aligned(v, alignment))
#elif HEDLEY_HAS_WARNING("-Wcast-align")
#  define SIMDE_CAST_ALIGN(alignment, T, v) \
    HEDLEY_DIAGNOSTIC_PUSH \
    _Pragma("clang diagnostic ignored \"-Wcast-align\"") \
    ((T) (v)) \
    HEDLEY_REINTERPRET_CAST(T, (v)) \
    HEDLEY_DIAGNOSTIC_POP
#else
#  define SIMDE_CAST_ALIGN(alignment, T, v) ((T) (v))
#  define SIMDE_CAST_ALIGN(alignment, T, v) HEDLEY_REINTERPRET_CAST(T, (v))
#endif

#if HEDLEY_GCC_HAS_ATTRIBUTE(vector_size,4,6,0)
@@ -145,10 +145,21 @@
#  define SIMDE__END_DECLS HEDLEY_END_C_DECLS
#endif

#if HEDLEY_HAS_WARNING("-Wpedantic")
#  define SIMDE_DIAGNOSTIC_DISABLE_INT128 _Pragma("clang diagnostic ignored \"-Wpedantic\"")
#elif defined(HEDLEY_GCC_VERSION)
#  define SIMDE_DIAGNOSTIC_DISABLE_INT128 _Pragma("GCC diagnostic ignored \"-Wpedantic\"")
#else
#  define SIMDE_DIAGNOSTIC_DISABLE_INT128
#endif

#if defined(__SIZEOF_INT128__)
#  define SIMDE__HAVE_INT128
HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DIAGNOSTIC_DISABLE_INT128
typedef __int128 simde_int128;
typedef unsigned __int128 simde_uint128;
HEDLEY_DIAGNOSTIC_POP
#endif

/* TODO: we should at least make an attempt to detect the correct
@@ -211,7 +222,10 @@ HEDLEY_STATIC_ASSERT(sizeof(simde_float64) == 8, "Unable to find 64-bit floating
#if HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
#  define SIMDE__SHUFFLE_VECTOR(elem_size, vec_size, a, b, ...) __builtin_shufflevector(a, b, __VA_ARGS__)
#elif HEDLEY_GCC_HAS_BUILTIN(__builtin_shuffle,4,7,0) && !defined(__INTEL_COMPILER)
#  define SIMDE__SHUFFLE_VECTOR(elem_size, vec_size, a, b, ...) __builtin_shuffle(a, b, (int##elem_size##_t __attribute__((__vector_size__(vec_size)))) { __VA_ARGS__ })
#  define SIMDE__SHUFFLE_VECTOR(elem_size, vec_size, a, b, ...) (__extension__ ({ \
       int##elem_size##_t __attribute__((__vector_size__(vec_size))) simde_shuffle_ = { __VA_ARGS__ }; \
       __builtin_shuffle(a, b, simde_shuffle_); \
     }))
#endif

#if HEDLEY_GCC_HAS_BUILTIN(__builtin_convertvector,9,0,0)
@@ -222,12 +236,21 @@ HEDLEY_STATIC_ASSERT(sizeof(simde_float64) == 8, "Unable to find 64-bit floating
#  define SIMDE_CONVERT_FTOI(T,v) \
    HEDLEY_DIAGNOSTIC_PUSH \
    _Pragma("clang diagnostic ignored \"-Wbad-function-cast\"") \
    ((T) (v)) \
    HEDLEY_STATIC_CAST(T, (v)) \
    HEDLEY_DIAGNOSTIC_POP
#else
#  define SIMDE_CONVERT_FTOI(T,v) ((T) (v))
#endif


#if HEDLEY_HAS_WARNING("-Wfloat-equal")
#  define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL _Pragma("clang diagnostic ignored \"-Wfloat-equal\"")
#elif HEDLEY_GCC_VERSION_CHECK(3,0,0)
#  define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL _Pragma("GCC diagnostic ignored \"-Wfloat-equal\"")
#else
#  define SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL
#endif

/* Some algorithms are iterative, and fewer iterations means less
   accuracy.  Lower values here will result in faster, but less
   accurate, calculations for some functions. */
@@ -305,21 +328,29 @@ HEDLEY_STATIC_ASSERT(sizeof(simde_float64) == 8, "Unable to find 64-bit floating
#  endif
#endif

#if !defined(__cplusplus)
#define SIMDE_F64_ALL_SET   (((union { uint64_t u64; simde_float64 f64; }) { .u64 = ~UINT64_C(0x0) }).f64)
#define SIMDE_F64_ALL_UNSET (((union { uint64_t u64; simde_float64 f64; }) { .u64 =  UINT64_C(0x0) }).f64)
#define SIMDE_F32_ALL_SET   (((union { uint32_t u32; simde_float32 f32; }) { .u32 = ~UINT32_C(0x0) }).f32)
#define SIMDE_F32_ALL_UNSET (((union { uint32_t u32; simde_float32 f32; }) { .u32 =  UINT32_C(0x0) }).f32)
#else
static const union { uint64_t u64; simde_float64 f64; } simde_f64_all_set   = { .u64 = ~UINT64_C(0) };
static const union { uint64_t u64; simde_float64 f64; } simde_f64_all_unset = { .u64 =  UINT64_C(0) };
static const union { uint64_t u32; simde_float64 f32; } simde_f32_all_set   = { .u32 = ~UINT32_C(0) };
static const union { uint64_t u32; simde_float64 f32; } simde_f32_all_unset = { .u32 =  UINT32_C(0) };

#  define SIMDE_F64_ALL_SET   (simde_f64_all_set.f64)
#  define SIMDE_F64_ALL_UNSET (simde_f64_all_unset.f64)
#  define SIMDE_F32_ALL_SET   (simde_f32_all_set.f32)
#  define SIMDE_F32_ALL_UNSET (simde_f32_all_unset.f32)
#endif
HEDLEY_ALWAYS_INLINE static
simde_float32 simde_u32_to_f32(uint32_t val) {
  union {
    uint32_t u32;
    simde_float32 f32;
  } u;
  u.u32 = val;
  return u.f32;
}

HEDLEY_ALWAYS_INLINE static
simde_float64 simde_u64_to_f64(uint64_t val) {
  union {
    uint64_t u64;
    simde_float64 f64;
  } u;
  u.u64 = val;
  return u.f64;
}

#define SIMDE_F32_ALL_SET   (simde_u32_to_f32(~UINT32_C(0)))
#define SIMDE_F32_ALL_UNSET (simde_u32_to_f32( UINT32_C(0)))
#define SIMDE_F64_ALL_SET   (simde_u64_to_f64(~UINT64_C(0)))
#define SIMDE_F64_ALL_UNSET (simde_u64_to_f64( UINT64_C(0)))

#endif /* !defined(SIMDE_COMMON_H) */
+34 −29
Original line number Diff line number Diff line
@@ -1100,7 +1100,7 @@ simde_mm256_castpd_ps (simde__m256d a) {
#if defined(SIMDE_AVX_NATIVE)
  return SIMDE__M256_FROM_NATIVE(_mm256_castpd_ps(a.n));
#else
  return *((simde__m256*) &a);
  return *HEDLEY_REINTERPRET_CAST(simde__m256*, &a);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -1113,7 +1113,7 @@ simde_mm256_castpd_si256 (simde__m256d a) {
#if defined(SIMDE_AVX_NATIVE)
  return SIMDE__M256I_FROM_NATIVE(_mm256_castpd_si256(a.n));
#else
  return *((simde__m256i*) &a);
  return *HEDLEY_REINTERPRET_CAST(simde__m256i*, &a);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -1162,7 +1162,7 @@ simde_mm256_castps_pd (simde__m256 a) {
#if defined(SIMDE_AVX_NATIVE)
  return SIMDE__M256D_FROM_NATIVE(_mm256_castps_pd(a.n));
#else
  return *((simde__m256d*) &a);
  return *HEDLEY_REINTERPRET_CAST(simde__m256d*, &a);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -1175,7 +1175,7 @@ simde_mm256_castps_si256 (simde__m256 a) {
#if defined(SIMDE_AVX_NATIVE)
  return SIMDE__M256I_FROM_NATIVE(_mm256_castps_si256(a.n));
#else
  return *((simde__m256i*) &a);
  return *HEDLEY_REINTERPRET_CAST(simde__m256i*, &a);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -1260,7 +1260,7 @@ simde_mm256_castsi256_pd (simde__m256i a) {
#if defined(SIMDE_AVX_NATIVE)
  return SIMDE__M256D_FROM_NATIVE(_mm256_castsi256_pd(a.n));
#else
  return *((simde__m256d*) &a);
  return *HEDLEY_REINTERPRET_CAST(simde__m256d*, &a);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -1273,7 +1273,7 @@ simde_mm256_castsi256_ps (simde__m256i a) {
#if defined(SIMDE_AVX_NATIVE)
  return SIMDE__M256_FROM_NATIVE(_mm256_castsi256_ps(a.n));
#else
  return *((simde__m256*) &a);
  return *HEDLEY_REINTERPRET_CAST(simde__m256*, &a);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -1320,6 +1320,9 @@ simde_mm256_ceil_ps (simde__m256 a) {
#  define _mm256_ceil_ps(a) SIMDE__M256_TO_NATIVE(simde_mm256_ceil_ps(SIMDE__M256_FROM_NATIVE(a)))
#endif

HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DIAGNOSTIC_DISABLE_FLOAT_EQUAL

/* This implementation does not support signaling NaNs (yet?) */
SIMDE__FUNCTION_ATTRIBUTES
simde__m128d
@@ -2457,6 +2460,8 @@ simde_mm256_cmp_ps (simde__m256 a, simde__m256 b, const int imm8)
#  define _mm256_cmp_ps(a, b, imm8) SIMDE__M256_TO_NATIVE(simde_mm256_cmp_ps(SIMDE__M256_FROM_NATIVE(a), SIMDE__M256_FROM_NATIVE(b), imm8))
#endif

HEDLEY_DIAGNOSTIC_POP /* -Wfloat-equal */

SIMDE__FUNCTION_ATTRIBUTES
simde__m256d
simde_mm256_cvtepi32_pd (simde__m128i a) {
@@ -2467,7 +2472,7 @@ simde_mm256_cvtepi32_pd (simde__m128i a) {
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f64) / sizeof(r.f64[0])) ; i++) {
    r.f64[i] = (simde_float64) a.i32[i];
    r.f64[i] = HEDLEY_STATIC_CAST(simde_float64, a.i32[i]);
  }
#endif

@@ -2487,7 +2492,7 @@ simde_mm256_cvtepi32_ps (simde__m256i a) {
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f32) / sizeof(r.f32[0])) ; i++) {
    r.f32[i] = (simde_float32) a.i32[i];
    r.f32[i] = HEDLEY_STATIC_CAST(simde_float32, a.i32[i]);
  }
#endif

@@ -2527,7 +2532,7 @@ simde_mm256_cvtpd_ps (simde__m256d a) {
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f32) / sizeof(r.f32[0])) ; i++) {
    r.f32[i] = (simde_float32) a.f64[i];
    r.f32[i] = HEDLEY_STATIC_CAST(simde_float32, a.f64[i]);
  }
#endif

@@ -2984,7 +2989,7 @@ simde_mm256_load_pd (const double a[HEDLEY_ARRAY_PARAM(4)]) {
#if defined(SIMDE_AVX_NATIVE)
  r.n = _mm256_load_pd(a);
#else
  r = *SIMDE_CAST_ALIGN(32, simde__m256d*, a);
  r = *SIMDE_CAST_ALIGN(32, simde__m256d const*, a);
#endif

  return r;
@@ -3003,7 +3008,7 @@ simde_mm256_load_ps (const float a[HEDLEY_ARRAY_PARAM(8)]) {
#if defined(SIMDE_AVX_NATIVE)
  r.n = _mm256_load_ps(a);
#else
  r = *SIMDE_CAST_ALIGN(32, simde__m256*, a);
  r = *SIMDE_CAST_ALIGN(32, simde__m256 const*, a);
#endif

  return r;
@@ -3125,7 +3130,7 @@ simde_mm_maskload_pd (const simde_float64 mem_addr[HEDLEY_ARRAY_PARAM(4)], simde
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f64) / sizeof(r.f64[0])) ; i++) {
    r.i64[i] = ((int64_t*) mem_addr)[i] & (mask.i64[i] >> 63);
    r.i64[i] = HEDLEY_REINTERPRET_CAST(int64_t const*, mem_addr)[i] & (mask.i64[i] >> 63);
  }
#endif

@@ -3145,7 +3150,7 @@ simde_mm256_maskload_pd (const simde_float64 mem_addr[HEDLEY_ARRAY_PARAM(4)], si
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f64) / sizeof(r.f64[0])) ; i++) {
    r.i64[i] = ((int64_t*) mem_addr)[i] & (mask.i64[i] >> 63);
    r.i64[i] = HEDLEY_REINTERPRET_CAST(int64_t const*, mem_addr)[i] & (mask.i64[i] >> 63);
  }
#endif

@@ -3165,7 +3170,7 @@ simde_mm_maskload_ps (const simde_float32 mem_addr[HEDLEY_ARRAY_PARAM(4)], simde
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f32) / sizeof(r.f32[0])) ; i++) {
    r.i32[i] = ((int32_t*) mem_addr)[i] & (mask.i32[i] >> 31);
    r.i32[i] = HEDLEY_REINTERPRET_CAST(int32_t const*, mem_addr)[i] & (mask.i32[i] >> 31);
  }
#endif

@@ -3185,7 +3190,7 @@ simde_mm256_maskload_ps (const simde_float32 mem_addr[HEDLEY_ARRAY_PARAM(4)], si
#else
  SIMDE__VECTORIZE
  for (size_t i = 0 ; i < (sizeof(r.f32) / sizeof(r.f32[0])) ; i++) {
    r.i32[i] = ((int32_t*) mem_addr)[i] & (mask.i32[i] >> 31);
    r.i32[i] = HEDLEY_REINTERPRET_CAST(int32_t const*, mem_addr)[i] & (mask.i32[i] >> 31);
  }
#endif

@@ -3293,7 +3298,7 @@ simde_mm256_min_pd (simde__m256d a, simde__m256d b) {

#if defined(SIMDE_AVX_NATIVE)
  r.n = _mm256_min_pd(a.n,b.n);
#elif defined(SIMDE_SSE_NATIVE)
#elif defined(SIMDE_SSE2_NATIVE)
  r.m128d[0].n = _mm_min_pd(a.m128d[0].n, b.m128d[0].n);
  r.m128d[1].n = _mm_min_pd(a.m128d[1].n, b.m128d[1].n);
#else
@@ -3339,7 +3344,7 @@ simde_mm256_max_pd (simde__m256d a, simde__m256d b) {

#if defined(SIMDE_AVX_NATIVE)
  r.n = _mm256_max_pd(a.n,b.n);
#elif defined(SIMDE_SSE_NATIVE)
#elif defined(SIMDE_SSE2_NATIVE)
  r.m128d[0].n = _mm_max_pd(a.m128d[0].n, b.m128d[0].n);
  r.m128d[1].n = _mm_max_pd(a.m128d[1].n, b.m128d[1].n);
#else
@@ -3493,7 +3498,7 @@ simde_mm256_mul_pd (simde__m256d a, simde__m256d b) {

#if defined(SIMDE_AVX_NATIVE)
  r.n = _mm256_mul_pd(a.n,b.n);
#elif defined(SIMDE_SSE_NATIVE)
#elif defined(SIMDE_SSE2_NATIVE)
  r.m128d[0].n = _mm_mul_pd(a.m128d[0].n, b.m128d[0].n);
  r.m128d[1].n = _mm_mul_pd(a.m128d[1].n, b.m128d[1].n);
#elif defined(SIMDE__ENABLE_GCC_VEC_EXT)
@@ -3543,7 +3548,7 @@ simde_mm256_or_pd (simde__m256d a, simde__m256d b) {

#if defined(SIMDE_AVX_NATIVE)
  r.n = _mm256_or_pd(a.n,b.n);
#elif defined(SIMDE_SSE_NATIVE)
#elif defined(SIMDE_SSE2_NATIVE)
  r.m128d[0].n = _mm_or_pd(a.m128d[0].n, b.m128d[0].n);
  r.m128d[1].n = _mm_or_pd(a.m128d[1].n, b.m128d[1].n);
#elif defined(SIMDE__ENABLE_GCC_VEC_EXT)
@@ -4688,7 +4693,7 @@ simde_mm_testc_ps (simde__m128 a, simde__m128 b) {
    r |= ~a.u32[i] & b.u32[i];
  }

  return (int) ((~r >> 31) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 31) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4708,7 +4713,7 @@ simde_mm_testc_pd (simde__m128d a, simde__m128d b) {
    r |= ~a.u64[i] & b.u64[i];
  }

  return (int) ((~r >> 63) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 63) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4728,7 +4733,7 @@ simde_mm256_testc_ps (simde__m256 a, simde__m256 b) {
    r |= ~a.u32[i] & b.u32[i];
  }

  return (int) ((~r >> 31) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 31) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4748,7 +4753,7 @@ simde_mm256_testc_pd (simde__m256d a, simde__m256d b) {
    r |= ~a.u64[i] & b.u64[i];
  }

  return (int) ((~r >> 63) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 63) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4768,7 +4773,7 @@ simde_mm256_testc_si256 (simde__m256i a, simde__m256i b) {
    r |= ~a.i32f[i] & b.i32f[i];
  }

  return (int) !r;
  return HEDLEY_STATIC_CAST(int, !r);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4788,7 +4793,7 @@ simde_mm_testz_ps (simde__m128 a, simde__m128 b) {
    r |= a.u32[i] & b.u32[i];
  }

  return (int) ((~r >> 31) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 31) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4808,7 +4813,7 @@ simde_mm_testz_pd (simde__m128d a, simde__m128d b) {
    r |= a.u64[i] & b.u64[i];
  }

  return (int) ((~r >> 63) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 63) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4828,7 +4833,7 @@ simde_mm256_testz_ps (simde__m256 a, simde__m256 b) {
    r |= a.u32[i] & b.u32[i];
  }

  return (int) ((~r >> 31) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 31) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4848,7 +4853,7 @@ simde_mm256_testz_pd (simde__m256d a, simde__m256d b) {
    r |= a.u64[i] & b.u64[i];
  }

  return (int) ((~r >> 63) & 1);
  return HEDLEY_STATIC_CAST(int, ((~r >> 63) & 1));
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
@@ -4868,7 +4873,7 @@ simde_mm256_testz_si256 (simde__m256i a, simde__m256i b) {
    r |= a.i32f[i] & b.i32f[i];
  }

  return (int) !r;
  return HEDLEY_STATIC_CAST(int, !r);
#endif
}
#if defined(SIMDE_AVX_ENABLE_NATIVE_ALIASES)
+40 −11
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@

#  if defined(SIMDE_MMX_FORCE_NATIVE)
#    define SIMDE_MMX_NATIVE
#  elif defined(__MMX__) && !defined(SIMDE_MMX_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#  elif (defined(__MMX__) || (defined(_MSC_VER) && defined(_M_IX86))) && !defined(SIMDE_MMX_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#    define SIMDE_MMX_NATIVE
#  elif defined(__ARM_NEON) && !defined(SIMDE_MMX_NO_NEON) && !defined(SIMDE_NO_NEON)
#    define SIMDE_MMX_NEON
@@ -101,6 +101,13 @@ typedef union {
#endif
HEDLEY_STATIC_ASSERT(8 == sizeof(simde__m64), "__m64 size incorrect");

HEDLEY_DIAGNOSTIC_PUSH

/* Function has no EMMS instruction */
#if defined(HEDLEY_MSVC_VERSION)
#pragma warning(disable:4799)
#endif

#if defined(SIMDE_MMX_NATIVE)
   SIMDE__FUNCTION_ATTRIBUTES simde__m64 SIMDE__M64_FROM_NATIVE(__m64 v) { simde__m64 r; r.n = v; return r; }
#  define SIMDE__M64_TO_NATIVE(v) (v.n)
@@ -721,11 +728,19 @@ simde_mm_set_pi8 (int8_t e7, int8_t e6, int8_t e5, int8_t e4, int8_t e3, int8_t
SIMDE__FUNCTION_ATTRIBUTES
simde__m64
simde_x_mm_set_pu8 (uint8_t e7, uint8_t e6, uint8_t e5, uint8_t e4, uint8_t e3, uint8_t e2, uint8_t e1, uint8_t e0) {
  simde__m64 r;

#if defined(SIMDE_MMX_NATIVE)
  return SIMDE__M64_FROM_NATIVE(_mm_set_pi8((int8_t) e7, (int8_t) e6, (int8_t) e5, (int8_t) e4,
				  (int8_t) e3, (int8_t) e2, (int8_t) e1, (int8_t) e0));
  r.n = _mm_set_pi8(
      HEDLEY_STATIC_CAST(int8_t, e7),
      HEDLEY_STATIC_CAST(int8_t, e6),
      HEDLEY_STATIC_CAST(int8_t, e5),
      HEDLEY_STATIC_CAST(int8_t, e4),
      HEDLEY_STATIC_CAST(int8_t, e3),
      HEDLEY_STATIC_CAST(int8_t, e2),
      HEDLEY_STATIC_CAST(int8_t, e1),
      HEDLEY_STATIC_CAST(int8_t, e0));
#else
  simde__m64 r;
  r.u8[0] = e0;
  r.u8[1] = e1;
  r.u8[2] = e2;
@@ -734,8 +749,9 @@ simde_x_mm_set_pu8 (uint8_t e7, uint8_t e6, uint8_t e5, uint8_t e4, uint8_t e3,
  r.u8[5] = e5;
  r.u8[6] = e6;
  r.u8[7] = e7;
  return r;
#endif

  return r;
}

SIMDE__FUNCTION_ATTRIBUTES
@@ -759,29 +775,40 @@ simde_mm_set_pi16 (int16_t e3, int16_t e2, int16_t e1, int16_t e0) {
SIMDE__FUNCTION_ATTRIBUTES
simde__m64
simde_x_mm_set_pu16 (uint16_t e3, uint16_t e2, uint16_t e1, uint16_t e0) {
  simde__m64 r;

#if defined(SIMDE_MMX_NATIVE)
  return SIMDE__M64_FROM_NATIVE(_mm_set_pi16((int16_t) e3, (int16_t) e2, (int16_t) e1, (int16_t) e0));
  r.n = _mm_set_pi16(
      HEDLEY_STATIC_CAST(int16_t, e3),
      HEDLEY_STATIC_CAST(int16_t, e2),
      HEDLEY_STATIC_CAST(int16_t, e1),
      HEDLEY_STATIC_CAST(int16_t, e0)
    );
#else
  simde__m64 r;
  r.u16[0] = e0;
  r.u16[1] = e1;
  r.u16[2] = e2;
  r.u16[3] = e3;
  return r;
#endif

  return r;
}

SIMDE__FUNCTION_ATTRIBUTES
simde__m64
simde_x_mm_set_pu32 (uint32_t e1, uint32_t e0) {
  simde__m64 r;

#if defined(SIMDE_MMX_NATIVE)
  return SIMDE__M64_FROM_NATIVE(_mm_set_pi32((int32_t) e1, (int32_t) e0));
  r.n = _mm_set_pi32(
      HEDLEY_STATIC_CAST(int32_t, e1),
      HEDLEY_STATIC_CAST(int32_t, e0));
#else
  simde__m64 r;
  r.u32[0] = e0;
  r.u32[1] = e1;
  return r;
#endif

  return r;
}

SIMDE__FUNCTION_ATTRIBUTES
@@ -1574,6 +1601,8 @@ simde_m_to_int (simde__m64 a) {
#  define _m_to_int(a) simde_m_to_int(SIMDE__M64_FROM_NATIVE(a))
#endif

HEDLEY_DIAGNOSTIC_POP

SIMDE__END_DECLS

#endif /* !defined(SIMDE__MMX_H) */
+6 −2
Original line number Diff line number Diff line
@@ -38,6 +38,10 @@
#    define SIMDE_SSE_NATIVE
#  elif defined(__SSE__) && !defined(SIMDE_SSE_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#    define SIMDE_SSE_NATIVE
#  elif defined(_M_IX86_FP) && !defined(SIMDE_SSE_NO_NATIVE) && !defined(SIMDE_NO_NATIVE)
#    if (_M_IX86_FP >= 1)
#      define SIMDE_SSE_NATIVE
#    endif
#  elif defined(__ARM_NEON) && !defined(SIMDE_SSE_NO_NEON) && !defined(SIMDE_NO_NEON)
#    define SIMDE_SSE_NEON
#  endif
@@ -1584,7 +1588,7 @@ simde_mm_loadh_pi (simde__m128 a, simde__m64 const* mem_addr) {
  simde__m128 r;

#if defined(SIMDE_SSE_NATIVE)
  r.n = _mm_loadh_pi(a.n, (__m64*) mem_addr);
  r.n = _mm_loadh_pi(a.n, HEDLEY_REINTERPRET_CAST(__m64 const*, mem_addr));
#else
  r.f32[0] = a.f32[0];
  r.f32[1] = a.f32[1];
@@ -1604,7 +1608,7 @@ simde_mm_loadl_pi (simde__m128 a, simde__m64 const* mem_addr) {
  simde__m128 r;

#if defined(SIMDE_SSE_NATIVE)
  r.n = _mm_loadl_pi(a.n, (__m64*) mem_addr);
  r.n = _mm_loadl_pi(a.n, HEDLEY_REINTERPRET_CAST(__m64 const*, mem_addr));
#else
  r.f32[0] = mem_addr->f32[0];
  r.f32[1] = mem_addr->f32[1];
Loading