59#ifndef SSE2NEON_PRECISE_MINMAX
60#define SSE2NEON_PRECISE_MINMAX (0)
63#ifndef SSE2NEON_PRECISE_DIV
64#define SSE2NEON_PRECISE_DIV (0)
67#ifndef SSE2NEON_PRECISE_SQRT
68#define SSE2NEON_PRECISE_SQRT (0)
71#ifndef SSE2NEON_PRECISE_DP
72#define SSE2NEON_PRECISE_DP (0)
76#if defined(__GNUC__) || defined(__clang__)
77#pragma push_macro("FORCE_INLINE")
78#pragma push_macro("ALIGN_STRUCT")
79#define FORCE_INLINE static inline __attribute__((always_inline))
80#define ALIGN_STRUCT(x) __attribute__((aligned(x)))
81#define _sse2neon_likely(x) __builtin_expect(!!(x), 1)
82#define _sse2neon_unlikely(x) __builtin_expect(!!(x), 0)
84#warning "Macro name collisions may happen with unsupported compiler."
86#define FORCE_INLINE static inline
89#define ALIGN_STRUCT(x) __declspec(align(x))
91#define _sse2neon_likely(x) (x)
92#define _sse2neon_unlikely(x) (x)
97#define _sse2neon_const static const
99#define _sse2neon_const const
109#define SSE2NEON_ALLOC_DEFINED
115#if (defined(_M_AMD64) || defined(__x86_64__)) || \
116 (defined(_M_ARM) || defined(__arm__))
117#define SSE2NEON_HAS_BITSCAN64
122#define SSE2NEON_BARRIER() \
124 __asm__ __volatile__("" ::: "memory"); \
133#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
134#include <stdatomic.h>
140#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
141 !defined(__STDC_NO_ATOMICS__)
142 atomic_thread_fence(memory_order_seq_cst);
143#elif defined(__GNUC__) || defined(__clang__)
144 __atomic_thread_fence(__ATOMIC_SEQ_CST);
153#if defined(__arm__) && __ARM_ARCH == 7
158#if !defined(__ARM_NEON) || !defined(__ARM_NEON__)
159#error "You must enable NEON instructions (e.g. -mfpu=neon) to use SSE2NEON."
161#if !defined(__clang__)
162#pragma GCC push_options
163#pragma GCC target("fpu=neon")
165#elif defined(__aarch64__)
166#if !defined(__clang__)
167#pragma GCC push_options
168#pragma GCC target("+simd")
171#if !defined(__ARM_NEON) || !defined(__ARM_NEON__)
173 "You must enable NEON instructions (e.g. -mfpu=neon-fp-armv8) to use SSE2NEON."
175#if !defined(__clang__)
176#pragma GCC push_options
179#error "Unsupported target. Must be either ARMv7-A+NEON or ARMv8-A."
184#if !defined(__aarch64__) && (__ARM_ARCH == 8)
185#if defined __has_include && __has_include(<arm_acle.h>)
195#if defined(__APPLE__) && (defined(__aarch64__) || defined(__arm64__))
196#define SSE2NEON_CACHELINE_SIZE 128
198#define SSE2NEON_CACHELINE_SIZE 64
202#if !defined(__aarch64__)
211#if !defined(__aarch64__)
220#if defined(__GNUC__) && (__GNUC__ <= 9)
221#define __has_builtin(x) HAS##x
222#define HAS__builtin_popcount 1
223#define HAS__builtin_popcountll 1
226#if (__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))
227#define HAS__builtin_shuffle 1
229#define HAS__builtin_shuffle 0
232#define HAS__builtin_shufflevector 0
233#define HAS__builtin_nontemporal_store 0
235#define __has_builtin(x) 0
247#define _MM_SHUFFLE(fp3, fp2, fp1, fp0) \
248 (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0)))
250#if __has_builtin(__builtin_shufflevector)
251#define _sse2neon_shuffle(type, a, b, ...) \
252 __builtin_shufflevector(a, b, __VA_ARGS__)
253#elif __has_builtin(__builtin_shuffle)
254#define _sse2neon_shuffle(type, a, b, ...) \
256 type tmp = {__VA_ARGS__}; \
257 __builtin_shuffle(a, b, tmp); \
261#ifdef _sse2neon_shuffle
262#define vshuffle_s16(a, b, ...) _sse2neon_shuffle(int16x4_t, a, b, __VA_ARGS__)
263#define vshuffleq_s16(a, b, ...) _sse2neon_shuffle(int16x8_t, a, b, __VA_ARGS__)
264#define vshuffle_s32(a, b, ...) _sse2neon_shuffle(int32x2_t, a, b, __VA_ARGS__)
265#define vshuffleq_s32(a, b, ...) _sse2neon_shuffle(int32x4_t, a, b, __VA_ARGS__)
266#define vshuffle_s64(a, b, ...) _sse2neon_shuffle(int64x1_t, a, b, __VA_ARGS__)
267#define vshuffleq_s64(a, b, ...) _sse2neon_shuffle(int64x2_t, a, b, __VA_ARGS__)
271#define _MM_FROUND_TO_NEAREST_INT 0x00
272#define _MM_FROUND_TO_NEG_INF 0x01
273#define _MM_FROUND_TO_POS_INF 0x02
274#define _MM_FROUND_TO_ZERO 0x03
275#define _MM_FROUND_CUR_DIRECTION 0x04
276#define _MM_FROUND_NO_EXC 0x08
277#define _MM_FROUND_RAISE_EXC 0x00
278#define _MM_FROUND_NINT (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_RAISE_EXC)
279#define _MM_FROUND_FLOOR (_MM_FROUND_TO_NEG_INF | _MM_FROUND_RAISE_EXC)
280#define _MM_FROUND_CEIL (_MM_FROUND_TO_POS_INF | _MM_FROUND_RAISE_EXC)
281#define _MM_FROUND_TRUNC (_MM_FROUND_TO_ZERO | _MM_FROUND_RAISE_EXC)
282#define _MM_FROUND_RINT (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_RAISE_EXC)
283#define _MM_FROUND_NEARBYINT (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_NO_EXC)
284#define _MM_ROUND_NEAREST 0x0000
285#define _MM_ROUND_DOWN 0x2000
286#define _MM_ROUND_UP 0x4000
287#define _MM_ROUND_TOWARD_ZERO 0x6000
289#define _MM_FLUSH_ZERO_MASK 0x8000
290#define _MM_FLUSH_ZERO_ON 0x8000
291#define _MM_FLUSH_ZERO_OFF 0x0000
293#define _MM_DENORMALS_ZERO_MASK 0x0040
294#define _MM_DENORMALS_ZERO_ON 0x0040
295#define _MM_DENORMALS_ZERO_OFF 0x0000
298#define __constrange(a, b) const
311#if defined(__aarch64__)
320#if !(defined(_WIN32) || defined(_WIN64) || defined(__int64))
321#if (defined(__x86_64__) || defined(__i386__))
322#define __int64 long long
324#define __int64 int64_t
330#define vreinterpretq_m128_f16(x) vreinterpretq_f32_f16(x)
331#define vreinterpretq_m128_f32(x) (x)
332#define vreinterpretq_m128_f64(x) vreinterpretq_f32_f64(x)
334#define vreinterpretq_m128_u8(x) vreinterpretq_f32_u8(x)
335#define vreinterpretq_m128_u16(x) vreinterpretq_f32_u16(x)
336#define vreinterpretq_m128_u32(x) vreinterpretq_f32_u32(x)
337#define vreinterpretq_m128_u64(x) vreinterpretq_f32_u64(x)
339#define vreinterpretq_m128_s8(x) vreinterpretq_f32_s8(x)
340#define vreinterpretq_m128_s16(x) vreinterpretq_f32_s16(x)
341#define vreinterpretq_m128_s32(x) vreinterpretq_f32_s32(x)
342#define vreinterpretq_m128_s64(x) vreinterpretq_f32_s64(x)
344#define vreinterpretq_f16_m128(x) vreinterpretq_f16_f32(x)
345#define vreinterpretq_f32_m128(x) (x)
346#define vreinterpretq_f64_m128(x) vreinterpretq_f64_f32(x)
348#define vreinterpretq_u8_m128(x) vreinterpretq_u8_f32(x)
349#define vreinterpretq_u16_m128(x) vreinterpretq_u16_f32(x)
350#define vreinterpretq_u32_m128(x) vreinterpretq_u32_f32(x)
351#define vreinterpretq_u64_m128(x) vreinterpretq_u64_f32(x)
353#define vreinterpretq_s8_m128(x) vreinterpretq_s8_f32(x)
354#define vreinterpretq_s16_m128(x) vreinterpretq_s16_f32(x)
355#define vreinterpretq_s32_m128(x) vreinterpretq_s32_f32(x)
356#define vreinterpretq_s64_m128(x) vreinterpretq_s64_f32(x)
358#define vreinterpretq_m128i_s8(x) vreinterpretq_s64_s8(x)
359#define vreinterpretq_m128i_s16(x) vreinterpretq_s64_s16(x)
360#define vreinterpretq_m128i_s32(x) vreinterpretq_s64_s32(x)
361#define vreinterpretq_m128i_s64(x) (x)
363#define vreinterpretq_m128i_u8(x) vreinterpretq_s64_u8(x)
364#define vreinterpretq_m128i_u16(x) vreinterpretq_s64_u16(x)
365#define vreinterpretq_m128i_u32(x) vreinterpretq_s64_u32(x)
366#define vreinterpretq_m128i_u64(x) vreinterpretq_s64_u64(x)
368#define vreinterpretq_f32_m128i(x) vreinterpretq_f32_s64(x)
369#define vreinterpretq_f64_m128i(x) vreinterpretq_f64_s64(x)
371#define vreinterpretq_s8_m128i(x) vreinterpretq_s8_s64(x)
372#define vreinterpretq_s16_m128i(x) vreinterpretq_s16_s64(x)
373#define vreinterpretq_s32_m128i(x) vreinterpretq_s32_s64(x)
374#define vreinterpretq_s64_m128i(x) (x)
376#define vreinterpretq_u8_m128i(x) vreinterpretq_u8_s64(x)
377#define vreinterpretq_u16_m128i(x) vreinterpretq_u16_s64(x)
378#define vreinterpretq_u32_m128i(x) vreinterpretq_u32_s64(x)
379#define vreinterpretq_u64_m128i(x) vreinterpretq_u64_s64(x)
381#define vreinterpret_m64_s8(x) vreinterpret_s64_s8(x)
382#define vreinterpret_m64_s16(x) vreinterpret_s64_s16(x)
383#define vreinterpret_m64_s32(x) vreinterpret_s64_s32(x)
384#define vreinterpret_m64_s64(x) (x)
386#define vreinterpret_m64_u8(x) vreinterpret_s64_u8(x)
387#define vreinterpret_m64_u16(x) vreinterpret_s64_u16(x)
388#define vreinterpret_m64_u32(x) vreinterpret_s64_u32(x)
389#define vreinterpret_m64_u64(x) vreinterpret_s64_u64(x)
391#define vreinterpret_m64_f16(x) vreinterpret_s64_f16(x)
392#define vreinterpret_m64_f32(x) vreinterpret_s64_f32(x)
393#define vreinterpret_m64_f64(x) vreinterpret_s64_f64(x)
395#define vreinterpret_u8_m64(x) vreinterpret_u8_s64(x)
396#define vreinterpret_u16_m64(x) vreinterpret_u16_s64(x)
397#define vreinterpret_u32_m64(x) vreinterpret_u32_s64(x)
398#define vreinterpret_u64_m64(x) vreinterpret_u64_s64(x)
400#define vreinterpret_s8_m64(x) vreinterpret_s8_s64(x)
401#define vreinterpret_s16_m64(x) vreinterpret_s16_s64(x)
402#define vreinterpret_s32_m64(x) vreinterpret_s32_s64(x)
403#define vreinterpret_s64_m64(x) (x)
405#define vreinterpret_f32_m64(x) vreinterpret_f32_s64(x)
407#if defined(__aarch64__)
408#define vreinterpretq_m128d_s32(x) vreinterpretq_f64_s32(x)
409#define vreinterpretq_m128d_s64(x) vreinterpretq_f64_s64(x)
411#define vreinterpretq_m128d_u64(x) vreinterpretq_f64_u64(x)
413#define vreinterpretq_m128d_f32(x) vreinterpretq_f64_f32(x)
414#define vreinterpretq_m128d_f64(x) (x)
416#define vreinterpretq_s64_m128d(x) vreinterpretq_s64_f64(x)
418#define vreinterpretq_u32_m128d(x) vreinterpretq_u32_f64(x)
419#define vreinterpretq_u64_m128d(x) vreinterpretq_u64_f64(x)
421#define vreinterpretq_f64_m128d(x) (x)
422#define vreinterpretq_f32_m128d(x) vreinterpretq_f32_f64(x)
424#define vreinterpretq_m128d_s32(x) vreinterpretq_f32_s32(x)
425#define vreinterpretq_m128d_s64(x) vreinterpretq_f32_s64(x)
427#define vreinterpretq_m128d_u32(x) vreinterpretq_f32_u32(x)
428#define vreinterpretq_m128d_u64(x) vreinterpretq_f32_u64(x)
430#define vreinterpretq_m128d_f32(x) (x)
432#define vreinterpretq_s64_m128d(x) vreinterpretq_s64_f32(x)
434#define vreinterpretq_u32_m128d(x) vreinterpretq_u32_f32(x)
435#define vreinterpretq_u64_m128d(x) vreinterpretq_u64_f32(x)
437#define vreinterpretq_f32_m128d(x) (x)
470 uint16_t m128_u16[8];
471 uint32_t m128_u32[4];
472 uint64_t m128_u64[2];
476#define vreinterpretq_nth_u64_m128i(x, n) (((SIMDVec *) &x)->m128_u64[n])
477#define vreinterpretq_nth_u32_m128i(x, n) (((SIMDVec *) &x)->m128_u32[n])
478#define vreinterpretq_nth_u8_m128i(x, n) (((SIMDVec *) &x)->m128_u8[n])
481#define _MM_GET_FLUSH_ZERO_MODE _sse2neon_mm_get_flush_zero_mode
482#define _MM_SET_FLUSH_ZERO_MODE _sse2neon_mm_set_flush_zero_mode
483#define _MM_GET_DENORMALS_ZERO_MODE _sse2neon_mm_get_denormals_zero_mode
484#define _MM_SET_DENORMALS_ZERO_MODE _sse2neon_mm_set_denormals_zero_mode
518#if defined(__GNUC__) && !defined(__clang__) && \
519 ((__GNUC__ <= 12 && defined(__arm__)) || \
520 (__GNUC__ == 10 && __GNUC_MINOR__ < 3 && defined(__aarch64__)) || \
521 (__GNUC__ <= 9 && defined(__aarch64__)))
525 ret.val[0] = vld1q_u8(p + 0);
526 ret.val[1] = vld1q_u8(p + 16);
527 ret.val[2] = vld1q_u8(p + 32);
528 ret.val[3] = vld1q_u8(p + 48);
535 return vld1q_u8_x4(p);
539#if !defined(__aarch64__)
543 const uint64x1_t v1 = vpaddl_u32(vpaddl_u16(vpaddl_u8(v8)));
544 return vget_lane_u8(vreinterpret_u8_u64(v1), 0);
554#if !defined(__aarch64__)
558 uint8x8_t tmp = vpadd_u8(vget_low_u8(a), vget_high_u8(a));
560 for (
int i = 0; i < 8; ++i)
572#if !defined(__aarch64__)
576 uint32x4_t m = vpaddlq_u16(a);
577 uint64x2_t n = vpaddlq_u32(m);
578 uint64x1_t o = vget_low_u64(n) + vget_high_u64(n);
580 return vget_lane_u32((uint32x2_t) o, 0);
586 return vaddvq_u16(a);
683#if defined(__aarch64__)
709 float32x2_t a21 = vget_high_f32(
711 float32x2_t b03 = vget_low_f32(
718 float32x2_t a03 = vget_low_f32(
720 float32x2_t b21 = vget_high_f32(
783 float32x2_t a02 = vset_lane_f32(a0, a22, 1);
801 float32x2_t b20 = vset_lane_f32(b2, b00, 1);
808 float32_t b2 = vgetq_lane_f32(b, 2);
810 float32x2_t b20 = vset_lane_f32(b2, b00, 1);
817 float32_t b2 = vgetq_lane_f32(b, 2);
819 float32x2_t b20 = vset_lane_f32(b2, b00, 1);
833#if defined(__ARM_FEATURE_CRYPTO) && \
834 (defined(__aarch64__) || __has_builtin(__builtin_arm_crypto_vmullp64))
836FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b)
838 poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0);
839 poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0);
840 return vreinterpretq_u64_p128(vmull_p64(a, b));
856static uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b)
858 poly8x8_t a = vreinterpret_p8_u64(_a);
859 poly8x8_t b = vreinterpret_p8_u64(_b);
862 uint8x16_t k48_32 = vcombine_u8(vcreate_u8(0x0000ffffffffffff),
863 vcreate_u8(0x00000000ffffffff));
864 uint8x16_t k16_00 = vcombine_u8(vcreate_u8(0x000000000000ffff),
865 vcreate_u8(0x0000000000000000));
868 uint8x16_t d = vreinterpretq_u8_p16(vmull_p8(a, b));
870 vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 1)));
872 vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 1), b));
874 vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 2)));
876 vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 2), b));
878 vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 3)));
880 vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 3), b));
882 vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 4)));
885 uint8x16_t l = veorq_u8(e,
f);
886 uint8x16_t m = veorq_u8(g, h);
887 uint8x16_t n = veorq_u8(i, j);
891#if defined(__aarch64__)
892 uint8x16_t lm_p0 = vreinterpretq_u8_u64(
893 vzip1q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m)));
894 uint8x16_t lm_p1 = vreinterpretq_u8_u64(
895 vzip2q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m)));
896 uint8x16_t nk_p0 = vreinterpretq_u8_u64(
897 vzip1q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k)));
898 uint8x16_t nk_p1 = vreinterpretq_u8_u64(
899 vzip2q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k)));
901 uint8x16_t lm_p0 = vcombine_u8(vget_low_u8(l), vget_low_u8(m));
902 uint8x16_t lm_p1 = vcombine_u8(vget_high_u8(l), vget_high_u8(m));
903 uint8x16_t nk_p0 = vcombine_u8(vget_low_u8(n), vget_low_u8(k));
904 uint8x16_t nk_p1 = vcombine_u8(vget_high_u8(n), vget_high_u8(k));
908 uint8x16_t t0t1_tmp = veorq_u8(lm_p0, lm_p1);
909 uint8x16_t t0t1_h = vandq_u8(lm_p1, k48_32);
910 uint8x16_t t0t1_l = veorq_u8(t0t1_tmp, t0t1_h);
914 uint8x16_t t2t3_tmp = veorq_u8(nk_p0, nk_p1);
915 uint8x16_t t2t3_h = vandq_u8(nk_p1, k16_00);
916 uint8x16_t t2t3_l = veorq_u8(t2t3_tmp, t2t3_h);
919#if defined(__aarch64__)
920 uint8x16_t t0 = vreinterpretq_u8_u64(
921 vuzp1q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h)));
922 uint8x16_t t1 = vreinterpretq_u8_u64(
923 vuzp2q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h)));
924 uint8x16_t t2 = vreinterpretq_u8_u64(
925 vuzp1q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h)));
926 uint8x16_t t3 = vreinterpretq_u8_u64(
927 vuzp2q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h)));
929 uint8x16_t t1 = vcombine_u8(vget_high_u8(t0t1_l), vget_high_u8(t0t1_h));
930 uint8x16_t t0 = vcombine_u8(vget_low_u8(t0t1_l), vget_low_u8(t0t1_h));
931 uint8x16_t t3 = vcombine_u8(vget_high_u8(t2t3_l), vget_high_u8(t2t3_h));
932 uint8x16_t t2 = vcombine_u8(vget_low_u8(t2t3_l), vget_low_u8(t2t3_h));
935 uint8x16_t t0_shift = vextq_u8(t0, t0, 15);
936 uint8x16_t t1_shift = vextq_u8(t1, t1, 14);
937 uint8x16_t t2_shift = vextq_u8(t2, t2, 13);
938 uint8x16_t t3_shift = vextq_u8(t3, t3, 12);
941 uint8x16_t cross1 = veorq_u8(t0_shift, t1_shift);
942 uint8x16_t cross2 = veorq_u8(t2_shift, t3_shift);
943 uint8x16_t mix = veorq_u8(d, cross1);
944 uint8x16_t r = veorq_u8(mix, cross2);
945 return vreinterpretq_u64_u8(r);
957#define _mm_shuffle_epi32_default(a, imm) \
961 vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm) & (0x3))); \
962 ret = vsetq_lane_s32( \
963 vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 2) & 0x3), \
965 ret = vsetq_lane_s32( \
966 vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \
968 ret = vsetq_lane_s32( \
969 vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \
971 vreinterpretq_m128i_s32(ret); \
1058#if defined(__aarch64__)
1059#define _mm_shuffle_epi32_splat(a, imm) \
1061 vreinterpretq_m128i_s32( \
1062 vdupq_laneq_s32(vreinterpretq_s32_m128i(a), (imm))); \
1065#define _mm_shuffle_epi32_splat(a, imm) \
1067 vreinterpretq_m128i_s32( \
1068 vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))); \
1086#define _mm_shuffle_ps_default(a, b, imm) \
1089 ret = vmovq_n_f32( \
1090 vgetq_lane_f32(vreinterpretq_f32_m128(a), (imm) & (0x3))); \
1091 ret = vsetq_lane_f32( \
1092 vgetq_lane_f32(vreinterpretq_f32_m128(a), ((imm) >> 2) & 0x3), \
1094 ret = vsetq_lane_f32( \
1095 vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \
1097 ret = vsetq_lane_f32( \
1098 vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \
1100 vreinterpretq_m128_f32(ret); \
1109#define _mm_shufflelo_epi16_function(a, imm) \
1111 int16x8_t ret = vreinterpretq_s16_m128i(a); \
1112 int16x4_t lowBits = vget_low_s16(ret); \
1113 ret = vsetq_lane_s16(vget_lane_s16(lowBits, (imm) & (0x3)), ret, 0); \
1114 ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 2) & 0x3), ret, \
1116 ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \
1118 ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \
1120 vreinterpretq_m128i_s16(ret); \
1129#define _mm_shufflehi_epi16_function(a, imm) \
1131 int16x8_t ret = vreinterpretq_s16_m128i(a); \
1132 int16x4_t highBits = vget_high_s16(ret); \
1133 ret = vsetq_lane_s16(vget_lane_s16(highBits, (imm) & (0x3)), ret, 4); \
1134 ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 2) & 0x3), ret, \
1136 ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \
1138 ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \
1140 vreinterpretq_m128i_s16(ret); \
1169 float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0);
1448 return vgetq_lane_u32(a_eq_b, 0) & 0x1;
1458 return vgetq_lane_u32(a_ge_b, 0) & 0x1;
1468 return vgetq_lane_u32(a_gt_b, 0) & 0x1;
1478 return vgetq_lane_u32(a_le_b, 0) & 0x1;
1490 return vgetq_lane_u32(a_lt_b, 0) & 0x1;
1530#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
1558#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
1562 float32_t data = vgetq_lane_f32(
1564 return (int32_t) data;
1666#define _mm_cvtps_pi32(a) _mm_cvt_ps2pi(a)
1731#define _mm_cvtsi32_ss(a, b) _mm_cvt_si2ss(a, b)
1763#define _mm_cvtss_si32(a) _mm_cvt_ss2si(a)
1773#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
1776 float32_t data = vgetq_lane_f32(
1778 return (int64_t) data;
1817#define _mm_cvttps_pi32(a) _mm_cvtt_ps2pi(a)
1825#define _mm_cvttss_si32(a) _mm_cvtt_ss2si(a)
1848#if defined(__aarch64__) && !SSE2NEON_PRECISE_DIV
1854#if SSE2NEON_PRECISE_DIV
1875#define _mm_extract_pi16(a, imm) \
1876 (int32_t) vget_lane_u16(vreinterpret_u16_m64(a), (imm))
1880#if !defined(SSE2NEON_ALLOC_DEFINED)
1895#if defined(__aarch64__)
1902#if defined(__aarch64__)
1903 __asm__ __volatile__(
"mrs %0, FPCR" :
"=r"(r.value));
1905 __asm__ __volatile__(
"vmrs %0, FPSCR" :
"=r"(r.value));
1919#if defined(__aarch64__)
1926#if defined(__aarch64__)
1927 __asm__ __volatile__(
"mrs %0, FPCR" :
"=r"(r.value));
1929 __asm__ __volatile__(
"vmrs %0, FPSCR" :
"=r"(r.value));
1932 if (r.field.bit22) {
1942#define _mm_insert_pi16(a, b, imm) \
1944 vreinterpret_m64_s16( \
1945 vset_lane_s16((b), vreinterpret_s16_m64(a), (imm))); \
1964#define _mm_load_ps1 _mm_load1_ps
1995 vcombine_f32(vget_low_f32(a), vld1_f32((
const float32_t *) p)));
2012 vcombine_f32(vld1_f32((
const float32_t *) p), vget_high_f32(a)));
2027 float32x4_t v = vrev64q_f32(vld1q_f32(p));
2049 vsetq_lane_s16(*(
const int16_t *) p, vdupq_n_s16(0), 0));
2061 vcombine_s64(vld1_s64((
const int64_t *) p), vdup_n_s64(0)));
2067#if !defined(SSE2NEON_ALLOC_DEFINED)
2072 return malloc(size);
2073 if (align == 2 || (
sizeof(
void *) == 8 && align == 4))
2074 align =
sizeof(
void *);
2075 if (!posix_memalign(&ptr, align, size))
2092 vst1_s8((int8_t *) mem_addr, masked);
2099#define _m_maskmovq(a, mask, mem_addr) _mm_maskmove_si64(a, mask, mem_addr)
2121#if SSE2NEON_PRECISE_MINMAX
2151 float32_t value = vgetq_lane_f32(
_mm_max_ps(a, b), 0);
2176#if SSE2NEON_PRECISE_MINMAX
2206 float32_t value = vgetq_lane_f32(
_mm_min_ps(a, b), 0);
2252#if defined(__aarch64__)
2253 static const int8x8_t shift = {0, 1, 2, 3, 4, 5, 6, 7};
2254 uint8x8_t tmp = vshr_n_u8(input, 7);
2255 return vaddv_u8(vshl_u8(tmp, shift));
2258 uint16x4_t high_bits = vreinterpret_u16_u8(vshr_n_u8(input, 7));
2259 uint32x2_t paired16 =
2260 vreinterpret_u32_u16(vsra_n_u16(high_bits, high_bits, 7));
2261 uint8x8_t paired32 =
2262 vreinterpret_u8_u32(vsra_n_u32(paired16, paired16, 14));
2263 return vget_lane_u8(paired32, 0) | ((int) vget_lane_u8(paired32, 4) << 4);
2274#if defined(__aarch64__)
2275 static const int32x4_t shift = {0, 1, 2, 3};
2276 uint32x4_t tmp = vshrq_n_u32(input, 31);
2277 return vaddvq_u32(vshlq_u32(tmp, shift));
2282 uint64x2_t high_bits = vreinterpretq_u64_u32(vshrq_n_u32(input, 31));
2285 vreinterpretq_u8_u64(vsraq_n_u64(high_bits, high_bits, 31));
2287 return vgetq_lane_u8(paired, 0) | (vgetq_lane_u8(paired, 8) << 2);
2346#define _m_pavgb(a, b) _mm_avg_pu8(a, b)
2357#define _m_pavgw(a, b) _mm_avg_pu16(a, b)
2362#define _m_pextrw(a, imm) _mm_extract_pi16(a, imm)
2367#define _m_pinsrw(a, i, imm) _mm_insert_pi16(a, i, imm)
2372#define _m_pmaxsw(a, b) _mm_max_pi16(a, b)
2377#define _m_pmaxub(a, b) _mm_max_pu8(a, b)
2382#define _m_pminsw(a, b) _mm_min_pi16(a, b)
2387#define _m_pminub(a, b) _mm_min_pu8(a, b)
2392#define _m_pmovmskb(a) _mm_movemask_pi8(a)
2398#define _m_pmulhuw(a, b) _mm_mulhi_pu16(a, b)
2407 __builtin_prefetch(p, 0, 0);
2410 __builtin_prefetch(p, 0, 3);
2413 __builtin_prefetch(p, 0, 2);
2416 __builtin_prefetch(p, 0, 1);
2426#define _m_psadbw(a, b) _mm_sad_pu8(a, b)
2431#define _m_pshufw(a, imm) _mm_shuffle_pi16(a, imm)
2441#if SSE2NEON_PRECISE_DIV
2469#if SSE2NEON_PRECISE_SQRT
2486 return vsetq_lane_f32(vgetq_lane_f32(
_mm_rsqrt_ps(in), 0), in, 0);
2496 uint64x1_t t = vpaddl_u32(vpaddl_u16(
2499 vset_lane_u16(vget_lane_u64(t, 0), vdup_n_u16(0), 0));
2512#if defined(__aarch64__)
2519#if defined(__aarch64__)
2520 __asm__ __volatile__(
"mrs %0, FPCR" :
"=r"(r.value));
2522 __asm__ __volatile__(
"vmrs %0, FPSCR" :
"=r"(r.value));
2527#if defined(__aarch64__)
2528 __asm__ __volatile__(
"msr FPCR, %0" ::
"r"(r));
2530 __asm__ __volatile__(
"vmsr FPSCR, %0" ::
"r"(r));
2558#if defined(__aarch64__)
2565#if defined(__aarch64__)
2566 __asm__ __volatile__(
"mrs %0, FPCR" :
"=r"(r.value));
2568 __asm__ __volatile__(
"vmrs %0, FPSCR" :
"=r"(r.value));
2589#if defined(__aarch64__)
2590 __asm__ __volatile__(
"msr FPCR, %0" ::
"r"(r));
2592 __asm__ __volatile__(
"vmsr FPSCR, %0" ::
"r"(r));
2645#ifdef _sse2neon_shuffle
2646#define _mm_shuffle_pi16(a, imm) \
2648 vreinterpret_m64_s16(vshuffle_s16( \
2649 vreinterpret_s16_m64(a), vreinterpret_s16_m64(a), (imm & 0x3), \
2650 ((imm >> 2) & 0x3), ((imm >> 4) & 0x3), ((imm >> 6) & 0x3))); \
2653#define _mm_shuffle_pi16(a, imm) \
2657 vmov_n_s16(vget_lane_s16(vreinterpret_s16_m64(a), (imm) & (0x3))); \
2658 ret = vset_lane_s16( \
2659 vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 2) & 0x3), ret, \
2661 ret = vset_lane_s16( \
2662 vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 4) & 0x3), ret, \
2664 ret = vset_lane_s16( \
2665 vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 6) & 0x3), ret, \
2667 vreinterpret_m64_s16(ret); \
2704#ifdef _sse2neon_shuffle
2705#define _mm_shuffle_ps(a, b, imm) \
2707 float32x4_t _input1 = vreinterpretq_f32_m128(a); \
2708 float32x4_t _input2 = vreinterpretq_f32_m128(b); \
2709 float32x4_t _shuf = \
2710 vshuffleq_s32(_input1, _input2, (imm) & (0x3), ((imm) >> 2) & 0x3, \
2711 (((imm) >> 4) & 0x3) + 4, (((imm) >> 6) & 0x3) + 4); \
2712 vreinterpretq_m128_f32(_shuf); \
2715#define _mm_shuffle_ps(a, b, imm) \
2719 case _MM_SHUFFLE(1, 0, 3, 2): \
2720 ret = _mm_shuffle_ps_1032((a), (b)); \
2722 case _MM_SHUFFLE(2, 3, 0, 1): \
2723 ret = _mm_shuffle_ps_2301((a), (b)); \
2725 case _MM_SHUFFLE(0, 3, 2, 1): \
2726 ret = _mm_shuffle_ps_0321((a), (b)); \
2728 case _MM_SHUFFLE(2, 1, 0, 3): \
2729 ret = _mm_shuffle_ps_2103((a), (b)); \
2731 case _MM_SHUFFLE(1, 0, 1, 0): \
2732 ret = _mm_movelh_ps((a), (b)); \
2734 case _MM_SHUFFLE(1, 0, 0, 1): \
2735 ret = _mm_shuffle_ps_1001((a), (b)); \
2737 case _MM_SHUFFLE(0, 1, 0, 1): \
2738 ret = _mm_shuffle_ps_0101((a), (b)); \
2740 case _MM_SHUFFLE(3, 2, 1, 0): \
2741 ret = _mm_shuffle_ps_3210((a), (b)); \
2743 case _MM_SHUFFLE(0, 0, 1, 1): \
2744 ret = _mm_shuffle_ps_0011((a), (b)); \
2746 case _MM_SHUFFLE(0, 0, 2, 2): \
2747 ret = _mm_shuffle_ps_0022((a), (b)); \
2749 case _MM_SHUFFLE(2, 2, 0, 0): \
2750 ret = _mm_shuffle_ps_2200((a), (b)); \
2752 case _MM_SHUFFLE(3, 2, 0, 2): \
2753 ret = _mm_shuffle_ps_3202((a), (b)); \
2755 case _MM_SHUFFLE(3, 2, 3, 2): \
2756 ret = _mm_movehl_ps((b), (a)); \
2758 case _MM_SHUFFLE(1, 1, 3, 3): \
2759 ret = _mm_shuffle_ps_1133((a), (b)); \
2761 case _MM_SHUFFLE(2, 0, 1, 0): \
2762 ret = _mm_shuffle_ps_2010((a), (b)); \
2764 case _MM_SHUFFLE(2, 0, 0, 1): \
2765 ret = _mm_shuffle_ps_2001((a), (b)); \
2767 case _MM_SHUFFLE(2, 0, 3, 2): \
2768 ret = _mm_shuffle_ps_2032((a), (b)); \
2771 ret = _mm_shuffle_ps_default((a), (b), (imm)); \
2790#if SSE2NEON_PRECISE_SQRT
2795 const uint32x4_t pos_inf = vdupq_n_u32(0x7F800000);
2796 const uint32x4_t div_by_zero =
2797 vceqq_u32(pos_inf, vreinterpretq_u32_f32(recip));
2798 recip = vreinterpretq_f32_u32(
2799 vandq_u32(vmvnq_u32(div_by_zero), vreinterpretq_u32_f32(recip)));
2811#elif defined(__aarch64__)
2815 float32x4_t sq = vrecpeq_f32(recipsq);
2851 vst1q_f32(p, vdupq_n_f32(a0));
2871#define _mm_store1_ps _mm_store_ps1
2910 float32x4_t rev = vextq_f32(tmp, tmp, 2);
2948#if __has_builtin(__builtin_nontemporal_store)
2949 __builtin_nontemporal_store(a, (float32x4_t *) p);
2987#define _MM_TRANSPOSE4_PS(row0, row1, row2, row3) \
2989 float32x4x2_t ROW01 = vtrnq_f32(row0, row1); \
2990 float32x4x2_t ROW23 = vtrnq_f32(row2, row3); \
2991 row0 = vcombine_f32(vget_low_f32(ROW01.val[0]), \
2992 vget_low_f32(ROW23.val[0])); \
2993 row1 = vcombine_f32(vget_low_f32(ROW01.val[1]), \
2994 vget_low_f32(ROW23.val[1])); \
2995 row2 = vcombine_f32(vget_high_f32(ROW01.val[0]), \
2996 vget_high_f32(ROW23.val[0])); \
2997 row3 = vcombine_f32(vget_high_f32(ROW01.val[1]), \
2998 vget_high_f32(ROW23.val[1])); \
3003#define _mm_ucomieq_ss _mm_comieq_ss
3004#define _mm_ucomige_ss _mm_comige_ss
3005#define _mm_ucomigt_ss _mm_comigt_ss
3006#define _mm_ucomile_ss _mm_comile_ss
3007#define _mm_ucomilt_ss _mm_comilt_ss
3008#define _mm_ucomineq_ss _mm_comineq_ss
3014#if defined(__GNUC__) || defined(__clang__)
3015#pragma GCC diagnostic push
3016#pragma GCC diagnostic ignored "-Wuninitialized"
3020#if defined(__GNUC__) || defined(__clang__)
3021#pragma GCC diagnostic pop
3029#if defined(__GNUC__) || defined(__clang__)
3030#pragma GCC diagnostic push
3031#pragma GCC diagnostic ignored "-Wuninitialized"
3035#if defined(__GNUC__) || defined(__clang__)
3036#pragma GCC diagnostic pop
3051#if defined(__aarch64__)
3057 float32x2x2_t result = vzip_f32(a1, b1);
3073#if defined(__aarch64__)
3079 float32x2x2_t result = vzip_f32(a1, b1);
3142#if defined(__aarch64__)
3143 return vreinterpretq_m128d_f64(
3144 vaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3146 double *da = (
double *) &a;
3147 double *db = (
double *) &b;
3149 c[0] = da[0] + db[0];
3150 c[1] = da[1] + db[1];
3151 return vld1q_f32((float32_t *) c);
3165#if defined(__aarch64__)
3168 double *da = (
double *) &a;
3169 double *db = (
double *) &b;
3171 c[0] = da[0] + db[0];
3173 return vld1q_f32((float32_t *) c);
3325#define _mm_bslli_si128(a, imm) _mm_slli_si128(a, imm)
3330#define _mm_bsrli_si128(a, imm) _mm_srli_si128(a, imm)
3369#if defined(__aarch64__)
3387#if defined(__APPLE__)
3388#include <libkern/OSCacheControl.h>
3398#if defined(__APPLE__)
3400#elif defined(__GNUC__) || defined(__clang__)
3401 uintptr_t ptr = (uintptr_t) p;
3402 __builtin___clear_cache((
char *) ptr,
3440#if defined(__aarch64__)
3442 vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3447 uint32x4_t swapped = vrev64q_u32(cmp);
3466#if defined(__aarch64__)
3468 vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3475 d[0] = (*(
double *) &a0) >= (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3476 d[1] = (*(
double *) &a1) >= (*(
double *) &b1) ? ~UINT64_C(0) : UINT64_C(0);
3488#if defined(__aarch64__)
3496 d[0] = (*(
double *) &a0) >= (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3547#if defined(__aarch64__)
3549 vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3556 d[0] = (*(
double *) &a0) > (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3557 d[1] = (*(
double *) &a1) > (*(
double *) &b1) ? ~UINT64_C(0) : UINT64_C(0);
3569#if defined(__aarch64__)
3577 d[0] = (*(
double *) &a0) > (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3589#if defined(__aarch64__)
3591 vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3598 d[0] = (*(
double *) &a0) <= (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3599 d[1] = (*(
double *) &a1) <= (*(
double *) &b1) ? ~UINT64_C(0) : UINT64_C(0);
3611#if defined(__aarch64__)
3619 d[0] = (*(
double *) &a0) <= (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3665#if defined(__aarch64__)
3667 vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3674 d[0] = (*(
double *) &a0) < (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3675 d[1] = (*(
double *) &a1) < (*(
double *) &b1) ? ~UINT64_C(0) : UINT64_C(0);
3687#if defined(__aarch64__)
3694 d[0] = (*(
double *) &a0) < (*(
double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3706#if defined(__aarch64__)
3708 vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)))));
3713 uint32x4_t swapped = vrev64q_u32(cmp);
3732#if defined(__aarch64__)
3734 vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3735 vdupq_n_u64(UINT64_MAX)));
3743 !((*(
double *) &a0) >= (*(
double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3745 !((*(
double *) &a1) >= (*(
double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3765#if defined(__aarch64__)
3767 vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3768 vdupq_n_u64(UINT64_MAX)));
3776 !((*(
double *) &a0) > (*(
double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3778 !((*(
double *) &a1) > (*(
double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3798#if defined(__aarch64__)
3800 vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3801 vdupq_n_u64(UINT64_MAX)));
3809 !((*(
double *) &a0) <= (*(
double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3811 !((*(
double *) &a1) <= (*(
double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3831#if defined(__aarch64__)
3833 vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3834 vdupq_n_u64(UINT64_MAX)));
3842 !((*(
double *) &a0) < (*(
double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3844 !((*(
double *) &a1) < (*(
double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3864#if defined(__aarch64__)
3866 uint64x2_t not_nan_a =
3867 vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(a));
3868 uint64x2_t not_nan_b =
3869 vceqq_f64(vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(b));
3877 d[0] = ((*(
double *) &a0) == (*(
double *) &a0) &&
3878 (*(
double *) &b0) == (*(
double *) &b0))
3881 d[1] = ((*(
double *) &a1) == (*(
double *) &a1) &&
3882 (*(
double *) &b1) == (*(
double *) &b1))
3896#if defined(__aarch64__)
3903 d[0] = ((*(
double *) &a0) == (*(
double *) &a0) &&
3904 (*(
double *) &b0) == (*(
double *) &b0))
3918#if defined(__aarch64__)
3920 uint64x2_t not_nan_a =
3921 vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(a));
3922 uint64x2_t not_nan_b =
3923 vceqq_f64(vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(b));
3925 vmvnq_s32(vreinterpretq_s32_u64(vandq_u64(not_nan_a, not_nan_b))));
3932 d[0] = ((*(
double *) &a0) == (*(
double *) &a0) &&
3933 (*(
double *) &b0) == (*(
double *) &b0))
3936 d[1] = ((*(
double *) &a1) == (*(
double *) &a1) &&
3937 (*(
double *) &b1) == (*(
double *) &b1))
3951#if defined(__aarch64__)
3958 d[0] = ((*(
double *) &a0) == (*(
double *) &a0) &&
3959 (*(
double *) &b0) == (*(
double *) &b0))
3973#if defined(__aarch64__)
3974 return vgetq_lane_u64(vcgeq_f64(a, b), 0) & 0x1;
3979 return (*(
double *) &a0 >= *(
double *) &b0);
3988#if defined(__aarch64__)
3989 return vgetq_lane_u64(vcgtq_f64(a, b), 0) & 0x1;
3994 return (*(
double *) &a0 > *(
double *) &b0);
4003#if defined(__aarch64__)
4004 return vgetq_lane_u64(vcleq_f64(a, b), 0) & 0x1;
4009 return (*(
double *) &a0 <= *(
double *) &b0);
4018#if defined(__aarch64__)
4019 return vgetq_lane_u64(vcltq_f64(a, b), 0) & 0x1;
4024 return (*(
double *) &a0 < *(
double *) &b0);
4033#if defined(__aarch64__)
4034 return vgetq_lane_u64(vceqq_f64(a, b), 0) & 0x1;
4036 uint32x4_t a_not_nan =
4038 uint32x4_t b_not_nan =
4040 uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan);
4043 uint64x2_t and_results = vandq_u64(vreinterpretq_u64_u32(a_and_b_not_nan),
4044 vreinterpretq_u64_u32(a_eq_b));
4045 return vgetq_lane_u64(and_results, 0) & 0x1;
4069#if defined(__aarch64__)
4070 return vreinterpretq_m128d_f64(
4100#if defined(__ARM_FEATURE_FRINT) && !defined(__clang__)
4101 float64x2_t rounded = vrnd32xq_f64(vreinterpretq_f64_m128d(a));
4102 int64x2_t integers = vcvtq_s64_f64(rounded);
4104 vcombine_s32(vmovn_s64(integers), vdup_n_s32(0)));
4107 double d0 = ((
double *) &rnd)[0];
4108 double d1 = ((
double *) &rnd)[1];
4126 double d0 = ((
double *) &rnd)[0];
4127 double d1 = ((
double *) &rnd)[1];
4128 int32_t
ALIGN_STRUCT(16) data[2] = {(int32_t) d0, (int32_t) d1};
4146#if defined(__aarch64__)
4147 float32x2_t tmp = vcvt_f32_f64(vreinterpretq_f64_m128d(a));
4150 float a0 = (float) ((
double *) &a)[0];
4151 float a1 = (float) ((
double *) &a)[1];
4168#if defined(__aarch64__)
4169 return vreinterpretq_m128d_f64(
4191#if defined(__ARM_FEATURE_FRINT)
4193#elif defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
4205 float *
f = (
float *) &a;
4208 uint32x4_t signmask = vdupq_n_u32(0x80000000);
4211 int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32(
4213 int32x4_t r_trunc = vcvtq_s32_f32(
4215 int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32(
4216 vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31));
4217 int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone),
4219 float32x4_t delta = vsubq_f32(
4221 vcvtq_f32_s32(r_trunc));
4222 uint32x4_t is_delta_half =
4223 vceqq_f32(delta, half);
4225 vbslq_s32(is_delta_half, r_even, r_normal));
4253#if defined(__aarch64__)
4254 return vreinterpretq_m128d_f64(
4270#if defined(__aarch64__)
4271 return (
double) vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0);
4273 return ((
double *) &a)[0];
4285#if defined(__aarch64__)
4286 return (int32_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0);
4289 double ret = ((
double *) &rnd)[0];
4290 return (int32_t) ret;
4302#if defined(__aarch64__)
4303 return (int64_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0);
4306 double ret = ((
double *) &rnd)[0];
4307 return (int64_t) ret;
4317#define _mm_cvtsd_si64x _mm_cvtsd_si64
4326#if defined(__aarch64__)
4328 vget_lane_f32(vcvt_f32_f64(vreinterpretq_f64_m128d(b)), 0),
4358#define _mm_cvtsi128_si64x(a) _mm_cvtsi128_si64(a)
4366#if defined(__aarch64__)
4367 return vreinterpretq_m128d_f64(
4368 vsetq_lane_f64((
double) b, vreinterpretq_f64_m128d(a), 0));
4370 double bf = (double) b;
4381#define _mm_cvtsi128_si64x(a) _mm_cvtsi128_si64(a)
4403#if defined(__aarch64__)
4404 return vreinterpretq_m128d_f64(
4405 vsetq_lane_f64((
double) b, vreinterpretq_f64_m128d(a), 0));
4407 double bf = (double) b;
4426#define _mm_cvtsi64x_si128(a) _mm_cvtsi64_si128(a)
4432#define _mm_cvtsi64x_sd(a, b) _mm_cvtsi64_sd(a, b)
4446#if defined(__aarch64__)
4447 return vreinterpretq_m128d_f64(
4448 vsetq_lane_f64(d, vreinterpretq_f64_m128d(a), 0));
4460 double a0 = ((
double *) &a)[0];
4461 double a1 = ((
double *) &a)[1];
4470 double a0 = ((
double *) &a)[0];
4471 double a1 = ((
double *) &a)[1];
4472 int32_t
ALIGN_STRUCT(16) data[2] = {(int32_t) a0, (int32_t) a1};
4492 double ret = *((
double *) &a);
4493 return (int32_t) ret;
4504#if defined(__aarch64__)
4505 return vgetq_lane_s64(vcvtq_s64_f64(vreinterpretq_f64_m128d(a)), 0);
4507 double ret = *((
double *) &a);
4508 return (int64_t) ret;
4518#define _mm_cvttsd_si64x(a) _mm_cvttsd_si64(a)
4531#if defined(__aarch64__)
4532 return vreinterpretq_m128d_f64(
4533 vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
4535 double *da = (
double *) &a;
4536 double *db = (
double *) &b;
4538 c[0] = da[0] / db[0];
4539 c[1] = da[1] / db[1];
4540 return vld1q_f32((float32_t *) c);
4551#if defined(__aarch64__)
4553 vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b));
4554 return vreinterpretq_m128d_f64(
4555 vsetq_lane_f64(vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1), tmp, 1));
4565#define _mm_extract_epi16(a, imm) \
4566 vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm))
4573#define _mm_insert_epi16(a, b, imm) \
4575 vreinterpretq_m128i_s16( \
4576 vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))); \
4587#if defined(__aarch64__)
4588 return vreinterpretq_m128d_f64(vld1q_f64(p));
4590 const float *fp = (
const float *) p;
4591 float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], fp[2], fp[3]};
4603#define _mm_load_pd1 _mm_load1_pd
4615#if defined(__aarch64__)
4616 return vreinterpretq_m128d_f64(vsetq_lane_f64(*p, vdupq_n_f64(0), 0));
4618 const float *fp = (
const float *) p;
4640#if defined(__aarch64__)
4641 return vreinterpretq_m128d_f64(vld1q_dup_f64(p));
4657#if defined(__aarch64__)
4658 return vreinterpretq_m128d_f64(
4659 vcombine_f64(vget_low_f64(vreinterpretq_f64_m128d(a)), vld1_f64(p)));
4674 vcombine_s32(vld1_s32((int32_t
const *) p), vcreate_s32(0)));
4687#if defined(__aarch64__)
4688 return vreinterpretq_m128d_f64(
4689 vcombine_f64(vld1_f64(p), vget_high_f64(vreinterpretq_f64_m128d(a))));
4692 vcombine_f32(vld1_f32((
const float *) p),
4707#if defined(__aarch64__)
4708 float64x2_t v = vld1q_f64(p);
4709 return vreinterpretq_m128d_f64(vextq_f64(v, v, 1));
4711 int64x2_t v = vld1q_s64((
const int64_t *) p);
4739 vsetq_lane_s32(*(
const int32_t *) p, vdupq_n_s32(0), 0));
4754#if defined(__aarch64__)
4763 int32x2_t low_sum = vpadd_s32(vget_low_s32(low), vget_high_s32(low));
4764 int32x2_t high_sum = vpadd_s32(vget_low_s32(high), vget_high_s32(high));
4782 vst1q_s8((int8_t *) mem_addr, masked);
4808#if defined(__aarch64__)
4809#if SSE2NEON_PRECISE_MINMAX
4810 float64x2_t _a = vreinterpretq_f64_m128d(a);
4811 float64x2_t _b = vreinterpretq_f64_m128d(b);
4812 return vreinterpretq_m128d_f64(vbslq_f64(vcgtq_f64(_a, _b), _a, _b));
4814 return vreinterpretq_m128d_f64(
4815 vmaxq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
4823 d[0] = (*(
double *) &a0) > (*(
double *) &b0) ? a0 : b0;
4824 d[1] = (*(
double *) &a1) > (*(
double *) &b1) ? a1 : b1;
4836#if defined(__aarch64__)
4839 double *da = (
double *) &a;
4840 double *db = (
double *) &b;
4841 double c[2] = {da[0] > db[0] ? da[0] : db[0], da[1]};
4869#if defined(__aarch64__)
4870#if SSE2NEON_PRECISE_MINMAX
4871 float64x2_t _a = vreinterpretq_f64_m128d(a);
4872 float64x2_t _b = vreinterpretq_f64_m128d(b);
4873 return vreinterpretq_m128d_f64(vbslq_f64(vcltq_f64(_a, _b), _a, _b));
4875 return vreinterpretq_m128d_f64(
4876 vminq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
4884 d[0] = (*(
double *) &a0) < (*(
double *) &b0) ? a0 : b0;
4885 d[1] = (*(
double *) &a1) < (*(
double *) &b1) ? a1 : b1;
4896#if defined(__aarch64__)
4899 double *da = (
double *) &a;
4900 double *db = (
double *) &b;
4901 double c[2] = {da[0] < db[0] ? da[0] : db[0], da[1]};
4964 uint16x8_t high_bits = vreinterpretq_u16_u8(vshrq_n_u8(input, 7));
4979 uint32x4_t paired16 =
4980 vreinterpretq_u32_u16(vsraq_n_u16(high_bits, high_bits, 7));
4993 uint64x2_t paired32 =
4994 vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14));
5007 uint8x16_t paired64 =
5008 vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28));
5015 return vgetq_lane_u8(paired64, 0) | ((int) vgetq_lane_u8(paired64, 8) << 8);
5024 uint64x2_t high_bits = vshrq_n_u64(input, 63);
5025 return vgetq_lane_u64(high_bits, 0) | (vgetq_lane_u64(high_bits, 1) << 1);
5069#if defined(__aarch64__)
5070 return vreinterpretq_m128d_f64(
5071 vmulq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
5073 double *da = (
double *) &a;
5074 double *db = (
double *) &b;
5076 c[0] = da[0] * db[0];
5077 c[1] = da[1] * db[1];
5078 return vld1q_f32((float32_t *) c);
5120 int32x4_t ab3210 = vmull_s16(a3210, b3210);
5123 int32x4_t ab7654 = vmull_s16(a7654, b7654);
5125 vuzpq_u16(vreinterpretq_u16_s32(ab3210), vreinterpretq_u16_s32(ab7654));
5137 uint32x4_t ab3210 = vmull_u16(a3210, b3210);
5138#if defined(__aarch64__)
5141 uint16x8_t r = vuzp2q_u16(vreinterpretq_u16_u32(ab3210),
5142 vreinterpretq_u16_u32(ab7654));
5147 uint32x4_t ab7654 = vmull_u16(a7654, b7654);
5149 vuzpq_u16(vreinterpretq_u16_u32(ab3210), vreinterpretq_u16_u32(ab7654));
5246 __asm__ __volatile__(
"isb\n");
5256 uint16x8_t t = vpaddlq_u8(vabdq_u8((uint8x16_t) a, (uint8x16_t) b));
5271 int16_t
ALIGN_STRUCT(16) data[8] = {i0, i1, i2, i3, i4, i5, i6, i7};
5297 vcombine_s64(vcreate_s64(i2), vcreate_s64(i1)));
5320 data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3,
5321 (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7,
5322 (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11,
5323 (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15};
5324 return (
__m128i) vld1q_s8(data);
5333#if defined(__aarch64__)
5334 return vreinterpretq_m128d_f64(vld1q_f64((float64_t *) data));
5343#define _mm_set_pd1 _mm_set1_pd
5350#if defined(__aarch64__)
5351 return vreinterpretq_m128d_f64(vsetq_lane_f64(a, vdupq_n_f64(0), 0));
5415#if defined(__aarch64__)
5416 return vreinterpretq_m128d_f64(vdupq_n_f64(d));
5438 int16_t
ALIGN_STRUCT(16) data[8] = {w0, w1, w2, w3, w4, w5, w6, w7};
5477 data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3,
5478 (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7,
5479 (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11,
5480 (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15};
5481 return (
__m128i) vld1q_s8(data);
5496#if defined(__aarch64__)
5497 return vreinterpretq_m128d_f64(vdupq_n_f64(0));
5514#ifdef _sse2neon_shuffle
5515#define _mm_shuffle_epi32(a, imm) \
5517 int32x4_t _input = vreinterpretq_s32_m128i(a); \
5519 vshuffleq_s32(_input, _input, (imm) & (0x3), ((imm) >> 2) & 0x3, \
5520 ((imm) >> 4) & 0x3, ((imm) >> 6) & 0x3); \
5521 vreinterpretq_m128i_s32(_shuf); \
5524#define _mm_shuffle_epi32(a, imm) \
5528 case _MM_SHUFFLE(1, 0, 3, 2): \
5529 ret = _mm_shuffle_epi_1032((a)); \
5531 case _MM_SHUFFLE(2, 3, 0, 1): \
5532 ret = _mm_shuffle_epi_2301((a)); \
5534 case _MM_SHUFFLE(0, 3, 2, 1): \
5535 ret = _mm_shuffle_epi_0321((a)); \
5537 case _MM_SHUFFLE(2, 1, 0, 3): \
5538 ret = _mm_shuffle_epi_2103((a)); \
5540 case _MM_SHUFFLE(1, 0, 1, 0): \
5541 ret = _mm_shuffle_epi_1010((a)); \
5543 case _MM_SHUFFLE(1, 0, 0, 1): \
5544 ret = _mm_shuffle_epi_1001((a)); \
5546 case _MM_SHUFFLE(0, 1, 0, 1): \
5547 ret = _mm_shuffle_epi_0101((a)); \
5549 case _MM_SHUFFLE(2, 2, 1, 1): \
5550 ret = _mm_shuffle_epi_2211((a)); \
5552 case _MM_SHUFFLE(0, 1, 2, 2): \
5553 ret = _mm_shuffle_epi_0122((a)); \
5555 case _MM_SHUFFLE(3, 3, 3, 2): \
5556 ret = _mm_shuffle_epi_3332((a)); \
5558 case _MM_SHUFFLE(0, 0, 0, 0): \
5559 ret = _mm_shuffle_epi32_splat((a), 0); \
5561 case _MM_SHUFFLE(1, 1, 1, 1): \
5562 ret = _mm_shuffle_epi32_splat((a), 1); \
5564 case _MM_SHUFFLE(2, 2, 2, 2): \
5565 ret = _mm_shuffle_epi32_splat((a), 2); \
5567 case _MM_SHUFFLE(3, 3, 3, 3): \
5568 ret = _mm_shuffle_epi32_splat((a), 3); \
5571 ret = _mm_shuffle_epi32_default((a), (imm)); \
5585#ifdef _sse2neon_shuffle
5586#define _mm_shuffle_pd(a, b, imm8) \
5587 vreinterpretq_m128d_s64( \
5588 vshuffleq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b), \
5589 imm8 & 0x1, ((imm8 & 0x2) >> 1) + 2))
5591#define _mm_shuffle_pd(a, b, imm8) \
5592 _mm_castsi128_pd(_mm_set_epi64x( \
5593 vgetq_lane_s64(vreinterpretq_s64_m128d(b), (imm8 & 0x2) >> 1), \
5594 vgetq_lane_s64(vreinterpretq_s64_m128d(a), imm8 & 0x1)))
5599#ifdef _sse2neon_shuffle
5600#define _mm_shufflehi_epi16(a, imm) \
5602 int16x8_t _input = vreinterpretq_s16_m128i(a); \
5604 vshuffleq_s16(_input, _input, 0, 1, 2, 3, ((imm) & (0x3)) + 4, \
5605 (((imm) >> 2) & 0x3) + 4, (((imm) >> 4) & 0x3) + 4, \
5606 (((imm) >> 6) & 0x3) + 4); \
5607 vreinterpretq_m128i_s16(_shuf); \
5610#define _mm_shufflehi_epi16(a, imm) _mm_shufflehi_epi16_function((a), (imm))
5615#ifdef _sse2neon_shuffle
5616#define _mm_shufflelo_epi16(a, imm) \
5618 int16x8_t _input = vreinterpretq_s16_m128i(a); \
5619 int16x8_t _shuf = vshuffleq_s16( \
5620 _input, _input, ((imm) & (0x3)), (((imm) >> 2) & 0x3), \
5621 (((imm) >> 4) & 0x3), (((imm) >> 6) & 0x3), 4, 5, 6, 7); \
5622 vreinterpretq_m128i_s16(_shuf); \
5625#define _mm_shufflelo_epi16(a, imm) _mm_shufflelo_epi16_function((a), (imm))
5647 int16x8_t vc = vdupq_n_s16((int16_t) c);
5670 int32x4_t vc = vdupq_n_s32((int32_t) c);
5693 int64x2_t vc = vdupq_n_s64((int64_t) c);
5770#define _mm_slli_si128(a, imm) \
5773 if (_sse2neon_unlikely(imm == 0)) \
5774 ret = vreinterpretq_s8_m128i(a); \
5775 else if (_sse2neon_unlikely((imm) & ~15)) \
5776 ret = vdupq_n_s8(0); \
5778 ret = vextq_s8(vdupq_n_s8(0), vreinterpretq_s8_m128i(a), \
5779 ((imm <= 0 || imm > 15) ? 0 : (16 - imm))); \
5780 vreinterpretq_m128i_s8(ret); \
5788#if defined(__aarch64__)
5789 return vreinterpretq_m128d_f64(vsqrtq_f64(vreinterpretq_f64_m128d(a)));
5791 double a0 = sqrt(((
double *) &a)[0]);
5792 double a1 = sqrt(((
double *) &a)[1]);
5803#if defined(__aarch64__)
5806 return _mm_set_pd(((
double *) &a)[1], sqrt(((
double *) &b)[0]));
5825 int64_t c = (int64_t) vget_low_s64((int64x2_t) count);
5846 int64_t c = (int64_t) vget_low_s64((int64x2_t) count);
5867 const int count = (imm & ~15) ? 15 : imm;
5868 return (
__m128i) vshlq_s16((int16x8_t) a, vdupq_n_s16(-count));
5885#define _mm_srai_epi32(a, imm) \
5888 if (_sse2neon_unlikely((imm) == 0)) { \
5890 } else if (_sse2neon_likely(0 < (imm) && (imm) < 32)) { \
5891 ret = vreinterpretq_m128i_s32( \
5892 vshlq_s32(vreinterpretq_s32_m128i(a), vdupq_n_s32(-(imm)))); \
5894 ret = vreinterpretq_m128i_s32( \
5895 vshrq_n_s32(vreinterpretq_s32_m128i(a), 31)); \
5919 int16x8_t vc = vdupq_n_s16(-(int16_t) c);
5942 int32x4_t vc = vdupq_n_s32(-(int32_t) c);
5965 int64x2_t vc = vdupq_n_s64(-(int64_t) c);
5982#define _mm_srli_epi16(a, imm) \
5985 if (_sse2neon_unlikely((imm) & ~15)) { \
5986 ret = _mm_setzero_si128(); \
5988 ret = vreinterpretq_m128i_u16( \
5989 vshlq_u16(vreinterpretq_u16_m128i(a), vdupq_n_s16(-(imm)))); \
6008#define _mm_srli_epi32(a, imm) \
6011 if (_sse2neon_unlikely((imm) & ~31)) { \
6012 ret = _mm_setzero_si128(); \
6014 ret = vreinterpretq_m128i_u32( \
6015 vshlq_u32(vreinterpretq_u32_m128i(a), vdupq_n_s32(-(imm)))); \
6033#define _mm_srli_epi64(a, imm) \
6036 if (_sse2neon_unlikely((imm) & ~63)) { \
6037 ret = _mm_setzero_si128(); \
6039 ret = vreinterpretq_m128i_u64( \
6040 vshlq_u64(vreinterpretq_u64_m128i(a), vdupq_n_s64(-(imm)))); \
6055#define _mm_srli_si128(a, imm) \
6058 if (_sse2neon_unlikely((imm) & ~15)) \
6059 ret = vdupq_n_s8(0); \
6061 ret = vextq_s8(vreinterpretq_s8_m128i(a), vdupq_n_s8(0), \
6062 (imm > 15 ? 0 : imm)); \
6063 vreinterpretq_m128i_s8(ret); \
6072#if defined(__aarch64__)
6073 vst1q_f64((float64_t *) mem_addr, vreinterpretq_f64_m128d(a));
6085#if defined(__aarch64__)
6086 float64x1_t a_low = vget_low_f64(vreinterpretq_f64_m128d(a));
6087 vst1q_f64((float64_t *) mem_addr,
6088 vreinterpretq_f64_m128d(vcombine_f64(a_low, a_low)));
6091 vst1q_f32((float32_t *) mem_addr,
6101#if defined(__aarch64__)
6102 vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a)));
6119#define _mm_store1_pd _mm_store_pd1
6129#if defined(__aarch64__)
6130 vst1_f64((float64_t *) mem_addr, vget_high_f64(vreinterpretq_f64_m128d(a)));
6151#if defined(__aarch64__)
6152 vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a)));
6202#if __has_builtin(__builtin_nontemporal_store)
6203 __builtin_nontemporal_store(a, (float32x4_t *) p);
6204#elif defined(__aarch64__)
6205 vst1q_f64(p, vreinterpretq_f64_m128d(a));
6217#if __has_builtin(__builtin_nontemporal_store)
6218 __builtin_nontemporal_store(a, p);
6230 vst1q_lane_s32((int32_t *) p, vdupq_n_s32(a), 0);
6239 vst1_s64((int64_t *) p, vdup_n_s64((int64_t) a));
6297#if defined(__aarch64__)
6298 return vreinterpretq_m128d_f64(
6299 vsubq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6301 double *da = (
double *) &a;
6302 double *db = (
double *) &b;
6304 c[0] = da[0] - db[0];
6305 c[1] = da[1] - db[1];
6306 return vld1q_f32((float32_t *) c);
6385#define _mm_ucomieq_sd _mm_comieq_sd
6386#define _mm_ucomige_sd _mm_comige_sd
6387#define _mm_ucomigt_sd _mm_comigt_sd
6388#define _mm_ucomile_sd _mm_comile_sd
6389#define _mm_ucomilt_sd _mm_comilt_sd
6390#define _mm_ucomineq_sd _mm_comineq_sd
6396#if defined(__GNUC__) || defined(__clang__)
6397#pragma GCC diagnostic push
6398#pragma GCC diagnostic ignored "-Wuninitialized"
6402#if defined(__GNUC__) || defined(__clang__)
6403#pragma GCC diagnostic pop
6422#if defined(__aarch64__)
6428 int16x4x2_t result = vzip_s16(a1, b1);
6438#if defined(__aarch64__)
6444 int32x2x2_t result = vzip_s32(a1, b1);
6475#if defined(__aarch64__)
6483 int8x8x2_t result = vzip_s8(a1, b1);
6501#if defined(__aarch64__)
6502 return vreinterpretq_m128d_f64(
6503 vzip2q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6526#if defined(__aarch64__)
6532 int16x4x2_t result = vzip_s16(a1, b1);
6548#if defined(__aarch64__)
6554 int32x2x2_t result = vzip_s32(a1, b1);
6580#if defined(__aarch64__)
6586 int8x8x2_t result = vzip_s8(a1, b1);
6604#if defined(__aarch64__)
6605 return vreinterpretq_m128d_f64(
6606 vzip1q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6656#if defined(__aarch64__)
6657 return vreinterpretq_m128d_f64(vfmaq_f64(vreinterpretq_f64_m128d(a),
6658 vreinterpretq_f64_m128d(b),
6659 vreinterpretq_f64_m128d(mask)));
6672#if defined(__aarch64__) || defined(__ARM_FEATURE_FMA)
6686#if defined(__aarch64__)
6687 return vreinterpretq_m128d_f64(
6688 vpaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6690 double *da = (
double *) &a;
6691 double *db = (
double *) &b;
6692 double c[] = {da[0] + da[1], db[0] + db[1]};
6702#if defined(__aarch64__)
6711 vcombine_f32(vpadd_f32(a10, a32), vpadd_f32(b10, b32)));
6720#if defined(__aarch64__)
6721 float64x2_t a = vreinterpretq_f64_m128d(_a);
6722 float64x2_t b = vreinterpretq_f64_m128d(_b);
6723 return vreinterpretq_m128d_f64(
6724 vsubq_f64(vuzp1q_f64(a, b), vuzp2q_f64(a, b)));
6726 double *da = (
double *) &_a;
6727 double *db = (
double *) &_b;
6728 double c[] = {da[0] - da[1], db[0] - db[1]};
6740#if defined(__aarch64__)
6742 vsubq_f32(vuzp1q_f32(a, b), vuzp2q_f32(a, b)));
6744 float32x4x2_t c = vuzpq_f32(a, b);
6756#define _mm_lddqu_si128 _mm_loadu_si128
6765#define _mm_loaddup_pd _mm_load1_pd
6772#if defined(__aarch64__)
6773 return vreinterpretq_m128d_f64(
6774 vdupq_laneq_f64(vreinterpretq_f64_m128d(a), 0));
6786#if defined(__aarch64__)
6789#elif defined(_sse2neon_shuffle)
6805#if defined(__aarch64__)
6808#elif defined(_sse2neon_shuffle)
6912#define _mm_alignr_epi8(a, b, imm) \
6914 uint8x16_t _a = vreinterpretq_u8_m128i(a); \
6915 uint8x16_t _b = vreinterpretq_u8_m128i(b); \
6917 if (_sse2neon_unlikely((imm) & ~31)) \
6918 ret = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \
6919 else if (imm >= 16) \
6920 ret = _mm_srli_si128(a, imm >= 16 ? imm - 16 : 0); \
6923 vreinterpretq_m128i_u8(vextq_u8(_b, _a, imm < 16 ? imm : 0)); \
6934#define _mm_alignr_pi8(a, b, imm) \
6937 if (_sse2neon_unlikely((imm) >= 16)) { \
6938 ret = vreinterpret_m64_s8(vdup_n_s8(0)); \
6940 uint8x8_t tmp_low, tmp_high; \
6942 const int idx = (imm) -8; \
6943 tmp_low = vreinterpret_u8_m64(a); \
6944 tmp_high = vdup_n_u8(0); \
6945 ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \
6947 const int idx = (imm); \
6948 tmp_low = vreinterpret_u8_m64(b); \
6949 tmp_high = vreinterpret_u8_m64(a); \
6950 ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \
6962#if defined(__aarch64__)
6966 vcombine_s16(vpadd_s16(vget_low_s16(a), vget_high_s16(a)),
6967 vpadd_s16(vget_low_s16(b), vget_high_s16(b))));
6977#if defined(__aarch64__)
6981 vcombine_s32(vpadd_s32(vget_low_s32(a), vget_high_s32(a)),
6982 vpadd_s32(vget_low_s32(b), vget_high_s32(b))));
7008#if defined(__aarch64__)
7011 return vreinterpretq_s64_s16(
7012 vqaddq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b)));
7019 int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b));
7020 int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16));
7033#if defined(__aarch64__)
7034 return vreinterpret_s64_s16(vqadd_s16(vuzp1_s16(a, b), vuzp2_s16(a, b)));
7036 int16x4x2_t res = vuzp_s16(a, b);
7037 return vreinterpret_s64_s16(vqadd_s16(res.val[0], res.val[1]));
7048#if defined(__aarch64__)
7050 vsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b)));
7052 int16x8x2_t c = vuzpq_s16(a, b);
7064#if defined(__aarch64__)
7066 vsubq_s32(vuzp1q_s32(a, b), vuzp2q_s32(a, b)));
7068 int32x4x2_t c = vuzpq_s32(a, b);
7080#if defined(__aarch64__)
7083 int16x4x2_t c = vuzp_s16(a, b);
7095#if defined(__aarch64__)
7098 int32x2x2_t c = vuzp_s32(a, b);
7110#if defined(__aarch64__)
7112 vqsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b)));
7114 int16x8x2_t c = vuzpq_s16(a, b);
7126#if defined(__aarch64__)
7129 int16x4x2_t c = vuzp_s16(a, b);
7146#if defined(__aarch64__)
7149 int16x8_t tl = vmulq_s16(vreinterpretq_s16_u16(vmovl_u8(vget_low_u8(a))),
7150 vmovl_s8(vget_low_s8(b)));
7151 int16x8_t th = vmulq_s16(vreinterpretq_s16_u16(vmovl_u8(vget_high_u8(a))),
7152 vmovl_s8(vget_high_s8(b)));
7154 vqaddq_s16(vuzp1q_s16(tl, th), vuzp2q_s16(tl, th)));
7162 int16x8_t a_odd = vreinterpretq_s16_u16(vshrq_n_u16(a, 8));
7163 int16x8_t a_even = vreinterpretq_s16_u16(vbicq_u16(a, vdupq_n_u16(0xff00)));
7166 int16x8_t b_even = vshrq_n_s16(vshlq_n_s16(b, 8), 8);
7167 int16x8_t b_odd = vshrq_n_s16(b, 8);
7170 int16x8_t prod1 = vmulq_s16(a_even, b_even);
7171 int16x8_t prod2 = vmulq_s16(a_odd, b_odd);
7189 int16x4_t a_odd = vreinterpret_s16_u16(vshr_n_u16(a, 8));
7190 int16x4_t a_even = vreinterpret_s16_u16(vand_u16(a, vdup_n_u16(0xff)));
7193 int16x4_t b_even = vshr_n_s16(vshl_n_s16(b, 8), 8);
7194 int16x4_t b_odd = vshr_n_s16(b, 8);
7197 int16x4_t prod1 = vmul_s16(a_even, b_even);
7198 int16x4_t prod2 = vmul_s16(a_odd, b_odd);
7226 int16x4_t narrow_lo = vrshrn_n_s32(mul_lo, 15);
7227 int16x4_t narrow_hi = vrshrn_n_s32(mul_hi, 15);
7239 int32x4_t mul_extend =
7253 uint8x16_t idx_masked =
7254 vandq_u8(idx, vdupq_n_u8(0x8F));
7255#if defined(__aarch64__)
7257#elif defined(__GNUC__)
7261 __asm__ __volatile__(
7262 "vtbl.8 %e[ret], {%e[tbl], %f[tbl]}, %e[idx]\n"
7263 "vtbl.8 %f[ret], {%e[tbl], %f[tbl]}, %f[idx]\n"
7265 : [tbl]
"w"(tbl), [idx]
"w"(idx_masked));
7269 int8x8x2_t a_split = {vget_low_s8(tbl), vget_high_s8(tbl)};
7271 vcombine_s8(vtbl2_s8(a_split, vget_low_u8(idx_masked)),
7272 vtbl2_s8(a_split, vget_high_u8(idx_masked))));
7292 const int8x8_t controlMask =
7319 uint16x8_t ltMask = vreinterpretq_u16_s16(vshrq_n_s16(b, 15));
7321#if defined(__aarch64__)
7322 int16x8_t zeroMask = vreinterpretq_s16_u16(vceqzq_s16(b));
7324 int16x8_t zeroMask = vreinterpretq_s16_u16(vceqq_s16(b, vdupq_n_s16(0)));
7329 int16x8_t masked = vbslq_s16(ltMask, vnegq_s16(a), a);
7331 int16x8_t res = vbicq_s16(masked, zeroMask);
7356 uint32x4_t ltMask = vreinterpretq_u32_s32(vshrq_n_s32(b, 31));
7359#if defined(__aarch64__)
7360 int32x4_t zeroMask = vreinterpretq_s32_u32(vceqzq_s32(b));
7362 int32x4_t zeroMask = vreinterpretq_s32_u32(vceqq_s32(b, vdupq_n_s32(0)));
7367 int32x4_t masked = vbslq_s32(ltMask, vnegq_s32(a), a);
7369 int32x4_t res = vbicq_s32(masked, zeroMask);
7394 uint8x16_t ltMask = vreinterpretq_u8_s8(vshrq_n_s8(b, 7));
7397#if defined(__aarch64__)
7398 int8x16_t zeroMask = vreinterpretq_s8_u8(vceqzq_s8(b));
7400 int8x16_t zeroMask = vreinterpretq_s8_u8(vceqq_s8(b, vdupq_n_s8(0)));
7405 int8x16_t masked = vbslq_s8(ltMask, vnegq_s8(a), a);
7407 int8x16_t res = vbicq_s8(masked, zeroMask);
7435 uint16x4_t ltMask = vreinterpret_u16_s16(vshr_n_s16(b, 15));
7438#if defined(__aarch64__)
7439 int16x4_t zeroMask = vreinterpret_s16_u16(vceqz_s16(b));
7441 int16x4_t zeroMask = vreinterpret_s16_u16(vceq_s16(b, vdup_n_s16(0)));
7446 int16x4_t masked = vbsl_s16(ltMask, vneg_s16(a), a);
7448 int16x4_t res = vbic_s16(masked, zeroMask);
7476 uint32x2_t ltMask = vreinterpret_u32_s32(vshr_n_s32(b, 31));
7479#if defined(__aarch64__)
7480 int32x2_t zeroMask = vreinterpret_s32_u32(vceqz_s32(b));
7482 int32x2_t zeroMask = vreinterpret_s32_u32(vceq_s32(b, vdup_n_s32(0)));
7487 int32x2_t masked = vbsl_s32(ltMask, vneg_s32(a), a);
7489 int32x2_t res = vbic_s32(masked, zeroMask);
7517 uint8x8_t ltMask = vreinterpret_u8_s8(vshr_n_s8(b, 7));
7520#if defined(__aarch64__)
7521 int8x8_t zeroMask = vreinterpret_s8_u8(vceqz_s8(b));
7523 int8x8_t zeroMask = vreinterpret_s8_u8(vceq_s8(b, vdup_n_s8(0)));
7528 int8x8_t masked = vbsl_s8(ltMask, vneg_s8(a), a);
7530 int8x8_t res = vbic_s8(masked, zeroMask);
7550#define _mm_blend_epi16(a, b, imm) \
7552 const uint16_t _mask[8] = {((imm) & (1 << 0)) ? (uint16_t) -1 : 0x0, \
7553 ((imm) & (1 << 1)) ? (uint16_t) -1 : 0x0, \
7554 ((imm) & (1 << 2)) ? (uint16_t) -1 : 0x0, \
7555 ((imm) & (1 << 3)) ? (uint16_t) -1 : 0x0, \
7556 ((imm) & (1 << 4)) ? (uint16_t) -1 : 0x0, \
7557 ((imm) & (1 << 5)) ? (uint16_t) -1 : 0x0, \
7558 ((imm) & (1 << 6)) ? (uint16_t) -1 : 0x0, \
7559 ((imm) & (1 << 7)) ? (uint16_t) -1 : 0x0}; \
7560 uint16x8_t _mask_vec = vld1q_u16(_mask); \
7561 uint16x8_t _a = vreinterpretq_u16_m128i(a); \
7562 uint16x8_t _b = vreinterpretq_u16_m128i(b); \
7563 vreinterpretq_m128i_u16(vbslq_u16(_mask_vec, _b, _a)); \
7569#define _mm_blend_pd(a, b, imm) \
7571 const uint64_t _mask[2] = { \
7572 ((imm) & (1 << 0)) ? ~UINT64_C(0) : UINT64_C(0), \
7573 ((imm) & (1 << 1)) ? ~UINT64_C(0) : UINT64_C(0)}; \
7574 uint64x2_t _mask_vec = vld1q_u64(_mask); \
7575 uint64x2_t _a = vreinterpretq_u64_m128d(a); \
7576 uint64x2_t _b = vreinterpretq_u64_m128d(b); \
7577 vreinterpretq_m128d_u64(vbslq_u64(_mask_vec, _b, _a)); \
7586 data[4] = {((imm8) & (1 << 0)) ? UINT32_MAX : 0,
7587 ((imm8) & (1 << 1)) ? UINT32_MAX : 0,
7588 ((imm8) & (1 << 2)) ? UINT32_MAX : 0,
7589 ((imm8) & (1 << 3)) ? UINT32_MAX : 0};
7590 uint32x4_t mask = vld1q_u32(data);
7624#if defined(__aarch64__)
7625 float64x2_t a = vreinterpretq_f64_m128d(_a);
7626 float64x2_t b = vreinterpretq_f64_m128d(_b);
7627 return vreinterpretq_m128d_f64(vbslq_f64(mask, b, a));
7654#if defined(__aarch64__)
7655 return vreinterpretq_m128d_f64(vrndpq_f64(vreinterpretq_f64_m128d(a)));
7657 double *
f = (
double *) &a;
7668#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
7671 float *
f = (
float *) &a;
7672 return _mm_set_ps(ceilf(
f[3]), ceilf(
f[2]), ceilf(
f[1]), ceilf(
f[0]));
7704#if defined(__aarch64__)
7712 uint32x4_t swapped = vrev64q_u32(cmp);
7730 int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8));
7731 int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4));
7748 int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16));
7757 int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16));
7758 int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8));
7767 int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16));
7768 int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8));
7769 int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4));
7786 uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8));
7787 uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4));
7805 uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16));
7815 uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16));
7816 uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8));
7825 uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16));
7826 uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8));
7827 uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4));
7838 const int64_t bit0Mask = imm & 0x01 ? UINT64_MAX : 0;
7839 const int64_t bit1Mask = imm & 0x02 ? UINT64_MAX : 0;
7840#if !SSE2NEON_PRECISE_DP
7841 const int64_t bit4Mask = imm & 0x10 ? UINT64_MAX : 0;
7842 const int64_t bit5Mask = imm & 0x20 ? UINT64_MAX : 0;
7845#if !SSE2NEON_PRECISE_DP
7851#if defined(__aarch64__)
7852 double d0 = (imm & 0x10) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0) *
7853 vgetq_lane_f64(vreinterpretq_f64_m128d(b), 0)
7855 double d1 = (imm & 0x20) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1) *
7856 vgetq_lane_f64(vreinterpretq_f64_m128d(b), 1)
7859 double d0 = (imm & 0x10) ? ((
double *) &a)[0] * ((
double *) &b)[0] : 0;
7860 double d1 = (imm & 0x20) ? ((
double *) &a)[1] * ((
double *) &b)[1] : 0;
7865#if defined(__aarch64__)
7866 double sum = vpaddd_f64(vreinterpretq_f64_m128d(tmp));
7868 double sum = *((
double *) &tmp) + *(((
double *) &tmp) + 1);
7883#if defined(__aarch64__)
7913 (imm & 0x1) ? s : 0,
7914 (imm & 0x2) ? s : 0,
7915 (imm & 0x4) ? s : 0,
7916 (imm & 0x8) ? s : 0,
7924#define _mm_extract_epi32(a, imm) \
7925 vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm))
7930#define _mm_extract_epi64(a, imm) \
7931 vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm))
7937#define _mm_extract_epi8(a, imm) vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm))
7941#define _mm_extract_ps(a, imm) vgetq_lane_s32(vreinterpretq_s32_m128(a), (imm))
7949#if defined(__aarch64__)
7950 return vreinterpretq_m128d_f64(vrndmq_f64(vreinterpretq_f64_m128d(a)));
7952 double *
f = (
double *) &a;
7963#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
7966 float *
f = (
float *) &a;
7967 return _mm_set_ps(floorf(
f[3]), floorf(
f[2]), floorf(
f[1]), floorf(
f[0]));
7999#define _mm_insert_epi32(a, b, imm) \
8001 vreinterpretq_m128i_s32( \
8002 vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))); \
8009#define _mm_insert_epi64(a, b, imm) \
8011 vreinterpretq_m128i_s64( \
8012 vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))); \
8019#define _mm_insert_epi8(a, b, imm) \
8021 vreinterpretq_m128i_s8( \
8022 vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))); \
8029#define _mm_insert_ps(a, b, imm8) \
8031 float32x4_t tmp1 = \
8032 vsetq_lane_f32(vgetq_lane_f32(b, (imm8 >> 6) & 0x3), \
8033 vreinterpretq_f32_m128(a), 0); \
8034 float32x4_t tmp2 = \
8035 vsetq_lane_f32(vgetq_lane_f32(tmp1, 0), vreinterpretq_f32_m128(a), \
8036 ((imm8 >> 4) & 0x3)); \
8037 const uint32_t data[4] = {((imm8) & (1 << 0)) ? UINT32_MAX : 0, \
8038 ((imm8) & (1 << 1)) ? UINT32_MAX : 0, \
8039 ((imm8) & (1 << 2)) ? UINT32_MAX : 0, \
8040 ((imm8) & (1 << 3)) ? UINT32_MAX : 0}; \
8041 uint32x4_t mask = vld1q_u32(data); \
8042 float32x4_t all_zeros = vdupq_n_f32(0); \
8044 vreinterpretq_m128_f32( \
8045 vbslq_f32(mask, all_zeros, vreinterpretq_f32_m128(tmp2))); \
8155 uint16_t min, idx = 0;
8156#if defined(__aarch64__)
8161 static const uint16_t idxv[] = {0, 1, 2, 3, 4, 5, 6, 7};
8162 uint16x8_t minv = vdupq_n_u16(min);
8164 idx = vminvq_u16(vornq_u16(vld1q_u16(idxv), cmeq));
8178 for (i = 0; i < 8; i++) {
8206 switch (imm & 0x4) {
8216#if defined(__GNUC__) || defined(__clang__)
8217 __builtin_unreachable();
8222 switch (imm & 0x3) {
8224 _b = vreinterpretq_u8_u32(
8228 _b = vreinterpretq_u8_u32(
8232 _b = vreinterpretq_u8_u32(
8236 _b = vreinterpretq_u8_u32(
8240#if defined(__GNUC__) || defined(__clang__)
8241 __builtin_unreachable();
8246 int16x8_t c04, c15, c26, c37;
8247 uint8x8_t low_b = vget_low_u8(_b);
8248 c04 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a), low_b));
8249 uint8x16_t _a_1 = vextq_u8(_a, _a, 1);
8250 c15 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_1), low_b));
8251 uint8x16_t _a_2 = vextq_u8(_a, _a, 2);
8252 c26 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_2), low_b));
8253 uint8x16_t _a_3 = vextq_u8(_a, _a, 3);
8254 c37 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_3), low_b));
8255#if defined(__aarch64__)
8257 c04 = vpaddq_s16(c04, c26);
8259 c15 = vpaddq_s16(c15, c37);
8262 vtrn1q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15));
8264 vtrn2q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15));
8266 vreinterpretq_s16_s32(trn2_c)));
8268 int16x4_t c01, c23, c45, c67;
8269 c01 = vpadd_s16(vget_low_s16(c04), vget_low_s16(c15));
8270 c23 = vpadd_s16(vget_low_s16(c26), vget_low_s16(c37));
8271 c45 = vpadd_s16(vget_high_s16(c04), vget_high_s16(c15));
8272 c67 = vpadd_s16(vget_high_s16(c26), vget_high_s16(c37));
8275 vcombine_s16(vpadd_s16(c01, c23), vpadd_s16(c45, c67)));
8325#if defined(__aarch64__)
8328 return vreinterpretq_m128d_f64(vrndnq_f64(vreinterpretq_f64_m128d(a)));
8334 return vreinterpretq_m128d_f64(vrndq_f64(vreinterpretq_f64_m128d(a)));
8336 return vreinterpretq_m128d_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)));
8339 double *v_double = (
double *) &a;
8345 for (
int i = 0; i < 2; i++) {
8346 tmp = (v_double[i] < 0) ? -v_double[i] : v_double[i];
8347 double roundDown = floor(tmp);
8348 double roundUp = ceil(tmp);
8349 double diffDown = tmp - roundDown;
8350 double diffUp = roundUp - tmp;
8351 if (diffDown < diffUp) {
8354 }
else if (diffDown > diffUp) {
8360 double half = roundDown / 2;
8361 if (half != floor(half)) {
8371 res[i] = (v_double[i] < 0) ? -res[i] : res[i];
8383 return _mm_set_pd(v_double[1] > 0 ? floor(v_double[1]) : ceil(v_double[1]),
8384 v_double[0] > 0 ? floor(v_double[0]) : ceil(v_double[0]));
8394#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
8408 float *v_float = (
float *) &a;
8413 uint32x4_t signmask = vdupq_n_u32(0x80000000);
8416 int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32(
8418 int32x4_t r_trunc = vcvtq_s32_f32(
8420 int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32(
8421 vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31));
8422 int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone),
8424 float32x4_t delta = vsubq_f32(
8426 vcvtq_f32_s32(r_trunc));
8427 uint32x4_t is_delta_half =
8428 vceqq_f32(delta, half);
8430 vcvtq_f32_s32(vbslq_s32(is_delta_half, r_even, r_normal)));
8440 return _mm_set_ps(v_float[3] > 0 ? floorf(v_float[3]) : ceilf(v_float[3]),
8441 v_float[2] > 0 ? floorf(v_float[2]) : ceilf(v_float[2]),
8442 v_float[1] > 0 ? floorf(v_float[1]) : ceilf(v_float[1]),
8443 v_float[0] > 0 ? floorf(v_float[0]) : ceilf(v_float[0]));
8486#if __has_builtin(__builtin_nontemporal_store)
8487 return __builtin_nontemporal_load(p);
8498 return (uint64_t) (vgetq_lane_s64(a, 0) & vgetq_lane_s64(a, 1)) ==
8507 int64x2_t a_and_mask =
8509 return !(vgetq_lane_s64(a_and_mask, 0) | vgetq_lane_s64(a_and_mask, 1));
8524 uint64x2_t result = vandq_u64(zf, cf);
8525 return !(vgetq_lane_u64(result, 0) | vgetq_lane_u64(result, 1));
8537 return !(vgetq_lane_s64(s64, 0) | vgetq_lane_s64(s64, 1));
8546#define _mm_testnzc_si128(a, b) _mm_test_mix_ones_zeros(a, b)
8557 return !(vgetq_lane_s64(s64, 0) | vgetq_lane_s64(s64, 1));
8562const static uint16_t _sse2neon_cmpestr_mask16b[8]
ALIGN_STRUCT(16) = {
8563 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
8565const static uint8_t _sse2neon_cmpestr_mask8b[16]
ALIGN_STRUCT(16) = {
8566 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
8567 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
8571#define _SIDD_UBYTE_OPS 0x00
8572#define _SIDD_UWORD_OPS 0x01
8573#define _SIDD_SBYTE_OPS 0x02
8574#define _SIDD_SWORD_OPS 0x03
8577#define _SIDD_CMP_EQUAL_ANY 0x00
8578#define _SIDD_CMP_RANGES 0x04
8579#define _SIDD_CMP_EQUAL_EACH 0x08
8580#define _SIDD_CMP_EQUAL_ORDERED 0x0C
8583#define _SIDD_POSITIVE_POLARITY 0x00
8584#define _SIDD_MASKED_POSITIVE_POLARITY 0x20
8585#define _SIDD_NEGATIVE_POLARITY 0x10
8586#define _SIDD_MASKED_NEGATIVE_POLARITY \
8590#define _SIDD_LEAST_SIGNIFICANT 0x00
8591#define _SIDD_MOST_SIGNIFICANT 0x40
8594#define _SIDD_BIT_MASK 0x00
8595#define _SIDD_UNIT_MASK 0x40
8602#define SSE2NEON_PRIMITIVE_CAT(a, ...) a##__VA_ARGS__
8603#define SSE2NEON_CAT(a, b) SSE2NEON_PRIMITIVE_CAT(a, b)
8605#define SSE2NEON_IIF(c) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_IIF_, c)
8607#define SSE2NEON_IIF_0(t, ...) __VA_ARGS__
8609#define SSE2NEON_IIF_1(t, ...) t
8611#define SSE2NEON_COMPL(b) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_COMPL_, b)
8612#define SSE2NEON_COMPL_0 1
8613#define SSE2NEON_COMPL_1 0
8615#define SSE2NEON_DEC(x) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_DEC_, x)
8616#define SSE2NEON_DEC_1 0
8617#define SSE2NEON_DEC_2 1
8618#define SSE2NEON_DEC_3 2
8619#define SSE2NEON_DEC_4 3
8620#define SSE2NEON_DEC_5 4
8621#define SSE2NEON_DEC_6 5
8622#define SSE2NEON_DEC_7 6
8623#define SSE2NEON_DEC_8 7
8624#define SSE2NEON_DEC_9 8
8625#define SSE2NEON_DEC_10 9
8626#define SSE2NEON_DEC_11 10
8627#define SSE2NEON_DEC_12 11
8628#define SSE2NEON_DEC_13 12
8629#define SSE2NEON_DEC_14 13
8630#define SSE2NEON_DEC_15 14
8631#define SSE2NEON_DEC_16 15
8634#define SSE2NEON_CHECK_N(x, n, ...) n
8635#define SSE2NEON_CHECK(...) SSE2NEON_CHECK_N(__VA_ARGS__, 0, )
8636#define SSE2NEON_PROBE(x) x, 1,
8638#define SSE2NEON_NOT(x) SSE2NEON_CHECK(SSE2NEON_PRIMITIVE_CAT(SSE2NEON_NOT_, x))
8639#define SSE2NEON_NOT_0 SSE2NEON_PROBE(~)
8641#define SSE2NEON_BOOL(x) SSE2NEON_COMPL(SSE2NEON_NOT(x))
8642#define SSE2NEON_IF(c) SSE2NEON_IIF(SSE2NEON_BOOL(c))
8644#define SSE2NEON_EAT(...)
8645#define SSE2NEON_EXPAND(...) __VA_ARGS__
8646#define SSE2NEON_WHEN(c) SSE2NEON_IF(c)(SSE2NEON_EXPAND, SSE2NEON_EAT)
8650#define SSE2NEON_EMPTY()
8651#define SSE2NEON_DEFER(id) id SSE2NEON_EMPTY()
8652#define SSE2NEON_OBSTRUCT(...) __VA_ARGS__ SSE2NEON_DEFER(SSE2NEON_EMPTY)()
8653#define SSE2NEON_EXPAND(...) __VA_ARGS__
8655#define SSE2NEON_EVAL(...) \
8656 SSE2NEON_EVAL1(SSE2NEON_EVAL1(SSE2NEON_EVAL1(__VA_ARGS__)))
8657#define SSE2NEON_EVAL1(...) \
8658 SSE2NEON_EVAL2(SSE2NEON_EVAL2(SSE2NEON_EVAL2(__VA_ARGS__)))
8659#define SSE2NEON_EVAL2(...) \
8660 SSE2NEON_EVAL3(SSE2NEON_EVAL3(SSE2NEON_EVAL3(__VA_ARGS__)))
8661#define SSE2NEON_EVAL3(...) __VA_ARGS__
8663#define SSE2NEON_REPEAT(count, macro, ...) \
8664 SSE2NEON_WHEN(count) \
8665 (SSE2NEON_OBSTRUCT(SSE2NEON_REPEAT_INDIRECT)()( \
8666 SSE2NEON_DEC(count), macro, \
8667 __VA_ARGS__) SSE2NEON_OBSTRUCT(macro)(SSE2NEON_DEC(count), \
8669#define SSE2NEON_REPEAT_INDIRECT() SSE2NEON_REPEAT
8671#define SSE2NEON_SIZE_OF_byte 8
8672#define SSE2NEON_NUMBER_OF_LANES_byte 16
8673#define SSE2NEON_SIZE_OF_word 16
8674#define SSE2NEON_NUMBER_OF_LANES_word 8
8676#define SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE(i, type) \
8677 mtx[i] = vreinterpretq_m128i_##type(vceqq_##type( \
8678 vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i)), \
8679 vreinterpretq_##type##_m128i(a)));
8681#define SSE2NEON_FILL_LANE(i, type) \
8683 vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i));
8685#define PCMPSTR_RANGES(a, b, mtx, data_type_prefix, type_prefix, size, \
8686 number_of_lanes, byte_or_word) \
8690 SSE2NEON_CAT(size, \
8691 SSE2NEON_CAT(x, SSE2NEON_CAT(number_of_lanes, _t)))) \
8692 vec_b[number_of_lanes]; \
8693 __m128i mask = SSE2NEON_IIF(byte_or_word)( \
8694 vreinterpretq_m128i_u16(vdupq_n_u16(0xff)), \
8695 vreinterpretq_m128i_u32(vdupq_n_u32(0xffff))); \
8696 SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, SSE2NEON_FILL_LANE, \
8697 SSE2NEON_CAT(type_prefix, size))) \
8698 for (int i = 0; i < number_of_lanes; i++) { \
8699 mtx[i] = SSE2NEON_CAT(vreinterpretq_m128i_u, \
8700 size)(SSE2NEON_CAT(vbslq_u, size)( \
8701 SSE2NEON_CAT(vreinterpretq_u, \
8702 SSE2NEON_CAT(size, _m128i))(mask), \
8703 SSE2NEON_CAT(vcgeq_, SSE2NEON_CAT(type_prefix, size))( \
8707 SSE2NEON_CAT(type_prefix, \
8708 SSE2NEON_CAT(size, _m128i(a))))), \
8709 SSE2NEON_CAT(vcleq_, SSE2NEON_CAT(type_prefix, size))( \
8713 SSE2NEON_CAT(type_prefix, \
8714 SSE2NEON_CAT(size, _m128i(a))))))); \
8718#define PCMPSTR_EQ(a, b, mtx, size, number_of_lanes) \
8720 SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, \
8721 SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE, \
8722 SSE2NEON_CAT(u, size))) \
8725#define SSE2NEON_CMP_EQUAL_ANY_IMPL(type) \
8726 static int _sse2neon_cmp_##type##_equal_any(__m128i a, int la, __m128i b, \
8730 PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8731 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \
8732 return SSE2NEON_CAT( \
8733 _sse2neon_aggregate_equal_any_, \
8735 SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8736 SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \
8737 type))))(la, lb, mtx); \
8740#define SSE2NEON_CMP_RANGES_IMPL(type, data_type, us, byte_or_word) \
8741 static int _sse2neon_cmp_##us##type##_ranges(__m128i a, int la, __m128i b, \
8746 a, b, mtx, data_type, us, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8747 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), byte_or_word); \
8748 return SSE2NEON_CAT( \
8749 _sse2neon_aggregate_ranges_, \
8751 SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8752 SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \
8753 type))))(la, lb, mtx); \
8756#define SSE2NEON_CMP_EQUAL_ORDERED_IMPL(type) \
8757 static int _sse2neon_cmp_##type##_equal_ordered(__m128i a, int la, \
8758 __m128i b, int lb) \
8761 PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8762 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \
8763 return SSE2NEON_CAT( \
8764 _sse2neon_aggregate_equal_ordered_, \
8766 SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8768 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type))))( \
8769 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), la, lb, mtx); \
8772static int _sse2neon_aggregate_equal_any_8x16(
int la,
int lb,
__m128i mtx[16])
8775 int m = (1 << la) - 1;
8776 uint8x8_t vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b);
8777 uint8x8_t t_lo = vtst_u8(vdup_n_u8(m & 0xff), vec_mask);
8778 uint8x8_t t_hi = vtst_u8(vdup_n_u8(m >> 8), vec_mask);
8779 uint8x16_t vec = vcombine_u8(t_lo, t_hi);
8780 for (
int j = 0; j < lb; j++) {
8791static int _sse2neon_aggregate_equal_any_16x8(
int la,
int lb,
__m128i mtx[16])
8794 int m = (1 << la) - 1;
8796 vtstq_u16(vdupq_n_u16(m), vld1q_u16(_sse2neon_cmpestr_mask16b));
8797 for (
int j = 0; j < lb; j++) {
8809#define SSE2NEON_GENERATE_CMP_EQUAL_ANY(prefix) \
8810 prefix##IMPL(byte) \
8816static int _sse2neon_aggregate_ranges_16x8(
int la,
int lb,
__m128i mtx[16])
8819 int m = (1 << la) - 1;
8821 vtstq_u16(vdupq_n_u16(m), vld1q_u16(_sse2neon_cmpestr_mask16b));
8822 for (
int j = 0; j < lb; j++) {
8831#if defined(__aarch64__)
8832 int t = vaddvq_u32(vec_res) ? 1 : 0;
8834 uint64x2_t sumh = vpaddlq_u32(vec_res);
8835 int t = vgetq_lane_u64(sumh, 0) + vgetq_lane_u64(sumh, 1);
8842static int _sse2neon_aggregate_ranges_8x16(
int la,
int lb,
__m128i mtx[16])
8845 int m = (1 << la) - 1;
8846 uint8x8_t vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b);
8847 uint8x8_t t_lo = vtst_u8(vdup_n_u8(m & 0xff), vec_mask);
8848 uint8x8_t t_hi = vtst_u8(vdup_n_u8(m >> 8), vec_mask);
8849 uint8x16_t vec = vcombine_u8(t_lo, t_hi);
8850 for (
int j = 0; j < lb; j++) {
8865#define SSE2NEON_CMP_RANGES_IS_BYTE 1
8866#define SSE2NEON_CMP_RANGES_IS_WORD 0
8869#define SSE2NEON_GENERATE_CMP_RANGES(prefix) \
8870 prefix##IMPL(byte, uint, u, prefix##IS_BYTE) \
8871 prefix##IMPL(byte, int, s, prefix##IS_BYTE) \
8872 prefix##IMPL(word, uint, u, prefix##IS_WORD) \
8873 prefix##IMPL(word, int, s, prefix##IS_WORD)
8878#undef SSE2NEON_CMP_RANGES_IS_BYTE
8879#undef SSE2NEON_CMP_RANGES_IS_WORD
8881static int _sse2neon_cmp_byte_equal_each(
__m128i a,
int la,
__m128i b,
int lb)
8885 int m0 = (la < lb) ? 0 : ((1 << la) - (1 << lb));
8886 int m1 = 0x10000 - (1 << la);
8887 int tb = 0x10000 - (1 << lb);
8888 uint8x8_t vec_mask, vec0_lo, vec0_hi, vec1_lo, vec1_hi;
8889 uint8x8_t tmp_lo, tmp_hi, res_lo, res_hi;
8890 vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b);
8891 vec0_lo = vtst_u8(vdup_n_u8(m0), vec_mask);
8892 vec0_hi = vtst_u8(vdup_n_u8(m0 >> 8), vec_mask);
8893 vec1_lo = vtst_u8(vdup_n_u8(m1), vec_mask);
8894 vec1_hi = vtst_u8(vdup_n_u8(m1 >> 8), vec_mask);
8895 tmp_lo = vtst_u8(vdup_n_u8(tb), vec_mask);
8896 tmp_hi = vtst_u8(vdup_n_u8(tb >> 8), vec_mask);
8898 res_lo = vbsl_u8(vec0_lo, vdup_n_u8(0), vget_low_u8(mtx));
8899 res_hi = vbsl_u8(vec0_hi, vdup_n_u8(0), vget_high_u8(mtx));
8900 res_lo = vbsl_u8(vec1_lo, tmp_lo, res_lo);
8901 res_hi = vbsl_u8(vec1_hi, tmp_hi, res_hi);
8902 res_lo = vand_u8(res_lo, vec_mask);
8903 res_hi = vand_u8(res_hi, vec_mask);
8909static int _sse2neon_cmp_word_equal_each(
__m128i a,
int la,
__m128i b,
int lb)
8913 int m0 = (la < lb) ? 0 : ((1 << la) - (1 << lb));
8914 int m1 = 0x100 - (1 << la);
8915 int tb = 0x100 - (1 << lb);
8916 uint16x8_t vec_mask = vld1q_u16(_sse2neon_cmpestr_mask16b);
8917 uint16x8_t vec0 = vtstq_u16(vdupq_n_u16(m0), vec_mask);
8918 uint16x8_t vec1 = vtstq_u16(vdupq_n_u16(m1), vec_mask);
8919 uint16x8_t tmp = vtstq_u16(vdupq_n_u16(tb), vec_mask);
8920 mtx = vbslq_u16(vec0, vdupq_n_u16(0), mtx);
8921 mtx = vbslq_u16(vec1, tmp, mtx);
8922 mtx = vandq_u16(mtx, vec_mask);
8926#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE 1
8927#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD 0
8929#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IMPL(size, number_of_lanes, data_type) \
8930 static int _sse2neon_aggregate_equal_ordered_##size##x##number_of_lanes( \
8931 int bound, int la, int lb, __m128i mtx[16]) \
8934 int m1 = SSE2NEON_IIF(data_type)(0x10000, 0x100) - (1 << la); \
8935 uint##size##x8_t vec_mask = SSE2NEON_IIF(data_type)( \
8936 vld1_u##size(_sse2neon_cmpestr_mask##size##b), \
8937 vld1q_u##size(_sse2neon_cmpestr_mask##size##b)); \
8938 uint##size##x##number_of_lanes##_t vec1 = SSE2NEON_IIF(data_type)( \
8939 vcombine_u##size(vtst_u##size(vdup_n_u##size(m1), vec_mask), \
8940 vtst_u##size(vdup_n_u##size(m1 >> 8), vec_mask)), \
8941 vtstq_u##size(vdupq_n_u##size(m1), vec_mask)); \
8942 uint##size##x##number_of_lanes##_t vec_minusone = vdupq_n_u##size(-1); \
8943 uint##size##x##number_of_lanes##_t vec_zero = vdupq_n_u##size(0); \
8944 for (int j = 0; j < lb; j++) { \
8945 mtx[j] = vreinterpretq_m128i_u##size(vbslq_u##size( \
8946 vec1, vec_minusone, vreinterpretq_u##size##_m128i(mtx[j]))); \
8948 for (int j = lb; j < bound; j++) { \
8949 mtx[j] = vreinterpretq_m128i_u##size( \
8950 vbslq_u##size(vec1, vec_minusone, vec_zero)); \
8952 unsigned SSE2NEON_IIF(data_type)(char, short) *ptr = \
8953 (unsigned SSE2NEON_IIF(data_type)(char, short) *) mtx; \
8954 for (int i = 0; i < bound; i++) { \
8956 for (int j = 0, k = i; j < bound - i && k < bound; j++, k++) \
8957 val &= ptr[k * bound + j]; \
8964#define SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(prefix) \
8965 prefix##IMPL(8, 16, prefix##IS_UBYTE) \
8966 prefix##IMPL(16, 8, prefix##IS_UWORD)
8971#undef SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE
8972#undef SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD
8975#define SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(prefix) \
8976 prefix##IMPL(byte) \
8982#define SSE2NEON_CMPESTR_LIST \
8983 _(CMP_UBYTE_EQUAL_ANY, cmp_byte_equal_any) \
8984 _(CMP_UWORD_EQUAL_ANY, cmp_word_equal_any) \
8985 _(CMP_SBYTE_EQUAL_ANY, cmp_byte_equal_any) \
8986 _(CMP_SWORD_EQUAL_ANY, cmp_word_equal_any) \
8987 _(CMP_UBYTE_RANGES, cmp_ubyte_ranges) \
8988 _(CMP_UWORD_RANGES, cmp_uword_ranges) \
8989 _(CMP_SBYTE_RANGES, cmp_sbyte_ranges) \
8990 _(CMP_SWORD_RANGES, cmp_sword_ranges) \
8991 _(CMP_UBYTE_EQUAL_EACH, cmp_byte_equal_each) \
8992 _(CMP_UWORD_EQUAL_EACH, cmp_word_equal_each) \
8993 _(CMP_SBYTE_EQUAL_EACH, cmp_byte_equal_each) \
8994 _(CMP_SWORD_EQUAL_EACH, cmp_word_equal_each) \
8995 _(CMP_UBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \
8996 _(CMP_UWORD_EQUAL_ORDERED, cmp_word_equal_ordered) \
8997 _(CMP_SBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \
8998 _(CMP_SWORD_EQUAL_ORDERED, cmp_word_equal_ordered)
9001#define _(name, func_suffix) name,
9007#define _(name, func_suffix) _sse2neon_##func_suffix,
9014 switch (imm8 & 0x30) {
9019 res ^= (1 << lb) - 1;
9025 return res & ((bound == 8) ? 0xFF : 0xFFFF);
9032 if (_BitScanForward(&cnt, x))
9036 return x != 0 ? __builtin_clz(x) : 32;
9044 if (_BitScanReverse(&cnt, x))
9048 return x != 0 ? __builtin_ctz(x) : 32;
9056#ifdef defined(SSE2NEON_HAS_BITSCAN64)
9057 (defined(_M_AMD64) || defined(__x86_64__))
9058 if((_BitScanForward64(&cnt, x))
9061 if (_BitScanForward(&cnt, (
unsigned long) (x)))
9063 if (_BitScanForward(&cnt, (
unsigned long) (x >> 32)))
9064 return (
int) (cnt + 32);
9068 return x != 0 ? __builtin_ctzll(x) : 64;
9072#define SSE2NEON_MIN(x, y) (x) < (y) ? (x) : (y)
9074#define SSE2NEON_CMPSTR_SET_UPPER(var, imm) \
9075 const int var = (imm & 0x01) ? 8 : 16
9077#define SSE2NEON_CMPESTRX_LEN_PAIR(a, b, la, lb) \
9078 int tmp1 = la ^ (la >> 31); \
9079 la = tmp1 - (la >> 31); \
9080 int tmp2 = lb ^ (lb >> 31); \
9081 lb = tmp2 - (lb >> 31); \
9082 la = SSE2NEON_MIN(la, bound); \
9083 lb = SSE2NEON_MIN(lb, bound)
9090#define SSE2NEON_COMP_AGG(a, b, la, lb, imm8, IE) \
9091 SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); \
9092 SSE2NEON_##IE##_LEN_PAIR(a, b, la, lb); \
9093 int r2 = (_sse2neon_cmpfunc_table[imm8 & 0x0f])(a, la, b, lb); \
9094 r2 = _sse2neon_sido_negative(r2, lb, imm8, bound)
9096#define SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8) \
9097 return (r2 == 0) ? bound \
9098 : ((imm8 & 0x40) ? (31 - _sse2neon_clz(r2)) \
9099 : _sse2neon_ctz(r2))
9101#define SSE2NEON_CMPSTR_GENERATE_MASK(dst) \
9102 __m128i dst = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \
9103 if (imm8 & 0x40) { \
9105 uint16x8_t tmp = vtstq_u16(vdupq_n_u16(r2), \
9106 vld1q_u16(_sse2neon_cmpestr_mask16b)); \
9107 dst = vreinterpretq_m128i_u16(vbslq_u16( \
9108 tmp, vdupq_n_u16(-1), vreinterpretq_u16_m128i(dst))); \
9110 uint8x16_t vec_r2 = \
9111 vcombine_u8(vdup_n_u8(r2), vdup_n_u8(r2 >> 8)); \
9113 vtstq_u8(vec_r2, vld1q_u8(_sse2neon_cmpestr_mask8b)); \
9114 dst = vreinterpretq_m128i_u8( \
9115 vbslq_u8(tmp, vdupq_n_u8(-1), vreinterpretq_u8_m128i(dst))); \
9118 if (bound == 16) { \
9119 dst = vreinterpretq_m128i_u16( \
9120 vsetq_lane_u16(r2 & 0xffff, vreinterpretq_u16_m128i(dst), 0)); \
9122 dst = vreinterpretq_m128i_u8( \
9123 vsetq_lane_u8(r2 & 0xff, vreinterpretq_u8_m128i(dst), 0)); \
9140 return !r2 & (lb_cpy > bound);
9202 return la <= (bound - 1);
9215 return lb <= (bound - 1);
9218#define SSE2NEON_CMPISTRX_LENGTH(str, len, imm8) \
9220 if (imm8 & 0x01) { \
9221 uint16x8_t equal_mask_##str = \
9222 vceqq_u16(vreinterpretq_u16_m128i(str), vdupq_n_u16(0)); \
9223 uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \
9224 uint64_t matches_##str = \
9225 vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \
9226 len = _sse2neon_ctzll(matches_##str) >> 3; \
9228 uint16x8_t equal_mask_##str = vreinterpretq_u16_u8( \
9229 vceqq_u8(vreinterpretq_u8_m128i(str), vdupq_n_u8(0))); \
9230 uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \
9231 uint64_t matches_##str = \
9232 vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \
9233 len = _sse2neon_ctzll(matches_##str) >> 2; \
9237#define SSE2NEON_CMPISTRX_LEN_PAIR(a, b, la, lb) \
9240 SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); \
9241 SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); \
9251 return !r2 & (lb >= bound);
9298 return la <= (bound - 1);
9309 return lb <= (bound - 1);
9316#if defined(__aarch64__)
9331#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9332 __asm__ __volatile__(
"crc32ch %w[c], %w[c], %w[v]\n\t"
9335#elif (__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)
9336 crc = __crc32ch(crc, v);
9349#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9350 __asm__ __volatile__(
"crc32cw %w[c], %w[c], %w[v]\n\t"
9353#elif (__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)
9354 crc = __crc32cw(crc, v);
9367#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9368 __asm__ __volatile__(
"crc32cx %w[c], %w[c], %x[v]\n\t"
9373 crc =
_mm_crc32_u32((uint32_t) (crc), (v >> 32) & 0xffffffff);
9383#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9384 __asm__ __volatile__(
"crc32cb %w[c], %w[c], %w[v]\n\t"
9387#elif (__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)
9388 crc = __crc32cb(crc, v);
9391 for (
int bit = 0; bit < 8; bit++) {
9393 crc = (crc >> 1) ^ UINT32_C(0x82f63b78);
9403#if !defined(__ARM_FEATURE_CRYPTO)
9405#define SSE2NEON_AES_SBOX(w) \
9407 w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), \
9408 w(0xc5), w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), \
9409 w(0xab), w(0x76), w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), \
9410 w(0x59), w(0x47), w(0xf0), w(0xad), w(0xd4), w(0xa2), w(0xaf), \
9411 w(0x9c), w(0xa4), w(0x72), w(0xc0), w(0xb7), w(0xfd), w(0x93), \
9412 w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc), w(0x34), w(0xa5), \
9413 w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15), w(0x04), \
9414 w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a), \
9415 w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), \
9416 w(0x75), w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), \
9417 w(0x5a), w(0xa0), w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), \
9418 w(0xe3), w(0x2f), w(0x84), w(0x53), w(0xd1), w(0x00), w(0xed), \
9419 w(0x20), w(0xfc), w(0xb1), w(0x5b), w(0x6a), w(0xcb), w(0xbe), \
9420 w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf), w(0xd0), w(0xef), \
9421 w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85), w(0x45), \
9422 w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8), \
9423 w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), \
9424 w(0xf5), w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), \
9425 w(0xf3), w(0xd2), w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), \
9426 w(0x97), w(0x44), w(0x17), w(0xc4), w(0xa7), w(0x7e), w(0x3d), \
9427 w(0x64), w(0x5d), w(0x19), w(0x73), w(0x60), w(0x81), w(0x4f), \
9428 w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88), w(0x46), w(0xee), \
9429 w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb), w(0xe0), \
9430 w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c), \
9431 w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), \
9432 w(0x79), w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), \
9433 w(0x4e), w(0xa9), w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), \
9434 w(0x7a), w(0xae), w(0x08), w(0xba), w(0x78), w(0x25), w(0x2e), \
9435 w(0x1c), w(0xa6), w(0xb4), w(0xc6), w(0xe8), w(0xdd), w(0x74), \
9436 w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a), w(0x70), w(0x3e), \
9437 w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e), w(0x61), \
9438 w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e), \
9439 w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), \
9440 w(0x94), w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), \
9441 w(0x28), w(0xdf), w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), \
9442 w(0xe6), w(0x42), w(0x68), w(0x41), w(0x99), w(0x2d), w(0x0f), \
9443 w(0xb0), w(0x54), w(0xbb), w(0x16) \
9445#define SSE2NEON_AES_RSBOX(w) \
9447 w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), \
9448 w(0x38), w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), \
9449 w(0xd7), w(0xfb), w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), \
9450 w(0x2f), w(0xff), w(0x87), w(0x34), w(0x8e), w(0x43), w(0x44), \
9451 w(0xc4), w(0xde), w(0xe9), w(0xcb), w(0x54), w(0x7b), w(0x94), \
9452 w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d), w(0xee), w(0x4c), \
9453 w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e), w(0x08), \
9454 w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2), \
9455 w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), \
9456 w(0x25), w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), \
9457 w(0x98), w(0x16), w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), \
9458 w(0x65), w(0xb6), w(0x92), w(0x6c), w(0x70), w(0x48), w(0x50), \
9459 w(0xfd), w(0xed), w(0xb9), w(0xda), w(0x5e), w(0x15), w(0x46), \
9460 w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84), w(0x90), w(0xd8), \
9461 w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a), w(0xf7), \
9462 w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06), \
9463 w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), \
9464 w(0x02), w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), \
9465 w(0x8a), w(0x6b), w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), \
9466 w(0x67), w(0xdc), w(0xea), w(0x97), w(0xf2), w(0xcf), w(0xce), \
9467 w(0xf0), w(0xb4), w(0xe6), w(0x73), w(0x96), w(0xac), w(0x74), \
9468 w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85), w(0xe2), w(0xf9), \
9469 w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e), w(0x47), \
9470 w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89), \
9471 w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), \
9472 w(0x1b), w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), \
9473 w(0x79), w(0x20), w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), \
9474 w(0xcd), w(0x5a), w(0xf4), w(0x1f), w(0xdd), w(0xa8), w(0x33), \
9475 w(0x88), w(0x07), w(0xc7), w(0x31), w(0xb1), w(0x12), w(0x10), \
9476 w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f), w(0x60), w(0x51), \
9477 w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d), w(0x2d), \
9478 w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef), \
9479 w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), \
9480 w(0xb0), w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), \
9481 w(0x99), w(0x61), w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), \
9482 w(0x77), w(0xd6), w(0x26), w(0xe1), w(0x69), w(0x14), w(0x63), \
9483 w(0x55), w(0x21), w(0x0c), w(0x7d) \
9488#define SSE2NEON_AES_H0(x) (x)
9491#undef SSE2NEON_AES_H0
9494#if !defined(__aarch64__)
9495#define SSE2NEON_XT(x) (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b))
9496#define SSE2NEON_MULTIPLY(x, y) \
9497 (((y & 1) * x) ^ ((y >> 1 & 1) * SSE2NEON_XT(x)) ^ \
9498 ((y >> 2 & 1) * SSE2NEON_XT(SSE2NEON_XT(x))) ^ \
9499 ((y >> 3 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x)))) ^ \
9500 ((y >> 4 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x))))))
9511#if defined(__aarch64__)
9512 static const uint8_t shift_rows[] = {
9513 0x0, 0x5, 0xa, 0xf, 0x4, 0x9, 0xe, 0x3,
9514 0x8, 0xd, 0x2, 0x7, 0xc, 0x1, 0x6, 0xb,
9516 static const uint8_t ror32by8[] = {
9517 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4,
9518 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc,
9525 w = vqtbl1q_u8(w, vld1q_u8(shift_rows));
9540 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b);
9541 w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v);
9542 w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8));
9548#define SSE2NEON_AES_B2W(b0, b1, b2, b3) \
9549 (((uint32_t) (b3) << 24) | ((uint32_t) (b2) << 16) | \
9550 ((uint32_t) (b1) << 8) | (uint32_t) (b0))
9552#define SSE2NEON_AES_F2(x) ((x << 1) ^ (((x >> 7) & 1) * 0x011b ))
9554#define SSE2NEON_AES_F3(x) (SSE2NEON_AES_F2(x) ^ x)
9555#define SSE2NEON_AES_U0(p) \
9556 SSE2NEON_AES_B2W(SSE2NEON_AES_F2(p), p, p, SSE2NEON_AES_F3(p))
9557#define SSE2NEON_AES_U1(p) \
9558 SSE2NEON_AES_B2W(SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p, p)
9559#define SSE2NEON_AES_U2(p) \
9560 SSE2NEON_AES_B2W(p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p)
9561#define SSE2NEON_AES_U3(p) \
9562 SSE2NEON_AES_B2W(p, p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p))
9566 static const uint32_t
ALIGN_STRUCT(16) aes_table[4][256] = {
9572#undef SSE2NEON_AES_B2W
9573#undef SSE2NEON_AES_F2
9574#undef SSE2NEON_AES_F3
9575#undef SSE2NEON_AES_U0
9576#undef SSE2NEON_AES_U1
9577#undef SSE2NEON_AES_U2
9578#undef SSE2NEON_AES_U3
9590 (aes_table[0][x3 & 0xff] ^ aes_table[1][(x0 >> 8) & 0xff] ^
9591 aes_table[2][(x1 >> 16) & 0xff] ^ aes_table[3][x2 >> 24]),
9592 (aes_table[0][x2 & 0xff] ^ aes_table[1][(x3 >> 8) & 0xff] ^
9593 aes_table[2][(x0 >> 16) & 0xff] ^ aes_table[3][x1 >> 24]),
9594 (aes_table[0][x1 & 0xff] ^ aes_table[1][(x2 >> 8) & 0xff] ^
9595 aes_table[2][(x3 >> 16) & 0xff] ^ aes_table[3][x0 >> 24]),
9596 (aes_table[0][x0 & 0xff] ^ aes_table[1][(x1 >> 8) & 0xff] ^
9597 aes_table[2][(x2 >> 16) & 0xff] ^ aes_table[3][x3 >> 24]));
9608#if defined(__aarch64__)
9609 static const uint8_t inv_shift_rows[] = {
9610 0x0, 0xd, 0xa, 0x7, 0x4, 0x1, 0xe, 0xb,
9611 0x8, 0x5, 0x2, 0xf, 0xc, 0x9, 0x6, 0x3,
9613 static const uint8_t ror32by8[] = {
9614 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4,
9615 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc,
9622 w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows));
9632 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b);
9633 w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b);
9635 v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w);
9637 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) &
9639 w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v);
9640 w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8));
9647 uint8_t i, e,
f, g, h, v[4][4];
9648 uint8_t *_a = (uint8_t *) &a;
9649 for (i = 0; i < 16; ++i) {
9650 v[((i / 4) + (i % 4)) % 4][i % 4] = _sse2neon_rsbox[_a[i]];
9654 for (i = 0; i < 4; ++i) {
9679#if defined(__aarch64__)
9680 static const uint8_t shift_rows[] = {
9681 0x0, 0x5, 0xa, 0xf, 0x4, 0x9, 0xe, 0x3,
9682 0x8, 0xd, 0x2, 0x7, 0xc, 0x1, 0x6, 0xb,
9689 w = vqtbl1q_u8(w, vld1q_u8(shift_rows));
9729#if defined(__aarch64__)
9730 static const uint8_t inv_shift_rows[] = {
9731 0x0, 0xd, 0xa, 0x7, 0x4, 0x1, 0xe, 0xb,
9732 0x8, 0x5, 0x2, 0xf, 0xc, 0x9, 0x6, 0x3,
9739 w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows));
9753 uint8_t *_a = (uint8_t *) &a;
9754 for (
int i = 0; i < 16; ++i) {
9755 v[((i / 4) + (i % 4)) % 4][i % 4] = _sse2neon_rsbox[_a[i]];
9766#if defined(__aarch64__)
9767 static const uint8_t ror32by8[] = {
9768 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4,
9769 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc,
9775 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b);
9776 w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b);
9778 v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w);
9781 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b);
9782 w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v);
9783 w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8));
9787 uint8_t i, e,
f, g, h, v[4][4];
9789 for (i = 0; i < 4; ++i) {
9817#if defined(__aarch64__)
9824 uint32x4_t select_mask = {0xffffffff, 0x0, 0xffffffff, 0x0};
9825 uint64x2_t v_mask = vshrq_n_u64(vreinterpretq_u64_u8(v), 32);
9826 uint32x4_t x = vbslq_u32(select_mask, vreinterpretq_u32_u64(v_mask),
9827 vreinterpretq_u32_u8(v));
9828 uint32x4_t ror_x = vorrq_u32(vshrq_n_u32(x, 8), vshlq_n_u32(x, 24));
9829 uint32x4_t ror_xor_x = veorq_u32(ror_x, vdupq_n_u32(rcon));
9836 for (
int i = 0; i < 4; ++i) {
9837 ((uint8_t *) &X1)[i] = _sse2neon_sbox[((uint8_t *) &X1)[i]];
9838 ((uint8_t *) &X3)[i] = _sse2neon_sbox[((uint8_t *) &X3)[i]];
9841 ((X1 >> 8) | (X1 << 24)) ^ rcon, X1);
9844#undef SSE2NEON_AES_SBOX
9845#undef SSE2NEON_AES_RSBOX
9847#if defined(__aarch64__)
9849#undef SSE2NEON_MULTIPLY
9914 u8[0x4], u8[0x1], u8[0xE], u8[0xB],
9915 u8[0x1], u8[0xE], u8[0xB], u8[0x4],
9916 u8[0xC], u8[0x9], u8[0x6], u8[0x3],
9917 u8[0x9], u8[0x6], u8[0x3], u8[0xC],
9919 uint32x4_t r = {0, (unsigned) rcon, 0, (
unsigned) rcon};
9933 switch (imm & 0x11) {
9936 _sse2neon_vmull_p64(vget_low_u64(a), vget_low_u64(b)));
9939 _sse2neon_vmull_p64(vget_high_u64(a), vget_low_u64(b)));
9942 _sse2neon_vmull_p64(vget_low_u64(a), vget_high_u64(b)));
9945 _sse2neon_vmull_p64(vget_high_u64(a), vget_high_u64(b)));
9955#if defined(__aarch64__)
9962#if defined(__aarch64__)
9963 __asm__ __volatile__(
"mrs %0, FPCR" :
"=r"(r.value));
9965 __asm__ __volatile__(
"vmrs %0, FPSCR" :
"=r"(r.value));
9976#if defined(__aarch64__)
9977#if __has_builtin(__builtin_popcount)
9978 return __builtin_popcount(a);
9980 return (
int) vaddlv_u8(vcnt_u8(vcreate_u8((uint64_t) a)));
9984 uint8x8_t input_val, count8x8_val;
9985 uint16x4_t count16x4_val;
9986 uint32x2_t count32x2_val;
9988 input_val = vld1_u8((uint8_t *) &a);
9989 count8x8_val = vcnt_u8(input_val);
9990 count16x4_val = vpaddl_u8(count8x8_val);
9991 count32x2_val = vpaddl_u16(count16x4_val);
9993 vst1_u32(&count, count32x2_val);
10003#if defined(__aarch64__)
10004#if __has_builtin(__builtin_popcountll)
10005 return __builtin_popcountll(a);
10007 return (int64_t) vaddlv_u8(vcnt_u8(vcreate_u8(a)));
10010 uint64_t count = 0;
10011 uint8x8_t input_val, count8x8_val;
10012 uint16x4_t count16x4_val;
10013 uint32x2_t count32x2_val;
10014 uint64x1_t count64x1_val;
10016 input_val = vld1_u8((uint8_t *) &a);
10017 count8x8_val = vcnt_u8(input_val);
10018 count16x4_val = vpaddl_u8(count8x8_val);
10019 count32x2_val = vpaddl_u16(count16x4_val);
10020 count64x1_val = vpaddl_u32(count32x2_val);
10021 vst1_u64(&count, count64x1_val);
10032#if defined(__aarch64__)
10039#if defined(__aarch64__)
10040 __asm__ __volatile__(
"mrs %0, FPCR" :
"=r"(r.value));
10042 __asm__ __volatile__(
"vmrs %0, FPSCR" :
"=r"(r.value));
10047#if defined(__aarch64__)
10048 __asm__ __volatile__(
"msr FPCR, %0" ::
"r"(r));
10050 __asm__ __volatile__(
"vmsr FPSCR, %0" ::
"r"(r));
10059#if defined(__aarch64__)
10068 __asm__ __volatile__(
"mrs %0, cntvct_el0" :
"=r"(val));
10072 uint32_t pmccntr, pmuseren, pmcntenset;
10075 __asm__ __volatile__(
"mrc p15, 0, %0, c9, c14, 0" :
"=r"(pmuseren));
10076 if (pmuseren & 1) {
10077 __asm__ __volatile__(
"mrc p15, 0, %0, c9, c12, 1" :
"=r"(pmcntenset));
10078 if (pmcntenset & 0x80000000UL) {
10079 __asm__ __volatile__(
"mrc p15, 0, %0, c9, c13, 0" :
"=r"(pmccntr));
10081 return (uint64_t) (pmccntr) << 6;
10087 gettimeofday(&tv, NULL);
10088 return (uint64_t) (tv.tv_sec) * 1000000 + tv.tv_usec;
10092#if defined(__GNUC__) || defined(__clang__)
10093#pragma pop_macro("ALIGN_STRUCT")
10094#pragma pop_macro("FORCE_INLINE")
10097#if defined(__GNUC__) && !defined(__clang__)
10098#pragma GCC pop_options
FORCE_INLINE int _mm_comige_sd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_xor_ps(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cmpnlt_ps(__m128 a, __m128 b)
FORCE_INLINE void _sse2neon_mm_set_flush_zero_mode(unsigned int flag)
FORCE_INLINE int _mm_comieq_ss(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cmpngt_ps(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_movehdup_ps(__m128 a)
FORCE_INLINE __m128i _mm_abs_epi8(__m128i a)
#define vreinterpret_m64_f32(x)
FORCE_INLINE __m128i _mm_cmpeq_epi64(__m128i a, __m128i b)
#define SSE2NEON_CMPSTR_GENERATE_MASK(dst)
FORCE_INLINE uint16_t _sse2neon_vaddvq_u16(uint16x8_t a)
#define _MM_FROUND_TO_POS_INF
#define vreinterpretq_u32_m128d(x)
#define vreinterpret_m64_s32(x)
FORCE_INLINE __m128i _mm_unpackhi_epi16(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_setr_epi64(__m64 e1, __m64 e0)
#define SSE2NEON_CACHELINE_SIZE
FORCE_INLINE int _mm_cvt_ss2si(__m128 a)
FORCE_INLINE __m128i _mm_packs_epi32(__m128i a, __m128i b)
#define vreinterpretq_m128_s32(x)
FORCE_INLINE __m128i _mm_max_epi8(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_cvtsi64_sd(__m128d a, int64_t b)
FORCE_INLINE __m128i _mm_cmpgt_epi8(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_slli_epi32(__m128i a, int imm)
FORCE_INLINE __m64 _mm_avg_pu16(__m64 a, __m64 b)
FORCE_INLINE __m128i _mm_min_epi16(__m128i a, __m128i b)
FORCE_INLINE __m64 _mm_max_pu8(__m64 a, __m64 b)
FORCE_INLINE __m128d _mm_cmpeq_pd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_div_sd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_and_pd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_setzero_pd(void)
#define SSE2NEON_AES_U2(p)
FORCE_INLINE __m128i _mm_set1_epi16(short w)
FORCE_INLINE void _mm_store_si128(__m128i *p, __m128i a)
FORCE_INLINE unsigned int _sse2neon_mm_get_flush_zero_mode()
FORCE_INLINE __m128 _mm_cvtpi8_ps(__m64 a)
#define vreinterpretq_m128_f32(x)
FORCE_INLINE double _mm_cvtsd_f64(__m128d a)
FORCE_INLINE __m128i _mm_adds_epi8(__m128i a, __m128i b)
FORCE_INLINE int _mm_cmpestrs(__m128i a, int la, __m128i b, int lb, const int imm8)
FORCE_INLINE __m128i _mm_loadu_si16(const void *p)
FORCE_INLINE __m128i _mm_add_epi64(__m128i a, __m128i b)
FORCE_INLINE void _mm_sfence(void)
FORCE_INLINE __m128 _mm_load_ss(const float *p)
FORCE_INLINE __m128d _mm_cmpeq_sd(__m128d a, __m128d b)
FORCE_INLINE void _mm_stream_ps(float *p, __m128 a)
FORCE_INLINE __m128i _mm_andnot_si128(__m128i a, __m128i b)
#define SSE2NEON_MULTIPLY(x, y)
FORCE_INLINE unsigned int _sse2neon_mm_get_denormals_zero_mode()
#define SSE2NEON_GENERATE_CMP_RANGES(prefix)
FORCE_INLINE __m128i _mm_set_epi8(signed char b15, signed char b14, signed char b13, signed char b12, signed char b11, signed char b10, signed char b9, signed char b8, signed char b7, signed char b6, signed char b5, signed char b4, signed char b3, signed char b2, signed char b1, signed char b0)
FORCE_INLINE __m128 _mm_addsub_ps(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_mul_epi32(__m128i a, __m128i b)
#define vreinterpretq_m128i_s8(x)
FORCE_INLINE void _mm_storeu_si16(void *p, __m128i a)
FORCE_INLINE __m128i _mm_aesenclast_si128(__m128i a, __m128i RoundKey)
FORCE_INLINE __m128i _mm_hsubs_epi16(__m128i _a, __m128i _b)
FORCE_INLINE __m128i _mm_unpacklo_epi8(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_shuffle_epi_2301(__m128i a)
FORCE_INLINE __m128i _mm_adds_epu8(__m128i a, __m128i b)
#define vreinterpret_m64_s8(x)
FORCE_INLINE __m128d _mm_cvtsi32_sd(__m128d a, int32_t b)
FORCE_INLINE int _mm_cmpestri(__m128i a, int la, __m128i b, int lb, const int imm8)
FORCE_INLINE __m128i _mm_hadd_epi16(__m128i _a, __m128i _b)
#define _SIDD_MASKED_NEGATIVE_POLARITY
#define vreinterpret_u16_m64(x)
FORCE_INLINE __m128 _mm_hadd_ps(__m128 a, __m128 b)
#define vreinterpretq_m128i_u64(x)
FORCE_INLINE int _mm_cmpestrz(__m128i a, int la, __m128i b, int lb, const int imm8)
FORCE_INLINE __m128i _mm_set_epi32(int, int, int, int)
FORCE_INLINE __m128d _mm_cmpord_sd(__m128d a, __m128d b)
FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4(const uint8_t *p)
FORCE_INLINE __m128i _mm_unpacklo_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_cvtps_pd(__m128 a)
FORCE_INLINE __m64 _mm_hsub_pi32(__m64 _a, __m64 _b)
FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b)
#define SSE2NEON_CMPSTR_SET_UPPER(var, imm)
FORCE_INLINE __m128d _mm_min_pd(__m128d a, __m128d b)
#define vreinterpret_m64_s64(x)
FORCE_INLINE __m128i _mm_cmpistrm(__m128i a, __m128i b, const int imm8)
#define vreinterpretq_u8_m128i(x)
FORCE_INLINE __m128i _mm_srl_epi16(__m128i a, __m128i count)
FORCE_INLINE __m128d _mm_ceil_pd(__m128d)
FORCE_INLINE void _mm_store_ps1(float *p, __m128 a)
#define vreinterpretq_s16_m128i(x)
#define _MM_FLUSH_ZERO_MASK
FORCE_INLINE __m128i _mm_mulhi_epi16(__m128i a, __m128i b)
#define vreinterpretq_u64_m128d(x)
FORCE_INLINE __m128 _mm_cmpnge_ps(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_mulhrs_epi16(__m128i a, __m128i b)
#define vreinterpretq_s8_m128(x)
FORCE_INLINE __m128i _mm_movpi64_epi64(__m64 a)
FORCE_INLINE void _sse2neon_smp_mb(void)
FORCE_INLINE __m64 _mm_avg_pu8(__m64 a, __m64 b)
FORCE_INLINE __m128i _mm_add_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_packus_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x)
FORCE_INLINE __m128d _mm_load_pd(const double *p)
FORCE_INLINE __m128d _mm_cmplt_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_cmpgt_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_unpackhi_epi32(__m128i a, __m128i b)
#define vreinterpret_m64_u8(x)
#define vreinterpretq_m128d_s32(x)
FORCE_INLINE void _mm_maskmove_si64(__m64 a, __m64 mask, char *mem_addr)
FORCE_INLINE __m128d _mm_mul_sd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_mul_ss(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_movehl_ps(__m128 __A, __m128 __B)
FORCE_INLINE __m128i _mm_sra_epi16(__m128i a, __m128i count)
FORCE_INLINE __m128 _mm_div_ps(__m128 a, __m128 b)
FORCE_INLINE int _mm_comige_ss(__m128 a, __m128 b)
FORCE_INLINE void _mm_storer_ps(float *p, __m128 a)
FORCE_INLINE __m128i _mm_sign_epi8(__m128i _a, __m128i _b)
FORCE_INLINE __m128d _mm_cmpgt_sd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_loadr_pd(const double *p)
FORCE_INLINE uint32_t _mm_crc32_u32(uint32_t crc, uint32_t v)
FORCE_INLINE __m64 _mm_sign_pi32(__m64 _a, __m64 _b)
FORCE_INLINE __m128d _mm_loadl_pd(__m128d a, const double *p)
FORCE_INLINE __m128d _mm_loadu_pd(const double *p)
FORCE_INLINE __m128 _mm_shuffle_ps_0321(__m128 a, __m128 b)
#define _sse2neon_unlikely(x)
FORCE_INLINE __m128i _mm_cmpeq_epi16(__m128i a, __m128i b)
FORCE_INLINE uint32_t _mm_crc32_u16(uint32_t crc, uint16_t v)
FORCE_INLINE __m128i _mm_subs_epu16(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_setr_pd(double e1, double e0)
FORCE_INLINE int _mm_cmpistrz(__m128i a, __m128i b, const int imm8)
#define vreinterpretq_f32_m128i(x)
FORCE_INLINE __m128i _mm_shuffle_epi_0321(__m128i a)
FORCE_INLINE uint8_t _sse2neon_vaddvq_u8(uint8x16_t a)
FORCE_INLINE __m128i _mm_unpackhi_epi64(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_sub_epi64(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_loadu_si128(const __m128i *p)
FORCE_INLINE __m128i _mm_cvtps_epi32(__m128)
FORCE_INLINE int _mm_movemask_epi8(__m128i a)
FORCE_INLINE __m128i _mm_srl_epi32(__m128i a, __m128i count)
FORCE_INLINE __m64 _mm_cvt_ps2pi(__m128 a)
#define vreinterpret_m64_u16(x)
FORCE_INLINE __m128 _mm_cvt_pi2ps(__m128 a, __m64 b)
FORCE_INLINE int64_t _mm_cvttss_si64(__m128 a)
FORCE_INLINE __m64 _mm_sad_pu8(__m64 a, __m64 b)
FORCE_INLINE int _mm_test_all_ones(__m128i a)
FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i, __m128i)
#define _MM_DENORMALS_ZERO_OFF
FORCE_INLINE __m128d _mm_cmpge_sd(__m128d a, __m128d b)
FORCE_INLINE int _mm_comineq_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_hadds_epi16(__m128i _a, __m128i _b)
FORCE_INLINE __m64 _mm_abs_pi16(__m64 a)
FORCE_INLINE void _mm_storeu_si64(void *p, __m128i a)
FORCE_INLINE __m128i _mm_blendv_epi8(__m128i _a, __m128i _b, __m128i _mask)
FORCE_INLINE __m128d _mm_round_sd(__m128d a, __m128d b, int rounding)
FORCE_INLINE __m128d _mm_add_sd(__m128d a, __m128d b)
#define vreinterpretq_m128_u32(x)
FORCE_INLINE void _mm_storeh_pd(double *mem_addr, __m128d a)
FORCE_INLINE __m128 _mm_set_ps(float w, float z, float y, float x)
FORCE_INLINE __m128d _mm_move_sd(__m128d, __m128d)
FORCE_INLINE int _mm_comieq_sd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_cmpeq_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_cvtpd_epi32(__m128d a)
FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b)
#define SSE2NEON_AES_U0(p)
#define vreinterpretq_s32_m128i(x)
#define vreinterpret_s64_m64(x)
FORCE_INLINE int _mm_testz_si128(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_abs_epi32(__m128i a)
#define vreinterpretq_m128i_s16(x)
FORCE_INLINE __m64 _mm_mul_su32(__m64 a, __m64 b)
#define vreinterpretq_f32_m128d(x)
FORCE_INLINE __m128i _mm_setzero_si128()
FORCE_INLINE __m128i _mm_and_si128(__m128i, __m128i)
FORCE_INLINE __m128i _mm_adds_epu16(__m128i a, __m128i b)
FORCE_INLINE __m64 _mm_cvtps_pi8(__m128 a)
FORCE_INLINE __m128 _mm_dp_ps(__m128 a, __m128 b, const int imm)
FORCE_INLINE __m128 _mm_sqrt_ss(__m128 in)
#define vreinterpretq_m128d_s64(x)
FORCE_INLINE __m128i _mm_set1_epi32(int)
FORCE_INLINE void _mm_setcsr(unsigned int a)
FORCE_INLINE __m128i _mm_shuffle_epi_1032(__m128i a)
FORCE_INLINE __m128 _mm_unpackhi_ps(__m128 a, __m128 b)
#define SSE2NEON_AES_RSBOX(w)
FORCE_INLINE __m128i _mm_shuffle_epi_0122(__m128i a)
FORCE_INLINE int _mm_cmpestrc(__m128i a, int la, __m128i b, int lb, const int imm8)
FORCE_INLINE __m128 _mm_rcp_ps(__m128 in)
#define vreinterpretq_s8_m128i(x)
FORCE_INLINE __m128i _mm_max_epu8(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_loadu_si32(const void *p)
FORCE_INLINE void _mm_stream_si64(__int64 *p, __int64 a)
FORCE_INLINE __m128 _mm_shuffle_ps_2301(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_cmpnge_sd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_shuffle_ps_1001(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_cvtpi32_pd(__m64 a)
FORCE_INLINE __m128i _mm_madd_epi16(__m128i a, __m128i b)
#define SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(prefix)
FORCE_INLINE __m128d _mm_floor_pd(__m128d)
FORCE_INLINE __m128 _mm_cmpnle_ps(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_ceil_sd(__m128d a, __m128d b)
FORCE_INLINE uint64_t _rdtsc(void)
FORCE_INLINE __m128i _mm_add_epi16(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_cmplt_pd(__m128d a, __m128d b)
FORCE_INLINE int32_t _mm_cvttsd_si32(__m128d a)
FORCE_INLINE void _mm_storeu_ps(float *p, __m128 a)
FORCE_INLINE __m64 _mm_hsub_pi16(__m64 _a, __m64 _b)
FORCE_INLINE __m128d _mm_cmpord_pd(__m128d a, __m128d b)
#define vreinterpretq_s64_m128d(x)
FORCE_INLINE __m128i _mm_setr_epi32(int i3, int i2, int i1, int i0)
FORCE_INLINE __m128i _mm_cvtepu8_epi16(__m128i a)
FORCE_INLINE __m128 _mm_moveldup_ps(__m128 a)
FORCE_INLINE __m128i _mm_shuffle_epi_1010(__m128i a)
FORCE_INLINE __m128d _mm_or_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_cvtepu8_epi32(__m128i a)
FORCE_INLINE __m64 _mm_sign_pi8(__m64 _a, __m64 _b)
FORCE_INLINE __m128d _mm_load1_pd(const double *p)
#define _MM_DENORMALS_ZERO_ON
FORCE_INLINE __m128i _mm_add_epi8(__m128i a, __m128i b)
FORCE_INLINE __m64 _mm_cvtt_ps2pi(__m128 a)
FORCE_INLINE __m128 _mm_shuffle_ps_3210(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_set1_epi8(signed char w)
#define vreinterpretq_m128i_u8(x)
FORCE_INLINE int _mm_comile_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_cvttps_epi32(__m128 a)
FORCE_INLINE __m128d _mm_round_pd(__m128d, int)
FORCE_INLINE __m128 _mm_cvtpi16_ps(__m64 a)
#define _MM_ROUND_NEAREST
FORCE_INLINE __m128 _mm_loadl_pi(__m128 a, __m64 const *p)
FORCE_INLINE __m128 _mm_shuffle_ps_1010(__m128 a, __m128 b)
FORCE_INLINE int _mm_test_all_zeros(__m128i a, __m128i mask)
FORCE_INLINE __m128i _mm_clmulepi64_si128(__m128i _a, __m128i _b, const int imm)
#define vreinterpret_u32_m64(x)
FORCE_INLINE __m64 _mm_movepi64_pi64(__m128i a)
#define vreinterpretq_nth_u64_m128i(x, n)
FORCE_INLINE __m128 _mm_cmpunord_ps(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_cmpneq_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_min_epi8(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_min_epu32(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_cvtpi32_ps(__m128 a, __m64 b)
#define vreinterpretq_m128d_f32(x)
FORCE_INLINE __m128d _mm_cmpnlt_pd(__m128d a, __m128d b)
FORCE_INLINE int64_t _mm_cvtsd_si64(__m128d a)
#define vreinterpretq_f64_m128i(x)
FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_unpackhi_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_cvttpd_epi32(__m128d a)
#define vreinterpret_m64_s16(x)
FORCE_INLINE int _mm_movemask_pd(__m128d a)
FORCE_INLINE __m128 _mm_set_ps1(float)
#define SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8)
FORCE_INLINE __m128d _mm_cmpnle_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_max_epu32(__m128i a, __m128i b)
#define _SIDD_NEGATIVE_POLARITY
FORCE_INLINE __m128i _mm_min_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_shuffle_ps_2010(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_set1_epi64(__m64 _i)
FORCE_INLINE __m128 _mm_undefined_ps(void)
FORCE_INLINE __m128d _mm_cmpunord_sd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_hadd_pd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_set1_ps(float _w)
FORCE_INLINE __m128i _mm_slli_epi64(__m128i a, int imm)
FORCE_INLINE __m128 _mm_sub_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b)
FORCE_INLINE __m128i _mm_cvtepi32_epi64(__m128i a)
FORCE_INLINE __m128i _mm_srai_epi16(__m128i a, int imm)
FORCE_INLINE __m128d _mm_set_sd(double a)
FORCE_INLINE __m64 _mm_cvtpd_pi32(__m128d a)
FORCE_INLINE __m128 _mm_ceil_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_shuffle_epi8(__m128i a, __m128i b)
FORCE_INLINE __m64 _mm_abs_pi8(__m64 a)
FORCE_INLINE __m128d _mm_addsub_pd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_cmpngt_ss(__m128 a, __m128 b)
FORCE_INLINE int _mm_comilt_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_undefined_si128(void)
FORCE_INLINE int _mm_comile_sd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_max_pd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_shuffle_ps_0011(__m128 a, __m128 b)
FORCE_INLINE __m64 _mm_min_pu8(__m64 a, __m64 b)
FORCE_INLINE __m128d _mm_castsi128_pd(__m128i a)
FORCE_INLINE __m128d _mm_mul_pd(__m128d a, __m128d b)
#define _MM_FROUND_TO_NEG_INF
FORCE_INLINE __m128d _mm_dp_pd(__m128d a, __m128d b, const int imm)
FORCE_INLINE int _mm_test_mix_ones_zeros(__m128i a, __m128i mask)
FORCE_INLINE void _mm_storel_pd(double *mem_addr, __m128d a)
FORCE_INLINE void _mm_storel_pi(__m64 *p, __m128 a)
FORCE_INLINE void _sse2neon_kadd_f32(float *sum, float *c, float y)
FORCE_INLINE int _mm_popcnt_u32(unsigned int a)
FORCE_INLINE __m128 _mm_cmpgt_ps(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cvtpu8_ps(__m64 a)
FORCE_INLINE __m128 _mm_max_ss(__m128 a, __m128 b)
FORCE_INLINE void _mm_empty(void)
FORCE_INLINE __m128i _mm_sub_epi32(__m128i a, __m128i b)
#define vreinterpretq_u64_m128(x)
FORCE_INLINE void _mm_storeu_si32(void *p, __m128i a)
FORCE_INLINE __m128i _mm_unpackhi_epi8(__m128i a, __m128i b)
FORCE_INLINE void _mm_stream_si128(__m128i *p, __m128i a)
FORCE_INLINE uint32_t _mm_crc32_u8(uint32_t, uint8_t)
FORCE_INLINE __m128 _mm_cmpneq_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_cvtepi8_epi32(__m128i a)
FORCE_INLINE __m128d _mm_cmpngt_pd(__m128d a, __m128d b)
FORCE_INLINE void _mm_storeu_pd(double *mem_addr, __m128d a)
FORCE_INLINE int _sse2neon_ctzll(unsigned long long x)
FORCE_INLINE __m128 _mm_cmpnlt_ss(__m128 a, __m128 b)
FORCE_INLINE int64_t _mm_cvtss_si64(__m128 a)
FORCE_INLINE __m128 _mm_cmpunord_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_packs_epi16(__m128i a, __m128i b)
FORCE_INLINE __m64 _mm_add_si64(__m64 a, __m64 b)
FORCE_INLINE __m128 _mm_loadu_ps(const float *p)
FORCE_INLINE __m128i _mm_hadd_epi32(__m128i _a, __m128i _b)
FORCE_INLINE int _mm_comilt_ss(__m128 a, __m128 b)
FORCE_INLINE int64_t _mm_cvtsi128_si64(__m128i a)
FORCE_INLINE __m128i _mm_xor_si128(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_maddubs_epi16(__m128i _a, __m128i _b)
FORCE_INLINE __m128 _mm_shuffle_ps_0022(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_cmpeq_epi8(__m128i a, __m128i b)
#define vreinterpretq_s32_m128(x)
FORCE_INLINE void _mm_store_ss(float *p, __m128 a)
FORCE_INLINE __m64 _mm_mulhrs_pi16(__m64 a, __m64 b)
FORCE_INLINE __m128 _mm_cmpnle_ss(__m128 a, __m128 b)
FORCE_INLINE __m64 _mm_hsubs_pi16(__m64 _a, __m64 _b)
FORCE_INLINE __m128i _mm_castpd_si128(__m128d a)
FORCE_INLINE __m128d _mm_cmpnle_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_sll_epi32(__m128i a, __m128i count)
FORCE_INLINE __m128i _mm_sign_epi32(__m128i _a, __m128i _b)
FORCE_INLINE uint8_t _sse2neon_vaddv_u8(uint8x8_t v8)
FORCE_INLINE __m128i _mm_cvtepi16_epi32(__m128i a)
#define vreinterpretq_u32_m128i(x)
FORCE_INLINE void * _mm_malloc(size_t size, size_t align)
FORCE_INLINE __m64 _mm_hadds_pi16(__m64 _a, __m64 _b)
FORCE_INLINE __m128i _mm_setr_epi8(signed char b0, signed char b1, signed char b2, signed char b3, signed char b4, signed char b5, signed char b6, signed char b7, signed char b8, signed char b9, signed char b10, signed char b11, signed char b12, signed char b13, signed char b14, signed char b15)
FORCE_INLINE __m128i _mm_load_si128(const __m128i *p)
FORCE_INLINE __m128 _mm_andnot_ps(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_movelh_ps(__m128 __A, __m128 __B)
FORCE_INLINE __m128d _mm_cmpunord_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_sub_epi16(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_cvtepi8_epi64(__m128i a)
FORCE_INLINE __m128i _mm_shuffle_epi_3332(__m128i a)
FORCE_INLINE __m128 _mm_rsqrt_ss(__m128 in)
#define vreinterpretq_m128i_s64(x)
FORCE_INLINE __m128 _mm_setzero_ps(void)
FORCE_INLINE int _sse2neon_clz(unsigned int x)
#define vreinterpretq_m128_s64(x)
FORCE_INLINE void _mm_storeu_si128(__m128i *p, __m128i a)
FORCE_INLINE void _mm_free(void *addr)
#define vreinterpretq_u32_m128(x)
#define SSE2NEON_COMP_AGG(a, b, la, lb, imm8, IE)
FORCE_INLINE __m128d _mm_div_pd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_loadr_ps(const float *p)
FORCE_INLINE __m128i _mm_sad_epu8(__m128i a, __m128i b)
FORCE_INLINE int _mm_comigt_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_cvtepu8_epi64(__m128i a)
FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon)
FORCE_INLINE __m128i _mm_cmplt_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_cmple_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_hsub_epi16(__m128i _a, __m128i _b)
FORCE_INLINE int _mm_comineq_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_set1_epi64x(int64_t _i)
FORCE_INLINE __m128i _mm_move_epi64(__m128i a)
FORCE_INLINE __m128d _mm_hsub_pd(__m128d _a, __m128d _b)
FORCE_INLINE __m128i _mm_slli_epi16(__m128i a, int imm)
FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b)
FORCE_INLINE int _mm_cmpistrc(__m128i a, __m128i b, const int imm8)
FORCE_INLINE __m128i _mm_min_epu16(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_min_epu8(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_sra_epi32(__m128i a, __m128i count)
FORCE_INLINE __m128 _mm_castsi128_ps(__m128i a)
FORCE_INLINE __m128i _mm_cmplt_epi8(__m128i a, __m128i b)
#define vreinterpret_s32_m64(x)
FORCE_INLINE int _mm_cmpistrs(__m128i a, __m128i b, const int imm8)
FORCE_INLINE __m64 _mm_shuffle_pi8(__m64 a, __m64 b)
#define vreinterpretq_m128d_u32(x)
FORCE_INLINE __m128d _mm_andnot_pd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_cvtss_sd(__m128d a, __m128 b)
#define vreinterpret_m64_u64(x)
FORCE_INLINE __m64 _mm_max_pi16(__m64 a, __m64 b)
FORCE_INLINE __m128 _mm_shuffle_ps_3202(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_cmpgt_epi16(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_floor_ps(__m128)
FORCE_INLINE __m128d _mm_cmpgt_pd(__m128d a, __m128d b)
#define vreinterpretq_u64_m128i(x)
FORCE_INLINE __m128i _mm_cvtsi64_si128(int64_t a)
FORCE_INLINE __m128i _mm_cvtepu16_epi32(__m128i a)
FORCE_INLINE __m128i _mm_loadl_epi64(__m128i const *p)
FORCE_INLINE void _sse2neon_mm_set_denormals_zero_mode(unsigned int flag)
FORCE_INLINE __m128 _mm_blendv_ps(__m128 _a, __m128 _b, __m128 _mask)
FORCE_INLINE __m128i _mm_set_epi64x(int64_t, int64_t)
#define _MM_ROUND_TOWARD_ZERO
FORCE_INLINE __m128 _mm_shuffle_ps_0101(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cmpeq_ps(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_aesimc_si128(__m128i a)
FORCE_INLINE __m64 _mm_sub_si64(__m64 a, __m64 b)
FORCE_INLINE void _mm_maskmoveu_si128(__m128i a, __m128i mask, char *mem_addr)
FORCE_INLINE __m128 _mm_cmplt_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_max_epi32(__m128i a, __m128i b)
FORCE_INLINE int _mm_cmpestra(__m128i a, int la, __m128i b, int lb, const int imm8)
#define SSE2NEON_CMPESTR_LIST
FORCE_INLINE __m128i _mm_subs_epi8(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cmpord_ss(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cmplt_ps(__m128 a, __m128 b)
FORCE_INLINE int _mm_movemask_ps(__m128 a)
FORCE_INLINE __m128d _mm_floor_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7)
FORCE_INLINE __m128i _mm_or_si128(__m128i, __m128i)
FORCE_INLINE __m128d _mm_cmpneq_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_aesdeclast_si128(__m128i a, __m128i RoundKey)
FORCE_INLINE __m128i _mm_cvtepi8_epi16(__m128i a)
FORCE_INLINE __m128i _mm_cvtepu32_epi64(__m128i a)
FORCE_INLINE __m128i _mm_max_epi16(__m128i a, __m128i b)
FORCE_INLINE void _mm_stream_si32(int *p, int a)
FORCE_INLINE __m128i _mm_max_epu16(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_hsub_epi32(__m128i _a, __m128i _b)
FORCE_INLINE __m128d _mm_cmpnlt_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_aesdec_si128(__m128i a, __m128i RoundKey)
FORCE_INLINE __m128i _mm_adds_epi16(__m128i a, __m128i b)
FORCE_INLINE int32_t _mm_cvtsd_si32(__m128d a)
FORCE_INLINE void _mm_storel_epi64(__m128i *a, __m128i b)
FORCE_INLINE __m128d _mm_set1_pd(double d)
#define _MM_FROUND_TO_NEAREST_INT
FORCE_INLINE __m128 _mm_unpacklo_ps(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_cvtsi64_ss(__m128 a, int64_t b)
#define vreinterpretq_m128d_u64(x)
FORCE_INLINE __m128i _mm_cvtsi32_si128(int a)
FORCE_INLINE __m128 _mm_cmple_ss(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_sub_pd(__m128d a, __m128d b)
FORCE_INLINE uint64_t _mm_crc32_u64(uint64_t crc, uint64_t v)
#define SSE2NEON_AES_U3(p)
#define vreinterpret_s16_m64(x)
FORCE_INLINE __m128i _mm_abs_epi16(__m128i a)
FORCE_INLINE __m128i _mm_set_epi16(short i7, short i6, short i5, short i4, short i3, short i2, short i1, short i0)
FORCE_INLINE __m128d _mm_load_sd(const double *p)
FORCE_INLINE __m128 _mm_cmpnge_ss(__m128 a, __m128 b)
FORCE_INLINE unsigned int _mm_getcsr()
FORCE_INLINE __m128 _mm_cvtpd_ps(__m128d a)
#define vreinterpretq_m128i_u32(x)
FORCE_INLINE __m128i _mm_subs_epu8(__m128i a, __m128i b)
FORCE_INLINE __m64 _mm_min_pi16(__m64 a, __m64 b)
FORCE_INLINE __m128i _mm_shuffle_epi_0101(__m128i a)
FORCE_INLINE int _mm_cmpistri(__m128i a, __m128i b, const int imm8)
#define SSE2NEON_AES_U1(p)
FORCE_INLINE __m128d _mm_sub_sd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_cmpestrm(__m128i a, int la, __m128i b, int lb, const int imm8)
FORCE_INLINE int _sse2neon_sido_negative(int res, int lb, int imm8, int bound)
FORCE_INLINE __m128i _mm_avg_epu16(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_shuffle_epi_2103(__m128i a)
FORCE_INLINE __m128 _mm_add_ss(__m128 a, __m128 b)
FORCE_INLINE void _mm_stream_pi(__m64 *p, __m64 a)
FORCE_INLINE __m128 _mm_ceil_ps(__m128)
FORCE_INLINE __m128i _mm_mpsadbw_epu8(__m128i a, __m128i b, const int imm)
#define vreinterpretq_m128i_s32(x)
FORCE_INLINE __m128i _mm_mullo_epi32(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_blend_ps(__m128 _a, __m128 _b, const char imm8)
FORCE_INLINE __m128i _mm_aesenc_si128(__m128i a, __m128i RoundKey)
FORCE_INLINE __m128 _mm_shuffle_ps_2103(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_set_ss(float a)
FORCE_INLINE __m128 _mm_shuffle_ps_2032(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_mullo_epi16(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_shuffle_ps_2001(__m128 a, __m128 b)
FORCE_INLINE int64_t _mm_popcnt_u64(uint64_t a)
FORCE_INLINE void _mm_pause()
FORCE_INLINE __m128i _mm_subs_epi16(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_minpos_epu16(__m128i a)
#define SSE2NEON_GENERATE_CMP_EQUAL_ANY(prefix)
FORCE_INLINE __m128d _mm_cvtepi32_pd(__m128i a)
FORCE_INLINE __m128d _mm_sqrt_sd(__m128d a, __m128d b)
FORCE_INLINE int _mm_cmpistro(__m128i a, __m128i b, const int imm8)
#define SSE2NEON_BARRIER()
FORCE_INLINE __m128 _mm_loadh_pi(__m128 a, __m64 const *p)
FORCE_INLINE __m128 _mm_cmpgt_ss(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_rcp_ss(__m128 a)
FORCE_INLINE __m128 _mm_castpd_ps(__m128d a)
FORCE_INLINE __m128 _mm_move_ss(__m128, __m128)
FORCE_INLINE __m64 _mm_cvttpd_pi32(__m128d a)
FORCE_INLINE __m128i _mm_sign_epi16(__m128i _a, __m128i _b)
FORCE_INLINE __m128i _mm_cmplt_epi16(__m128i a, __m128i b)
#define vreinterpretq_f32_m128(x)
FORCE_INLINE __m128 _mm_round_ps(__m128, int)
FORCE_INLINE __m128 _mm_shuffle_ps_2200(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_mul_epu32(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_cmpnge_pd(__m128d a, __m128d b)
FORCE_INLINE __m64 _mm_mulhi_pu16(__m64 a, __m64 b)
FORCE_INLINE __m128 _mm_floor_ss(__m128 a, __m128 b)
FORCE_INLINE __m128i _mm_set_epi64(__m64 i1, __m64 i2)
FORCE_INLINE void _mm_store_pd(double *mem_addr, __m128d a)
FORCE_INLINE __m128i _mm_mulhi_epu16(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_cmpneq_ps(__m128 a, __m128 b)
FORCE_INLINE void _mm_storer_pd(double *mem_addr, __m128d a)
FORCE_INLINE int _mm_cmpistra(__m128i a, __m128i b, const int imm8)
FORCE_INLINE __m128i _mm_shuffle_epi_1001(__m128i a)
FORCE_INLINE __m128d _mm_undefined_pd(void)
#define _MM_FROUND_TO_ZERO
FORCE_INLINE __m128d _mm_set_pd(double, double)
#define SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(prefix)
FORCE_INLINE __m128d _mm_castps_pd(__m128 a)
FORCE_INLINE __m128 _mm_shuffle_ps_1133(__m128 a, __m128 b)
FORCE_INLINE __m128 _mm_load1_ps(const float *p)
FORCE_INLINE __m128i _mm_cvtepu16_epi64(__m128i a)
FORCE_INLINE __m128i _mm_cvtepi16_epi64(__m128i a)
FORCE_INLINE __m128 _mm_hsub_ps(__m128 _a, __m128 _b)
FORCE_INLINE __m128 _mm_cvtpi32x2_ps(__m64 a, __m64 b)
#define _MM_FLUSH_ZERO_ON
FORCE_INLINE __m128i _mm_cmpgt_epi64(__m128i a, __m128i b)
FORCE_INLINE void _mm_prefetch(char const *p, int i)
#define _MM_DENORMALS_ZERO_MASK
FORCE_INLINE __m128 _mm_cvtpu16_ps(__m64 a)
FORCE_INLINE int _mm_testc_si128(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_castps_si128(__m128)
FORCE_INLINE void _mm_lfence(void)
FORCE_INLINE __m128 _mm_load_ps(const float *p)
FORCE_INLINE __m128d _mm_min_sd(__m128d a, __m128d b)
#define vreinterpretq_m128i_u16(x)
FORCE_INLINE __m64 _mm_cvtps_pi16(__m128 a)
#define _MM_FROUND_CUR_DIRECTION
int(* cmpestr_func_t)(__m128i a, int la, __m128i b, int lb)
FORCE_INLINE __m128i _mm_avg_epu8(__m128i a, __m128i b)
FORCE_INLINE __m128 _mm_round_ss(__m128 a, __m128 b, int rounding)
#define SSE2NEON_AES_SBOX(w)
FORCE_INLINE __m128 _mm_rsqrt_ps(__m128 in)
FORCE_INLINE void _mm_store_sd(double *mem_addr, __m128d a)
#define vreinterpretq_u16_m128i(x)
FORCE_INLINE __m128 _mm_cvtsd_ss(__m128 a, __m128d b)
FORCE_INLINE int _mm_movemask_pi8(__m64 a)
FORCE_INLINE __m128i _mm_shuffle_epi_2211(__m128i a)
FORCE_INLINE int _mm_cvtt_ss2si(__m128 a)
FORCE_INLINE __m128d _mm_cmpge_pd(__m128d a, __m128d b)
FORCE_INLINE void _mm_stream_pd(double *p, __m128d a)
FORCE_INLINE __m128d _mm_add_pd(__m128d a, __m128d b)
FORCE_INLINE void _mm_store_ps(float *p, __m128 a)
FORCE_INLINE int64_t _mm_cvttsd_si64(__m128d a)
FORCE_INLINE __m128i _mm_unpacklo_epi64(__m128i a, __m128i b)
FORCE_INLINE __m128d _mm_sqrt_pd(__m128d a)
FORCE_INLINE __m64 _mm_hadd_pi16(__m64 a, __m64 b)
FORCE_INLINE void _MM_SET_ROUNDING_MODE(int rounding)
FORCE_INLINE __m128d _mm_loadh_pd(__m128d a, const double *p)
FORCE_INLINE __m128i _mm_sub_epi8(__m128i a, __m128i b)
FORCE_INLINE __m128i _mm_sll_epi64(__m128i a, __m128i count)
#define SSE2NEON_CMPISTRX_LENGTH(str, len, imm8)
FORCE_INLINE __m128d _mm_max_sd(__m128d a, __m128d b)
FORCE_INLINE __m128 _mm_cvt_si2ss(__m128 a, int b)
#define vreinterpret_s8_m64(x)
#define _mm_srli_si128(a, imm)
#define _mm_shuffle_epi32(a, imm)
FORCE_INLINE __m128 _mm_sqrt_ps(__m128 in)
FORCE_INLINE __m128i _mm_sll_epi16(__m128i a, __m128i count)
#define vreinterpret_u8_m64(x)
FORCE_INLINE void _mm_storeh_pi(__m64 *p, __m128 a)
FORCE_INLINE __m128i _mm_unpacklo_epi16(__m128i a, __m128i b)
FORCE_INLINE int _mm_comigt_ss(__m128 a, __m128 b)
FORCE_INLINE __m64 _mm_sign_pi16(__m64 _a, __m64 _b)
FORCE_INLINE __m128 _mm_cmpge_ss(__m128 a, __m128 b)
FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE()
FORCE_INLINE __m128 _mm_min_ps(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_movedup_pd(__m128d a)
FORCE_INLINE __m128i _mm_loadu_si64(const void *p)
FORCE_INLINE __m128d _mm_xor_pd(__m128d a, __m128d b)
FORCE_INLINE __m128i _mm_stream_load_si128(__m128i *p)
FORCE_INLINE void _mm_store_pd1(double *mem_addr, __m128d a)
FORCE_INLINE __m128 _mm_cvtepi32_ps(__m128i a)
FORCE_INLINE __m128 _mm_or_ps(__m128, __m128)
FORCE_INLINE __m128d _mm_blendv_pd(__m128d _a, __m128d _b, __m128d _mask)
FORCE_INLINE __m128d _mm_unpacklo_pd(__m128d a, __m128d b)
FORCE_INLINE int _sse2neon_ctz(unsigned int x)
FORCE_INLINE __m128 _mm_min_ss(__m128 a, __m128 b)
FORCE_INLINE __m128d _mm_cmple_sd(__m128d a, __m128d b)
FORCE_INLINE __m128d _mm_cmpngt_sd(__m128d a, __m128d b)
#define SSE2NEON_AES_H0(x)
FORCE_INLINE __m64 _mm_abs_pi32(__m64 a)
FORCE_INLINE __m128i _mm_srl_epi64(__m128i a, __m128i count)
FORCE_INLINE int _mm_cmpestro(__m128i a, int la, __m128i b, int lb, const int imm8)
FORCE_INLINE __m128 _mm_max_ps(__m128 a, __m128 b)
FORCE_INLINE __m64 _mm_hadd_pi32(__m64 a, __m64 b)
FORCE_INLINE void _mm_mfence(void)
FORCE_INLINE float _mm_cvtss_f32(__m128 a)
FORCE_INLINE __m128 _mm_cmpord_ps(__m128 a, __m128 b)
#define _MM_FROUND_NO_EXC
#define vreinterpretq_s64_m128i(x)
FORCE_INLINE int _mm_cvtsi128_si32(__m128i a)
#define _MM_FLUSH_ZERO_OFF
FORCE_INLINE __m64 _mm_maddubs_pi16(__m64 _a, __m64 _b)
FORCE_INLINE void _mm_clflush(void const *p)