Apollo 11.0
自动驾驶开放平台
sse2neon.h 文件参考
#include <stdint.h>
#include <stdlib.h>
#include <arm_neon.h>
#include <math.h>
#include <sys/time.h>
sse2neon.h 的引用(Include)关系图:

浏览源代码.

类

struct  fpcr_bitfield
 

宏定义

#define SSE2NEON_PRECISE_MINMAX   (0)
 
#define SSE2NEON_PRECISE_DIV   (0)
 
#define SSE2NEON_PRECISE_SQRT   (0)
 
#define SSE2NEON_PRECISE_DP   (0)
 
#define FORCE_INLINE   static inline
 
#define ALIGN_STRUCT(x)   __declspec(align(x))
 
#define _sse2neon_likely(x)   (x)
 
#define _sse2neon_unlikely(x)   (x)
 
#define _sse2neon_const   const
 
#define SSE2NEON_BARRIER()
 
#define SSE2NEON_CACHELINE_SIZE   64
 
#define __has_builtin(x)   0
 
#define _MM_SHUFFLE(fp3, fp2, fp1, fp0)    (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0)))
 MACRO for shuffle parameter for _mm_shuffle_ps().
 
#define _MM_FROUND_TO_NEAREST_INT   0x00
 
#define _MM_FROUND_TO_NEG_INF   0x01
 
#define _MM_FROUND_TO_POS_INF   0x02
 
#define _MM_FROUND_TO_ZERO   0x03
 
#define _MM_FROUND_CUR_DIRECTION   0x04
 
#define _MM_FROUND_NO_EXC   0x08
 
#define _MM_FROUND_RAISE_EXC   0x00
 
#define _MM_FROUND_NINT   (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_RAISE_EXC)
 
#define _MM_FROUND_FLOOR   (_MM_FROUND_TO_NEG_INF | _MM_FROUND_RAISE_EXC)
 
#define _MM_FROUND_CEIL   (_MM_FROUND_TO_POS_INF | _MM_FROUND_RAISE_EXC)
 
#define _MM_FROUND_TRUNC   (_MM_FROUND_TO_ZERO | _MM_FROUND_RAISE_EXC)
 
#define _MM_FROUND_RINT   (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_RAISE_EXC)
 
#define _MM_FROUND_NEARBYINT   (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_NO_EXC)
 
#define _MM_ROUND_NEAREST   0x0000
 
#define _MM_ROUND_DOWN   0x2000
 
#define _MM_ROUND_UP   0x4000
 
#define _MM_ROUND_TOWARD_ZERO   0x6000
 
#define _MM_FLUSH_ZERO_MASK   0x8000
 
#define _MM_FLUSH_ZERO_ON   0x8000
 
#define _MM_FLUSH_ZERO_OFF   0x0000
 
#define _MM_DENORMALS_ZERO_MASK   0x0040
 
#define _MM_DENORMALS_ZERO_ON   0x0040
 
#define _MM_DENORMALS_ZERO_OFF   0x0000
 
#define __constrange(a, b)   const
 
#define __int64   int64_t
 
#define vreinterpretq_m128_f16(x)   vreinterpretq_f32_f16(x)
 
#define vreinterpretq_m128_f32(x)   (x)
 
#define vreinterpretq_m128_f64(x)   vreinterpretq_f32_f64(x)
 
#define vreinterpretq_m128_u8(x)   vreinterpretq_f32_u8(x)
 
#define vreinterpretq_m128_u16(x)   vreinterpretq_f32_u16(x)
 
#define vreinterpretq_m128_u32(x)   vreinterpretq_f32_u32(x)
 
#define vreinterpretq_m128_u64(x)   vreinterpretq_f32_u64(x)
 
#define vreinterpretq_m128_s8(x)   vreinterpretq_f32_s8(x)
 
#define vreinterpretq_m128_s16(x)   vreinterpretq_f32_s16(x)
 
#define vreinterpretq_m128_s32(x)   vreinterpretq_f32_s32(x)
 
#define vreinterpretq_m128_s64(x)   vreinterpretq_f32_s64(x)
 
#define vreinterpretq_f16_m128(x)   vreinterpretq_f16_f32(x)
 
#define vreinterpretq_f32_m128(x)   (x)
 
#define vreinterpretq_f64_m128(x)   vreinterpretq_f64_f32(x)
 
#define vreinterpretq_u8_m128(x)   vreinterpretq_u8_f32(x)
 
#define vreinterpretq_u16_m128(x)   vreinterpretq_u16_f32(x)
 
#define vreinterpretq_u32_m128(x)   vreinterpretq_u32_f32(x)
 
#define vreinterpretq_u64_m128(x)   vreinterpretq_u64_f32(x)
 
#define vreinterpretq_s8_m128(x)   vreinterpretq_s8_f32(x)
 
#define vreinterpretq_s16_m128(x)   vreinterpretq_s16_f32(x)
 
#define vreinterpretq_s32_m128(x)   vreinterpretq_s32_f32(x)
 
#define vreinterpretq_s64_m128(x)   vreinterpretq_s64_f32(x)
 
#define vreinterpretq_m128i_s8(x)   vreinterpretq_s64_s8(x)
 
#define vreinterpretq_m128i_s16(x)   vreinterpretq_s64_s16(x)
 
#define vreinterpretq_m128i_s32(x)   vreinterpretq_s64_s32(x)
 
#define vreinterpretq_m128i_s64(x)   (x)
 
#define vreinterpretq_m128i_u8(x)   vreinterpretq_s64_u8(x)
 
#define vreinterpretq_m128i_u16(x)   vreinterpretq_s64_u16(x)
 
#define vreinterpretq_m128i_u32(x)   vreinterpretq_s64_u32(x)
 
#define vreinterpretq_m128i_u64(x)   vreinterpretq_s64_u64(x)
 
#define vreinterpretq_f32_m128i(x)   vreinterpretq_f32_s64(x)
 
#define vreinterpretq_f64_m128i(x)   vreinterpretq_f64_s64(x)
 
#define vreinterpretq_s8_m128i(x)   vreinterpretq_s8_s64(x)
 
#define vreinterpretq_s16_m128i(x)   vreinterpretq_s16_s64(x)
 
#define vreinterpretq_s32_m128i(x)   vreinterpretq_s32_s64(x)
 
#define vreinterpretq_s64_m128i(x)   (x)
 
#define vreinterpretq_u8_m128i(x)   vreinterpretq_u8_s64(x)
 
#define vreinterpretq_u16_m128i(x)   vreinterpretq_u16_s64(x)
 
#define vreinterpretq_u32_m128i(x)   vreinterpretq_u32_s64(x)
 
#define vreinterpretq_u64_m128i(x)   vreinterpretq_u64_s64(x)
 
#define vreinterpret_m64_s8(x)   vreinterpret_s64_s8(x)
 
#define vreinterpret_m64_s16(x)   vreinterpret_s64_s16(x)
 
#define vreinterpret_m64_s32(x)   vreinterpret_s64_s32(x)
 
#define vreinterpret_m64_s64(x)   (x)
 
#define vreinterpret_m64_u8(x)   vreinterpret_s64_u8(x)
 
#define vreinterpret_m64_u16(x)   vreinterpret_s64_u16(x)
 
#define vreinterpret_m64_u32(x)   vreinterpret_s64_u32(x)
 
#define vreinterpret_m64_u64(x)   vreinterpret_s64_u64(x)
 
#define vreinterpret_m64_f16(x)   vreinterpret_s64_f16(x)
 
#define vreinterpret_m64_f32(x)   vreinterpret_s64_f32(x)
 
#define vreinterpret_m64_f64(x)   vreinterpret_s64_f64(x)
 
#define vreinterpret_u8_m64(x)   vreinterpret_u8_s64(x)
 
#define vreinterpret_u16_m64(x)   vreinterpret_u16_s64(x)
 
#define vreinterpret_u32_m64(x)   vreinterpret_u32_s64(x)
 
#define vreinterpret_u64_m64(x)   vreinterpret_u64_s64(x)
 
#define vreinterpret_s8_m64(x)   vreinterpret_s8_s64(x)
 
#define vreinterpret_s16_m64(x)   vreinterpret_s16_s64(x)
 
#define vreinterpret_s32_m64(x)   vreinterpret_s32_s64(x)
 
#define vreinterpret_s64_m64(x)   (x)
 
#define vreinterpret_f32_m64(x)   vreinterpret_f32_s64(x)
 
#define vreinterpretq_m128d_s32(x)   vreinterpretq_f32_s32(x)
 
#define vreinterpretq_m128d_s64(x)   vreinterpretq_f32_s64(x)
 
#define vreinterpretq_m128d_u32(x)   vreinterpretq_f32_u32(x)
 
#define vreinterpretq_m128d_u64(x)   vreinterpretq_f32_u64(x)
 
#define vreinterpretq_m128d_f32(x)   (x)
 
#define vreinterpretq_s64_m128d(x)   vreinterpretq_s64_f32(x)
 
#define vreinterpretq_u32_m128d(x)   vreinterpretq_u32_f32(x)
 
#define vreinterpretq_u64_m128d(x)   vreinterpretq_u64_f32(x)
 
#define vreinterpretq_f32_m128d(x)   (x)
 
#define vreinterpretq_nth_u64_m128i(x, n)   (((SIMDVec *) &x)->m128_u64[n])
 
#define vreinterpretq_nth_u32_m128i(x, n)   (((SIMDVec *) &x)->m128_u32[n])
 
#define vreinterpretq_nth_u8_m128i(x, n)   (((SIMDVec *) &x)->m128_u8[n])
 
#define _MM_GET_FLUSH_ZERO_MODE   _sse2neon_mm_get_flush_zero_mode
 
#define _MM_SET_FLUSH_ZERO_MODE   _sse2neon_mm_set_flush_zero_mode
 
#define _MM_GET_DENORMALS_ZERO_MODE   _sse2neon_mm_get_denormals_zero_mode
 
#define _MM_SET_DENORMALS_ZERO_MODE   _sse2neon_mm_set_denormals_zero_mode
 
#define _mm_shuffle_epi32_default(a, imm)
 
#define _mm_shuffle_epi32_splat(a, imm)
 
#define _mm_shuffle_ps_default(a, b, imm)
 
#define _mm_shufflelo_epi16_function(a, imm)
 
#define _mm_shufflehi_epi16_function(a, imm)
 
#define _mm_cvtps_pi32(a)   _mm_cvt_ps2pi(a)
 
#define _mm_cvtsi32_ss(a, b)   _mm_cvt_si2ss(a, b)
 
#define _mm_cvtss_si32(a)   _mm_cvt_ss2si(a)
 
#define _mm_cvttps_pi32(a)   _mm_cvtt_ps2pi(a)
 
#define _mm_cvttss_si32(a)   _mm_cvtt_ss2si(a)
 
#define _mm_extract_pi16(a, imm)    (int32_t) vget_lane_u16(vreinterpret_u16_m64(a), (imm))
 
#define _mm_insert_pi16(a, b, imm)
 
#define _mm_load_ps1   _mm_load1_ps
 
#define _m_maskmovq(a, mask, mem_addr)   _mm_maskmove_si64(a, mask, mem_addr)
 
#define _m_pavgb(a, b)   _mm_avg_pu8(a, b)
 
#define _m_pavgw(a, b)   _mm_avg_pu16(a, b)
 
#define _m_pextrw(a, imm)   _mm_extract_pi16(a, imm)
 
#define _m_pinsrw(a, i, imm)   _mm_insert_pi16(a, i, imm)
 
#define _m_pmaxsw(a, b)   _mm_max_pi16(a, b)
 
#define _m_pmaxub(a, b)   _mm_max_pu8(a, b)
 
#define _m_pminsw(a, b)   _mm_min_pi16(a, b)
 
#define _m_pminub(a, b)   _mm_min_pu8(a, b)
 
#define _m_pmovmskb(a)   _mm_movemask_pi8(a)
 
#define _m_pmulhuw(a, b)   _mm_mulhi_pu16(a, b)
 
#define _m_psadbw(a, b)   _mm_sad_pu8(a, b)
 
#define _m_pshufw(a, imm)   _mm_shuffle_pi16(a, imm)
 
#define _mm_shuffle_pi16(a, imm)
 
#define _mm_shuffle_ps(a, b, imm)
 
#define _mm_store1_ps   _mm_store_ps1
 
#define _MM_TRANSPOSE4_PS(row0, row1, row2, row3)
 
#define _mm_ucomieq_ss   _mm_comieq_ss
 
#define _mm_ucomige_ss   _mm_comige_ss
 
#define _mm_ucomigt_ss   _mm_comigt_ss
 
#define _mm_ucomile_ss   _mm_comile_ss
 
#define _mm_ucomilt_ss   _mm_comilt_ss
 
#define _mm_ucomineq_ss   _mm_comineq_ss
 
#define _mm_bslli_si128(a, imm)   _mm_slli_si128(a, imm)
 
#define _mm_bsrli_si128(a, imm)   _mm_srli_si128(a, imm)
 
#define _mm_cvtsd_si64x   _mm_cvtsd_si64
 
#define _mm_cvtsi128_si64x(a)   _mm_cvtsi128_si64(a)
 
#define _mm_cvtsi128_si64x(a)   _mm_cvtsi128_si64(a)
 
#define _mm_cvtsi64x_si128(a)   _mm_cvtsi64_si128(a)
 
#define _mm_cvtsi64x_sd(a, b)   _mm_cvtsi64_sd(a, b)
 
#define _mm_cvttsd_si64x(a)   _mm_cvttsd_si64(a)
 
#define _mm_extract_epi16(a, imm)    vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm))
 
#define _mm_insert_epi16(a, b, imm)
 
#define _mm_load_pd1   _mm_load1_pd
 
#define _mm_set_pd1   _mm_set1_pd
 
#define _mm_shuffle_epi32(a, imm)
 
#define _mm_shuffle_pd(a, b, imm8)
 
#define _mm_shufflehi_epi16(a, imm)   _mm_shufflehi_epi16_function((a), (imm))
 
#define _mm_shufflelo_epi16(a, imm)   _mm_shufflelo_epi16_function((a), (imm))
 
#define _mm_slli_si128(a, imm)
 
#define _mm_srai_epi32(a, imm)
 
#define _mm_srli_epi16(a, imm)
 
#define _mm_srli_epi32(a, imm)
 
#define _mm_srli_epi64(a, imm)
 
#define _mm_srli_si128(a, imm)
 
#define _mm_store1_pd   _mm_store_pd1
 
#define _mm_ucomieq_sd   _mm_comieq_sd
 
#define _mm_ucomige_sd   _mm_comige_sd
 
#define _mm_ucomigt_sd   _mm_comigt_sd
 
#define _mm_ucomile_sd   _mm_comile_sd
 
#define _mm_ucomilt_sd   _mm_comilt_sd
 
#define _mm_ucomineq_sd   _mm_comineq_sd
 
#define _mm_lddqu_si128   _mm_loadu_si128
 
#define _mm_loaddup_pd   _mm_load1_pd
 
#define _mm_alignr_epi8(a, b, imm)
 
#define _mm_alignr_pi8(a, b, imm)
 
#define _mm_blend_epi16(a, b, imm)
 
#define _mm_blend_pd(a, b, imm)
 
#define _mm_extract_epi32(a, imm)    vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm))
 
#define _mm_extract_epi64(a, imm)    vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm))
 
#define _mm_extract_epi8(a, imm)   vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm))
 
#define _mm_extract_ps(a, imm)   vgetq_lane_s32(vreinterpretq_s32_m128(a), (imm))
 
#define _mm_insert_epi32(a, b, imm)
 
#define _mm_insert_epi64(a, b, imm)
 
#define _mm_insert_epi8(a, b, imm)
 
#define _mm_insert_ps(a, b, imm8)
 
#define _mm_testnzc_si128(a, b)   _mm_test_mix_ones_zeros(a, b)
 
#define _SIDD_UBYTE_OPS   0x00 /* unsigned 8-bit characters */
 
#define _SIDD_UWORD_OPS   0x01 /* unsigned 16-bit characters */
 
#define _SIDD_SBYTE_OPS   0x02 /* signed 8-bit characters */
 
#define _SIDD_SWORD_OPS   0x03 /* signed 16-bit characters */
 
#define _SIDD_CMP_EQUAL_ANY   0x00 /* compare equal any: strchr */
 
#define _SIDD_CMP_RANGES   0x04 /* compare ranges */
 
#define _SIDD_CMP_EQUAL_EACH   0x08 /* compare equal each: strcmp */
 
#define _SIDD_CMP_EQUAL_ORDERED   0x0C /* compare equal ordered */
 
#define _SIDD_POSITIVE_POLARITY   0x00
 
#define _SIDD_MASKED_POSITIVE_POLARITY   0x20
 
#define _SIDD_NEGATIVE_POLARITY   0x10 /* negate results */
 
#define _SIDD_MASKED_NEGATIVE_POLARITY    0x30 /* negate results only before end of string */
 
#define _SIDD_LEAST_SIGNIFICANT   0x00
 
#define _SIDD_MOST_SIGNIFICANT   0x40
 
#define _SIDD_BIT_MASK   0x00
 
#define _SIDD_UNIT_MASK   0x40
 
#define SSE2NEON_PRIMITIVE_CAT(a, ...)   a##__VA_ARGS__
 
#define SSE2NEON_CAT(a, b)   SSE2NEON_PRIMITIVE_CAT(a, b)
 
#define SSE2NEON_IIF(c)   SSE2NEON_PRIMITIVE_CAT(SSE2NEON_IIF_, c)
 
#define SSE2NEON_IIF_0(t, ...)   __VA_ARGS__
 
#define SSE2NEON_IIF_1(t, ...)   t
 
#define SSE2NEON_COMPL(b)   SSE2NEON_PRIMITIVE_CAT(SSE2NEON_COMPL_, b)
 
#define SSE2NEON_COMPL_0   1
 
#define SSE2NEON_COMPL_1   0
 
#define SSE2NEON_DEC(x)   SSE2NEON_PRIMITIVE_CAT(SSE2NEON_DEC_, x)
 
#define SSE2NEON_DEC_1   0
 
#define SSE2NEON_DEC_2   1
 
#define SSE2NEON_DEC_3   2
 
#define SSE2NEON_DEC_4   3
 
#define SSE2NEON_DEC_5   4
 
#define SSE2NEON_DEC_6   5
 
#define SSE2NEON_DEC_7   6
 
#define SSE2NEON_DEC_8   7
 
#define SSE2NEON_DEC_9   8
 
#define SSE2NEON_DEC_10   9
 
#define SSE2NEON_DEC_11   10
 
#define SSE2NEON_DEC_12   11
 
#define SSE2NEON_DEC_13   12
 
#define SSE2NEON_DEC_14   13
 
#define SSE2NEON_DEC_15   14
 
#define SSE2NEON_DEC_16   15
 
#define SSE2NEON_CHECK_N(x, n, ...)   n
 
#define SSE2NEON_CHECK(...)   SSE2NEON_CHECK_N(__VA_ARGS__, 0, )
 
#define SSE2NEON_PROBE(x)   x, 1,
 
#define SSE2NEON_NOT(x)   SSE2NEON_CHECK(SSE2NEON_PRIMITIVE_CAT(SSE2NEON_NOT_, x))
 
#define SSE2NEON_NOT_0   SSE2NEON_PROBE(~)
 
#define SSE2NEON_BOOL(x)   SSE2NEON_COMPL(SSE2NEON_NOT(x))
 
#define SSE2NEON_IF(c)   SSE2NEON_IIF(SSE2NEON_BOOL(c))
 
#define SSE2NEON_EAT(...)
 
#define SSE2NEON_EXPAND(...)   __VA_ARGS__
 
#define SSE2NEON_WHEN(c)   SSE2NEON_IF(c)(SSE2NEON_EXPAND, SSE2NEON_EAT)
 
#define SSE2NEON_EMPTY()
 
#define SSE2NEON_DEFER(id)   id SSE2NEON_EMPTY()
 
#define SSE2NEON_OBSTRUCT(...)   __VA_ARGS__ SSE2NEON_DEFER(SSE2NEON_EMPTY)()
 
#define SSE2NEON_EXPAND(...)   __VA_ARGS__
 
#define SSE2NEON_EVAL(...)    SSE2NEON_EVAL1(SSE2NEON_EVAL1(SSE2NEON_EVAL1(__VA_ARGS__)))
 
#define SSE2NEON_EVAL1(...)    SSE2NEON_EVAL2(SSE2NEON_EVAL2(SSE2NEON_EVAL2(__VA_ARGS__)))
 
#define SSE2NEON_EVAL2(...)    SSE2NEON_EVAL3(SSE2NEON_EVAL3(SSE2NEON_EVAL3(__VA_ARGS__)))
 
#define SSE2NEON_EVAL3(...)   __VA_ARGS__
 
#define SSE2NEON_REPEAT(count, macro, ...)
 
#define SSE2NEON_REPEAT_INDIRECT()   SSE2NEON_REPEAT
 
#define SSE2NEON_SIZE_OF_byte   8
 
#define SSE2NEON_NUMBER_OF_LANES_byte   16
 
#define SSE2NEON_SIZE_OF_word   16
 
#define SSE2NEON_NUMBER_OF_LANES_word   8
 
#define SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE(i, type)
 
#define SSE2NEON_FILL_LANE(i, type)
 
#define PCMPSTR_RANGES(a, b, mtx, data_type_prefix, type_prefix, size, number_of_lanes, byte_or_word)
 
#define PCMPSTR_EQ(a, b, mtx, size, number_of_lanes)
 
#define SSE2NEON_CMP_EQUAL_ANY_IMPL(type)
 
#define SSE2NEON_CMP_RANGES_IMPL(type, data_type, us, byte_or_word)
 
#define SSE2NEON_CMP_EQUAL_ORDERED_IMPL(type)
 
#define SSE2NEON_GENERATE_CMP_EQUAL_ANY(prefix)
 
#define SSE2NEON_CMP_RANGES_IS_BYTE   1
 
#define SSE2NEON_CMP_RANGES_IS_WORD   0
 
#define SSE2NEON_GENERATE_CMP_RANGES(prefix)
 
#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE   1
 
#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD   0
 
#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IMPL(size, number_of_lanes, data_type)
 
#define SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(prefix)
 
#define SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(prefix)
 
#define SSE2NEON_CMPESTR_LIST
 
#define _(name, func_suffix)   name,
 
#define _(name, func_suffix)   _sse2neon_##func_suffix,
 
#define SSE2NEON_MIN(x, y)   (x) < (y) ? (x) : (y)
 
#define SSE2NEON_CMPSTR_SET_UPPER(var, imm)    const int var = (imm & 0x01) ? 8 : 16
 
#define SSE2NEON_CMPESTRX_LEN_PAIR(a, b, la, lb)
 
#define SSE2NEON_COMP_AGG(a, b, la, lb, imm8, IE)
 
#define SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8)
 
#define SSE2NEON_CMPSTR_GENERATE_MASK(dst)
 
#define SSE2NEON_CMPISTRX_LENGTH(str, len, imm8)
 
#define SSE2NEON_CMPISTRX_LEN_PAIR(a, b, la, lb)
 
#define SSE2NEON_AES_SBOX(w)
 
#define SSE2NEON_AES_RSBOX(w)
 
#define SSE2NEON_AES_H0(x)   (x)
 
#define SSE2NEON_XT(x)   (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b))
 
#define SSE2NEON_MULTIPLY(x, y)
 
#define SSE2NEON_AES_B2W(b0, b1, b2, b3)
 
#define SSE2NEON_AES_F2(x)   ((x << 1) ^ (((x >> 7) & 1) * 0x011b /* WPOLY */))
 
#define SSE2NEON_AES_F3(x)   (SSE2NEON_AES_F2(x) ^ x)
 
#define SSE2NEON_AES_U0(p)    SSE2NEON_AES_B2W(SSE2NEON_AES_F2(p), p, p, SSE2NEON_AES_F3(p))
 
#define SSE2NEON_AES_U1(p)    SSE2NEON_AES_B2W(SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p, p)
 
#define SSE2NEON_AES_U2(p)    SSE2NEON_AES_B2W(p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p)
 
#define SSE2NEON_AES_U3(p)    SSE2NEON_AES_B2W(p, p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p))
 

类型定义

typedef int64x1_t __m64
 
typedef float32x4_t __m128
 
typedef float32x4_t __m128d
 
typedef int64x2_t __m128i
 
typedef int(* cmpestr_func_t) (__m128i a, int la, __m128i b, int lb)
 

枚举

enum  _mm_hint { _MM_HINT_NTA = 0 , _MM_HINT_T0 = 1 , _MM_HINT_T1 = 2 , _MM_HINT_T2 = 3 }
 
enum  { SSE2NEON_CMPESTR_LIST }
 

函数

FORCE_INLINE void _sse2neon_smp_mb (void)
 
union ALIGN_STRUCT (16) SIMDVec
 
FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE ()
 
FORCE_INLINE __m128 _mm_move_ss (__m128, __m128)
 
FORCE_INLINE __m128 _mm_or_ps (__m128, __m128)
 
FORCE_INLINE __m128 _mm_set_ps1 (float)
 
FORCE_INLINE __m128 _mm_setzero_ps (void)
 
FORCE_INLINE __m128i _mm_and_si128 (__m128i, __m128i)
 
FORCE_INLINE __m128i _mm_castps_si128 (__m128)
 
FORCE_INLINE __m128i _mm_cmpeq_epi32 (__m128i, __m128i)
 
FORCE_INLINE __m128i _mm_cvtps_epi32 (__m128)
 
FORCE_INLINE __m128d _mm_move_sd (__m128d, __m128d)
 
FORCE_INLINE __m128i _mm_or_si128 (__m128i, __m128i)
 
FORCE_INLINE __m128i _mm_set_epi32 (int, int, int, int)
 
FORCE_INLINE __m128i _mm_set_epi64x (int64_t, int64_t)
 
FORCE_INLINE __m128d _mm_set_pd (double, double)
 
FORCE_INLINE __m128i _mm_set1_epi32 (int)
 
FORCE_INLINE __m128i _mm_setzero_si128 ()
 
FORCE_INLINE __m128d _mm_ceil_pd (__m128d)
 
FORCE_INLINE __m128 _mm_ceil_ps (__m128)
 
FORCE_INLINE __m128d _mm_floor_pd (__m128d)
 
FORCE_INLINE __m128 _mm_floor_ps (__m128)
 
FORCE_INLINE __m128d _mm_round_pd (__m128d, int)
 
FORCE_INLINE __m128 _mm_round_ps (__m128, int)
 
FORCE_INLINE uint32_t _mm_crc32_u8 (uint32_t, uint8_t)
 
FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4 (const uint8_t *p)
 
FORCE_INLINE uint8_t _sse2neon_vaddv_u8 (uint8x8_t v8)
 
FORCE_INLINE uint8_t _sse2neon_vaddvq_u8 (uint8x16_t a)
 
FORCE_INLINE uint16_t _sse2neon_vaddvq_u16 (uint16x8_t a)
 
FORCE_INLINE __m128 _mm_shuffle_ps_1032 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_2301 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_0321 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_2103 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_1010 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_1001 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_0101 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_3210 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_0011 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_0022 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_2200 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_3202 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_1133 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_2010 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_2001 (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_shuffle_ps_2032 (__m128 a, __m128 b)
 
FORCE_INLINE void _sse2neon_kadd_f32 (float *sum, float *c, float y)
 
FORCE_INLINE __m128i _mm_shuffle_epi_1032 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_2301 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_0321 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_2103 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_1010 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_1001 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_0101 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_2211 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_0122 (__m128i a)
 
FORCE_INLINE __m128i _mm_shuffle_epi_3332 (__m128i a)
 
FORCE_INLINE void _mm_empty (void)
 
FORCE_INLINE __m128 _mm_add_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_add_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_and_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_andnot_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m64 _mm_avg_pu16 (__m64 a, __m64 b)
 
FORCE_INLINE __m64 _mm_avg_pu8 (__m64 a, __m64 b)
 
FORCE_INLINE __m128 _mm_cmpeq_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpeq_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpge_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpge_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpgt_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpgt_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmple_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmple_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmplt_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmplt_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpneq_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpneq_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpnge_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpnge_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpngt_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpngt_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpnle_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpnle_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpnlt_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpnlt_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpord_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpord_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpunord_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cmpunord_ss (__m128 a, __m128 b)
 
FORCE_INLINE int _mm_comieq_ss (__m128 a, __m128 b)
 
FORCE_INLINE int _mm_comige_ss (__m128 a, __m128 b)
 
FORCE_INLINE int _mm_comigt_ss (__m128 a, __m128 b)
 
FORCE_INLINE int _mm_comile_ss (__m128 a, __m128 b)
 
FORCE_INLINE int _mm_comilt_ss (__m128 a, __m128 b)
 
FORCE_INLINE int _mm_comineq_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_cvt_pi2ps (__m128 a, __m64 b)
 
FORCE_INLINE __m64 _mm_cvt_ps2pi (__m128 a)
 
FORCE_INLINE __m128 _mm_cvt_si2ss (__m128 a, int b)
 
FORCE_INLINE int _mm_cvt_ss2si (__m128 a)
 
FORCE_INLINE __m128 _mm_cvtpi16_ps (__m64 a)
 
FORCE_INLINE __m128 _mm_cvtpi32_ps (__m128 a, __m64 b)
 
FORCE_INLINE __m128 _mm_cvtpi32x2_ps (__m64 a, __m64 b)
 
FORCE_INLINE __m128 _mm_cvtpi8_ps (__m64 a)
 
FORCE_INLINE __m64 _mm_cvtps_pi16 (__m128 a)
 
FORCE_INLINE __m64 _mm_cvtps_pi8 (__m128 a)
 
FORCE_INLINE __m128 _mm_cvtpu16_ps (__m64 a)
 
FORCE_INLINE __m128 _mm_cvtpu8_ps (__m64 a)
 
FORCE_INLINE __m128 _mm_cvtsi64_ss (__m128 a, int64_t b)
 
FORCE_INLINE float _mm_cvtss_f32 (__m128 a)
 
FORCE_INLINE int64_t _mm_cvtss_si64 (__m128 a)
 
FORCE_INLINE __m64 _mm_cvtt_ps2pi (__m128 a)
 
FORCE_INLINE int _mm_cvtt_ss2si (__m128 a)
 
FORCE_INLINE int64_t _mm_cvttss_si64 (__m128 a)
 
FORCE_INLINE __m128 _mm_div_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_div_ss (__m128 a, __m128 b)
 
FORCE_INLINE void _mm_free (void *addr)
 
FORCE_INLINE unsigned int _sse2neon_mm_get_flush_zero_mode ()
 
FORCE_INLINE __m128 _mm_load_ps (const float *p)
 
FORCE_INLINE __m128 _mm_load_ss (const float *p)
 
FORCE_INLINE __m128 _mm_load1_ps (const float *p)
 
FORCE_INLINE __m128 _mm_loadh_pi (__m128 a, __m64 const *p)
 
FORCE_INLINE __m128 _mm_loadl_pi (__m128 a, __m64 const *p)
 
FORCE_INLINE __m128 _mm_loadr_ps (const float *p)
 
FORCE_INLINE __m128 _mm_loadu_ps (const float *p)
 
FORCE_INLINE __m128i _mm_loadu_si16 (const void *p)
 
FORCE_INLINE __m128i _mm_loadu_si64 (const void *p)
 
FORCE_INLINE void * _mm_malloc (size_t size, size_t align)
 
FORCE_INLINE void _mm_maskmove_si64 (__m64 a, __m64 mask, char *mem_addr)
 
FORCE_INLINE __m64 _mm_max_pi16 (__m64 a, __m64 b)
 
FORCE_INLINE __m128 _mm_max_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m64 _mm_max_pu8 (__m64 a, __m64 b)
 
FORCE_INLINE __m128 _mm_max_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m64 _mm_min_pi16 (__m64 a, __m64 b)
 
FORCE_INLINE __m128 _mm_min_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m64 _mm_min_pu8 (__m64 a, __m64 b)
 
FORCE_INLINE __m128 _mm_min_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_movehl_ps (__m128 __A, __m128 __B)
 
FORCE_INLINE __m128 _mm_movelh_ps (__m128 __A, __m128 __B)
 
FORCE_INLINE int _mm_movemask_pi8 (__m64 a)
 
FORCE_INLINE int _mm_movemask_ps (__m128 a)
 
FORCE_INLINE __m128 _mm_mul_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_mul_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m64 _mm_mulhi_pu16 (__m64 a, __m64 b)
 
FORCE_INLINE void _mm_prefetch (char const *p, int i)
 
FORCE_INLINE __m128 _mm_rcp_ps (__m128 in)
 
FORCE_INLINE __m128 _mm_rcp_ss (__m128 a)
 
FORCE_INLINE __m128 _mm_rsqrt_ps (__m128 in)
 
FORCE_INLINE __m128 _mm_rsqrt_ss (__m128 in)
 
FORCE_INLINE __m64 _mm_sad_pu8 (__m64 a, __m64 b)
 
FORCE_INLINE void _sse2neon_mm_set_flush_zero_mode (unsigned int flag)
 
FORCE_INLINE __m128 _mm_set_ps (float w, float z, float y, float x)
 
FORCE_INLINE void _MM_SET_ROUNDING_MODE (int rounding)
 
FORCE_INLINE __m128 _mm_set_ss (float a)
 
FORCE_INLINE __m128 _mm_set1_ps (float _w)
 
FORCE_INLINE void _mm_setcsr (unsigned int a)
 
FORCE_INLINE unsigned int _mm_getcsr ()
 
FORCE_INLINE __m128 _mm_setr_ps (float w, float z, float y, float x)
 
FORCE_INLINE void _mm_sfence (void)
 
FORCE_INLINE void _mm_mfence (void)
 
FORCE_INLINE void _mm_lfence (void)
 
FORCE_INLINE __m128 _mm_sqrt_ps (__m128 in)
 
FORCE_INLINE __m128 _mm_sqrt_ss (__m128 in)
 
FORCE_INLINE void _mm_store_ps (float *p, __m128 a)
 
FORCE_INLINE void _mm_store_ps1 (float *p, __m128 a)
 
FORCE_INLINE void _mm_store_ss (float *p, __m128 a)
 
FORCE_INLINE void _mm_storeh_pi (__m64 *p, __m128 a)
 
FORCE_INLINE void _mm_storel_pi (__m64 *p, __m128 a)
 
FORCE_INLINE void _mm_storer_ps (float *p, __m128 a)
 
FORCE_INLINE void _mm_storeu_ps (float *p, __m128 a)
 
FORCE_INLINE void _mm_storeu_si16 (void *p, __m128i a)
 
FORCE_INLINE void _mm_storeu_si64 (void *p, __m128i a)
 
FORCE_INLINE void _mm_stream_pi (__m64 *p, __m64 a)
 
FORCE_INLINE void _mm_stream_ps (float *p, __m128 a)
 
FORCE_INLINE __m128 _mm_sub_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_sub_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128i _mm_undefined_si128 (void)
 
FORCE_INLINE __m128 _mm_undefined_ps (void)
 
FORCE_INLINE __m128 _mm_unpackhi_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_unpacklo_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128 _mm_xor_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128i _mm_add_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_add_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_add_epi64 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_add_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_add_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_add_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m64 _mm_add_si64 (__m64 a, __m64 b)
 
FORCE_INLINE __m128i _mm_adds_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_adds_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_adds_epu16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_adds_epu8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_and_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_andnot_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_andnot_si128 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_avg_epu16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_avg_epu8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128 _mm_castpd_ps (__m128d a)
 
FORCE_INLINE __m128i _mm_castpd_si128 (__m128d a)
 
FORCE_INLINE __m128d _mm_castps_pd (__m128 a)
 
FORCE_INLINE __m128d _mm_castsi128_pd (__m128i a)
 
FORCE_INLINE __m128 _mm_castsi128_ps (__m128i a)
 
FORCE_INLINE void _mm_clflush (void const *p)
 
FORCE_INLINE __m128i _mm_cmpeq_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_cmpeq_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_cmpeq_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpeq_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpge_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpge_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_cmpgt_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_cmpgt_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_cmpgt_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_cmpgt_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpgt_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmple_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmple_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_cmplt_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_cmplt_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_cmplt_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_cmplt_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmplt_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpneq_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpneq_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpnge_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpnge_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpngt_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpngt_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpnle_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpnle_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpnlt_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpnlt_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpord_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpord_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpunord_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cmpunord_sd (__m128d a, __m128d b)
 
FORCE_INLINE int _mm_comige_sd (__m128d a, __m128d b)
 
FORCE_INLINE int _mm_comigt_sd (__m128d a, __m128d b)
 
FORCE_INLINE int _mm_comile_sd (__m128d a, __m128d b)
 
FORCE_INLINE int _mm_comilt_sd (__m128d a, __m128d b)
 
FORCE_INLINE int _mm_comieq_sd (__m128d a, __m128d b)
 
FORCE_INLINE int _mm_comineq_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_cvtepi32_pd (__m128i a)
 
FORCE_INLINE __m128 _mm_cvtepi32_ps (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtpd_epi32 (__m128d a)
 
FORCE_INLINE __m64 _mm_cvtpd_pi32 (__m128d a)
 
FORCE_INLINE __m128 _mm_cvtpd_ps (__m128d a)
 
FORCE_INLINE __m128d _mm_cvtpi32_pd (__m64 a)
 
FORCE_INLINE __m128d _mm_cvtps_pd (__m128 a)
 
FORCE_INLINE double _mm_cvtsd_f64 (__m128d a)
 
FORCE_INLINE int32_t _mm_cvtsd_si32 (__m128d a)
 
FORCE_INLINE int64_t _mm_cvtsd_si64 (__m128d a)
 
FORCE_INLINE __m128 _mm_cvtsd_ss (__m128 a, __m128d b)
 
FORCE_INLINE int _mm_cvtsi128_si32 (__m128i a)
 
FORCE_INLINE int64_t _mm_cvtsi128_si64 (__m128i a)
 
FORCE_INLINE __m128d _mm_cvtsi32_sd (__m128d a, int32_t b)
 
FORCE_INLINE __m128i _mm_cvtsi32_si128 (int a)
 
FORCE_INLINE __m128d _mm_cvtsi64_sd (__m128d a, int64_t b)
 
FORCE_INLINE __m128i _mm_cvtsi64_si128 (int64_t a)
 
FORCE_INLINE __m128d _mm_cvtss_sd (__m128d a, __m128 b)
 
FORCE_INLINE __m128i _mm_cvttpd_epi32 (__m128d a)
 
FORCE_INLINE __m64 _mm_cvttpd_pi32 (__m128d a)
 
FORCE_INLINE __m128i _mm_cvttps_epi32 (__m128 a)
 
FORCE_INLINE int32_t _mm_cvttsd_si32 (__m128d a)
 
FORCE_INLINE int64_t _mm_cvttsd_si64 (__m128d a)
 
FORCE_INLINE __m128d _mm_div_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_div_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_load_pd (const double *p)
 
FORCE_INLINE __m128d _mm_load_sd (const double *p)
 
FORCE_INLINE __m128i _mm_load_si128 (const __m128i *p)
 
FORCE_INLINE __m128d _mm_load1_pd (const double *p)
 
FORCE_INLINE __m128d _mm_loadh_pd (__m128d a, const double *p)
 
FORCE_INLINE __m128i _mm_loadl_epi64 (__m128i const *p)
 
FORCE_INLINE __m128d _mm_loadl_pd (__m128d a, const double *p)
 
FORCE_INLINE __m128d _mm_loadr_pd (const double *p)
 
FORCE_INLINE __m128d _mm_loadu_pd (const double *p)
 
FORCE_INLINE __m128i _mm_loadu_si128 (const __m128i *p)
 
FORCE_INLINE __m128i _mm_loadu_si32 (const void *p)
 
FORCE_INLINE __m128i _mm_madd_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE void _mm_maskmoveu_si128 (__m128i a, __m128i mask, char *mem_addr)
 
FORCE_INLINE __m128i _mm_max_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_max_epu8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_max_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_max_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_min_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_min_epu8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_min_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_min_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_move_epi64 (__m128i a)
 
FORCE_INLINE int _mm_movemask_epi8 (__m128i a)
 
FORCE_INLINE int _mm_movemask_pd (__m128d a)
 
FORCE_INLINE __m64 _mm_movepi64_pi64 (__m128i a)
 
FORCE_INLINE __m128i _mm_movpi64_epi64 (__m64 a)
 
FORCE_INLINE __m128i _mm_mul_epu32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_mul_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_mul_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m64 _mm_mul_su32 (__m64 a, __m64 b)
 
FORCE_INLINE __m128i _mm_mulhi_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_mulhi_epu16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_mullo_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_or_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_packs_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_packs_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_packus_epi16 (const __m128i a, const __m128i b)
 
FORCE_INLINE void _mm_pause ()
 
FORCE_INLINE __m128i _mm_sad_epu8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_set_epi16 (short i7, short i6, short i5, short i4, short i3, short i2, short i1, short i0)
 
FORCE_INLINE __m128i _mm_set_epi64 (__m64 i1, __m64 i2)
 
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 __m128d _mm_set_sd (double a)
 
FORCE_INLINE __m128i _mm_set1_epi16 (short w)
 
FORCE_INLINE __m128i _mm_set1_epi64 (__m64 _i)
 
FORCE_INLINE __m128i _mm_set1_epi64x (int64_t _i)
 
FORCE_INLINE __m128i _mm_set1_epi8 (signed char w)
 
FORCE_INLINE __m128d _mm_set1_pd (double d)
 
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_setr_epi32 (int i3, int i2, int i1, int i0)
 
FORCE_INLINE __m128i _mm_setr_epi64 (__m64 e1, __m64 e0)
 
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 __m128d _mm_setr_pd (double e1, double e0)
 
FORCE_INLINE __m128d _mm_setzero_pd (void)
 
FORCE_INLINE __m128i _mm_sll_epi16 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_sll_epi32 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_sll_epi64 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_slli_epi16 (__m128i a, int imm)
 
FORCE_INLINE __m128i _mm_slli_epi32 (__m128i a, int imm)
 
FORCE_INLINE __m128i _mm_slli_epi64 (__m128i a, int imm)
 
FORCE_INLINE __m128d _mm_sqrt_pd (__m128d a)
 
FORCE_INLINE __m128d _mm_sqrt_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_sra_epi16 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_sra_epi32 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_srai_epi16 (__m128i a, int imm)
 
FORCE_INLINE __m128i _mm_srl_epi16 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_srl_epi32 (__m128i a, __m128i count)
 
FORCE_INLINE __m128i _mm_srl_epi64 (__m128i a, __m128i count)
 
FORCE_INLINE void _mm_store_pd (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_store_pd1 (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_store_sd (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_store_si128 (__m128i *p, __m128i a)
 
FORCE_INLINE void _mm_storeh_pd (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_storel_epi64 (__m128i *a, __m128i b)
 
FORCE_INLINE void _mm_storel_pd (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_storer_pd (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_storeu_pd (double *mem_addr, __m128d a)
 
FORCE_INLINE void _mm_storeu_si128 (__m128i *p, __m128i a)
 
FORCE_INLINE void _mm_storeu_si32 (void *p, __m128i a)
 
FORCE_INLINE void _mm_stream_pd (double *p, __m128d a)
 
FORCE_INLINE void _mm_stream_si128 (__m128i *p, __m128i a)
 
FORCE_INLINE void _mm_stream_si32 (int *p, int a)
 
FORCE_INLINE void _mm_stream_si64 (__int64 *p, __int64 a)
 
FORCE_INLINE __m128i _mm_sub_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_sub_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_sub_epi64 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_sub_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_sub_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_sub_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m64 _mm_sub_si64 (__m64 a, __m64 b)
 
FORCE_INLINE __m128i _mm_subs_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_subs_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_subs_epu16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_subs_epu8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_undefined_pd (void)
 
FORCE_INLINE __m128i _mm_unpackhi_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_unpackhi_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_unpackhi_epi64 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_unpackhi_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_unpackhi_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_unpacklo_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_unpacklo_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_unpacklo_epi64 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_unpacklo_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_unpacklo_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128d _mm_xor_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128i _mm_xor_si128 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_addsub_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128 _mm_addsub_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128d _mm_hadd_pd (__m128d a, __m128d b)
 
FORCE_INLINE __m128 _mm_hadd_ps (__m128 a, __m128 b)
 
FORCE_INLINE __m128d _mm_hsub_pd (__m128d _a, __m128d _b)
 
FORCE_INLINE __m128 _mm_hsub_ps (__m128 _a, __m128 _b)
 
FORCE_INLINE __m128d _mm_movedup_pd (__m128d a)
 
FORCE_INLINE __m128 _mm_movehdup_ps (__m128 a)
 
FORCE_INLINE __m128 _mm_moveldup_ps (__m128 a)
 
FORCE_INLINE __m128i _mm_abs_epi16 (__m128i a)
 
FORCE_INLINE __m128i _mm_abs_epi32 (__m128i a)
 
FORCE_INLINE __m128i _mm_abs_epi8 (__m128i a)
 
FORCE_INLINE __m64 _mm_abs_pi16 (__m64 a)
 
FORCE_INLINE __m64 _mm_abs_pi32 (__m64 a)
 
FORCE_INLINE __m64 _mm_abs_pi8 (__m64 a)
 
FORCE_INLINE __m128i _mm_hadd_epi16 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m128i _mm_hadd_epi32 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m64 _mm_hadd_pi16 (__m64 a, __m64 b)
 
FORCE_INLINE __m64 _mm_hadd_pi32 (__m64 a, __m64 b)
 
FORCE_INLINE __m128i _mm_hadds_epi16 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m64 _mm_hadds_pi16 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m128i _mm_hsub_epi16 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m128i _mm_hsub_epi32 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m64 _mm_hsub_pi16 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m64 _mm_hsub_pi32 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m128i _mm_hsubs_epi16 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m64 _mm_hsubs_pi16 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m128i _mm_maddubs_epi16 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m64 _mm_maddubs_pi16 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m128i _mm_mulhrs_epi16 (__m128i a, __m128i b)
 
FORCE_INLINE __m64 _mm_mulhrs_pi16 (__m64 a, __m64 b)
 
FORCE_INLINE __m128i _mm_shuffle_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m64 _mm_shuffle_pi8 (__m64 a, __m64 b)
 
FORCE_INLINE __m128i _mm_sign_epi16 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m128i _mm_sign_epi32 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m128i _mm_sign_epi8 (__m128i _a, __m128i _b)
 
FORCE_INLINE __m64 _mm_sign_pi16 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m64 _mm_sign_pi32 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m64 _mm_sign_pi8 (__m64 _a, __m64 _b)
 
FORCE_INLINE __m128 _mm_blend_ps (__m128 _a, __m128 _b, const char imm8)
 
FORCE_INLINE __m128i _mm_blendv_epi8 (__m128i _a, __m128i _b, __m128i _mask)
 
FORCE_INLINE __m128d _mm_blendv_pd (__m128d _a, __m128d _b, __m128d _mask)
 
FORCE_INLINE __m128 _mm_blendv_ps (__m128 _a, __m128 _b, __m128 _mask)
 
FORCE_INLINE __m128d _mm_ceil_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128 _mm_ceil_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128i _mm_cmpeq_epi64 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_cvtepi16_epi32 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepi16_epi64 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepi32_epi64 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepi8_epi16 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepi8_epi32 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepi8_epi64 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepu16_epi32 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepu16_epi64 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepu32_epi64 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepu8_epi16 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepu8_epi32 (__m128i a)
 
FORCE_INLINE __m128i _mm_cvtepu8_epi64 (__m128i a)
 
FORCE_INLINE __m128d _mm_dp_pd (__m128d a, __m128d b, const int imm)
 
FORCE_INLINE __m128 _mm_dp_ps (__m128 a, __m128 b, const int imm)
 
FORCE_INLINE __m128d _mm_floor_sd (__m128d a, __m128d b)
 
FORCE_INLINE __m128 _mm_floor_ss (__m128 a, __m128 b)
 
FORCE_INLINE __m128i _mm_max_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_max_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_max_epu16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_max_epu32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_min_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_min_epi8 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_min_epu16 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_min_epu32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_minpos_epu16 (__m128i a)
 
FORCE_INLINE __m128i _mm_mpsadbw_epu8 (__m128i a, __m128i b, const int imm)
 
FORCE_INLINE __m128i _mm_mul_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_mullo_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128i _mm_packus_epi32 (__m128i a, __m128i b)
 
FORCE_INLINE __m128d _mm_round_sd (__m128d a, __m128d b, int rounding)
 
FORCE_INLINE __m128 _mm_round_ss (__m128 a, __m128 b, int rounding)
 
FORCE_INLINE __m128i _mm_stream_load_si128 (__m128i *p)
 
FORCE_INLINE int _mm_test_all_ones (__m128i a)
 
FORCE_INLINE int _mm_test_all_zeros (__m128i a, __m128i mask)
 
FORCE_INLINE int _mm_test_mix_ones_zeros (__m128i a, __m128i mask)
 
FORCE_INLINE int _mm_testc_si128 (__m128i a, __m128i b)
 
FORCE_INLINE int _mm_testz_si128 (__m128i a, __m128i b)
 
FORCE_INLINE int _sse2neon_sido_negative (int res, int lb, int imm8, int bound)
 
FORCE_INLINE int _sse2neon_clz (unsigned int x)
 
FORCE_INLINE int _sse2neon_ctz (unsigned int x)
 
FORCE_INLINE int _sse2neon_ctzll (unsigned long long x)
 
FORCE_INLINE int _mm_cmpestra (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE int _mm_cmpestrc (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE int _mm_cmpestri (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE __m128i _mm_cmpestrm (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE int _mm_cmpestro (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE int _mm_cmpestrs (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE int _mm_cmpestrz (__m128i a, int la, __m128i b, int lb, const int imm8)
 
FORCE_INLINE int _mm_cmpistra (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE int _mm_cmpistrc (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE int _mm_cmpistri (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE __m128i _mm_cmpistrm (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE int _mm_cmpistro (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE int _mm_cmpistrs (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE int _mm_cmpistrz (__m128i a, __m128i b, const int imm8)
 
FORCE_INLINE __m128i _mm_cmpgt_epi64 (__m128i a, __m128i b)
 
FORCE_INLINE uint32_t _mm_crc32_u16 (uint32_t crc, uint16_t v)
 
FORCE_INLINE uint32_t _mm_crc32_u32 (uint32_t crc, uint32_t v)
 
FORCE_INLINE uint64_t _mm_crc32_u64 (uint64_t crc, uint64_t v)
 
FORCE_INLINE __m128i _mm_aesenc_si128 (__m128i a, __m128i RoundKey)
 
FORCE_INLINE __m128i _mm_aesdec_si128 (__m128i a, __m128i RoundKey)
 
FORCE_INLINE __m128i _mm_aesenclast_si128 (__m128i a, __m128i RoundKey)
 
FORCE_INLINE __m128i _mm_aesdeclast_si128 (__m128i a, __m128i RoundKey)
 
FORCE_INLINE __m128i _mm_aesimc_si128 (__m128i a)
 
FORCE_INLINE __m128i _mm_aeskeygenassist_si128 (__m128i a, const int rcon)
 
FORCE_INLINE __m128i _mm_clmulepi64_si128 (__m128i _a, __m128i _b, const int imm)
 
FORCE_INLINE unsigned int _sse2neon_mm_get_denormals_zero_mode ()
 
FORCE_INLINE int _mm_popcnt_u32 (unsigned int a)
 
FORCE_INLINE int64_t _mm_popcnt_u64 (uint64_t a)
 
FORCE_INLINE void _sse2neon_mm_set_denormals_zero_mode (unsigned int flag)
 
FORCE_INLINE uint64_t _rdtsc (void)
 

变量

 SIMDVec
 

宏定义说明

◆ _ [1/2]

#define _ (   name,
  func_suffix 
)    name,

在文件 sse2neon.h 第 9001 行定义.

◆ _ [2/2]

#define _ (   name,
  func_suffix 
)    _sse2neon_##func_suffix,

在文件 sse2neon.h 第 9001 行定义.

◆ __constrange

#define __constrange (   a,
  b 
)    const

在文件 sse2neon.h 第 298 行定义.

◆ __has_builtin

#define __has_builtin (   x)    0

在文件 sse2neon.h 第 235 行定义.

◆ __int64

#define __int64   int64_t

在文件 sse2neon.h 第 324 行定义.

◆ _m_maskmovq

#define _m_maskmovq (   a,
  mask,
  mem_addr 
)    _mm_maskmove_si64(a, mask, mem_addr)

在文件 sse2neon.h 第 2099 行定义.

◆ _m_pavgb

#define _m_pavgb (   a,
  b 
)    _mm_avg_pu8(a, b)

在文件 sse2neon.h 第 2346 行定义.

◆ _m_pavgw

#define _m_pavgw (   a,
  b 
)    _mm_avg_pu16(a, b)

在文件 sse2neon.h 第 2357 行定义.

◆ _m_pextrw

#define _m_pextrw (   a,
  imm 
)    _mm_extract_pi16(a, imm)

在文件 sse2neon.h 第 2362 行定义.

◆ _m_pinsrw

#define _m_pinsrw (   a,
  i,
  imm 
)    _mm_insert_pi16(a, i, imm)

在文件 sse2neon.h 第 2367 行定义.

◆ _m_pmaxsw

#define _m_pmaxsw (   a,
  b 
)    _mm_max_pi16(a, b)

在文件 sse2neon.h 第 2372 行定义.

◆ _m_pmaxub

#define _m_pmaxub (   a,
  b 
)    _mm_max_pu8(a, b)

在文件 sse2neon.h 第 2377 行定义.

◆ _m_pminsw

#define _m_pminsw (   a,
  b 
)    _mm_min_pi16(a, b)

在文件 sse2neon.h 第 2382 行定义.

◆ _m_pminub

#define _m_pminub (   a,
  b 
)    _mm_min_pu8(a, b)

在文件 sse2neon.h 第 2387 行定义.

◆ _m_pmovmskb

#define _m_pmovmskb (   a)    _mm_movemask_pi8(a)

在文件 sse2neon.h 第 2392 行定义.

◆ _m_pmulhuw

#define _m_pmulhuw (   a,
  b 
)    _mm_mulhi_pu16(a, b)

在文件 sse2neon.h 第 2398 行定义.

◆ _m_psadbw

#define _m_psadbw (   a,
  b 
)    _mm_sad_pu8(a, b)

在文件 sse2neon.h 第 2426 行定义.

◆ _m_pshufw

#define _m_pshufw (   a,
  imm 
)    _mm_shuffle_pi16(a, imm)

在文件 sse2neon.h 第 2431 行定义.

◆ _mm_alignr_epi8

#define _mm_alignr_epi8 (   a,
  b,
  imm 
)
值:
__extension__({ \
uint8x16_t _a = vreinterpretq_u8_m128i(a); \
uint8x16_t _b = vreinterpretq_u8_m128i(b); \
__m128i ret; \
if (_sse2neon_unlikely((imm) & ~31)) \
ret = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \
else if (imm >= 16) \
ret = _mm_srli_si128(a, imm >= 16 ? imm - 16 : 0); \
else \
ret = \
vreinterpretq_m128i_u8(vextq_u8(_b, _a, imm < 16 ? imm : 0)); \
ret; \
})
#define vreinterpretq_u8_m128i(x)
Definition sse2neon.h:376
#define _sse2neon_unlikely(x)
Definition sse2neon.h:92
#define vreinterpretq_m128i_u8(x)
Definition sse2neon.h:363
int64x2_t __m128i
Definition sse2neon.h:316
#define _mm_srli_si128(a, imm)
Definition sse2neon.h:6055

在文件 sse2neon.h 第 6912 行定义.

6913 { \
6914 uint8x16_t _a = vreinterpretq_u8_m128i(a); \
6915 uint8x16_t _b = vreinterpretq_u8_m128i(b); \
6916 __m128i ret; \
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); \
6921 else \
6922 ret = \
6923 vreinterpretq_m128i_u8(vextq_u8(_b, _a, imm < 16 ? imm : 0)); \
6924 ret; \
6925 })

◆ _mm_alignr_pi8

#define _mm_alignr_pi8 (   a,
  b,
  imm 
)
值:
__extension__({ \
__m64 ret; \
if (_sse2neon_unlikely((imm) >= 16)) { \
ret = vreinterpret_m64_s8(vdup_n_s8(0)); \
} else { \
uint8x8_t tmp_low, tmp_high; \
if ((imm) >= 8) { \
const int idx = (imm) -8; \
tmp_low = vreinterpret_u8_m64(a); \
tmp_high = vdup_n_u8(0); \
ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \
} else { \
const int idx = (imm); \
tmp_low = vreinterpret_u8_m64(b); \
tmp_high = vreinterpret_u8_m64(a); \
ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \
} \
} \
ret; \
})
#define vreinterpret_m64_s8(x)
Definition sse2neon.h:381
#define vreinterpret_m64_u8(x)
Definition sse2neon.h:386
int64x1_t __m64
Definition sse2neon.h:306
#define vreinterpret_u8_m64(x)
Definition sse2neon.h:395

在文件 sse2neon.h 第 6934 行定义.

6935 { \
6936 __m64 ret; \
6937 if (_sse2neon_unlikely((imm) >= 16)) { \
6938 ret = vreinterpret_m64_s8(vdup_n_s8(0)); \
6939 } else { \
6940 uint8x8_t tmp_low, tmp_high; \
6941 if ((imm) >= 8) { \
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)); \
6946 } else { \
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)); \
6951 } \
6952 } \
6953 ret; \
6954 })

◆ _mm_blend_epi16

#define _mm_blend_epi16 (   a,
  b,
  imm 
)
值:
__extension__({ \
const uint16_t _mask[8] = {((imm) & (1 << 0)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 1)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 2)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 3)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 4)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 5)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 6)) ? (uint16_t) -1 : 0x0, \
((imm) & (1 << 7)) ? (uint16_t) -1 : 0x0}; \
uint16x8_t _mask_vec = vld1q_u16(_mask); \
uint16x8_t _a = vreinterpretq_u16_m128i(a); \
uint16x8_t _b = vreinterpretq_u16_m128i(b); \
vreinterpretq_m128i_u16(vbslq_u16(_mask_vec, _b, _a)); \
})
#define vreinterpretq_u16_m128i(x)
Definition sse2neon.h:377

在文件 sse2neon.h 第 7550 行定义.

7551 { \
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)); \
7564 })

◆ _mm_blend_pd

#define _mm_blend_pd (   a,
  b,
  imm 
)
值:
__extension__({ \
const uint64_t _mask[2] = { \
((imm) & (1 << 0)) ? ~UINT64_C(0) : UINT64_C(0), \
((imm) & (1 << 1)) ? ~UINT64_C(0) : UINT64_C(0)}; \
uint64x2_t _mask_vec = vld1q_u64(_mask); \
uint64x2_t _a = vreinterpretq_u64_m128d(a); \
uint64x2_t _b = vreinterpretq_u64_m128d(b); \
vreinterpretq_m128d_u64(vbslq_u64(_mask_vec, _b, _a)); \
})
#define vreinterpretq_u64_m128d(x)
Definition sse2neon.h:435

在文件 sse2neon.h 第 7569 行定义.

7570 { \
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)); \
7578 })

◆ _mm_bslli_si128

#define _mm_bslli_si128 (   a,
  imm 
)    _mm_slli_si128(a, imm)

在文件 sse2neon.h 第 3325 行定义.

◆ _mm_bsrli_si128

#define _mm_bsrli_si128 (   a,
  imm 
)    _mm_srli_si128(a, imm)

在文件 sse2neon.h 第 3330 行定义.

◆ _mm_cvtps_pi32

#define _mm_cvtps_pi32 (   a)    _mm_cvt_ps2pi(a)

在文件 sse2neon.h 第 1666 行定义.

◆ _mm_cvtsd_si64x

#define _mm_cvtsd_si64x   _mm_cvtsd_si64

在文件 sse2neon.h 第 4317 行定义.

◆ _mm_cvtsi128_si64x [1/2]

#define _mm_cvtsi128_si64x (   a)    _mm_cvtsi128_si64(a)

在文件 sse2neon.h 第 4358 行定义.

◆ _mm_cvtsi128_si64x [2/2]

#define _mm_cvtsi128_si64x (   a)    _mm_cvtsi128_si64(a)

在文件 sse2neon.h 第 4358 行定义.

◆ _mm_cvtsi32_ss

#define _mm_cvtsi32_ss (   a,
  b 
)    _mm_cvt_si2ss(a, b)

在文件 sse2neon.h 第 1731 行定义.

◆ _mm_cvtsi64x_sd

#define _mm_cvtsi64x_sd (   a,
  b 
)    _mm_cvtsi64_sd(a, b)

在文件 sse2neon.h 第 4432 行定义.

◆ _mm_cvtsi64x_si128

#define _mm_cvtsi64x_si128 (   a)    _mm_cvtsi64_si128(a)

在文件 sse2neon.h 第 4426 行定义.

◆ _mm_cvtss_si32

#define _mm_cvtss_si32 (   a)    _mm_cvt_ss2si(a)

在文件 sse2neon.h 第 1763 行定义.

◆ _mm_cvttps_pi32

#define _mm_cvttps_pi32 (   a)    _mm_cvtt_ps2pi(a)

在文件 sse2neon.h 第 1817 行定义.

◆ _mm_cvttsd_si64x

#define _mm_cvttsd_si64x (   a)    _mm_cvttsd_si64(a)

在文件 sse2neon.h 第 4518 行定义.

◆ _mm_cvttss_si32

#define _mm_cvttss_si32 (   a)    _mm_cvtt_ss2si(a)

在文件 sse2neon.h 第 1825 行定义.

◆ _MM_DENORMALS_ZERO_MASK

#define _MM_DENORMALS_ZERO_MASK   0x0040

在文件 sse2neon.h 第 293 行定义.

◆ _MM_DENORMALS_ZERO_OFF

#define _MM_DENORMALS_ZERO_OFF   0x0000

在文件 sse2neon.h 第 295 行定义.

◆ _MM_DENORMALS_ZERO_ON

#define _MM_DENORMALS_ZERO_ON   0x0040

在文件 sse2neon.h 第 294 行定义.

◆ _mm_extract_epi16

#define _mm_extract_epi16 (   a,
  imm 
)     vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm))

在文件 sse2neon.h 第 4565 行定义.

◆ _mm_extract_epi32

#define _mm_extract_epi32 (   a,
  imm 
)     vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm))

在文件 sse2neon.h 第 7924 行定义.

◆ _mm_extract_epi64

#define _mm_extract_epi64 (   a,
  imm 
)     vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm))

在文件 sse2neon.h 第 7930 行定义.

◆ _mm_extract_epi8

#define _mm_extract_epi8 (   a,
  imm 
)    vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm))

在文件 sse2neon.h 第 7937 行定义.

◆ _mm_extract_pi16

#define _mm_extract_pi16 (   a,
  imm 
)     (int32_t) vget_lane_u16(vreinterpret_u16_m64(a), (imm))

在文件 sse2neon.h 第 1875 行定义.

◆ _mm_extract_ps

#define _mm_extract_ps (   a,
  imm 
)    vgetq_lane_s32(vreinterpretq_s32_m128(a), (imm))

在文件 sse2neon.h 第 7941 行定义.

◆ _MM_FLUSH_ZERO_MASK

#define _MM_FLUSH_ZERO_MASK   0x8000

在文件 sse2neon.h 第 289 行定义.

◆ _MM_FLUSH_ZERO_OFF

#define _MM_FLUSH_ZERO_OFF   0x0000

在文件 sse2neon.h 第 291 行定义.

◆ _MM_FLUSH_ZERO_ON

#define _MM_FLUSH_ZERO_ON   0x8000

在文件 sse2neon.h 第 290 行定义.

◆ _MM_FROUND_CEIL

#define _MM_FROUND_CEIL   (_MM_FROUND_TO_POS_INF | _MM_FROUND_RAISE_EXC)

在文件 sse2neon.h 第 280 行定义.

◆ _MM_FROUND_CUR_DIRECTION

#define _MM_FROUND_CUR_DIRECTION   0x04

在文件 sse2neon.h 第 275 行定义.

◆ _MM_FROUND_FLOOR

#define _MM_FROUND_FLOOR   (_MM_FROUND_TO_NEG_INF | _MM_FROUND_RAISE_EXC)

在文件 sse2neon.h 第 279 行定义.

◆ _MM_FROUND_NEARBYINT

#define _MM_FROUND_NEARBYINT   (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_NO_EXC)

在文件 sse2neon.h 第 283 行定义.

◆ _MM_FROUND_NINT

#define _MM_FROUND_NINT   (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_RAISE_EXC)

在文件 sse2neon.h 第 278 行定义.

◆ _MM_FROUND_NO_EXC

#define _MM_FROUND_NO_EXC   0x08

在文件 sse2neon.h 第 276 行定义.

◆ _MM_FROUND_RAISE_EXC

#define _MM_FROUND_RAISE_EXC   0x00

在文件 sse2neon.h 第 277 行定义.

◆ _MM_FROUND_RINT

#define _MM_FROUND_RINT   (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_RAISE_EXC)

在文件 sse2neon.h 第 282 行定义.

◆ _MM_FROUND_TO_NEAREST_INT

#define _MM_FROUND_TO_NEAREST_INT   0x00

在文件 sse2neon.h 第 271 行定义.

◆ _MM_FROUND_TO_NEG_INF

#define _MM_FROUND_TO_NEG_INF   0x01

在文件 sse2neon.h 第 272 行定义.

◆ _MM_FROUND_TO_POS_INF

#define _MM_FROUND_TO_POS_INF   0x02

在文件 sse2neon.h 第 273 行定义.

◆ _MM_FROUND_TO_ZERO

#define _MM_FROUND_TO_ZERO   0x03

在文件 sse2neon.h 第 274 行定义.

◆ _MM_FROUND_TRUNC

#define _MM_FROUND_TRUNC   (_MM_FROUND_TO_ZERO | _MM_FROUND_RAISE_EXC)

在文件 sse2neon.h 第 281 行定义.

◆ _MM_GET_DENORMALS_ZERO_MODE

#define _MM_GET_DENORMALS_ZERO_MODE   _sse2neon_mm_get_denormals_zero_mode

在文件 sse2neon.h 第 483 行定义.

◆ _MM_GET_FLUSH_ZERO_MODE

#define _MM_GET_FLUSH_ZERO_MODE   _sse2neon_mm_get_flush_zero_mode

在文件 sse2neon.h 第 481 行定义.

◆ _mm_insert_epi16

#define _mm_insert_epi16 (   a,
  b,
  imm 
)
值:
__extension__({ \
vreinterpretq_m128i_s16( \
vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))); \
})
#define vreinterpretq_s16_m128i(x)
Definition sse2neon.h:372

在文件 sse2neon.h 第 4573 行定义.

4574 { \
4575 vreinterpretq_m128i_s16( \
4576 vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))); \
4577 })

◆ _mm_insert_epi32

#define _mm_insert_epi32 (   a,
  b,
  imm 
)
值:
__extension__({ \
vreinterpretq_m128i_s32( \
vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))); \
})
#define vreinterpretq_s32_m128i(x)
Definition sse2neon.h:373

在文件 sse2neon.h 第 7999 行定义.

8000 { \
8001 vreinterpretq_m128i_s32( \
8002 vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))); \
8003 })

◆ _mm_insert_epi64

#define _mm_insert_epi64 (   a,
  b,
  imm 
)
值:
__extension__({ \
vreinterpretq_m128i_s64( \
vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))); \
})
#define vreinterpretq_s64_m128i(x)
Definition sse2neon.h:374

在文件 sse2neon.h 第 8009 行定义.

8010 { \
8011 vreinterpretq_m128i_s64( \
8012 vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))); \
8013 })

◆ _mm_insert_epi8

#define _mm_insert_epi8 (   a,
  b,
  imm 
)
值:
__extension__({ \
vreinterpretq_m128i_s8( \
vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))); \
})
#define vreinterpretq_s8_m128i(x)
Definition sse2neon.h:371

在文件 sse2neon.h 第 8019 行定义.

8020 { \
8021 vreinterpretq_m128i_s8( \
8022 vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))); \
8023 })

◆ _mm_insert_pi16

#define _mm_insert_pi16 (   a,
  b,
  imm 
)
值:
__extension__({ \
vreinterpret_m64_s16( \
vset_lane_s16((b), vreinterpret_s16_m64(a), (imm))); \
})
#define vreinterpret_s16_m64(x)
Definition sse2neon.h:401

在文件 sse2neon.h 第 1942 行定义.

1943 { \
1944 vreinterpret_m64_s16( \
1945 vset_lane_s16((b), vreinterpret_s16_m64(a), (imm))); \
1946 })

◆ _mm_insert_ps

#define _mm_insert_ps (   a,
  b,
  imm8 
)
值:
__extension__({ \
float32x4_t tmp1 = \
vsetq_lane_f32(vgetq_lane_f32(b, (imm8 >> 6) & 0x3), \
float32x4_t tmp2 = \
vsetq_lane_f32(vgetq_lane_f32(tmp1, 0), vreinterpretq_f32_m128(a), \
((imm8 >> 4) & 0x3)); \
const uint32_t data[4] = {((imm8) & (1 << 0)) ? UINT32_MAX : 0, \
((imm8) & (1 << 1)) ? UINT32_MAX : 0, \
((imm8) & (1 << 2)) ? UINT32_MAX : 0, \
((imm8) & (1 << 3)) ? UINT32_MAX : 0}; \
uint32x4_t mask = vld1q_u32(data); \
float32x4_t all_zeros = vdupq_n_f32(0); \
\
vreinterpretq_m128_f32( \
vbslq_f32(mask, all_zeros, vreinterpretq_f32_m128(tmp2))); \
})
#define vreinterpretq_f32_m128(x)
Definition sse2neon.h:345

在文件 sse2neon.h 第 8029 行定义.

8030 { \
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); \
8043 \
8044 vreinterpretq_m128_f32( \
8045 vbslq_f32(mask, all_zeros, vreinterpretq_f32_m128(tmp2))); \
8046 })

◆ _mm_lddqu_si128

#define _mm_lddqu_si128   _mm_loadu_si128

在文件 sse2neon.h 第 6756 行定义.

◆ _mm_load_pd1

#define _mm_load_pd1   _mm_load1_pd

在文件 sse2neon.h 第 4603 行定义.

◆ _mm_load_ps1

#define _mm_load_ps1   _mm_load1_ps

在文件 sse2neon.h 第 1964 行定义.

◆ _mm_loaddup_pd

#define _mm_loaddup_pd   _mm_load1_pd

在文件 sse2neon.h 第 6765 行定义.

◆ _MM_ROUND_DOWN

#define _MM_ROUND_DOWN   0x2000

在文件 sse2neon.h 第 285 行定义.

◆ _MM_ROUND_NEAREST

#define _MM_ROUND_NEAREST   0x0000

在文件 sse2neon.h 第 284 行定义.

◆ _MM_ROUND_TOWARD_ZERO

#define _MM_ROUND_TOWARD_ZERO   0x6000

在文件 sse2neon.h 第 287 行定义.

◆ _MM_ROUND_UP

#define _MM_ROUND_UP   0x4000

在文件 sse2neon.h 第 286 行定义.

◆ _MM_SET_DENORMALS_ZERO_MODE

#define _MM_SET_DENORMALS_ZERO_MODE   _sse2neon_mm_set_denormals_zero_mode

在文件 sse2neon.h 第 484 行定义.

◆ _MM_SET_FLUSH_ZERO_MODE

#define _MM_SET_FLUSH_ZERO_MODE   _sse2neon_mm_set_flush_zero_mode

在文件 sse2neon.h 第 482 行定义.

◆ _mm_set_pd1

#define _mm_set_pd1   _mm_set1_pd

在文件 sse2neon.h 第 5343 行定义.

◆ _MM_SHUFFLE

#define _MM_SHUFFLE (   fp3,
  fp2,
  fp1,
  fp0 
)     (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0)))

MACRO for shuffle parameter for _mm_shuffle_ps().

Argument fp3 is a digit[0123] that represents the fp from argument "b" of mm_shuffle_ps that will be placed in fp3 of result. fp2 is the same for fp2 in result. fp1 is a digit[0123] that represents the fp from argument "a" of mm_shuffle_ps that will be places in fp1 of result. fp0 is the same for fp0 of result.

在文件 sse2neon.h 第 247 行定义.

◆ _mm_shuffle_epi32

#define _mm_shuffle_epi32 (   a,
  imm 
)

在文件 sse2neon.h 第 5524 行定义.

5525 { \
5526 __m128i ret; \
5527 switch (imm) { \
5528 case _MM_SHUFFLE(1, 0, 3, 2): \
5529 ret = _mm_shuffle_epi_1032((a)); \
5530 break; \
5531 case _MM_SHUFFLE(2, 3, 0, 1): \
5532 ret = _mm_shuffle_epi_2301((a)); \
5533 break; \
5534 case _MM_SHUFFLE(0, 3, 2, 1): \
5535 ret = _mm_shuffle_epi_0321((a)); \
5536 break; \
5537 case _MM_SHUFFLE(2, 1, 0, 3): \
5538 ret = _mm_shuffle_epi_2103((a)); \
5539 break; \
5540 case _MM_SHUFFLE(1, 0, 1, 0): \
5541 ret = _mm_shuffle_epi_1010((a)); \
5542 break; \
5543 case _MM_SHUFFLE(1, 0, 0, 1): \
5544 ret = _mm_shuffle_epi_1001((a)); \
5545 break; \
5546 case _MM_SHUFFLE(0, 1, 0, 1): \
5547 ret = _mm_shuffle_epi_0101((a)); \
5548 break; \
5549 case _MM_SHUFFLE(2, 2, 1, 1): \
5550 ret = _mm_shuffle_epi_2211((a)); \
5551 break; \
5552 case _MM_SHUFFLE(0, 1, 2, 2): \
5553 ret = _mm_shuffle_epi_0122((a)); \
5554 break; \
5555 case _MM_SHUFFLE(3, 3, 3, 2): \
5556 ret = _mm_shuffle_epi_3332((a)); \
5557 break; \
5558 case _MM_SHUFFLE(0, 0, 0, 0): \
5559 ret = _mm_shuffle_epi32_splat((a), 0); \
5560 break; \
5561 case _MM_SHUFFLE(1, 1, 1, 1): \
5562 ret = _mm_shuffle_epi32_splat((a), 1); \
5563 break; \
5564 case _MM_SHUFFLE(2, 2, 2, 2): \
5565 ret = _mm_shuffle_epi32_splat((a), 2); \
5566 break; \
5567 case _MM_SHUFFLE(3, 3, 3, 3): \
5568 ret = _mm_shuffle_epi32_splat((a), 3); \
5569 break; \
5570 default: \
5571 ret = _mm_shuffle_epi32_default((a), (imm)); \
5572 break; \
5573 } \
5574 ret; \
5575 })
FORCE_INLINE __m128i _mm_shuffle_epi_2301(__m128i a)
Definition sse2neon.h:986
FORCE_INLINE __m128i _mm_shuffle_epi_0321(__m128i a)
Definition sse2neon.h:995
FORCE_INLINE __m128i _mm_shuffle_epi_1032(__m128i a)
Definition sse2neon.h:976
FORCE_INLINE __m128i _mm_shuffle_epi_0122(__m128i a)
Definition sse2neon.h:1042
FORCE_INLINE __m128i _mm_shuffle_epi_1010(__m128i a)
Definition sse2neon.h:1011
FORCE_INLINE __m128i _mm_shuffle_epi_3332(__m128i a)
Definition sse2neon.h:1049
#define _mm_shuffle_epi32_splat(a, imm)
Definition sse2neon.h:1065
FORCE_INLINE __m128i _mm_shuffle_epi_0101(__m128i a)
Definition sse2neon.h:1029
FORCE_INLINE __m128i _mm_shuffle_epi_2103(__m128i a)
Definition sse2neon.h:1003
FORCE_INLINE __m128i _mm_shuffle_epi_1001(__m128i a)
Definition sse2neon.h:1019
#define _MM_SHUFFLE(fp3, fp2, fp1, fp0)
MACRO for shuffle parameter for _mm_shuffle_ps().
Definition sse2neon.h:247
FORCE_INLINE __m128i _mm_shuffle_epi_2211(__m128i a)
Definition sse2neon.h:1035
#define _mm_shuffle_epi32_default(a, imm)
Definition sse2neon.h:957

◆ _mm_shuffle_epi32_default

#define _mm_shuffle_epi32_default (   a,
  imm 
)
值:
__extension__({ \
int32x4_t ret; \
ret = vmovq_n_s32( \
vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm) & (0x3))); \
ret = vsetq_lane_s32( \
vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 2) & 0x3), \
ret, 1); \
ret = vsetq_lane_s32( \
vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \
ret, 2); \
ret = vsetq_lane_s32( \
vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \
ret, 3); \
vreinterpretq_m128i_s32(ret); \
})

在文件 sse2neon.h 第 957 行定义.

958 { \
959 int32x4_t ret; \
960 ret = vmovq_n_s32( \
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), \
964 ret, 1); \
965 ret = vsetq_lane_s32( \
966 vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \
967 ret, 2); \
968 ret = vsetq_lane_s32( \
969 vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \
970 ret, 3); \
971 vreinterpretq_m128i_s32(ret); \
972 })

◆ _mm_shuffle_epi32_splat

#define _mm_shuffle_epi32_splat (   a,
  imm 
)
值:
__extension__({ \
vreinterpretq_m128i_s32( \
vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))); \
})

在文件 sse2neon.h 第 1065 行定义.

1066 { \
1067 vreinterpretq_m128i_s32( \
1068 vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))); \
1069 })

◆ _mm_shuffle_pd

#define _mm_shuffle_pd (   a,
  b,
  imm8 
)
值:
vgetq_lane_s64(vreinterpretq_s64_m128d(b), (imm8 & 0x2) >> 1), \
vgetq_lane_s64(vreinterpretq_s64_m128d(a), imm8 & 0x1)))
#define vreinterpretq_s64_m128d(x)
Definition sse2neon.h:432
FORCE_INLINE __m128d _mm_castsi128_pd(__m128i a)
Definition sse2neon.h:3367
FORCE_INLINE __m128i _mm_set_epi64x(int64_t, int64_t)
Definition sse2neon.h:5294

在文件 sse2neon.h 第 5591 行定义.

◆ _mm_shuffle_pi16

#define _mm_shuffle_pi16 (   a,
  imm 
)
值:
__extension__({ \
int16x4_t ret; \
ret = \
vmov_n_s16(vget_lane_s16(vreinterpret_s16_m64(a), (imm) & (0x3))); \
ret = vset_lane_s16( \
vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 2) & 0x3), ret, \
1); \
ret = vset_lane_s16( \
vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 4) & 0x3), ret, \
2); \
ret = vset_lane_s16( \
vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 6) & 0x3), ret, \
3); \
vreinterpret_m64_s16(ret); \
})

在文件 sse2neon.h 第 2653 行定义.

2654 { \
2655 int16x4_t ret; \
2656 ret = \
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, \
2660 1); \
2661 ret = vset_lane_s16( \
2662 vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 4) & 0x3), ret, \
2663 2); \
2664 ret = vset_lane_s16( \
2665 vget_lane_s16(vreinterpret_s16_m64(a), ((imm) >> 6) & 0x3), ret, \
2666 3); \
2667 vreinterpret_m64_s16(ret); \
2668 })

◆ _mm_shuffle_ps

#define _mm_shuffle_ps (   a,
  b,
  imm 
)

在文件 sse2neon.h 第 2715 行定义.

2716 { \
2717 __m128 ret; \
2718 switch (imm) { \
2719 case _MM_SHUFFLE(1, 0, 3, 2): \
2720 ret = _mm_shuffle_ps_1032((a), (b)); \
2721 break; \
2722 case _MM_SHUFFLE(2, 3, 0, 1): \
2723 ret = _mm_shuffle_ps_2301((a), (b)); \
2724 break; \
2725 case _MM_SHUFFLE(0, 3, 2, 1): \
2726 ret = _mm_shuffle_ps_0321((a), (b)); \
2727 break; \
2728 case _MM_SHUFFLE(2, 1, 0, 3): \
2729 ret = _mm_shuffle_ps_2103((a), (b)); \
2730 break; \
2731 case _MM_SHUFFLE(1, 0, 1, 0): \
2732 ret = _mm_movelh_ps((a), (b)); \
2733 break; \
2734 case _MM_SHUFFLE(1, 0, 0, 1): \
2735 ret = _mm_shuffle_ps_1001((a), (b)); \
2736 break; \
2737 case _MM_SHUFFLE(0, 1, 0, 1): \
2738 ret = _mm_shuffle_ps_0101((a), (b)); \
2739 break; \
2740 case _MM_SHUFFLE(3, 2, 1, 0): \
2741 ret = _mm_shuffle_ps_3210((a), (b)); \
2742 break; \
2743 case _MM_SHUFFLE(0, 0, 1, 1): \
2744 ret = _mm_shuffle_ps_0011((a), (b)); \
2745 break; \
2746 case _MM_SHUFFLE(0, 0, 2, 2): \
2747 ret = _mm_shuffle_ps_0022((a), (b)); \
2748 break; \
2749 case _MM_SHUFFLE(2, 2, 0, 0): \
2750 ret = _mm_shuffle_ps_2200((a), (b)); \
2751 break; \
2752 case _MM_SHUFFLE(3, 2, 0, 2): \
2753 ret = _mm_shuffle_ps_3202((a), (b)); \
2754 break; \
2755 case _MM_SHUFFLE(3, 2, 3, 2): \
2756 ret = _mm_movehl_ps((b), (a)); \
2757 break; \
2758 case _MM_SHUFFLE(1, 1, 3, 3): \
2759 ret = _mm_shuffle_ps_1133((a), (b)); \
2760 break; \
2761 case _MM_SHUFFLE(2, 0, 1, 0): \
2762 ret = _mm_shuffle_ps_2010((a), (b)); \
2763 break; \
2764 case _MM_SHUFFLE(2, 0, 0, 1): \
2765 ret = _mm_shuffle_ps_2001((a), (b)); \
2766 break; \
2767 case _MM_SHUFFLE(2, 0, 3, 2): \
2768 ret = _mm_shuffle_ps_2032((a), (b)); \
2769 break; \
2770 default: \
2771 ret = _mm_shuffle_ps_default((a), (b), (imm)); \
2772 break; \
2773 } \
2774 ret; \
2775 })
float32x4_t __m128
Definition sse2neon.h:307
FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b)
Definition sse2neon.h:690
FORCE_INLINE __m128 _mm_movehl_ps(__m128 __A, __m128 __B)
Definition sse2neon.h:2226
FORCE_INLINE __m128 _mm_shuffle_ps_0321(__m128 a, __m128 b)
Definition sse2neon.h:707
FORCE_INLINE __m128 _mm_shuffle_ps_2301(__m128 a, __m128 b)
Definition sse2neon.h:700
FORCE_INLINE __m128 _mm_shuffle_ps_1001(__m128 a, __m128 b)
Definition sse2neon.h:732
FORCE_INLINE __m128 _mm_shuffle_ps_3210(__m128 a, __m128 b)
Definition sse2neon.h:748
FORCE_INLINE __m128 _mm_shuffle_ps_2010(__m128 a, __m128 b)
Definition sse2neon.h:796
FORCE_INLINE __m128 _mm_shuffle_ps_0011(__m128 a, __m128 b)
Definition sse2neon.h:755
FORCE_INLINE __m128 _mm_shuffle_ps_0022(__m128 a, __m128 b)
Definition sse2neon.h:762
FORCE_INLINE __m128 _mm_movelh_ps(__m128 __A, __m128 __B)
Definition sse2neon.h:2239
FORCE_INLINE __m128 _mm_shuffle_ps_3202(__m128 a, __m128 b)
Definition sse2neon.h:778
FORCE_INLINE __m128 _mm_shuffle_ps_0101(__m128 a, __m128 b)
Definition sse2neon.h:739
#define _mm_shuffle_ps_default(a, b, imm)
Definition sse2neon.h:1086
FORCE_INLINE __m128 _mm_shuffle_ps_2103(__m128 a, __m128 b)
Definition sse2neon.h:716
FORCE_INLINE __m128 _mm_shuffle_ps_2032(__m128 a, __m128 b)
Definition sse2neon.h:814
FORCE_INLINE __m128 _mm_shuffle_ps_2001(__m128 a, __m128 b)
Definition sse2neon.h:805
FORCE_INLINE __m128 _mm_shuffle_ps_2200(__m128 a, __m128 b)
Definition sse2neon.h:770
FORCE_INLINE __m128 _mm_shuffle_ps_1133(__m128 a, __m128 b)
Definition sse2neon.h:788

◆ _mm_shuffle_ps_default

#define _mm_shuffle_ps_default (   a,
  b,
  imm 
)
值:
__extension__({ \
float32x4_t ret; \
ret = vmovq_n_f32( \
vgetq_lane_f32(vreinterpretq_f32_m128(a), (imm) & (0x3))); \
ret = vsetq_lane_f32( \
vgetq_lane_f32(vreinterpretq_f32_m128(a), ((imm) >> 2) & 0x3), \
ret, 1); \
ret = vsetq_lane_f32( \
vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \
ret, 2); \
ret = vsetq_lane_f32( \
vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \
ret, 3); \
vreinterpretq_m128_f32(ret); \
})

在文件 sse2neon.h 第 1086 行定义.

1087 { \
1088 float32x4_t ret; \
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), \
1093 ret, 1); \
1094 ret = vsetq_lane_f32( \
1095 vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \
1096 ret, 2); \
1097 ret = vsetq_lane_f32( \
1098 vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \
1099 ret, 3); \
1100 vreinterpretq_m128_f32(ret); \
1101 })

◆ _mm_shufflehi_epi16

#define _mm_shufflehi_epi16 (   a,
  imm 
)    _mm_shufflehi_epi16_function((a), (imm))

在文件 sse2neon.h 第 5610 行定义.

◆ _mm_shufflehi_epi16_function

#define _mm_shufflehi_epi16_function (   a,
  imm 
)
值:
__extension__({ \
int16x8_t ret = vreinterpretq_s16_m128i(a); \
int16x4_t highBits = vget_high_s16(ret); \
ret = vsetq_lane_s16(vget_lane_s16(highBits, (imm) & (0x3)), ret, 4); \
ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 2) & 0x3), ret, \
5); \
ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \
6); \
ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \
7); \
vreinterpretq_m128i_s16(ret); \
})

在文件 sse2neon.h 第 1129 行定义.

1130 { \
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, \
1135 5); \
1136 ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \
1137 6); \
1138 ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \
1139 7); \
1140 vreinterpretq_m128i_s16(ret); \
1141 })

◆ _mm_shufflelo_epi16

#define _mm_shufflelo_epi16 (   a,
  imm 
)    _mm_shufflelo_epi16_function((a), (imm))

在文件 sse2neon.h 第 5625 行定义.

◆ _mm_shufflelo_epi16_function

#define _mm_shufflelo_epi16_function (   a,
  imm 
)
值:
__extension__({ \
int16x8_t ret = vreinterpretq_s16_m128i(a); \
int16x4_t lowBits = vget_low_s16(ret); \
ret = vsetq_lane_s16(vget_lane_s16(lowBits, (imm) & (0x3)), ret, 0); \
ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 2) & 0x3), ret, \
1); \
ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \
2); \
ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \
3); \
vreinterpretq_m128i_s16(ret); \
})

在文件 sse2neon.h 第 1109 行定义.

1110 { \
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, \
1115 1); \
1116 ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \
1117 2); \
1118 ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \
1119 3); \
1120 vreinterpretq_m128i_s16(ret); \
1121 })

◆ _mm_slli_si128

#define _mm_slli_si128 (   a,
  imm 
)
值:
__extension__({ \
int8x16_t ret; \
if (_sse2neon_unlikely(imm == 0)) \
else if (_sse2neon_unlikely((imm) & ~15)) \
ret = vdupq_n_s8(0); \
else \
ret = vextq_s8(vdupq_n_s8(0), vreinterpretq_s8_m128i(a), \
((imm <= 0 || imm > 15) ? 0 : (16 - imm))); \
vreinterpretq_m128i_s8(ret); \
})

在文件 sse2neon.h 第 5770 行定义.

5771 { \
5772 int8x16_t ret; \
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); \
5777 else \
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); \
5781 })

◆ _mm_srai_epi32

#define _mm_srai_epi32 (   a,
  imm 
)
值:
__extension__({ \
__m128i ret; \
if (_sse2neon_unlikely((imm) == 0)) { \
ret = a; \
} else if (_sse2neon_likely(0 < (imm) && (imm) < 32)) { \
vshlq_s32(vreinterpretq_s32_m128i(a), vdupq_n_s32(-(imm)))); \
} else { \
vshrq_n_s32(vreinterpretq_s32_m128i(a), 31)); \
} \
ret; \
})
#define _sse2neon_likely(x)
Definition sse2neon.h:91
#define vreinterpretq_m128i_s32(x)
Definition sse2neon.h:360

在文件 sse2neon.h 第 5885 行定义.

5886 { \
5887 __m128i ret; \
5888 if (_sse2neon_unlikely((imm) == 0)) { \
5889 ret = a; \
5890 } else if (_sse2neon_likely(0 < (imm) && (imm) < 32)) { \
5892 vshlq_s32(vreinterpretq_s32_m128i(a), vdupq_n_s32(-(imm)))); \
5893 } else { \
5895 vshrq_n_s32(vreinterpretq_s32_m128i(a), 31)); \
5896 } \
5897 ret; \
5898 })

◆ _mm_srli_epi16

#define _mm_srli_epi16 (   a,
  imm 
)
值:
__extension__({ \
__m128i ret; \
if (_sse2neon_unlikely((imm) & ~15)) { \
ret = _mm_setzero_si128(); \
} else { \
vshlq_u16(vreinterpretq_u16_m128i(a), vdupq_n_s16(-(imm)))); \
} \
ret; \
})
FORCE_INLINE __m128i _mm_setzero_si128()
Definition sse2neon.h:5505
#define vreinterpretq_m128i_u16(x)
Definition sse2neon.h:364

在文件 sse2neon.h 第 5982 行定义.

5983 { \
5984 __m128i ret; \
5985 if (_sse2neon_unlikely((imm) & ~15)) { \
5986 ret = _mm_setzero_si128(); \
5987 } else { \
5989 vshlq_u16(vreinterpretq_u16_m128i(a), vdupq_n_s16(-(imm)))); \
5990 } \
5991 ret; \
5992 })

◆ _mm_srli_epi32

#define _mm_srli_epi32 (   a,
  imm 
)
值:
__extension__({ \
__m128i ret; \
if (_sse2neon_unlikely((imm) & ~31)) { \
ret = _mm_setzero_si128(); \
} else { \
vshlq_u32(vreinterpretq_u32_m128i(a), vdupq_n_s32(-(imm)))); \
} \
ret; \
})
#define vreinterpretq_u32_m128i(x)
Definition sse2neon.h:378
#define vreinterpretq_m128i_u32(x)
Definition sse2neon.h:365

在文件 sse2neon.h 第 6008 行定义.

6009 { \
6010 __m128i ret; \
6011 if (_sse2neon_unlikely((imm) & ~31)) { \
6012 ret = _mm_setzero_si128(); \
6013 } else { \
6015 vshlq_u32(vreinterpretq_u32_m128i(a), vdupq_n_s32(-(imm)))); \
6016 } \
6017 ret; \
6018 })

◆ _mm_srli_epi64

#define _mm_srli_epi64 (   a,
  imm 
)
值:
__extension__({ \
__m128i ret; \
if (_sse2neon_unlikely((imm) & ~63)) { \
ret = _mm_setzero_si128(); \
} else { \
vshlq_u64(vreinterpretq_u64_m128i(a), vdupq_n_s64(-(imm)))); \
} \
ret; \
})
#define vreinterpretq_m128i_u64(x)
Definition sse2neon.h:366
#define vreinterpretq_u64_m128i(x)
Definition sse2neon.h:379

在文件 sse2neon.h 第 6033 行定义.

6034 { \
6035 __m128i ret; \
6036 if (_sse2neon_unlikely((imm) & ~63)) { \
6037 ret = _mm_setzero_si128(); \
6038 } else { \
6040 vshlq_u64(vreinterpretq_u64_m128i(a), vdupq_n_s64(-(imm)))); \
6041 } \
6042 ret; \
6043 })

◆ _mm_srli_si128

#define _mm_srli_si128 (   a,
  imm 
)
值:
__extension__({ \
int8x16_t ret; \
if (_sse2neon_unlikely((imm) & ~15)) \
ret = vdupq_n_s8(0); \
else \
ret = vextq_s8(vreinterpretq_s8_m128i(a), vdupq_n_s8(0), \
(imm > 15 ? 0 : imm)); \
vreinterpretq_m128i_s8(ret); \
})

在文件 sse2neon.h 第 6055 行定义.

6056 { \
6057 int8x16_t ret; \
6058 if (_sse2neon_unlikely((imm) & ~15)) \
6059 ret = vdupq_n_s8(0); \
6060 else \
6061 ret = vextq_s8(vreinterpretq_s8_m128i(a), vdupq_n_s8(0), \
6062 (imm > 15 ? 0 : imm)); \
6063 vreinterpretq_m128i_s8(ret); \
6064 })

◆ _mm_store1_pd

#define _mm_store1_pd   _mm_store_pd1

在文件 sse2neon.h 第 6119 行定义.

◆ _mm_store1_ps

#define _mm_store1_ps   _mm_store_ps1

在文件 sse2neon.h 第 2871 行定义.

◆ _mm_testnzc_si128

#define _mm_testnzc_si128 (   a,
  b 
)    _mm_test_mix_ones_zeros(a, b)

在文件 sse2neon.h 第 8546 行定义.

◆ _MM_TRANSPOSE4_PS

#define _MM_TRANSPOSE4_PS (   row0,
  row1,
  row2,
  row3 
)
值:
do { \
float32x4x2_t ROW01 = vtrnq_f32(row0, row1); \
float32x4x2_t ROW23 = vtrnq_f32(row2, row3); \
row0 = vcombine_f32(vget_low_f32(ROW01.val[0]), \
vget_low_f32(ROW23.val[0])); \
row1 = vcombine_f32(vget_low_f32(ROW01.val[1]), \
vget_low_f32(ROW23.val[1])); \
row2 = vcombine_f32(vget_high_f32(ROW01.val[0]), \
vget_high_f32(ROW23.val[0])); \
row3 = vcombine_f32(vget_high_f32(ROW01.val[1]), \
vget_high_f32(ROW23.val[1])); \
} while (0)

在文件 sse2neon.h 第 2987 行定义.

2988 { \
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])); \
2999 } while (0)

◆ _mm_ucomieq_sd

#define _mm_ucomieq_sd   _mm_comieq_sd

在文件 sse2neon.h 第 6385 行定义.

◆ _mm_ucomieq_ss

#define _mm_ucomieq_ss   _mm_comieq_ss

在文件 sse2neon.h 第 3003 行定义.

◆ _mm_ucomige_sd

#define _mm_ucomige_sd   _mm_comige_sd

在文件 sse2neon.h 第 6386 行定义.

◆ _mm_ucomige_ss

#define _mm_ucomige_ss   _mm_comige_ss

在文件 sse2neon.h 第 3004 行定义.

◆ _mm_ucomigt_sd

#define _mm_ucomigt_sd   _mm_comigt_sd

在文件 sse2neon.h 第 6387 行定义.

◆ _mm_ucomigt_ss

#define _mm_ucomigt_ss   _mm_comigt_ss

在文件 sse2neon.h 第 3005 行定义.

◆ _mm_ucomile_sd

#define _mm_ucomile_sd   _mm_comile_sd

在文件 sse2neon.h 第 6388 行定义.

◆ _mm_ucomile_ss

#define _mm_ucomile_ss   _mm_comile_ss

在文件 sse2neon.h 第 3006 行定义.

◆ _mm_ucomilt_sd

#define _mm_ucomilt_sd   _mm_comilt_sd

在文件 sse2neon.h 第 6389 行定义.

◆ _mm_ucomilt_ss

#define _mm_ucomilt_ss   _mm_comilt_ss

在文件 sse2neon.h 第 3007 行定义.

◆ _mm_ucomineq_sd

#define _mm_ucomineq_sd   _mm_comineq_sd

在文件 sse2neon.h 第 6390 行定义.

◆ _mm_ucomineq_ss

#define _mm_ucomineq_ss   _mm_comineq_ss

在文件 sse2neon.h 第 3008 行定义.

◆ _SIDD_BIT_MASK

#define _SIDD_BIT_MASK   0x00

在文件 sse2neon.h 第 8594 行定义.

◆ _SIDD_CMP_EQUAL_ANY

#define _SIDD_CMP_EQUAL_ANY   0x00 /* compare equal any: strchr */

在文件 sse2neon.h 第 8577 行定义.

◆ _SIDD_CMP_EQUAL_EACH

#define _SIDD_CMP_EQUAL_EACH   0x08 /* compare equal each: strcmp */

在文件 sse2neon.h 第 8579 行定义.

◆ _SIDD_CMP_EQUAL_ORDERED

#define _SIDD_CMP_EQUAL_ORDERED   0x0C /* compare equal ordered */

在文件 sse2neon.h 第 8580 行定义.

◆ _SIDD_CMP_RANGES

#define _SIDD_CMP_RANGES   0x04 /* compare ranges */

在文件 sse2neon.h 第 8578 行定义.

◆ _SIDD_LEAST_SIGNIFICANT

#define _SIDD_LEAST_SIGNIFICANT   0x00

在文件 sse2neon.h 第 8590 行定义.

◆ _SIDD_MASKED_NEGATIVE_POLARITY

#define _SIDD_MASKED_NEGATIVE_POLARITY    0x30 /* negate results only before end of string */

在文件 sse2neon.h 第 8586 行定义.

◆ _SIDD_MASKED_POSITIVE_POLARITY

#define _SIDD_MASKED_POSITIVE_POLARITY   0x20

在文件 sse2neon.h 第 8584 行定义.

◆ _SIDD_MOST_SIGNIFICANT

#define _SIDD_MOST_SIGNIFICANT   0x40

在文件 sse2neon.h 第 8591 行定义.

◆ _SIDD_NEGATIVE_POLARITY

#define _SIDD_NEGATIVE_POLARITY   0x10 /* negate results */

在文件 sse2neon.h 第 8585 行定义.

◆ _SIDD_POSITIVE_POLARITY

#define _SIDD_POSITIVE_POLARITY   0x00

在文件 sse2neon.h 第 8583 行定义.

◆ _SIDD_SBYTE_OPS

#define _SIDD_SBYTE_OPS   0x02 /* signed 8-bit characters */

在文件 sse2neon.h 第 8573 行定义.

◆ _SIDD_SWORD_OPS

#define _SIDD_SWORD_OPS   0x03 /* signed 16-bit characters */

在文件 sse2neon.h 第 8574 行定义.

◆ _SIDD_UBYTE_OPS

#define _SIDD_UBYTE_OPS   0x00 /* unsigned 8-bit characters */

在文件 sse2neon.h 第 8571 行定义.

◆ _SIDD_UNIT_MASK

#define _SIDD_UNIT_MASK   0x40

在文件 sse2neon.h 第 8595 行定义.

◆ _SIDD_UWORD_OPS

#define _SIDD_UWORD_OPS   0x01 /* unsigned 16-bit characters */

在文件 sse2neon.h 第 8572 行定义.

◆ _sse2neon_const

#define _sse2neon_const   const

在文件 sse2neon.h 第 99 行定义.

◆ _sse2neon_likely

#define _sse2neon_likely (   x)    (x)

在文件 sse2neon.h 第 91 行定义.

◆ _sse2neon_unlikely

#define _sse2neon_unlikely (   x)    (x)

在文件 sse2neon.h 第 92 行定义.

◆ ALIGN_STRUCT

#define ALIGN_STRUCT (   x)    __declspec(align(x))

在文件 sse2neon.h 第 89 行定义.

◆ FORCE_INLINE

#define FORCE_INLINE   static inline

在文件 sse2neon.h 第 86 行定义.

◆ PCMPSTR_EQ

#define PCMPSTR_EQ (   a,
  b,
  mtx,
  size,
  number_of_lanes 
)
值:
do { \
SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, \
SSE2NEON_CAT(u, size))) \
} while (0)
#define SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE(i, type)
Definition sse2neon.h:8676
#define SSE2NEON_REPEAT(count, macro,...)
Definition sse2neon.h:8663
#define SSE2NEON_CAT(a, b)
Definition sse2neon.h:8603

在文件 sse2neon.h 第 8718 行定义.

8719 { \
8720 SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, \
8722 SSE2NEON_CAT(u, size))) \
8723 } while (0)

◆ PCMPSTR_RANGES

#define PCMPSTR_RANGES (   a,
  b,
  mtx,
  data_type_prefix,
  type_prefix,
  size,
  number_of_lanes,
  byte_or_word 
)
值:
do { \
SSE2NEON_CAT( \
data_type_prefix, \
SSE2NEON_CAT(size, \
SSE2NEON_CAT(x, SSE2NEON_CAT(number_of_lanes, _t)))) \
vec_b[number_of_lanes]; \
__m128i mask = SSE2NEON_IIF(byte_or_word)( \
vreinterpretq_m128i_u16(vdupq_n_u16(0xff)), \
vreinterpretq_m128i_u32(vdupq_n_u32(0xffff))); \
SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, SSE2NEON_FILL_LANE, \
SSE2NEON_CAT(type_prefix, size))) \
for (int i = 0; i < number_of_lanes; i++) { \
mtx[i] = SSE2NEON_CAT(vreinterpretq_m128i_u, \
size)(SSE2NEON_CAT(vbslq_u, size)( \
SSE2NEON_CAT(vreinterpretq_u, \
SSE2NEON_CAT(size, _m128i))(mask), \
SSE2NEON_CAT(vcgeq_, SSE2NEON_CAT(type_prefix, size))( \
vec_b[i], \
vreinterpretq_, \
SSE2NEON_CAT(type_prefix, \
SSE2NEON_CAT(size, _m128i(a))))), \
SSE2NEON_CAT(vcleq_, SSE2NEON_CAT(type_prefix, size))( \
vec_b[i], \
vreinterpretq_, \
SSE2NEON_CAT(type_prefix, \
SSE2NEON_CAT(size, _m128i(a))))))); \
} \
} while (0)
#define SSE2NEON_FILL_LANE(i, type)
Definition sse2neon.h:8681
#define SSE2NEON_IIF(c)
Definition sse2neon.h:8605

在文件 sse2neon.h 第 8685 行定义.

8687 { \
8688 SSE2NEON_CAT( \
8689 data_type_prefix, \
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))( \
8704 vec_b[i], \
8705 SSE2NEON_CAT( \
8706 vreinterpretq_, \
8707 SSE2NEON_CAT(type_prefix, \
8708 SSE2NEON_CAT(size, _m128i(a))))), \
8709 SSE2NEON_CAT(vcleq_, SSE2NEON_CAT(type_prefix, size))( \
8710 vec_b[i], \
8711 SSE2NEON_CAT( \
8712 vreinterpretq_, \
8713 SSE2NEON_CAT(type_prefix, \
8714 SSE2NEON_CAT(size, _m128i(a))))))); \
8715 } \
8716 } while (0)

◆ SSE2NEON_AES_B2W

#define SSE2NEON_AES_B2W (   b0,
  b1,
  b2,
  b3 
)
值:
(((uint32_t) (b3) << 24) | ((uint32_t) (b2) << 16) | \
((uint32_t) (b1) << 8) | (uint32_t) (b0))

◆ SSE2NEON_AES_F2

#define SSE2NEON_AES_F2 (   x)    ((x << 1) ^ (((x >> 7) & 1) * 0x011b /* WPOLY */))

◆ SSE2NEON_AES_F3

#define SSE2NEON_AES_F3 (   x)    (SSE2NEON_AES_F2(x) ^ x)

◆ SSE2NEON_AES_H0

#define SSE2NEON_AES_H0 (   x)    (x)

在文件 sse2neon.h 第 9488 行定义.

◆ SSE2NEON_AES_RSBOX

#define SSE2NEON_AES_RSBOX (   w)

在文件 sse2neon.h 第 9445 行定义.

9446 { \
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) \
9484 }

◆ SSE2NEON_AES_SBOX

#define SSE2NEON_AES_SBOX (   w)

在文件 sse2neon.h 第 9405 行定义.

9406 { \
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) \
9444 }

◆ SSE2NEON_AES_U0

#define SSE2NEON_AES_U0 (   p)     SSE2NEON_AES_B2W(SSE2NEON_AES_F2(p), p, p, SSE2NEON_AES_F3(p))

◆ SSE2NEON_AES_U1

#define SSE2NEON_AES_U1 (   p)     SSE2NEON_AES_B2W(SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p, p)

◆ SSE2NEON_AES_U2

#define SSE2NEON_AES_U2 (   p)     SSE2NEON_AES_B2W(p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p)

◆ SSE2NEON_AES_U3

#define SSE2NEON_AES_U3 (   p)     SSE2NEON_AES_B2W(p, p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p))

◆ SSE2NEON_AGGREGATE_EQUAL_ORDER_IMPL

#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IMPL (   size,
  number_of_lanes,
  data_type 
)

在文件 sse2neon.h 第 8929 行定义.

8932 { \
8933 int res = 0; \
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]))); \
8947 } \
8948 for (int j = lb; j < bound; j++) { \
8949 mtx[j] = vreinterpretq_m128i_u##size( \
8950 vbslq_u##size(vec1, vec_minusone, vec_zero)); \
8951 } \
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++) { \
8955 int val = 1; \
8956 for (int j = 0, k = i; j < bound - i && k < bound; j++, k++) \
8957 val &= ptr[k * bound + j]; \
8958 res += val << i; \
8959 } \
8960 return res; \
8961 }
T bound(const T &x, const T &min, const T &max)
Get bound of value x
Definition misc.h:98

◆ SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE

#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE   1

在文件 sse2neon.h 第 8926 行定义.

◆ SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD

#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD   0

在文件 sse2neon.h 第 8927 行定义.

◆ SSE2NEON_BARRIER

#define SSE2NEON_BARRIER ( )
值:
do { \
__asm__ __volatile__("" ::: "memory"); \
(void) 0; \
} while (0)

在文件 sse2neon.h 第 122 行定义.

123 { \
124 __asm__ __volatile__("" ::: "memory"); \
125 (void) 0; \
126 } while (0)

◆ SSE2NEON_BOOL

#define SSE2NEON_BOOL (   x)    SSE2NEON_COMPL(SSE2NEON_NOT(x))

在文件 sse2neon.h 第 8641 行定义.

◆ SSE2NEON_CACHELINE_SIZE

#define SSE2NEON_CACHELINE_SIZE   64

在文件 sse2neon.h 第 198 行定义.

◆ SSE2NEON_CAT

#define SSE2NEON_CAT (   a,
  b 
)    SSE2NEON_PRIMITIVE_CAT(a, b)

在文件 sse2neon.h 第 8603 行定义.

◆ SSE2NEON_CHECK

#define SSE2NEON_CHECK (   ...)    SSE2NEON_CHECK_N(__VA_ARGS__, 0, )

在文件 sse2neon.h 第 8635 行定义.

◆ SSE2NEON_CHECK_N

#define SSE2NEON_CHECK_N (   x,
  n,
  ... 
)    n

在文件 sse2neon.h 第 8634 行定义.

◆ SSE2NEON_CMP_EQUAL_ANY_IMPL

#define SSE2NEON_CMP_EQUAL_ANY_IMPL (   type)
值:
static int _sse2neon_cmp_##type##_equal_any(__m128i a, int la, __m128i b, \
int lb) \
{ \
__m128i mtx[16]; \
PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \
return SSE2NEON_CAT( \
_sse2neon_aggregate_equal_any_, \
SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \
type))))(la, lb, mtx); \
}

在文件 sse2neon.h 第 8725 行定义.

8728 { \
8729 __m128i mtx[16]; \
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_, \
8734 SSE2NEON_CAT( \
8735 SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8736 SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \
8737 type))))(la, lb, mtx); \
8738 }

◆ SSE2NEON_CMP_EQUAL_ORDERED_IMPL

#define SSE2NEON_CMP_EQUAL_ORDERED_IMPL (   type)
值:
static int _sse2neon_cmp_##type##_equal_ordered(__m128i a, int la, \
__m128i b, int lb) \
{ \
__m128i mtx[16]; \
PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \
return SSE2NEON_CAT( \
_sse2neon_aggregate_equal_ordered_, \
SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type))))( \
SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), la, lb, mtx); \
}

在文件 sse2neon.h 第 8756 行定义.

8759 { \
8760 __m128i mtx[16]; \
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_, \
8765 SSE2NEON_CAT( \
8766 SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8767 SSE2NEON_CAT(x, \
8768 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type))))( \
8769 SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), la, lb, mtx); \
8770 }

◆ SSE2NEON_CMP_RANGES_IMPL

#define SSE2NEON_CMP_RANGES_IMPL (   type,
  data_type,
  us,
  byte_or_word 
)
值:
static int _sse2neon_cmp_##us##type##_ranges(__m128i a, int la, __m128i b, \
int lb) \
{ \
__m128i mtx[16]; \
PCMPSTR_RANGES( \
a, b, mtx, data_type, us, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), byte_or_word); \
return SSE2NEON_CAT( \
_sse2neon_aggregate_ranges_, \
SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \
type))))(la, lb, mtx); \
}

在文件 sse2neon.h 第 8740 行定义.

8743 { \
8744 __m128i mtx[16]; \
8745 PCMPSTR_RANGES( \
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_, \
8750 SSE2NEON_CAT( \
8751 SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \
8752 SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \
8753 type))))(la, lb, mtx); \
8754 }

◆ SSE2NEON_CMP_RANGES_IS_BYTE

#define SSE2NEON_CMP_RANGES_IS_BYTE   1

在文件 sse2neon.h 第 8865 行定义.

◆ SSE2NEON_CMP_RANGES_IS_WORD

#define SSE2NEON_CMP_RANGES_IS_WORD   0

在文件 sse2neon.h 第 8866 行定义.

◆ SSE2NEON_CMPESTR_LIST

#define SSE2NEON_CMPESTR_LIST
值:
_(CMP_UBYTE_EQUAL_ANY, cmp_byte_equal_any) \
_(CMP_UWORD_EQUAL_ANY, cmp_word_equal_any) \
_(CMP_SBYTE_EQUAL_ANY, cmp_byte_equal_any) \
_(CMP_SWORD_EQUAL_ANY, cmp_word_equal_any) \
_(CMP_UBYTE_RANGES, cmp_ubyte_ranges) \
_(CMP_UWORD_RANGES, cmp_uword_ranges) \
_(CMP_SBYTE_RANGES, cmp_sbyte_ranges) \
_(CMP_SWORD_RANGES, cmp_sword_ranges) \
_(CMP_UBYTE_EQUAL_EACH, cmp_byte_equal_each) \
_(CMP_UWORD_EQUAL_EACH, cmp_word_equal_each) \
_(CMP_SBYTE_EQUAL_EACH, cmp_byte_equal_each) \
_(CMP_SWORD_EQUAL_EACH, cmp_word_equal_each) \
_(CMP_UBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \
_(CMP_UWORD_EQUAL_ORDERED, cmp_word_equal_ordered) \
_(CMP_SBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \
_(CMP_SWORD_EQUAL_ORDERED, cmp_word_equal_ordered)
#define _(name, func_suffix)
Definition sse2neon.h:9001

在文件 sse2neon.h 第 8982 行定义.

◆ SSE2NEON_CMPESTRX_LEN_PAIR

#define SSE2NEON_CMPESTRX_LEN_PAIR (   a,
  b,
  la,
  lb 
)
值:
int tmp1 = la ^ (la >> 31); \
la = tmp1 - (la >> 31); \
int tmp2 = lb ^ (lb >> 31); \
lb = tmp2 - (lb >> 31); \
la = SSE2NEON_MIN(la, bound); \
lb = SSE2NEON_MIN(lb, bound)
#define SSE2NEON_MIN(x, y)
Definition sse2neon.h:9072

在文件 sse2neon.h 第 9077 行定义.

◆ SSE2NEON_CMPISTRX_LEN_PAIR

#define SSE2NEON_CMPISTRX_LEN_PAIR (   a,
  b,
  la,
  lb 
)
值:
int la, lb; \
do { \
SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); \
SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); \
} while (0)

在文件 sse2neon.h 第 9237 行定义.

9239 { \
9240 SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); \
9241 SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); \
9242 } while (0)

◆ SSE2NEON_CMPISTRX_LENGTH

#define SSE2NEON_CMPISTRX_LENGTH (   str,
  len,
  imm8 
)
值:
do { \
if (imm8 & 0x01) { \
uint16x8_t equal_mask_##str = \
vceqq_u16(vreinterpretq_u16_m128i(str), vdupq_n_u16(0)); \
uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \
uint64_t matches_##str = \
vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \
len = _sse2neon_ctzll(matches_##str) >> 3; \
} else { \
uint16x8_t equal_mask_##str = vreinterpretq_u16_u8( \
vceqq_u8(vreinterpretq_u8_m128i(str), vdupq_n_u8(0))); \
uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \
uint64_t matches_##str = \
vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \
len = _sse2neon_ctzll(matches_##str) >> 2; \
} \
} while (0)
FORCE_INLINE int _sse2neon_ctzll(unsigned long long x)
Definition sse2neon.h:9052

在文件 sse2neon.h 第 9218 行定义.

9219 { \
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; \
9227 } else { \
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; \
9234 } \
9235 } while (0)

◆ SSE2NEON_CMPSTR_GENERATE_INDEX

#define SSE2NEON_CMPSTR_GENERATE_INDEX (   r2,
  bound,
  imm8 
)
值:
return (r2 == 0) ? bound \
: ((imm8 & 0x40) ? (31 - _sse2neon_clz(r2)) \
FORCE_INLINE int _sse2neon_clz(unsigned int x)
Definition sse2neon.h:9028
FORCE_INLINE int _sse2neon_ctz(unsigned int x)
Definition sse2neon.h:9040

在文件 sse2neon.h 第 9096 行定义.

9098 : ((imm8 & 0x40) ? (31 - _sse2neon_clz(r2)) \
9099 : _sse2neon_ctz(r2))

◆ SSE2NEON_CMPSTR_GENERATE_MASK

#define SSE2NEON_CMPSTR_GENERATE_MASK (   dst)
值:
__m128i dst = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \
if (imm8 & 0x40) { \
if (bound == 8) { \
uint16x8_t tmp = vtstq_u16(vdupq_n_u16(r2), \
vld1q_u16(_sse2neon_cmpestr_mask16b)); \
dst = vreinterpretq_m128i_u16(vbslq_u16( \
tmp, vdupq_n_u16(-1), vreinterpretq_u16_m128i(dst))); \
} else { \
uint8x16_t vec_r2 = \
vcombine_u8(vdup_n_u8(r2), vdup_n_u8(r2 >> 8)); \
uint8x16_t tmp = \
vtstq_u8(vec_r2, vld1q_u8(_sse2neon_cmpestr_mask8b)); \
vbslq_u8(tmp, vdupq_n_u8(-1), vreinterpretq_u8_m128i(dst))); \
} \
} else { \
if (bound == 16) { \
vsetq_lane_u16(r2 & 0xffff, vreinterpretq_u16_m128i(dst), 0)); \
} else { \
vsetq_lane_u8(r2 & 0xff, vreinterpretq_u8_m128i(dst), 0)); \
} \
} \
return dst

在文件 sse2neon.h 第 9101 行定义.

9103 { \
9104 if (bound == 8) { \
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))); \
9109 } else { \
9110 uint8x16_t vec_r2 = \
9111 vcombine_u8(vdup_n_u8(r2), vdup_n_u8(r2 >> 8)); \
9112 uint8x16_t tmp = \
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))); \
9116 } \
9117 } else { \
9118 if (bound == 16) { \
9120 vsetq_lane_u16(r2 & 0xffff, vreinterpretq_u16_m128i(dst), 0)); \
9121 } else { \
9122 dst = vreinterpretq_m128i_u8( \
9123 vsetq_lane_u8(r2 & 0xff, vreinterpretq_u8_m128i(dst), 0)); \
9124 } \
9125 } \
9126 return dst

◆ SSE2NEON_CMPSTR_SET_UPPER

#define SSE2NEON_CMPSTR_SET_UPPER (   var,
  imm 
)     const int var = (imm & 0x01) ? 8 : 16

在文件 sse2neon.h 第 9074 行定义.

9075 : 16

◆ SSE2NEON_COMP_AGG

#define SSE2NEON_COMP_AGG (   a,
  b,
  la,
  lb,
  imm8,
  IE 
)
值:
SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); \
SSE2NEON_##IE##_LEN_PAIR(a, b, la, lb); \
int r2 = (_sse2neon_cmpfunc_table[imm8 & 0x0f])(a, la, b, lb); \
r2 = _sse2neon_sido_negative(r2, lb, imm8, bound)
#define SSE2NEON_CMPSTR_SET_UPPER(var, imm)
Definition sse2neon.h:9074
FORCE_INLINE int _sse2neon_sido_negative(int res, int lb, int imm8, int bound)
Definition sse2neon.h:9012

在文件 sse2neon.h 第 9090 行定义.

◆ SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE

#define SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE (   i,
  type 
)
值:
mtx[i] = vreinterpretq_m128i_##type(vceqq_##type( \
vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i)), \
vreinterpretq_##type##_m128i(a)));

在文件 sse2neon.h 第 8676 行定义.

◆ SSE2NEON_COMPL

#define SSE2NEON_COMPL (   b)    SSE2NEON_PRIMITIVE_CAT(SSE2NEON_COMPL_, b)

在文件 sse2neon.h 第 8611 行定义.

◆ SSE2NEON_COMPL_0

#define SSE2NEON_COMPL_0   1

在文件 sse2neon.h 第 8612 行定义.

◆ SSE2NEON_COMPL_1

#define SSE2NEON_COMPL_1   0

在文件 sse2neon.h 第 8613 行定义.

◆ SSE2NEON_DEC

#define SSE2NEON_DEC (   x)    SSE2NEON_PRIMITIVE_CAT(SSE2NEON_DEC_, x)

在文件 sse2neon.h 第 8615 行定义.

◆ SSE2NEON_DEC_1

#define SSE2NEON_DEC_1   0

在文件 sse2neon.h 第 8616 行定义.

◆ SSE2NEON_DEC_10

#define SSE2NEON_DEC_10   9

在文件 sse2neon.h 第 8625 行定义.

◆ SSE2NEON_DEC_11

#define SSE2NEON_DEC_11   10

在文件 sse2neon.h 第 8626 行定义.

◆ SSE2NEON_DEC_12

#define SSE2NEON_DEC_12   11

在文件 sse2neon.h 第 8627 行定义.

◆ SSE2NEON_DEC_13

#define SSE2NEON_DEC_13   12

在文件 sse2neon.h 第 8628 行定义.

◆ SSE2NEON_DEC_14

#define SSE2NEON_DEC_14   13

在文件 sse2neon.h 第 8629 行定义.

◆ SSE2NEON_DEC_15

#define SSE2NEON_DEC_15   14

在文件 sse2neon.h 第 8630 行定义.

◆ SSE2NEON_DEC_16

#define SSE2NEON_DEC_16   15

在文件 sse2neon.h 第 8631 行定义.

◆ SSE2NEON_DEC_2

#define SSE2NEON_DEC_2   1

在文件 sse2neon.h 第 8617 行定义.

◆ SSE2NEON_DEC_3

#define SSE2NEON_DEC_3   2

在文件 sse2neon.h 第 8618 行定义.

◆ SSE2NEON_DEC_4

#define SSE2NEON_DEC_4   3

在文件 sse2neon.h 第 8619 行定义.

◆ SSE2NEON_DEC_5

#define SSE2NEON_DEC_5   4

在文件 sse2neon.h 第 8620 行定义.

◆ SSE2NEON_DEC_6

#define SSE2NEON_DEC_6   5

在文件 sse2neon.h 第 8621 行定义.

◆ SSE2NEON_DEC_7

#define SSE2NEON_DEC_7   6

在文件 sse2neon.h 第 8622 行定义.

◆ SSE2NEON_DEC_8

#define SSE2NEON_DEC_8   7

在文件 sse2neon.h 第 8623 行定义.

◆ SSE2NEON_DEC_9

#define SSE2NEON_DEC_9   8

在文件 sse2neon.h 第 8624 行定义.

◆ SSE2NEON_DEFER

#define SSE2NEON_DEFER (   id)    id SSE2NEON_EMPTY()

在文件 sse2neon.h 第 8651 行定义.

◆ SSE2NEON_EAT

#define SSE2NEON_EAT (   ...)

在文件 sse2neon.h 第 8644 行定义.

◆ SSE2NEON_EMPTY

#define SSE2NEON_EMPTY ( )

在文件 sse2neon.h 第 8650 行定义.

◆ SSE2NEON_EVAL

#define SSE2NEON_EVAL (   ...)     SSE2NEON_EVAL1(SSE2NEON_EVAL1(SSE2NEON_EVAL1(__VA_ARGS__)))

在文件 sse2neon.h 第 8655 行定义.

◆ SSE2NEON_EVAL1

#define SSE2NEON_EVAL1 (   ...)     SSE2NEON_EVAL2(SSE2NEON_EVAL2(SSE2NEON_EVAL2(__VA_ARGS__)))

在文件 sse2neon.h 第 8657 行定义.

◆ SSE2NEON_EVAL2

#define SSE2NEON_EVAL2 (   ...)     SSE2NEON_EVAL3(SSE2NEON_EVAL3(SSE2NEON_EVAL3(__VA_ARGS__)))

在文件 sse2neon.h 第 8659 行定义.

◆ SSE2NEON_EVAL3

#define SSE2NEON_EVAL3 (   ...)    __VA_ARGS__

在文件 sse2neon.h 第 8661 行定义.

◆ SSE2NEON_EXPAND [1/2]

#define SSE2NEON_EXPAND (   ...)    __VA_ARGS__

在文件 sse2neon.h 第 8645 行定义.

◆ SSE2NEON_EXPAND [2/2]

#define SSE2NEON_EXPAND (   ...)    __VA_ARGS__

在文件 sse2neon.h 第 8645 行定义.

◆ SSE2NEON_FILL_LANE

#define SSE2NEON_FILL_LANE (   i,
  type 
)
值:
vec_b[i] = \
vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i));

在文件 sse2neon.h 第 8681 行定义.

◆ SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER

#define SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER (   prefix)
值:
prefix##IMPL(8, 16, prefix##IS_UBYTE) \
prefix##IMPL(16, 8, prefix##IS_UWORD)

在文件 sse2neon.h 第 8964 行定义.

◆ SSE2NEON_GENERATE_CMP_EQUAL_ANY

#define SSE2NEON_GENERATE_CMP_EQUAL_ANY (   prefix)
值:
prefix##IMPL(byte) \
prefix##IMPL(word)

在文件 sse2neon.h 第 8809 行定义.

◆ SSE2NEON_GENERATE_CMP_EQUAL_ORDERED

#define SSE2NEON_GENERATE_CMP_EQUAL_ORDERED (   prefix)
值:
prefix##IMPL(byte) \
prefix##IMPL(word)

在文件 sse2neon.h 第 8975 行定义.

◆ SSE2NEON_GENERATE_CMP_RANGES

#define SSE2NEON_GENERATE_CMP_RANGES (   prefix)
值:
prefix##IMPL(byte, uint, u, prefix##IS_BYTE) \
prefix##IMPL(byte, int, s, prefix##IS_BYTE) \
prefix##IMPL(word, uint, u, prefix##IS_WORD) \
prefix##IMPL(word, int, s, prefix##IS_WORD)

在文件 sse2neon.h 第 8869 行定义.

◆ SSE2NEON_IF

#define SSE2NEON_IF (   c)    SSE2NEON_IIF(SSE2NEON_BOOL(c))

在文件 sse2neon.h 第 8642 行定义.

◆ SSE2NEON_IIF

#define SSE2NEON_IIF (   c)    SSE2NEON_PRIMITIVE_CAT(SSE2NEON_IIF_, c)

在文件 sse2neon.h 第 8605 行定义.

◆ SSE2NEON_IIF_0

#define SSE2NEON_IIF_0 (   t,
  ... 
)    __VA_ARGS__

在文件 sse2neon.h 第 8607 行定义.

◆ SSE2NEON_IIF_1

#define SSE2NEON_IIF_1 (   t,
  ... 
)    t

在文件 sse2neon.h 第 8609 行定义.

◆ SSE2NEON_MIN

#define SSE2NEON_MIN (   x,
  y 
)    (x) < (y) ? (x) : (y)

在文件 sse2neon.h 第 9072 行定义.

◆ SSE2NEON_MULTIPLY

#define SSE2NEON_MULTIPLY (   x,
  y 
)
值:
(((y & 1) * x) ^ ((y >> 1 & 1) * SSE2NEON_XT(x)) ^ \
((y >> 2 & 1) * SSE2NEON_XT(SSE2NEON_XT(x))) ^ \
((y >> 3 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x)))) ^ \
#define SSE2NEON_XT(x)
Definition sse2neon.h:9495

在文件 sse2neon.h 第 9496 行定义.

◆ SSE2NEON_NOT

#define SSE2NEON_NOT (   x)    SSE2NEON_CHECK(SSE2NEON_PRIMITIVE_CAT(SSE2NEON_NOT_, x))

在文件 sse2neon.h 第 8638 行定义.

◆ SSE2NEON_NOT_0

#define SSE2NEON_NOT_0   SSE2NEON_PROBE(~)

在文件 sse2neon.h 第 8639 行定义.

◆ SSE2NEON_NUMBER_OF_LANES_byte

#define SSE2NEON_NUMBER_OF_LANES_byte   16

在文件 sse2neon.h 第 8672 行定义.

◆ SSE2NEON_NUMBER_OF_LANES_word

#define SSE2NEON_NUMBER_OF_LANES_word   8

在文件 sse2neon.h 第 8674 行定义.

◆ SSE2NEON_OBSTRUCT

#define SSE2NEON_OBSTRUCT (   ...)    __VA_ARGS__ SSE2NEON_DEFER(SSE2NEON_EMPTY)()

在文件 sse2neon.h 第 8652 行定义.

◆ SSE2NEON_PRECISE_DIV

#define SSE2NEON_PRECISE_DIV   (0)

在文件 sse2neon.h 第 64 行定义.

◆ SSE2NEON_PRECISE_DP

#define SSE2NEON_PRECISE_DP   (0)

在文件 sse2neon.h 第 72 行定义.

◆ SSE2NEON_PRECISE_MINMAX

#define SSE2NEON_PRECISE_MINMAX   (0)

在文件 sse2neon.h 第 60 行定义.

◆ SSE2NEON_PRECISE_SQRT

#define SSE2NEON_PRECISE_SQRT   (0)

在文件 sse2neon.h 第 68 行定义.

◆ SSE2NEON_PRIMITIVE_CAT

#define SSE2NEON_PRIMITIVE_CAT (   a,
  ... 
)    a##__VA_ARGS__

在文件 sse2neon.h 第 8602 行定义.

◆ SSE2NEON_PROBE

#define SSE2NEON_PROBE (   x)    x, 1,

在文件 sse2neon.h 第 8636 行定义.

◆ SSE2NEON_REPEAT

#define SSE2NEON_REPEAT (   count,
  macro,
  ... 
)
值:
SSE2NEON_WHEN(count) \
SSE2NEON_DEC(count), macro, \
__VA_ARGS__) SSE2NEON_OBSTRUCT(macro)(SSE2NEON_DEC(count), \
__VA_ARGS__))
#define SSE2NEON_OBSTRUCT(...)
Definition sse2neon.h:8652
#define SSE2NEON_REPEAT_INDIRECT()
Definition sse2neon.h:8669
#define SSE2NEON_DEC(x)
Definition sse2neon.h:8615
#define SSE2NEON_WHEN(c)
Definition sse2neon.h:8646

在文件 sse2neon.h 第 8663 行定义.

◆ SSE2NEON_REPEAT_INDIRECT

#define SSE2NEON_REPEAT_INDIRECT ( )    SSE2NEON_REPEAT

在文件 sse2neon.h 第 8669 行定义.

◆ SSE2NEON_SIZE_OF_byte

#define SSE2NEON_SIZE_OF_byte   8

在文件 sse2neon.h 第 8671 行定义.

◆ SSE2NEON_SIZE_OF_word

#define SSE2NEON_SIZE_OF_word   16

在文件 sse2neon.h 第 8673 行定义.

◆ SSE2NEON_WHEN

#define SSE2NEON_WHEN (   c)    SSE2NEON_IF(c)(SSE2NEON_EXPAND, SSE2NEON_EAT)

在文件 sse2neon.h 第 8646 行定义.

◆ SSE2NEON_XT

#define SSE2NEON_XT (   x)    (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b))

在文件 sse2neon.h 第 9495 行定义.

◆ vreinterpret_f32_m64

#define vreinterpret_f32_m64 (   x)    vreinterpret_f32_s64(x)

在文件 sse2neon.h 第 405 行定义.

◆ vreinterpret_m64_f16

#define vreinterpret_m64_f16 (   x)    vreinterpret_s64_f16(x)

在文件 sse2neon.h 第 391 行定义.

◆ vreinterpret_m64_f32

#define vreinterpret_m64_f32 (   x)    vreinterpret_s64_f32(x)

在文件 sse2neon.h 第 392 行定义.

◆ vreinterpret_m64_f64

#define vreinterpret_m64_f64 (   x)    vreinterpret_s64_f64(x)

在文件 sse2neon.h 第 393 行定义.

◆ vreinterpret_m64_s16

#define vreinterpret_m64_s16 (   x)    vreinterpret_s64_s16(x)

在文件 sse2neon.h 第 382 行定义.

◆ vreinterpret_m64_s32

#define vreinterpret_m64_s32 (   x)    vreinterpret_s64_s32(x)

在文件 sse2neon.h 第 383 行定义.

◆ vreinterpret_m64_s64

#define vreinterpret_m64_s64 (   x)    (x)

在文件 sse2neon.h 第 384 行定义.

◆ vreinterpret_m64_s8

#define vreinterpret_m64_s8 (   x)    vreinterpret_s64_s8(x)

在文件 sse2neon.h 第 381 行定义.

◆ vreinterpret_m64_u16

#define vreinterpret_m64_u16 (   x)    vreinterpret_s64_u16(x)

在文件 sse2neon.h 第 387 行定义.

◆ vreinterpret_m64_u32

#define vreinterpret_m64_u32 (   x)    vreinterpret_s64_u32(x)

在文件 sse2neon.h 第 388 行定义.

◆ vreinterpret_m64_u64

#define vreinterpret_m64_u64 (   x)    vreinterpret_s64_u64(x)

在文件 sse2neon.h 第 389 行定义.

◆ vreinterpret_m64_u8

#define vreinterpret_m64_u8 (   x)    vreinterpret_s64_u8(x)

在文件 sse2neon.h 第 386 行定义.

◆ vreinterpret_s16_m64

#define vreinterpret_s16_m64 (   x)    vreinterpret_s16_s64(x)

在文件 sse2neon.h 第 401 行定义.

◆ vreinterpret_s32_m64

#define vreinterpret_s32_m64 (   x)    vreinterpret_s32_s64(x)

在文件 sse2neon.h 第 402 行定义.

◆ vreinterpret_s64_m64

#define vreinterpret_s64_m64 (   x)    (x)

在文件 sse2neon.h 第 403 行定义.

◆ vreinterpret_s8_m64

#define vreinterpret_s8_m64 (   x)    vreinterpret_s8_s64(x)

在文件 sse2neon.h 第 400 行定义.

◆ vreinterpret_u16_m64

#define vreinterpret_u16_m64 (   x)    vreinterpret_u16_s64(x)

在文件 sse2neon.h 第 396 行定义.

◆ vreinterpret_u32_m64

#define vreinterpret_u32_m64 (   x)    vreinterpret_u32_s64(x)

在文件 sse2neon.h 第 397 行定义.

◆ vreinterpret_u64_m64

#define vreinterpret_u64_m64 (   x)    vreinterpret_u64_s64(x)

在文件 sse2neon.h 第 398 行定义.

◆ vreinterpret_u8_m64

#define vreinterpret_u8_m64 (   x)    vreinterpret_u8_s64(x)

在文件 sse2neon.h 第 395 行定义.

◆ vreinterpretq_f16_m128

#define vreinterpretq_f16_m128 (   x)    vreinterpretq_f16_f32(x)

在文件 sse2neon.h 第 344 行定义.

◆ vreinterpretq_f32_m128

#define vreinterpretq_f32_m128 (   x)    (x)

在文件 sse2neon.h 第 345 行定义.

◆ vreinterpretq_f32_m128d

#define vreinterpretq_f32_m128d (   x)    (x)

在文件 sse2neon.h 第 437 行定义.

◆ vreinterpretq_f32_m128i

#define vreinterpretq_f32_m128i (   x)    vreinterpretq_f32_s64(x)

在文件 sse2neon.h 第 368 行定义.

◆ vreinterpretq_f64_m128

#define vreinterpretq_f64_m128 (   x)    vreinterpretq_f64_f32(x)

在文件 sse2neon.h 第 346 行定义.

◆ vreinterpretq_f64_m128i

#define vreinterpretq_f64_m128i (   x)    vreinterpretq_f64_s64(x)

在文件 sse2neon.h 第 369 行定义.

◆ vreinterpretq_m128_f16

#define vreinterpretq_m128_f16 (   x)    vreinterpretq_f32_f16(x)

在文件 sse2neon.h 第 330 行定义.

◆ vreinterpretq_m128_f32

#define vreinterpretq_m128_f32 (   x)    (x)

在文件 sse2neon.h 第 331 行定义.

◆ vreinterpretq_m128_f64

#define vreinterpretq_m128_f64 (   x)    vreinterpretq_f32_f64(x)

在文件 sse2neon.h 第 332 行定义.

◆ vreinterpretq_m128_s16

#define vreinterpretq_m128_s16 (   x)    vreinterpretq_f32_s16(x)

在文件 sse2neon.h 第 340 行定义.

◆ vreinterpretq_m128_s32

#define vreinterpretq_m128_s32 (   x)    vreinterpretq_f32_s32(x)

在文件 sse2neon.h 第 341 行定义.

◆ vreinterpretq_m128_s64

#define vreinterpretq_m128_s64 (   x)    vreinterpretq_f32_s64(x)

在文件 sse2neon.h 第 342 行定义.

◆ vreinterpretq_m128_s8

#define vreinterpretq_m128_s8 (   x)    vreinterpretq_f32_s8(x)

在文件 sse2neon.h 第 339 行定义.

◆ vreinterpretq_m128_u16

#define vreinterpretq_m128_u16 (   x)    vreinterpretq_f32_u16(x)

在文件 sse2neon.h 第 335 行定义.

◆ vreinterpretq_m128_u32

#define vreinterpretq_m128_u32 (   x)    vreinterpretq_f32_u32(x)

在文件 sse2neon.h 第 336 行定义.

◆ vreinterpretq_m128_u64

#define vreinterpretq_m128_u64 (   x)    vreinterpretq_f32_u64(x)

在文件 sse2neon.h 第 337 行定义.

◆ vreinterpretq_m128_u8

#define vreinterpretq_m128_u8 (   x)    vreinterpretq_f32_u8(x)

在文件 sse2neon.h 第 334 行定义.

◆ vreinterpretq_m128d_f32

#define vreinterpretq_m128d_f32 (   x)    (x)

在文件 sse2neon.h 第 430 行定义.

◆ vreinterpretq_m128d_s32

#define vreinterpretq_m128d_s32 (   x)    vreinterpretq_f32_s32(x)

在文件 sse2neon.h 第 424 行定义.

◆ vreinterpretq_m128d_s64

#define vreinterpretq_m128d_s64 (   x)    vreinterpretq_f32_s64(x)

在文件 sse2neon.h 第 425 行定义.

◆ vreinterpretq_m128d_u32

#define vreinterpretq_m128d_u32 (   x)    vreinterpretq_f32_u32(x)

在文件 sse2neon.h 第 427 行定义.

◆ vreinterpretq_m128d_u64

#define vreinterpretq_m128d_u64 (   x)    vreinterpretq_f32_u64(x)

在文件 sse2neon.h 第 428 行定义.

◆ vreinterpretq_m128i_s16

#define vreinterpretq_m128i_s16 (   x)    vreinterpretq_s64_s16(x)

在文件 sse2neon.h 第 359 行定义.

◆ vreinterpretq_m128i_s32

#define vreinterpretq_m128i_s32 (   x)    vreinterpretq_s64_s32(x)

在文件 sse2neon.h 第 360 行定义.

◆ vreinterpretq_m128i_s64

#define vreinterpretq_m128i_s64 (   x)    (x)

在文件 sse2neon.h 第 361 行定义.

◆ vreinterpretq_m128i_s8

#define vreinterpretq_m128i_s8 (   x)    vreinterpretq_s64_s8(x)

在文件 sse2neon.h 第 358 行定义.

◆ vreinterpretq_m128i_u16

#define vreinterpretq_m128i_u16 (   x)    vreinterpretq_s64_u16(x)

在文件 sse2neon.h 第 364 行定义.

◆ vreinterpretq_m128i_u32

#define vreinterpretq_m128i_u32 (   x)    vreinterpretq_s64_u32(x)

在文件 sse2neon.h 第 365 行定义.

◆ vreinterpretq_m128i_u64

#define vreinterpretq_m128i_u64 (   x)    vreinterpretq_s64_u64(x)

在文件 sse2neon.h 第 366 行定义.

◆ vreinterpretq_m128i_u8

#define vreinterpretq_m128i_u8 (   x)    vreinterpretq_s64_u8(x)

在文件 sse2neon.h 第 363 行定义.

◆ vreinterpretq_nth_u32_m128i

#define vreinterpretq_nth_u32_m128i (   x,
  n 
)    (((SIMDVec *) &x)->m128_u32[n])

在文件 sse2neon.h 第 477 行定义.

◆ vreinterpretq_nth_u64_m128i

#define vreinterpretq_nth_u64_m128i (   x,
  n 
)    (((SIMDVec *) &x)->m128_u64[n])

在文件 sse2neon.h 第 476 行定义.

◆ vreinterpretq_nth_u8_m128i

#define vreinterpretq_nth_u8_m128i (   x,
  n 
)    (((SIMDVec *) &x)->m128_u8[n])

在文件 sse2neon.h 第 478 行定义.

◆ vreinterpretq_s16_m128

#define vreinterpretq_s16_m128 (   x)    vreinterpretq_s16_f32(x)

在文件 sse2neon.h 第 354 行定义.

◆ vreinterpretq_s16_m128i

#define vreinterpretq_s16_m128i (   x)    vreinterpretq_s16_s64(x)

在文件 sse2neon.h 第 372 行定义.

◆ vreinterpretq_s32_m128

#define vreinterpretq_s32_m128 (   x)    vreinterpretq_s32_f32(x)

在文件 sse2neon.h 第 355 行定义.

◆ vreinterpretq_s32_m128i

#define vreinterpretq_s32_m128i (   x)    vreinterpretq_s32_s64(x)

在文件 sse2neon.h 第 373 行定义.

◆ vreinterpretq_s64_m128

#define vreinterpretq_s64_m128 (   x)    vreinterpretq_s64_f32(x)

在文件 sse2neon.h 第 356 行定义.

◆ vreinterpretq_s64_m128d

#define vreinterpretq_s64_m128d (   x)    vreinterpretq_s64_f32(x)

在文件 sse2neon.h 第 432 行定义.

◆ vreinterpretq_s64_m128i

#define vreinterpretq_s64_m128i (   x)    (x)

在文件 sse2neon.h 第 374 行定义.

◆ vreinterpretq_s8_m128

#define vreinterpretq_s8_m128 (   x)    vreinterpretq_s8_f32(x)

在文件 sse2neon.h 第 353 行定义.

◆ vreinterpretq_s8_m128i

#define vreinterpretq_s8_m128i (   x)    vreinterpretq_s8_s64(x)

在文件 sse2neon.h 第 371 行定义.

◆ vreinterpretq_u16_m128

#define vreinterpretq_u16_m128 (   x)    vreinterpretq_u16_f32(x)

在文件 sse2neon.h 第 349 行定义.

◆ vreinterpretq_u16_m128i

#define vreinterpretq_u16_m128i (   x)    vreinterpretq_u16_s64(x)

在文件 sse2neon.h 第 377 行定义.

◆ vreinterpretq_u32_m128

#define vreinterpretq_u32_m128 (   x)    vreinterpretq_u32_f32(x)

在文件 sse2neon.h 第 350 行定义.

◆ vreinterpretq_u32_m128d

#define vreinterpretq_u32_m128d (   x)    vreinterpretq_u32_f32(x)

在文件 sse2neon.h 第 434 行定义.

◆ vreinterpretq_u32_m128i

#define vreinterpretq_u32_m128i (   x)    vreinterpretq_u32_s64(x)

在文件 sse2neon.h 第 378 行定义.

◆ vreinterpretq_u64_m128

#define vreinterpretq_u64_m128 (   x)    vreinterpretq_u64_f32(x)

在文件 sse2neon.h 第 351 行定义.

◆ vreinterpretq_u64_m128d

#define vreinterpretq_u64_m128d (   x)    vreinterpretq_u64_f32(x)

在文件 sse2neon.h 第 435 行定义.

◆ vreinterpretq_u64_m128i

#define vreinterpretq_u64_m128i (   x)    vreinterpretq_u64_s64(x)

在文件 sse2neon.h 第 379 行定义.

◆ vreinterpretq_u8_m128

#define vreinterpretq_u8_m128 (   x)    vreinterpretq_u8_f32(x)

在文件 sse2neon.h 第 348 行定义.

◆ vreinterpretq_u8_m128i

#define vreinterpretq_u8_m128i (   x)    vreinterpretq_u8_s64(x)

在文件 sse2neon.h 第 376 行定义.

类型定义说明

◆ __m128

typedef float32x4_t __m128

在文件 sse2neon.h 第 307 行定义.

◆ __m128d

typedef float32x4_t __m128d

在文件 sse2neon.h 第 314 行定义.

◆ __m128i

typedef int64x2_t __m128i

在文件 sse2neon.h 第 316 行定义.

◆ __m64

typedef int64x1_t __m64

在文件 sse2neon.h 第 306 行定义.

◆ cmpestr_func_t

typedef int(* cmpestr_func_t) (__m128i a, int la, __m128i b, int lb)

在文件 sse2neon.h 第 9005 行定义.

枚举类型说明

◆ anonymous enum

anonymous enum
枚举值
SSE2NEON_CMPESTR_LIST 

在文件 sse2neon.h 第 9000 行定义.

9000 {
9001#define _(name, func_suffix) name,
9003#undef _
9004};
#define SSE2NEON_CMPESTR_LIST
Definition sse2neon.h:8982

◆ _mm_hint

enum _mm_hint
枚举值
_MM_HINT_NTA 
_MM_HINT_T0 
_MM_HINT_T1 
_MM_HINT_T2 

在文件 sse2neon.h 第 668 行定义.

668 {
669 _MM_HINT_NTA = 0, /* load data to L1 and L2 cache, mark it as NTA */
670 _MM_HINT_T0 = 1, /* load data to L1 and L2 cache */
671 _MM_HINT_T1 = 2, /* load data to L2 cache only */
672 _MM_HINT_T2 = 3, /* load data to L2 cache only, mark it as NTA */
673};
@ _MM_HINT_T1
Definition sse2neon.h:671
@ _MM_HINT_T0
Definition sse2neon.h:670
@ _MM_HINT_T2
Definition sse2neon.h:672
@ _MM_HINT_NTA
Definition sse2neon.h:669

函数说明

◆ _mm_abs_epi16()

FORCE_INLINE __m128i _mm_abs_epi16 ( __m128i  a)

在文件 sse2neon.h 第 6830 行定义.

6831{
6833}
#define vreinterpretq_m128i_s16(x)
Definition sse2neon.h:359

◆ _mm_abs_epi32()

FORCE_INLINE __m128i _mm_abs_epi32 ( __m128i  a)

在文件 sse2neon.h 第 6844 行定义.

6845{
6847}

◆ _mm_abs_epi8()

FORCE_INLINE __m128i _mm_abs_epi8 ( __m128i  a)

在文件 sse2neon.h 第 6858 行定义.

6859{
6861}
#define vreinterpretq_m128i_s8(x)
Definition sse2neon.h:358

◆ _mm_abs_pi16()

FORCE_INLINE __m64 _mm_abs_pi16 ( __m64  a)

在文件 sse2neon.h 第 6872 行定义.

6873{
6874 return vreinterpret_m64_s16(vabs_s16(vreinterpret_s16_m64(a)));
6875}
#define vreinterpret_m64_s16(x)
Definition sse2neon.h:382

◆ _mm_abs_pi32()

FORCE_INLINE __m64 _mm_abs_pi32 ( __m64  a)

在文件 sse2neon.h 第 6886 行定义.

6887{
6888 return vreinterpret_m64_s32(vabs_s32(vreinterpret_s32_m64(a)));
6889}
#define vreinterpret_m64_s32(x)
Definition sse2neon.h:383
#define vreinterpret_s32_m64(x)
Definition sse2neon.h:402

◆ _mm_abs_pi8()

FORCE_INLINE __m64 _mm_abs_pi8 ( __m64  a)

在文件 sse2neon.h 第 6900 行定义.

6901{
6902 return vreinterpret_m64_s8(vabs_s8(vreinterpret_s8_m64(a)));
6903}
#define vreinterpret_s8_m64(x)
Definition sse2neon.h:400

◆ _mm_add_epi16()

FORCE_INLINE __m128i _mm_add_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3098 行定义.

3099{
3102}

◆ _mm_add_epi32()

FORCE_INLINE __m128i _mm_add_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3113 行定义.

3114{
3117}

◆ _mm_add_epi64()

FORCE_INLINE __m128i _mm_add_epi64 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3122 行定义.

3123{
3126}
#define vreinterpretq_m128i_s64(x)
Definition sse2neon.h:361

◆ _mm_add_epi8()

FORCE_INLINE __m128i _mm_add_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3131 行定义.

3132{
3135}

◆ _mm_add_pd()

FORCE_INLINE __m128d _mm_add_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3140 行定义.

3141{
3142#if defined(__aarch64__)
3143 return vreinterpretq_m128d_f64(
3144 vaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3145#else
3146 double *da = (double *) &a;
3147 double *db = (double *) &b;
3148 double c[2];
3149 c[0] = da[0] + db[0];
3150 c[1] = da[1] + db[1];
3151 return vld1q_f32((float32_t *) c);
3152#endif
3153}

◆ _mm_add_ps()

FORCE_INLINE __m128 _mm_add_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1158 行定义.

1159{
1162}
#define vreinterpretq_m128_f32(x)
Definition sse2neon.h:331

◆ _mm_add_sd()

FORCE_INLINE __m128d _mm_add_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3163 行定义.

3164{
3165#if defined(__aarch64__)
3166 return _mm_move_sd(a, _mm_add_pd(a, b));
3167#else
3168 double *da = (double *) &a;
3169 double *db = (double *) &b;
3170 double c[2];
3171 c[0] = da[0] + db[0];
3172 c[1] = da[1];
3173 return vld1q_f32((float32_t *) c);
3174#endif
3175}
FORCE_INLINE __m128d _mm_move_sd(__m128d, __m128d)
Definition sse2neon.h:4927
FORCE_INLINE __m128d _mm_add_pd(__m128d a, __m128d b)
Definition sse2neon.h:3140

◆ _mm_add_si64()

FORCE_INLINE __m64 _mm_add_si64 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 3182 行定义.

3183{
3184 return vreinterpret_m64_s64(
3186}
#define vreinterpret_m64_s64(x)
Definition sse2neon.h:384
#define vreinterpret_s64_m64(x)
Definition sse2neon.h:403

◆ _mm_add_ss()

FORCE_INLINE __m128 _mm_add_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1166 行定义.

1167{
1168 float32_t b0 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 0);
1169 float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0);
1170 // the upper values in the result must be the remnants of <a>.
1171 return vreinterpretq_m128_f32(vaddq_f32(a, value));
1172}

◆ _mm_adds_epi16()

FORCE_INLINE __m128i _mm_adds_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3197 行定义.

3198{
3201}

◆ _mm_adds_epi8()

FORCE_INLINE __m128i _mm_adds_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3212 行定义.

3213{
3216}

◆ _mm_adds_epu16()

FORCE_INLINE __m128i _mm_adds_epu16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3221 行定义.

3222{
3225}

◆ _mm_adds_epu8()

FORCE_INLINE __m128i _mm_adds_epu8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3230 行定义.

3231{
3234}

◆ _mm_addsub_pd()

FORCE_INLINE __m128d _mm_addsub_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6653 行定义.

6654{
6655 _sse2neon_const __m128d mask = _mm_set_pd(1.0f, -1.0f);
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)));
6660#else
6661 return _mm_add_pd(_mm_mul_pd(b, mask), a);
6662#endif
6663}
#define _sse2neon_const
Definition sse2neon.h:99
float32x4_t __m128d
Definition sse2neon.h:314
FORCE_INLINE __m128d _mm_mul_pd(__m128d a, __m128d b)
Definition sse2neon.h:5067
FORCE_INLINE __m128d _mm_set_pd(double, double)
Definition sse2neon.h:5330

◆ _mm_addsub_ps()

FORCE_INLINE __m128 _mm_addsub_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 6669 行定义.

6670{
6671 _sse2neon_const __m128 mask = _mm_setr_ps(-1.0f, 1.0f, -1.0f, 1.0f);
6672#if defined(__aarch64__) || defined(__ARM_FEATURE_FMA) /* VFPv4+ */
6676#else
6677 return _mm_add_ps(_mm_mul_ps(b, mask), a);
6678#endif
6679}
FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x)
Definition sse2neon.h:2629
FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b)
Definition sse2neon.h:2299
FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b)
Definition sse2neon.h:1158

◆ _mm_aesdec_si128()

FORCE_INLINE __m128i _mm_aesdec_si128 ( __m128i  a,
__m128i  RoundKey 
)

在文件 sse2neon.h 第 9606 行定义.

9607{
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,
9612 };
9613 static const uint8_t ror32by8[] = {
9614 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4,
9615 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc,
9616 };
9617
9618 uint8x16_t v;
9619 uint8x16_t w = vreinterpretq_u8_m128i(a);
9620
9621 // inverse shift rows
9622 w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows));
9623
9624 // inverse sub bytes
9625 v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_rsbox), w);
9626 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x40), w - 0x40);
9627 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x80), w - 0x80);
9628 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0xc0), w - 0xc0);
9629
9630 // inverse mix columns
9631 // muliplying 'v' by 4 in GF(2^8)
9632 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b);
9633 w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b);
9634 v ^= w;
9635 v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w);
9636
9637 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) &
9638 0x1b); // muliplying 'v' by 2 in GF(2^8)
9639 w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v);
9640 w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8));
9641
9642 // add round key
9643 return vreinterpretq_m128i_u8(w) ^ RoundKey;
9644
9645#else /* ARMv7-A NEON implementation */
9646 /* FIXME: optimized for NEON */
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]];
9651 }
9652
9653 // inverse mix columns
9654 for (i = 0; i < 4; ++i) {
9655 e = v[i][0];
9656 f = v[i][1];
9657 g = v[i][2];
9658 h = v[i][3];
9659
9660 v[i][0] = SSE2NEON_MULTIPLY(e, 0x0e) ^ SSE2NEON_MULTIPLY(f, 0x0b) ^
9661 SSE2NEON_MULTIPLY(g, 0x0d) ^ SSE2NEON_MULTIPLY(h, 0x09);
9662 v[i][1] = SSE2NEON_MULTIPLY(e, 0x09) ^ SSE2NEON_MULTIPLY(f, 0x0e) ^
9663 SSE2NEON_MULTIPLY(g, 0x0b) ^ SSE2NEON_MULTIPLY(h, 0x0d);
9664 v[i][2] = SSE2NEON_MULTIPLY(e, 0x0d) ^ SSE2NEON_MULTIPLY(f, 0x09) ^
9665 SSE2NEON_MULTIPLY(g, 0x0e) ^ SSE2NEON_MULTIPLY(h, 0x0b);
9666 v[i][3] = SSE2NEON_MULTIPLY(e, 0x0b) ^ SSE2NEON_MULTIPLY(f, 0x0d) ^
9667 SSE2NEON_MULTIPLY(g, 0x09) ^ SSE2NEON_MULTIPLY(h, 0x0e);
9668 }
9669
9670 return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)) ^ RoundKey;
9671#endif
9672}
double f
#define SSE2NEON_MULTIPLY(x, y)
Definition sse2neon.h:9496
FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4(const uint8_t *p)
Definition sse2neon.h:533

◆ _mm_aesdeclast_si128()

FORCE_INLINE __m128i _mm_aesdeclast_si128 ( __m128i  a,
__m128i  RoundKey 
)

在文件 sse2neon.h 第 9727 行定义.

9728{
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,
9733 };
9734
9735 uint8x16_t v;
9736 uint8x16_t w = vreinterpretq_u8_m128i(a);
9737
9738 // inverse shift rows
9739 w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows));
9740
9741 // inverse sub bytes
9742 v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_rsbox), w);
9743 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x40), w - 0x40);
9744 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x80), w - 0x80);
9745 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0xc0), w - 0xc0);
9746
9747 // add round key
9748 return vreinterpretq_m128i_u8(v) ^ RoundKey;
9749
9750#else /* ARMv7-A NEON implementation */
9751 /* FIXME: optimized for NEON */
9752 uint8_t v[4][4];
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]];
9756 }
9757
9758 return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)) ^ RoundKey;
9759#endif
9760}

◆ _mm_aesenc_si128()

FORCE_INLINE __m128i _mm_aesenc_si128 ( __m128i  a,
__m128i  RoundKey 
)

在文件 sse2neon.h 第 9509 行定义.

9510{
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,
9515 };
9516 static const uint8_t ror32by8[] = {
9517 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4,
9518 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc,
9519 };
9520
9521 uint8x16_t v;
9522 uint8x16_t w = vreinterpretq_u8_m128i(a);
9523
9524 /* shift rows */
9525 w = vqtbl1q_u8(w, vld1q_u8(shift_rows));
9526
9527 /* sub bytes */
9528 // Here, we separate the whole 256-bytes table into 4 64-bytes tables, and
9529 // look up each of the table. After each lookup, we load the next table
9530 // which locates at the next 64-bytes. In the meantime, the index in the
9531 // table would be smaller than it was, so the index parameters of
9532 // `vqtbx4q_u8()` need to be added the same constant as the loaded tables.
9533 v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), w);
9534 // 'w-0x40' equals to 'vsubq_u8(w, vdupq_n_u8(0x40))'
9535 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), w - 0x40);
9536 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), w - 0x80);
9537 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), w - 0xc0);
9538
9539 /* mix columns */
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));
9543
9544 /* add round key */
9545 return vreinterpretq_m128i_u8(w) ^ RoundKey;
9546
9547#else /* ARMv7-A implementation for a table-based AES */
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))
9551// muliplying 'x' by 2 in GF(2^8)
9552#define SSE2NEON_AES_F2(x) ((x << 1) ^ (((x >> 7) & 1) * 0x011b /* WPOLY */))
9553// muliplying 'x' by 3 in GF(2^8)
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))
9563
9564 // this generates a table containing every possible permutation of
9565 // shift_rows() and sub_bytes() with mix_columns().
9566 static const uint32_t ALIGN_STRUCT(16) aes_table[4][256] = {
9571 };
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
9579
9580 uint32_t x0 = _mm_cvtsi128_si32(a); // get a[31:0]
9581 uint32_t x1 =
9582 _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0x55)); // get a[63:32]
9583 uint32_t x2 =
9584 _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xAA)); // get a[95:64]
9585 uint32_t x3 =
9586 _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xFF)); // get a[127:96]
9587
9588 // finish the modulo addition step in mix_columns()
9589 __m128i out = _mm_set_epi32(
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]));
9598
9599 return _mm_xor_si128(out, RoundKey);
9600#endif
9601}
#define SSE2NEON_AES_U2(p)
FORCE_INLINE __m128i _mm_set_epi32(int, int, int, int)
Definition sse2neon.h:5277
#define SSE2NEON_AES_U0(p)
#define ALIGN_STRUCT(x)
Definition sse2neon.h:89
FORCE_INLINE __m128i _mm_xor_si128(__m128i a, __m128i b)
Definition sse2neon.h:6631
#define SSE2NEON_AES_U3(p)
#define SSE2NEON_AES_U1(p)
#define SSE2NEON_AES_SBOX(w)
Definition sse2neon.h:9405
#define _mm_shuffle_epi32(a, imm)
Definition sse2neon.h:5524
FORCE_INLINE int _mm_cvtsi128_si32(__m128i a)
Definition sse2neon.h:4341

◆ _mm_aesenclast_si128()

FORCE_INLINE __m128i _mm_aesenclast_si128 ( __m128i  a,
__m128i  RoundKey 
)

在文件 sse2neon.h 第 9677 行定义.

9678{
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,
9683 };
9684
9685 uint8x16_t v;
9686 uint8x16_t w = vreinterpretq_u8_m128i(a);
9687
9688 // shift rows
9689 w = vqtbl1q_u8(w, vld1q_u8(shift_rows));
9690
9691 // sub bytes
9692 v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), w);
9693 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), w - 0x40);
9694 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), w - 0x80);
9695 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), w - 0xc0);
9696
9697 // add round key
9698 return vreinterpretq_m128i_u8(v) ^ RoundKey;
9699
9700#else /* ARMv7-A implementation */
9701 uint8_t v[16] = {
9702 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 0)],
9703 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 5)],
9704 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 10)],
9705 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 15)],
9706 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 4)],
9707 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 9)],
9708 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 14)],
9709 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 3)],
9710 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 8)],
9711 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 13)],
9712 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 2)],
9713 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 7)],
9714 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 12)],
9715 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 1)],
9716 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 6)],
9717 _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 11)],
9718 };
9719
9720 return vreinterpretq_m128i_u8(vld1q_u8(v)) ^ RoundKey;
9721#endif
9722}

◆ _mm_aesimc_si128()

FORCE_INLINE __m128i _mm_aesimc_si128 ( __m128i  a)

在文件 sse2neon.h 第 9764 行定义.

9765{
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,
9770 };
9771 uint8x16_t v = vreinterpretq_u8_m128i(a);
9772 uint8x16_t w;
9773
9774 // multiplying 'v' by 4 in GF(2^8)
9775 w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b);
9776 w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b);
9777 v ^= w;
9778 v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w);
9779
9780 // multiplying 'v' by 2 in GF(2^8)
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));
9784 return vreinterpretq_m128i_u8(w);
9785
9786#else /* ARMv7-A NEON implementation */
9787 uint8_t i, e, f, g, h, v[4][4];
9788 vst1q_u8((uint8_t *) v, vreinterpretq_u8_m128i(a));
9789 for (i = 0; i < 4; ++i) {
9790 e = v[i][0];
9791 f = v[i][1];
9792 g = v[i][2];
9793 h = v[i][3];
9794
9795 v[i][0] = SSE2NEON_MULTIPLY(e, 0x0e) ^ SSE2NEON_MULTIPLY(f, 0x0b) ^
9796 SSE2NEON_MULTIPLY(g, 0x0d) ^ SSE2NEON_MULTIPLY(h, 0x09);
9797 v[i][1] = SSE2NEON_MULTIPLY(e, 0x09) ^ SSE2NEON_MULTIPLY(f, 0x0e) ^
9798 SSE2NEON_MULTIPLY(g, 0x0b) ^ SSE2NEON_MULTIPLY(h, 0x0d);
9799 v[i][2] = SSE2NEON_MULTIPLY(e, 0x0d) ^ SSE2NEON_MULTIPLY(f, 0x09) ^
9800 SSE2NEON_MULTIPLY(g, 0x0e) ^ SSE2NEON_MULTIPLY(h, 0x0b);
9801 v[i][3] = SSE2NEON_MULTIPLY(e, 0x0b) ^ SSE2NEON_MULTIPLY(f, 0x0d) ^
9802 SSE2NEON_MULTIPLY(g, 0x09) ^ SSE2NEON_MULTIPLY(h, 0x0e);
9803 }
9804
9805 return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v));
9806#endif
9807}

◆ _mm_aeskeygenassist_si128()

FORCE_INLINE __m128i _mm_aeskeygenassist_si128 ( __m128i  a,
const int  rcon 
)

在文件 sse2neon.h 第 9815 行定义.

9816{
9817#if defined(__aarch64__)
9818 uint8x16_t _a = vreinterpretq_u8_m128i(a);
9819 uint8x16_t v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), _a);
9820 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), _a - 0x40);
9821 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), _a - 0x80);
9822 v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), _a - 0xc0);
9823
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));
9830
9831 return vreinterpretq_m128i_u32(vbslq_u32(select_mask, x, ror_xor_x));
9832
9833#else /* ARMv7-A NEON implementation */
9834 uint32_t X1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0x55));
9835 uint32_t X3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xFF));
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]];
9839 }
9840 return _mm_set_epi32(((X3 >> 8) | (X3 << 24)) ^ rcon, X3,
9841 ((X1 >> 8) | (X1 << 24)) ^ rcon, X1);
9842#endif
9843}

◆ _mm_and_pd()

FORCE_INLINE __m128d _mm_and_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3245 行定义.

3246{
3249}
#define vreinterpretq_m128d_s64(x)
Definition sse2neon.h:425

◆ _mm_and_ps()

FORCE_INLINE __m128 _mm_and_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1183 行定义.

1184{
1187}
#define vreinterpretq_m128_s32(x)
Definition sse2neon.h:341
#define vreinterpretq_s32_m128(x)
Definition sse2neon.h:355

◆ _mm_and_si128()

FORCE_INLINE __m128i _mm_and_si128 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3257 行定义.

3258{
3261}

◆ _mm_andnot_pd()

FORCE_INLINE __m128d _mm_andnot_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3272 行定义.

3273{
3274 // *NOTE* argument swap
3277}

◆ _mm_andnot_ps()

FORCE_INLINE __m128 _mm_andnot_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1198 行定义.

1199{
1201 vbicq_s32(vreinterpretq_s32_m128(b),
1202 vreinterpretq_s32_m128(a))); // *NOTE* argument swap
1203}

◆ _mm_andnot_si128()

FORCE_INLINE __m128i _mm_andnot_si128 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3285 行定义.

3286{
3288 vbicq_s32(vreinterpretq_s32_m128i(b),
3289 vreinterpretq_s32_m128i(a))); // *NOTE* argument swap
3290}

◆ _mm_avg_epu16()

FORCE_INLINE __m128i _mm_avg_epu16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3301 行定义.

3302{
3303 return (__m128i) vrhaddq_u16(vreinterpretq_u16_m128i(a),
3305}

◆ _mm_avg_epu8()

FORCE_INLINE __m128i _mm_avg_epu8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3316 行定义.

3317{
3320}

◆ _mm_avg_pu16()

FORCE_INLINE __m64 _mm_avg_pu16 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 1214 行定义.

1215{
1216 return vreinterpret_m64_u16(
1217 vrhadd_u16(vreinterpret_u16_m64(a), vreinterpret_u16_m64(b)));
1218}
#define vreinterpret_u16_m64(x)
Definition sse2neon.h:396
#define vreinterpret_m64_u16(x)
Definition sse2neon.h:387

◆ _mm_avg_pu8()

FORCE_INLINE __m64 _mm_avg_pu8 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 1229 行定义.

1230{
1231 return vreinterpret_m64_u8(
1232 vrhadd_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b)));
1233}

◆ _mm_blend_ps()

FORCE_INLINE __m128 _mm_blend_ps ( __m128  _a,
__m128  _b,
const char  imm8 
)

在文件 sse2neon.h 第 7583 行定义.

7584{
7585 const uint32_t ALIGN_STRUCT(16)
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);
7591 float32x4_t a = vreinterpretq_f32_m128(_a);
7592 float32x4_t b = vreinterpretq_f32_m128(_b);
7593 return vreinterpretq_m128_f32(vbslq_f32(mask, b, a));
7594}

◆ _mm_blendv_epi8()

FORCE_INLINE __m128i _mm_blendv_epi8 ( __m128i  _a,
__m128i  _b,
__m128i  _mask 
)

在文件 sse2neon.h 第 7607 行定义.

7608{
7609 // Use a signed shift right to create a mask with the sign bit
7610 uint8x16_t mask =
7611 vreinterpretq_u8_s8(vshrq_n_s8(vreinterpretq_s8_m128i(_mask), 7));
7612 uint8x16_t a = vreinterpretq_u8_m128i(_a);
7613 uint8x16_t b = vreinterpretq_u8_m128i(_b);
7614 return vreinterpretq_m128i_u8(vbslq_u8(mask, b, a));
7615}

◆ _mm_blendv_pd()

FORCE_INLINE __m128d _mm_blendv_pd ( __m128d  _a,
__m128d  _b,
__m128d  _mask 
)

在文件 sse2neon.h 第 7620 行定义.

7621{
7622 uint64x2_t mask =
7623 vreinterpretq_u64_s64(vshrq_n_s64(vreinterpretq_s64_m128d(_mask), 63));
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));
7628#else
7629 uint64x2_t a = vreinterpretq_u64_m128d(_a);
7630 uint64x2_t b = vreinterpretq_u64_m128d(_b);
7631 return vreinterpretq_m128d_u64(vbslq_u64(mask, b, a));
7632#endif
7633}
#define vreinterpretq_m128d_u64(x)
Definition sse2neon.h:428

◆ _mm_blendv_ps()

FORCE_INLINE __m128 _mm_blendv_ps ( __m128  _a,
__m128  _b,
__m128  _mask 
)

在文件 sse2neon.h 第 7638 行定义.

7639{
7640 // Use a signed shift right to create a mask with the sign bit
7641 uint32x4_t mask =
7642 vreinterpretq_u32_s32(vshrq_n_s32(vreinterpretq_s32_m128(_mask), 31));
7643 float32x4_t a = vreinterpretq_f32_m128(_a);
7644 float32x4_t b = vreinterpretq_f32_m128(_b);
7645 return vreinterpretq_m128_f32(vbslq_f32(mask, b, a));
7646}

◆ _mm_castpd_ps()

FORCE_INLINE __m128 _mm_castpd_ps ( __m128d  a)

在文件 sse2neon.h 第 3335 行定义.

3336{
3338}
#define vreinterpretq_m128_s64(x)
Definition sse2neon.h:342

◆ _mm_castpd_si128()

FORCE_INLINE __m128i _mm_castpd_si128 ( __m128d  a)

在文件 sse2neon.h 第 3343 行定义.

3344{
3346}

◆ _mm_castps_pd()

FORCE_INLINE __m128d _mm_castps_pd ( __m128  a)

在文件 sse2neon.h 第 3351 行定义.

3352{
3354}
#define vreinterpretq_m128d_s32(x)
Definition sse2neon.h:424

◆ _mm_castps_si128()

FORCE_INLINE __m128i _mm_castps_si128 ( __m128  a)

在文件 sse2neon.h 第 3359 行定义.

3360{
3362}

◆ _mm_castsi128_pd()

FORCE_INLINE __m128d _mm_castsi128_pd ( __m128i  a)

在文件 sse2neon.h 第 3367 行定义.

3368{
3369#if defined(__aarch64__)
3370 return vreinterpretq_m128d_f64(vreinterpretq_f64_m128i(a));
3371#else
3373#endif
3374}
#define vreinterpretq_f32_m128i(x)
Definition sse2neon.h:368
#define vreinterpretq_m128d_f32(x)
Definition sse2neon.h:430
#define vreinterpretq_f64_m128i(x)
Definition sse2neon.h:369

◆ _mm_castsi128_ps()

FORCE_INLINE __m128 _mm_castsi128_ps ( __m128i  a)

在文件 sse2neon.h 第 3379 行定义.

3380{
3382}

◆ _mm_ceil_pd()

FORCE_INLINE __m128d _mm_ceil_pd ( __m128d  a)

在文件 sse2neon.h 第 7652 行定义.

7653{
7654#if defined(__aarch64__)
7655 return vreinterpretq_m128d_f64(vrndpq_f64(vreinterpretq_f64_m128d(a)));
7656#else
7657 double *f = (double *) &a;
7658 return _mm_set_pd(ceil(f[1]), ceil(f[0]));
7659#endif
7660}

◆ _mm_ceil_ps()

FORCE_INLINE __m128 _mm_ceil_ps ( __m128  a)

在文件 sse2neon.h 第 7666 行定义.

7667{
7668#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
7669 return vreinterpretq_m128_f32(vrndpq_f32(vreinterpretq_f32_m128(a)));
7670#else
7671 float *f = (float *) &a;
7672 return _mm_set_ps(ceilf(f[3]), ceilf(f[2]), ceilf(f[1]), ceilf(f[0]));
7673#endif
7674}
FORCE_INLINE __m128 _mm_set_ps(float w, float z, float y, float x)
Definition sse2neon.h:2536

◆ _mm_ceil_sd()

FORCE_INLINE __m128d _mm_ceil_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 7681 行定义.

7682{
7683 return _mm_move_sd(a, _mm_ceil_pd(b));
7684}
FORCE_INLINE __m128d _mm_ceil_pd(__m128d)
Definition sse2neon.h:7652

◆ _mm_ceil_ss()

FORCE_INLINE __m128 _mm_ceil_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 7695 行定义.

7696{
7697 return _mm_move_ss(a, _mm_ceil_ps(b));
7698}
FORCE_INLINE __m128 _mm_ceil_ps(__m128)
Definition sse2neon.h:7666
FORCE_INLINE __m128 _mm_move_ss(__m128, __m128)
Definition sse2neon.h:2213

◆ _mm_clflush()

FORCE_INLINE void _mm_clflush ( void const *  p)

在文件 sse2neon.h 第 3390 行定义.

3391{
3392 (void) p;
3393
3394 /* sys_icache_invalidate is supported since macOS 10.5.
3395 * However, it does not work on non-jailbroken iOS devices, although the
3396 * compilation is successful.
3397 */
3398#if defined(__APPLE__)
3399 sys_icache_invalidate((void *) (uintptr_t) p, SSE2NEON_CACHELINE_SIZE);
3400#elif defined(__GNUC__) || defined(__clang__)
3401 uintptr_t ptr = (uintptr_t) p;
3402 __builtin___clear_cache((char *) ptr,
3403 (char *) ptr + SSE2NEON_CACHELINE_SIZE);
3404#else
3405 /* FIXME: MSVC support */
3406#endif
3407}
#define SSE2NEON_CACHELINE_SIZE
Definition sse2neon.h:198

◆ _mm_clmulepi64_si128()

FORCE_INLINE __m128i _mm_clmulepi64_si128 ( __m128i  _a,
__m128i  _b,
const int  imm 
)

在文件 sse2neon.h 第 9929 行定义.

9930{
9931 uint64x2_t a = vreinterpretq_u64_m128i(_a);
9932 uint64x2_t b = vreinterpretq_u64_m128i(_b);
9933 switch (imm & 0x11) {
9934 case 0x00:
9936 _sse2neon_vmull_p64(vget_low_u64(a), vget_low_u64(b)));
9937 case 0x01:
9939 _sse2neon_vmull_p64(vget_high_u64(a), vget_low_u64(b)));
9940 case 0x10:
9942 _sse2neon_vmull_p64(vget_low_u64(a), vget_high_u64(b)));
9943 case 0x11:
9945 _sse2neon_vmull_p64(vget_high_u64(a), vget_high_u64(b)));
9946 default:
9947 abort();
9948 }
9949}

◆ _mm_cmpeq_epi16()

FORCE_INLINE __m128i _mm_cmpeq_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3412 行定义.

3413{
3416}

◆ _mm_cmpeq_epi32()

FORCE_INLINE __m128i _mm_cmpeq_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3420 行定义.

3421{
3424}

◆ _mm_cmpeq_epi64()

FORCE_INLINE __m128i _mm_cmpeq_epi64 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 7702 行定义.

7703{
7704#if defined(__aarch64__)
7707#else
7708 // ARMv7 lacks vceqq_u64
7709 // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi)
7710 uint32x4_t cmp =
7712 uint32x4_t swapped = vrev64q_u32(cmp);
7713 return vreinterpretq_m128i_u32(vandq_u32(cmp, swapped));
7714#endif
7715}

◆ _mm_cmpeq_epi8()

FORCE_INLINE __m128i _mm_cmpeq_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3429 行定义.

3430{
3433}

◆ _mm_cmpeq_pd()

FORCE_INLINE __m128d _mm_cmpeq_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3438 行定义.

3439{
3440#if defined(__aarch64__)
3442 vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3443#else
3444 // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi)
3445 uint32x4_t cmp =
3447 uint32x4_t swapped = vrev64q_u32(cmp);
3448 return vreinterpretq_m128d_u32(vandq_u32(cmp, swapped));
3449#endif
3450}
#define vreinterpretq_u32_m128d(x)
Definition sse2neon.h:434
#define vreinterpretq_m128d_u32(x)
Definition sse2neon.h:427

◆ _mm_cmpeq_ps()

FORCE_INLINE __m128 _mm_cmpeq_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1237 行定义.

1238{
1241}
#define vreinterpretq_m128_u32(x)
Definition sse2neon.h:336

◆ _mm_cmpeq_sd()

FORCE_INLINE __m128d _mm_cmpeq_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3456 行定义.

3457{
3458 return _mm_move_sd(a, _mm_cmpeq_pd(a, b));
3459}
FORCE_INLINE __m128d _mm_cmpeq_pd(__m128d a, __m128d b)
Definition sse2neon.h:3438

◆ _mm_cmpeq_ss()

FORCE_INLINE __m128 _mm_cmpeq_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1245 行定义.

1246{
1247 return _mm_move_ss(a, _mm_cmpeq_ps(a, b));
1248}
FORCE_INLINE __m128 _mm_cmpeq_ps(__m128 a, __m128 b)
Definition sse2neon.h:1237

◆ _mm_cmpestra()

FORCE_INLINE int _mm_cmpestra ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9132 行定义.

9137{
9138 int lb_cpy = lb;
9139 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX);
9140 return !r2 & (lb_cpy > bound);
9141}
#define SSE2NEON_COMP_AGG(a, b, la, lb, imm8, IE)
Definition sse2neon.h:9090

◆ _mm_cmpestrc()

FORCE_INLINE int _mm_cmpestrc ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9146 行定义.

9151{
9152 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX);
9153 return r2 != 0;
9154}

◆ _mm_cmpestri()

FORCE_INLINE int _mm_cmpestri ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9159 行定义.

9164{
9165 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX);
9166 SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8);
9167}
#define SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8)
Definition sse2neon.h:9096

◆ _mm_cmpestrm()

FORCE_INLINE __m128i _mm_cmpestrm ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9173 行定义.

9174{
9175 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX);
9177}
#define SSE2NEON_CMPSTR_GENERATE_MASK(dst)
Definition sse2neon.h:9101

◆ _mm_cmpestro()

FORCE_INLINE int _mm_cmpestro ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9182 行定义.

9187{
9188 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX);
9189 return r2 & 1;
9190}

◆ _mm_cmpestrs()

FORCE_INLINE int _mm_cmpestrs ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9195 行定义.

9200{
9201 SSE2NEON_CMPSTR_SET_UPPER(bound, imm8);
9202 return la <= (bound - 1);
9203}

◆ _mm_cmpestrz()

FORCE_INLINE int _mm_cmpestrz ( __m128i  a,
int  la,
__m128i  b,
int  lb,
const int  imm8 
)

在文件 sse2neon.h 第 9208 行定义.

9213{
9214 SSE2NEON_CMPSTR_SET_UPPER(bound, imm8);
9215 return lb <= (bound - 1);
9216}

◆ _mm_cmpge_pd()

FORCE_INLINE __m128d _mm_cmpge_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3464 行定义.

3465{
3466#if defined(__aarch64__)
3468 vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3469#else
3470 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3471 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3472 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3473 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3474 uint64_t d[2];
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);
3477
3478 return vreinterpretq_m128d_u64(vld1q_u64(d));
3479#endif
3480}

◆ _mm_cmpge_ps()

FORCE_INLINE __m128 _mm_cmpge_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1252 行定义.

1253{
1256}

◆ _mm_cmpge_sd()

FORCE_INLINE __m128d _mm_cmpge_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3486 行定义.

3487{
3488#if defined(__aarch64__)
3489 return _mm_move_sd(a, _mm_cmpge_pd(a, b));
3490#else
3491 // expand "_mm_cmpge_pd()" to reduce unnecessary operations
3492 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3493 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3494 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3495 uint64_t d[2];
3496 d[0] = (*(double *) &a0) >= (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3497 d[1] = a1;
3498
3499 return vreinterpretq_m128d_u64(vld1q_u64(d));
3500#endif
3501}
FORCE_INLINE __m128d _mm_cmpge_pd(__m128d a, __m128d b)
Definition sse2neon.h:3464

◆ _mm_cmpge_ss()

FORCE_INLINE __m128 _mm_cmpge_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1260 行定义.

1261{
1262 return _mm_move_ss(a, _mm_cmpge_ps(a, b));
1263}
FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b)
Definition sse2neon.h:1252

◆ _mm_cmpgt_epi16()

FORCE_INLINE __m128i _mm_cmpgt_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3512 行定义.

3513{
3516}

◆ _mm_cmpgt_epi32()

FORCE_INLINE __m128i _mm_cmpgt_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3521 行定义.

3522{
3525}

◆ _mm_cmpgt_epi64()

FORCE_INLINE __m128i _mm_cmpgt_epi64 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 9314 行定义.

9315{
9316#if defined(__aarch64__)
9319#else
9320 return vreinterpretq_m128i_s64(vshrq_n_s64(
9322 63));
9323#endif
9324}

◆ _mm_cmpgt_epi8()

FORCE_INLINE __m128i _mm_cmpgt_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3536 行定义.

3537{
3540}

◆ _mm_cmpgt_pd()

FORCE_INLINE __m128d _mm_cmpgt_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3545 行定义.

3546{
3547#if defined(__aarch64__)
3549 vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3550#else
3551 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3552 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3553 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3554 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3555 uint64_t d[2];
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);
3558
3559 return vreinterpretq_m128d_u64(vld1q_u64(d));
3560#endif
3561}

◆ _mm_cmpgt_ps()

FORCE_INLINE __m128 _mm_cmpgt_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1273 行定义.

1274{
1277}

◆ _mm_cmpgt_sd()

FORCE_INLINE __m128d _mm_cmpgt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3567 行定义.

3568{
3569#if defined(__aarch64__)
3570 return _mm_move_sd(a, _mm_cmpgt_pd(a, b));
3571#else
3572 // expand "_mm_cmpge_pd()" to reduce unnecessary operations
3573 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3574 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3575 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3576 uint64_t d[2];
3577 d[0] = (*(double *) &a0) > (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3578 d[1] = a1;
3579
3580 return vreinterpretq_m128d_u64(vld1q_u64(d));
3581#endif
3582}
FORCE_INLINE __m128d _mm_cmpgt_pd(__m128d a, __m128d b)
Definition sse2neon.h:3545

◆ _mm_cmpgt_ss()

FORCE_INLINE __m128 _mm_cmpgt_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1281 行定义.

1282{
1283 return _mm_move_ss(a, _mm_cmpgt_ps(a, b));
1284}
FORCE_INLINE __m128 _mm_cmpgt_ps(__m128 a, __m128 b)
Definition sse2neon.h:1273

◆ _mm_cmpistra()

FORCE_INLINE int _mm_cmpistra ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9248 行定义.

9249{
9250 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX);
9251 return !r2 & (lb >= bound);
9252}

◆ _mm_cmpistrc()

FORCE_INLINE int _mm_cmpistrc ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9257 行定义.

9258{
9259 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX);
9260 return r2 != 0;
9261}

◆ _mm_cmpistri()

FORCE_INLINE int _mm_cmpistri ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9266 行定义.

9267{
9268 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX);
9269 SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8);
9270}

◆ _mm_cmpistrm()

FORCE_INLINE __m128i _mm_cmpistrm ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9275 行定义.

9276{
9277 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX);
9279}

◆ _mm_cmpistro()

FORCE_INLINE int _mm_cmpistro ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9284 行定义.

9285{
9286 SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX);
9287 return r2 & 1;
9288}

◆ _mm_cmpistrs()

FORCE_INLINE int _mm_cmpistrs ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9293 行定义.

9294{
9295 SSE2NEON_CMPSTR_SET_UPPER(bound, imm8);
9296 int la;
9297 SSE2NEON_CMPISTRX_LENGTH(a, la, imm8);
9298 return la <= (bound - 1);
9299}
#define SSE2NEON_CMPISTRX_LENGTH(str, len, imm8)
Definition sse2neon.h:9218

◆ _mm_cmpistrz()

FORCE_INLINE int _mm_cmpistrz ( __m128i  a,
__m128i  b,
const int  imm8 
)

在文件 sse2neon.h 第 9304 行定义.

9305{
9306 SSE2NEON_CMPSTR_SET_UPPER(bound, imm8);
9307 int lb;
9308 SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8);
9309 return lb <= (bound - 1);
9310}

◆ _mm_cmple_pd()

FORCE_INLINE __m128d _mm_cmple_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3587 行定义.

3588{
3589#if defined(__aarch64__)
3591 vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3592#else
3593 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3594 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3595 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3596 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3597 uint64_t d[2];
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);
3600
3601 return vreinterpretq_m128d_u64(vld1q_u64(d));
3602#endif
3603}

◆ _mm_cmple_ps()

FORCE_INLINE __m128 _mm_cmple_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1294 行定义.

1295{
1298}

◆ _mm_cmple_sd()

FORCE_INLINE __m128d _mm_cmple_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3609 行定义.

3610{
3611#if defined(__aarch64__)
3612 return _mm_move_sd(a, _mm_cmple_pd(a, b));
3613#else
3614 // expand "_mm_cmpge_pd()" to reduce unnecessary operations
3615 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3616 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3617 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3618 uint64_t d[2];
3619 d[0] = (*(double *) &a0) <= (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3620 d[1] = a1;
3621
3622 return vreinterpretq_m128d_u64(vld1q_u64(d));
3623#endif
3624}
FORCE_INLINE __m128d _mm_cmple_pd(__m128d a, __m128d b)
Definition sse2neon.h:3587

◆ _mm_cmple_ss()

FORCE_INLINE __m128 _mm_cmple_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1302 行定义.

1303{
1304 return _mm_move_ss(a, _mm_cmple_ps(a, b));
1305}
FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b)
Definition sse2neon.h:1294

◆ _mm_cmplt_epi16()

FORCE_INLINE __m128i _mm_cmplt_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3635 行定义.

3636{
3639}

◆ _mm_cmplt_epi32()

FORCE_INLINE __m128i _mm_cmplt_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3645 行定义.

3646{
3649}

◆ _mm_cmplt_epi8()

FORCE_INLINE __m128i _mm_cmplt_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 3654 行定义.

3655{
3658}

◆ _mm_cmplt_pd()

FORCE_INLINE __m128d _mm_cmplt_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3663 行定义.

3664{
3665#if defined(__aarch64__)
3667 vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
3668#else
3669 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3670 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3671 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3672 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3673 uint64_t d[2];
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);
3676
3677 return vreinterpretq_m128d_u64(vld1q_u64(d));
3678#endif
3679}

◆ _mm_cmplt_ps()

FORCE_INLINE __m128 _mm_cmplt_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1309 行定义.

1310{
1313}

◆ _mm_cmplt_sd()

FORCE_INLINE __m128d _mm_cmplt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3685 行定义.

3686{
3687#if defined(__aarch64__)
3688 return _mm_move_sd(a, _mm_cmplt_pd(a, b));
3689#else
3690 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3691 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3692 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3693 uint64_t d[2];
3694 d[0] = (*(double *) &a0) < (*(double *) &b0) ? ~UINT64_C(0) : UINT64_C(0);
3695 d[1] = a1;
3696
3697 return vreinterpretq_m128d_u64(vld1q_u64(d));
3698#endif
3699}
FORCE_INLINE __m128d _mm_cmplt_pd(__m128d a, __m128d b)
Definition sse2neon.h:3663

◆ _mm_cmplt_ss()

FORCE_INLINE __m128 _mm_cmplt_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1317 行定义.

1318{
1319 return _mm_move_ss(a, _mm_cmplt_ps(a, b));
1320}
FORCE_INLINE __m128 _mm_cmplt_ps(__m128 a, __m128 b)
Definition sse2neon.h:1309

◆ _mm_cmpneq_pd()

FORCE_INLINE __m128d _mm_cmpneq_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3704 行定义.

3705{
3706#if defined(__aarch64__)
3707 return vreinterpretq_m128d_s32(vmvnq_s32(vreinterpretq_s32_u64(
3708 vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)))));
3709#else
3710 // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi)
3711 uint32x4_t cmp =
3713 uint32x4_t swapped = vrev64q_u32(cmp);
3714 return vreinterpretq_m128d_u32(vmvnq_u32(vandq_u32(cmp, swapped)));
3715#endif
3716}

◆ _mm_cmpneq_ps()

FORCE_INLINE __m128 _mm_cmpneq_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1324 行定义.

1325{
1326 return vreinterpretq_m128_u32(vmvnq_u32(
1328}

◆ _mm_cmpneq_sd()

FORCE_INLINE __m128d _mm_cmpneq_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3722 行定义.

3723{
3724 return _mm_move_sd(a, _mm_cmpneq_pd(a, b));
3725}
FORCE_INLINE __m128d _mm_cmpneq_pd(__m128d a, __m128d b)
Definition sse2neon.h:3704

◆ _mm_cmpneq_ss()

FORCE_INLINE __m128 _mm_cmpneq_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1332 行定义.

1333{
1334 return _mm_move_ss(a, _mm_cmpneq_ps(a, b));
1335}
FORCE_INLINE __m128 _mm_cmpneq_ps(__m128 a, __m128 b)
Definition sse2neon.h:1324

◆ _mm_cmpnge_pd()

FORCE_INLINE __m128d _mm_cmpnge_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3730 行定义.

3731{
3732#if defined(__aarch64__)
3733 return vreinterpretq_m128d_u64(veorq_u64(
3734 vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3735 vdupq_n_u64(UINT64_MAX)));
3736#else
3737 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3738 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3739 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3740 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3741 uint64_t d[2];
3742 d[0] =
3743 !((*(double *) &a0) >= (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3744 d[1] =
3745 !((*(double *) &a1) >= (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3746
3747 return vreinterpretq_m128d_u64(vld1q_u64(d));
3748#endif
3749}

◆ _mm_cmpnge_ps()

FORCE_INLINE __m128 _mm_cmpnge_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1339 行定义.

1340{
1341 return vreinterpretq_m128_u32(vmvnq_u32(
1343}

◆ _mm_cmpnge_sd()

FORCE_INLINE __m128d _mm_cmpnge_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3755 行定义.

3756{
3757 return _mm_move_sd(a, _mm_cmpnge_pd(a, b));
3758}
FORCE_INLINE __m128d _mm_cmpnge_pd(__m128d a, __m128d b)
Definition sse2neon.h:3730

◆ _mm_cmpnge_ss()

FORCE_INLINE __m128 _mm_cmpnge_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1347 行定义.

1348{
1349 return _mm_move_ss(a, _mm_cmpnge_ps(a, b));
1350}
FORCE_INLINE __m128 _mm_cmpnge_ps(__m128 a, __m128 b)
Definition sse2neon.h:1339

◆ _mm_cmpngt_pd()

FORCE_INLINE __m128d _mm_cmpngt_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3763 行定义.

3764{
3765#if defined(__aarch64__)
3766 return vreinterpretq_m128d_u64(veorq_u64(
3767 vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3768 vdupq_n_u64(UINT64_MAX)));
3769#else
3770 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3771 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3772 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3773 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3774 uint64_t d[2];
3775 d[0] =
3776 !((*(double *) &a0) > (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3777 d[1] =
3778 !((*(double *) &a1) > (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3779
3780 return vreinterpretq_m128d_u64(vld1q_u64(d));
3781#endif
3782}

◆ _mm_cmpngt_ps()

FORCE_INLINE __m128 _mm_cmpngt_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1354 行定义.

1355{
1356 return vreinterpretq_m128_u32(vmvnq_u32(
1358}

◆ _mm_cmpngt_sd()

FORCE_INLINE __m128d _mm_cmpngt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3788 行定义.

3789{
3790 return _mm_move_sd(a, _mm_cmpngt_pd(a, b));
3791}
FORCE_INLINE __m128d _mm_cmpngt_pd(__m128d a, __m128d b)
Definition sse2neon.h:3763

◆ _mm_cmpngt_ss()

FORCE_INLINE __m128 _mm_cmpngt_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1362 行定义.

1363{
1364 return _mm_move_ss(a, _mm_cmpngt_ps(a, b));
1365}
FORCE_INLINE __m128 _mm_cmpngt_ps(__m128 a, __m128 b)
Definition sse2neon.h:1354

◆ _mm_cmpnle_pd()

FORCE_INLINE __m128d _mm_cmpnle_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3796 行定义.

3797{
3798#if defined(__aarch64__)
3799 return vreinterpretq_m128d_u64(veorq_u64(
3800 vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3801 vdupq_n_u64(UINT64_MAX)));
3802#else
3803 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3804 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3805 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3806 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3807 uint64_t d[2];
3808 d[0] =
3809 !((*(double *) &a0) <= (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3810 d[1] =
3811 !((*(double *) &a1) <= (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3812
3813 return vreinterpretq_m128d_u64(vld1q_u64(d));
3814#endif
3815}

◆ _mm_cmpnle_ps()

FORCE_INLINE __m128 _mm_cmpnle_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1369 行定义.

1370{
1371 return vreinterpretq_m128_u32(vmvnq_u32(
1373}

◆ _mm_cmpnle_sd()

FORCE_INLINE __m128d _mm_cmpnle_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3821 行定义.

3822{
3823 return _mm_move_sd(a, _mm_cmpnle_pd(a, b));
3824}
FORCE_INLINE __m128d _mm_cmpnle_pd(__m128d a, __m128d b)
Definition sse2neon.h:3796

◆ _mm_cmpnle_ss()

FORCE_INLINE __m128 _mm_cmpnle_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1377 行定义.

1378{
1379 return _mm_move_ss(a, _mm_cmpnle_ps(a, b));
1380}
FORCE_INLINE __m128 _mm_cmpnle_ps(__m128 a, __m128 b)
Definition sse2neon.h:1369

◆ _mm_cmpnlt_pd()

FORCE_INLINE __m128d _mm_cmpnlt_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3829 行定义.

3830{
3831#if defined(__aarch64__)
3832 return vreinterpretq_m128d_u64(veorq_u64(
3833 vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)),
3834 vdupq_n_u64(UINT64_MAX)));
3835#else
3836 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3837 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3838 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3839 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3840 uint64_t d[2];
3841 d[0] =
3842 !((*(double *) &a0) < (*(double *) &b0)) ? ~UINT64_C(0) : UINT64_C(0);
3843 d[1] =
3844 !((*(double *) &a1) < (*(double *) &b1)) ? ~UINT64_C(0) : UINT64_C(0);
3845
3846 return vreinterpretq_m128d_u64(vld1q_u64(d));
3847#endif
3848}

◆ _mm_cmpnlt_ps()

FORCE_INLINE __m128 _mm_cmpnlt_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1384 行定义.

1385{
1386 return vreinterpretq_m128_u32(vmvnq_u32(
1388}

◆ _mm_cmpnlt_sd()

FORCE_INLINE __m128d _mm_cmpnlt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3854 行定义.

3855{
3856 return _mm_move_sd(a, _mm_cmpnlt_pd(a, b));
3857}
FORCE_INLINE __m128d _mm_cmpnlt_pd(__m128d a, __m128d b)
Definition sse2neon.h:3829

◆ _mm_cmpnlt_ss()

FORCE_INLINE __m128 _mm_cmpnlt_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1392 行定义.

1393{
1394 return _mm_move_ss(a, _mm_cmpnlt_ps(a, b));
1395}
FORCE_INLINE __m128 _mm_cmpnlt_ps(__m128 a, __m128 b)
Definition sse2neon.h:1384

◆ _mm_cmpord_pd()

FORCE_INLINE __m128d _mm_cmpord_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3862 行定义.

3863{
3864#if defined(__aarch64__)
3865 // Excluding NaNs, any two floating point numbers can be compared.
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));
3870 return vreinterpretq_m128d_u64(vandq_u64(not_nan_a, not_nan_b));
3871#else
3872 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3873 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3874 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3875 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3876 uint64_t d[2];
3877 d[0] = ((*(double *) &a0) == (*(double *) &a0) &&
3878 (*(double *) &b0) == (*(double *) &b0))
3879 ? ~UINT64_C(0)
3880 : UINT64_C(0);
3881 d[1] = ((*(double *) &a1) == (*(double *) &a1) &&
3882 (*(double *) &b1) == (*(double *) &b1))
3883 ? ~UINT64_C(0)
3884 : UINT64_C(0);
3885
3886 return vreinterpretq_m128d_u64(vld1q_u64(d));
3887#endif
3888}

◆ _mm_cmpord_ps()

FORCE_INLINE __m128 _mm_cmpord_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1404 行定义.

1405{
1406 // Note: NEON does not have ordered compare builtin
1407 // Need to compare a eq a and b eq b to check for NaN
1408 // Do AND of results to get final
1409 uint32x4_t ceqaa =
1411 uint32x4_t ceqbb =
1413 return vreinterpretq_m128_u32(vandq_u32(ceqaa, ceqbb));
1414}

◆ _mm_cmpord_sd()

FORCE_INLINE __m128d _mm_cmpord_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3894 行定义.

3895{
3896#if defined(__aarch64__)
3897 return _mm_move_sd(a, _mm_cmpord_pd(a, b));
3898#else
3899 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3900 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3901 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3902 uint64_t d[2];
3903 d[0] = ((*(double *) &a0) == (*(double *) &a0) &&
3904 (*(double *) &b0) == (*(double *) &b0))
3905 ? ~UINT64_C(0)
3906 : UINT64_C(0);
3907 d[1] = a1;
3908
3909 return vreinterpretq_m128d_u64(vld1q_u64(d));
3910#endif
3911}
FORCE_INLINE __m128d _mm_cmpord_pd(__m128d a, __m128d b)
Definition sse2neon.h:3862

◆ _mm_cmpord_ss()

FORCE_INLINE __m128 _mm_cmpord_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1418 行定义.

1419{
1420 return _mm_move_ss(a, _mm_cmpord_ps(a, b));
1421}
FORCE_INLINE __m128 _mm_cmpord_ps(__m128 a, __m128 b)
Definition sse2neon.h:1404

◆ _mm_cmpunord_pd()

FORCE_INLINE __m128d _mm_cmpunord_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3916 行定义.

3917{
3918#if defined(__aarch64__)
3919 // Two NaNs are not equal in comparison operation.
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))));
3926#else
3927 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3928 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3929 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3930 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
3931 uint64_t d[2];
3932 d[0] = ((*(double *) &a0) == (*(double *) &a0) &&
3933 (*(double *) &b0) == (*(double *) &b0))
3934 ? UINT64_C(0)
3935 : ~UINT64_C(0);
3936 d[1] = ((*(double *) &a1) == (*(double *) &a1) &&
3937 (*(double *) &b1) == (*(double *) &b1))
3938 ? UINT64_C(0)
3939 : ~UINT64_C(0);
3940
3941 return vreinterpretq_m128d_u64(vld1q_u64(d));
3942#endif
3943}

◆ _mm_cmpunord_ps()

FORCE_INLINE __m128 _mm_cmpunord_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1425 行定义.

1426{
1427 uint32x4_t f32a =
1429 uint32x4_t f32b =
1431 return vreinterpretq_m128_u32(vmvnq_u32(vandq_u32(f32a, f32b)));
1432}

◆ _mm_cmpunord_sd()

FORCE_INLINE __m128d _mm_cmpunord_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3949 行定义.

3950{
3951#if defined(__aarch64__)
3952 return _mm_move_sd(a, _mm_cmpunord_pd(a, b));
3953#else
3954 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3955 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3956 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
3957 uint64_t d[2];
3958 d[0] = ((*(double *) &a0) == (*(double *) &a0) &&
3959 (*(double *) &b0) == (*(double *) &b0))
3960 ? UINT64_C(0)
3961 : ~UINT64_C(0);
3962 d[1] = a1;
3963
3964 return vreinterpretq_m128d_u64(vld1q_u64(d));
3965#endif
3966}
FORCE_INLINE __m128d _mm_cmpunord_pd(__m128d a, __m128d b)
Definition sse2neon.h:3916

◆ _mm_cmpunord_ss()

FORCE_INLINE __m128 _mm_cmpunord_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1436 行定义.

1437{
1438 return _mm_move_ss(a, _mm_cmpunord_ps(a, b));
1439}
FORCE_INLINE __m128 _mm_cmpunord_ps(__m128 a, __m128 b)
Definition sse2neon.h:1425

◆ _mm_comieq_sd()

FORCE_INLINE int _mm_comieq_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4031 行定义.

4032{
4033#if defined(__aarch64__)
4034 return vgetq_lane_u64(vceqq_f64(a, b), 0) & 0x1;
4035#else
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);
4041 uint32x4_t a_eq_b =
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;
4046#endif
4047}

◆ _mm_comieq_ss()

FORCE_INLINE int _mm_comieq_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1444 行定义.

1445{
1446 uint32x4_t a_eq_b =
1448 return vgetq_lane_u32(a_eq_b, 0) & 0x1;
1449}

◆ _mm_comige_sd()

FORCE_INLINE int _mm_comige_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3971 行定义.

3972{
3973#if defined(__aarch64__)
3974 return vgetq_lane_u64(vcgeq_f64(a, b), 0) & 0x1;
3975#else
3976 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3977 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3978
3979 return (*(double *) &a0 >= *(double *) &b0);
3980#endif
3981}

◆ _mm_comige_ss()

FORCE_INLINE int _mm_comige_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1454 行定义.

1455{
1456 uint32x4_t a_ge_b =
1458 return vgetq_lane_u32(a_ge_b, 0) & 0x1;
1459}

◆ _mm_comigt_sd()

FORCE_INLINE int _mm_comigt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 3986 行定义.

3987{
3988#if defined(__aarch64__)
3989 return vgetq_lane_u64(vcgtq_f64(a, b), 0) & 0x1;
3990#else
3991 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
3992 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
3993
3994 return (*(double *) &a0 > *(double *) &b0);
3995#endif
3996}

◆ _mm_comigt_ss()

FORCE_INLINE int _mm_comigt_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1464 行定义.

1465{
1466 uint32x4_t a_gt_b =
1468 return vgetq_lane_u32(a_gt_b, 0) & 0x1;
1469}

◆ _mm_comile_sd()

FORCE_INLINE int _mm_comile_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4001 行定义.

4002{
4003#if defined(__aarch64__)
4004 return vgetq_lane_u64(vcleq_f64(a, b), 0) & 0x1;
4005#else
4006 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
4007 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
4008
4009 return (*(double *) &a0 <= *(double *) &b0);
4010#endif
4011}

◆ _mm_comile_ss()

FORCE_INLINE int _mm_comile_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1474 行定义.

1475{
1476 uint32x4_t a_le_b =
1478 return vgetq_lane_u32(a_le_b, 0) & 0x1;
1479}

◆ _mm_comilt_sd()

FORCE_INLINE int _mm_comilt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4016 行定义.

4017{
4018#if defined(__aarch64__)
4019 return vgetq_lane_u64(vcltq_f64(a, b), 0) & 0x1;
4020#else
4021 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
4022 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
4023
4024 return (*(double *) &a0 < *(double *) &b0);
4025#endif
4026}

◆ _mm_comilt_ss()

FORCE_INLINE int _mm_comilt_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1486 行定义.

1487{
1488 uint32x4_t a_lt_b =
1490 return vgetq_lane_u32(a_lt_b, 0) & 0x1;
1491}

◆ _mm_comineq_sd()

FORCE_INLINE int _mm_comineq_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4052 行定义.

4053{
4054 return !_mm_comieq_sd(a, b);
4055}
FORCE_INLINE int _mm_comieq_sd(__m128d a, __m128d b)
Definition sse2neon.h:4031

◆ _mm_comineq_ss()

FORCE_INLINE int _mm_comineq_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1496 行定义.

1497{
1498 return !_mm_comieq_ss(a, b);
1499}
FORCE_INLINE int _mm_comieq_ss(__m128 a, __m128 b)
Definition sse2neon.h:1444

◆ _mm_crc32_u16()

FORCE_INLINE uint32_t _mm_crc32_u16 ( uint32_t  crc,
uint16_t  v 
)

在文件 sse2neon.h 第 9329 行定义.

9330{
9331#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9332 __asm__ __volatile__("crc32ch %w[c], %w[c], %w[v]\n\t"
9333 : [c] "+r"(crc)
9334 : [v] "r"(v));
9335#elif (__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)
9336 crc = __crc32ch(crc, v);
9337#else
9338 crc = _mm_crc32_u8(crc, v & 0xff);
9339 crc = _mm_crc32_u8(crc, (v >> 8) & 0xff);
9340#endif
9341 return crc;
9342}
FORCE_INLINE uint32_t _mm_crc32_u8(uint32_t, uint8_t)
Definition sse2neon.h:9381

◆ _mm_crc32_u32()

FORCE_INLINE uint32_t _mm_crc32_u32 ( uint32_t  crc,
uint32_t  v 
)

在文件 sse2neon.h 第 9347 行定义.

9348{
9349#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9350 __asm__ __volatile__("crc32cw %w[c], %w[c], %w[v]\n\t"
9351 : [c] "+r"(crc)
9352 : [v] "r"(v));
9353#elif (__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)
9354 crc = __crc32cw(crc, v);
9355#else
9356 crc = _mm_crc32_u16(crc, v & 0xffff);
9357 crc = _mm_crc32_u16(crc, (v >> 16) & 0xffff);
9358#endif
9359 return crc;
9360}
FORCE_INLINE uint32_t _mm_crc32_u16(uint32_t crc, uint16_t v)
Definition sse2neon.h:9329

◆ _mm_crc32_u64()

FORCE_INLINE uint64_t _mm_crc32_u64 ( uint64_t  crc,
uint64_t  v 
)

在文件 sse2neon.h 第 9365 行定义.

9366{
9367#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9368 __asm__ __volatile__("crc32cx %w[c], %w[c], %x[v]\n\t"
9369 : [c] "+r"(crc)
9370 : [v] "r"(v));
9371#else
9372 crc = _mm_crc32_u32((uint32_t) (crc), v & 0xffffffff);
9373 crc = _mm_crc32_u32((uint32_t) (crc), (v >> 32) & 0xffffffff);
9374#endif
9375 return crc;
9376}
FORCE_INLINE uint32_t _mm_crc32_u32(uint32_t crc, uint32_t v)
Definition sse2neon.h:9347

◆ _mm_crc32_u8()

FORCE_INLINE uint32_t _mm_crc32_u8 ( uint32_t  crc,
uint8_t  v 
)

在文件 sse2neon.h 第 9381 行定义.

9382{
9383#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32)
9384 __asm__ __volatile__("crc32cb %w[c], %w[c], %w[v]\n\t"
9385 : [c] "+r"(crc)
9386 : [v] "r"(v));
9387#elif (__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)
9388 crc = __crc32cb(crc, v);
9389#else
9390 crc ^= v;
9391 for (int bit = 0; bit < 8; bit++) {
9392 if (crc & 1)
9393 crc = (crc >> 1) ^ UINT32_C(0x82f63b78);
9394 else
9395 crc = (crc >> 1);
9396 }
9397#endif
9398 return crc;
9399}

◆ _mm_cvt_pi2ps()

FORCE_INLINE __m128 _mm_cvt_pi2ps ( __m128  a,
__m64  b 
)

在文件 sse2neon.h 第 1512 行定义.

1513{
1515 vcombine_f32(vcvt_f32_s32(vreinterpret_s32_m64(b)),
1516 vget_high_f32(vreinterpretq_f32_m128(a))));
1517}

◆ _mm_cvt_ps2pi()

FORCE_INLINE __m64 _mm_cvt_ps2pi ( __m128  a)

在文件 sse2neon.h 第 1528 行定义.

1529{
1530#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
1531 return vreinterpret_m64_s32(
1532 vget_low_s32(vcvtnq_s32_f32(vrndiq_f32(vreinterpretq_f32_m128(a)))));
1533#else
1534 return vreinterpret_m64_s32(vcvt_s32_f32(vget_low_f32(
1536#endif
1537}
FORCE_INLINE __m128 _mm_round_ps(__m128, int)
Definition sse2neon.h:8392
#define _MM_FROUND_CUR_DIRECTION
Definition sse2neon.h:275

◆ _mm_cvt_si2ss()

FORCE_INLINE __m128 _mm_cvt_si2ss ( __m128  a,
int  b 
)

在文件 sse2neon.h 第 1547 行定义.

1548{
1550 vsetq_lane_f32((float) b, vreinterpretq_f32_m128(a), 0));
1551}

◆ _mm_cvt_ss2si()

FORCE_INLINE int _mm_cvt_ss2si ( __m128  a)

在文件 sse2neon.h 第 1556 行定义.

1557{
1558#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
1559 return vgetq_lane_s32(vcvtnq_s32_f32(vrndiq_f32(vreinterpretq_f32_m128(a))),
1560 0);
1561#else
1562 float32_t data = vgetq_lane_f32(
1564 return (int32_t) data;
1565#endif
1566}

◆ _mm_cvtepi16_epi32()

FORCE_INLINE __m128i _mm_cvtepi16_epi32 ( __m128i  a)

在文件 sse2neon.h 第 7719 行定义.

7720{
7722 vmovl_s16(vget_low_s16(vreinterpretq_s16_m128i(a))));
7723}

◆ _mm_cvtepi16_epi64()

FORCE_INLINE __m128i _mm_cvtepi16_epi64 ( __m128i  a)

在文件 sse2neon.h 第 7727 行定义.

7728{
7729 int16x8_t s16x8 = vreinterpretq_s16_m128i(a); /* xxxx xxxx xxxx 0B0A */
7730 int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */
7731 int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */
7732 return vreinterpretq_m128i_s64(s64x2);
7733}

◆ _mm_cvtepi32_epi64()

FORCE_INLINE __m128i _mm_cvtepi32_epi64 ( __m128i  a)

在文件 sse2neon.h 第 7737 行定义.

7738{
7740 vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a))));
7741}

◆ _mm_cvtepi32_pd()

FORCE_INLINE __m128d _mm_cvtepi32_pd ( __m128i  a)

在文件 sse2neon.h 第 4067 行定义.

4068{
4069#if defined(__aarch64__)
4070 return vreinterpretq_m128d_f64(
4071 vcvtq_f64_s64(vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a)))));
4072#else
4073 double a0 = (double) vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0);
4074 double a1 = (double) vgetq_lane_s32(vreinterpretq_s32_m128i(a), 1);
4075 return _mm_set_pd(a1, a0);
4076#endif
4077}

◆ _mm_cvtepi32_ps()

FORCE_INLINE __m128 _mm_cvtepi32_ps ( __m128i  a)

在文件 sse2neon.h 第 4082 行定义.

4083{
4084 return vreinterpretq_m128_f32(vcvtq_f32_s32(vreinterpretq_s32_m128i(a)));
4085}

◆ _mm_cvtepi8_epi16()

FORCE_INLINE __m128i _mm_cvtepi8_epi16 ( __m128i  a)

在文件 sse2neon.h 第 7745 行定义.

7746{
7747 int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */
7748 int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */
7749 return vreinterpretq_m128i_s16(s16x8);
7750}

◆ _mm_cvtepi8_epi32()

FORCE_INLINE __m128i _mm_cvtepi8_epi32 ( __m128i  a)

在文件 sse2neon.h 第 7754 行定义.

7755{
7756 int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */
7757 int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */
7758 int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000D 000C 000B 000A */
7759 return vreinterpretq_m128i_s32(s32x4);
7760}

◆ _mm_cvtepi8_epi64()

FORCE_INLINE __m128i _mm_cvtepi8_epi64 ( __m128i  a)

在文件 sse2neon.h 第 7764 行定义.

7765{
7766 int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx xxBA */
7767 int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0x0x 0B0A */
7768 int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */
7769 int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */
7770 return vreinterpretq_m128i_s64(s64x2);
7771}

◆ _mm_cvtepu16_epi32()

FORCE_INLINE __m128i _mm_cvtepu16_epi32 ( __m128i  a)

在文件 sse2neon.h 第 7775 行定义.

7776{
7778 vmovl_u16(vget_low_u16(vreinterpretq_u16_m128i(a))));
7779}

◆ _mm_cvtepu16_epi64()

FORCE_INLINE __m128i _mm_cvtepu16_epi64 ( __m128i  a)

在文件 sse2neon.h 第 7783 行定义.

7784{
7785 uint16x8_t u16x8 = vreinterpretq_u16_m128i(a); /* xxxx xxxx xxxx 0B0A */
7786 uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */
7787 uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */
7788 return vreinterpretq_m128i_u64(u64x2);
7789}

◆ _mm_cvtepu32_epi64()

FORCE_INLINE __m128i _mm_cvtepu32_epi64 ( __m128i  a)

在文件 sse2neon.h 第 7793 行定义.

7794{
7796 vmovl_u32(vget_low_u32(vreinterpretq_u32_m128i(a))));
7797}

◆ _mm_cvtepu8_epi16()

FORCE_INLINE __m128i _mm_cvtepu8_epi16 ( __m128i  a)

在文件 sse2neon.h 第 7802 行定义.

7803{
7804 uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx HGFE DCBA */
7805 uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0H0G 0F0E 0D0C 0B0A */
7806 return vreinterpretq_m128i_u16(u16x8);
7807}

◆ _mm_cvtepu8_epi32()

FORCE_INLINE __m128i _mm_cvtepu8_epi32 ( __m128i  a)

在文件 sse2neon.h 第 7812 行定义.

7813{
7814 uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */
7815 uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */
7816 uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000D 000C 000B 000A */
7817 return vreinterpretq_m128i_u32(u32x4);
7818}

◆ _mm_cvtepu8_epi64()

FORCE_INLINE __m128i _mm_cvtepu8_epi64 ( __m128i  a)

在文件 sse2neon.h 第 7822 行定义.

7823{
7824 uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx xxBA */
7825 uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0x0x 0B0A */
7826 uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */
7827 uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */
7828 return vreinterpretq_m128i_u64(u64x2);
7829}

◆ _mm_cvtpd_epi32()

FORCE_INLINE __m128i _mm_cvtpd_epi32 ( __m128d  a)

在文件 sse2neon.h 第 4097 行定义.

4098{
4099// vrnd32xq_f64 not supported on clang
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)));
4105#else
4107 double d0 = ((double *) &rnd)[0];
4108 double d1 = ((double *) &rnd)[1];
4109 return _mm_set_epi32(0, 0, (int32_t) d1, (int32_t) d0);
4110#endif
4111}
FORCE_INLINE __m128d _mm_round_pd(__m128d, int)
Definition sse2neon.h:8323

◆ _mm_cvtpd_pi32()

FORCE_INLINE __m64 _mm_cvtpd_pi32 ( __m128d  a)

在文件 sse2neon.h 第 4123 行定义.

4124{
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};
4129 return vreinterpret_m64_s32(vld1_s32(data));
4130}

◆ _mm_cvtpd_ps()

FORCE_INLINE __m128 _mm_cvtpd_ps ( __m128d  a)

在文件 sse2neon.h 第 4144 行定义.

4145{
4146#if defined(__aarch64__)
4147 float32x2_t tmp = vcvt_f32_f64(vreinterpretq_f64_m128d(a));
4148 return vreinterpretq_m128_f32(vcombine_f32(tmp, vdup_n_f32(0)));
4149#else
4150 float a0 = (float) ((double *) &a)[0];
4151 float a1 = (float) ((double *) &a)[1];
4152 return _mm_set_ps(0, 0, a1, a0);
4153#endif
4154}

◆ _mm_cvtpi16_ps()

FORCE_INLINE __m128 _mm_cvtpi16_ps ( __m64  a)

在文件 sse2neon.h 第 1578 行定义.

1579{
1581 vcvtq_f32_s32(vmovl_s16(vreinterpret_s16_m64(a))));
1582}

◆ _mm_cvtpi32_pd()

FORCE_INLINE __m128d _mm_cvtpi32_pd ( __m64  a)

在文件 sse2neon.h 第 4166 行定义.

4167{
4168#if defined(__aarch64__)
4169 return vreinterpretq_m128d_f64(
4170 vcvtq_f64_s64(vmovl_s32(vreinterpret_s32_m64(a))));
4171#else
4172 double a0 = (double) vget_lane_s32(vreinterpret_s32_m64(a), 0);
4173 double a1 = (double) vget_lane_s32(vreinterpret_s32_m64(a), 1);
4174 return _mm_set_pd(a1, a0);
4175#endif
4176}

◆ _mm_cvtpi32_ps()

FORCE_INLINE __m128 _mm_cvtpi32_ps ( __m128  a,
__m64  b 
)

在文件 sse2neon.h 第 1594 行定义.

1595{
1597 vcombine_f32(vcvt_f32_s32(vreinterpret_s32_m64(b)),
1598 vget_high_f32(vreinterpretq_f32_m128(a))));
1599}

◆ _mm_cvtpi32x2_ps()

FORCE_INLINE __m128 _mm_cvtpi32x2_ps ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 1613 行定义.

1614{
1615 return vreinterpretq_m128_f32(vcvtq_f32_s32(
1616 vcombine_s32(vreinterpret_s32_m64(a), vreinterpret_s32_m64(b))));
1617}

◆ _mm_cvtpi8_ps()

FORCE_INLINE __m128 _mm_cvtpi8_ps ( __m64  a)

在文件 sse2neon.h 第 1629 行定义.

1630{
1631 return vreinterpretq_m128_f32(vcvtq_f32_s32(
1632 vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_m64(a))))));
1633}

◆ _mm_cvtps_epi32()

FORCE_INLINE __m128i _mm_cvtps_epi32 ( __m128  a)

在文件 sse2neon.h 第 4189 行定义.

4190{
4191#if defined(__ARM_FEATURE_FRINT)
4192 return vreinterpretq_m128i_s32(vcvtq_s32_f32(vrnd32xq_f32(a)));
4193#elif defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
4194 switch (_MM_GET_ROUNDING_MODE()) {
4195 case _MM_ROUND_NEAREST:
4196 return vreinterpretq_m128i_s32(vcvtnq_s32_f32(a));
4197 case _MM_ROUND_DOWN:
4198 return vreinterpretq_m128i_s32(vcvtmq_s32_f32(a));
4199 case _MM_ROUND_UP:
4200 return vreinterpretq_m128i_s32(vcvtpq_s32_f32(a));
4201 default: // _MM_ROUND_TOWARD_ZERO
4202 return vreinterpretq_m128i_s32(vcvtq_s32_f32(a));
4203 }
4204#else
4205 float *f = (float *) &a;
4206 switch (_MM_GET_ROUNDING_MODE()) {
4207 case _MM_ROUND_NEAREST: {
4208 uint32x4_t signmask = vdupq_n_u32(0x80000000);
4209 float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a),
4210 vdupq_n_f32(0.5f)); /* +/- 0.5 */
4211 int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32(
4212 vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/
4213 int32x4_t r_trunc = vcvtq_s32_f32(
4214 vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */
4215 int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32(
4216 vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */
4217 int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone),
4218 vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */
4219 float32x4_t delta = vsubq_f32(
4221 vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */
4222 uint32x4_t is_delta_half =
4223 vceqq_f32(delta, half); /* delta == +/- 0.5 */
4225 vbslq_s32(is_delta_half, r_even, r_normal));
4226 }
4227 case _MM_ROUND_DOWN:
4228 return _mm_set_epi32(floorf(f[3]), floorf(f[2]), floorf(f[1]),
4229 floorf(f[0]));
4230 case _MM_ROUND_UP:
4231 return _mm_set_epi32(ceilf(f[3]), ceilf(f[2]), ceilf(f[1]),
4232 ceilf(f[0]));
4233 default: // _MM_ROUND_TOWARD_ZERO
4234 return _mm_set_epi32((int32_t) f[3], (int32_t) f[2], (int32_t) f[1],
4235 (int32_t) f[0]);
4236 }
4237#endif
4238}
#define _MM_ROUND_NEAREST
Definition sse2neon.h:284
#define _MM_ROUND_DOWN
Definition sse2neon.h:285
#define _MM_ROUND_UP
Definition sse2neon.h:286
FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE()
Definition sse2neon.h:1915

◆ _mm_cvtps_pd()

FORCE_INLINE __m128d _mm_cvtps_pd ( __m128  a)

在文件 sse2neon.h 第 4251 行定义.

4252{
4253#if defined(__aarch64__)
4254 return vreinterpretq_m128d_f64(
4255 vcvt_f64_f32(vget_low_f32(vreinterpretq_f32_m128(a))));
4256#else
4257 double a0 = (double) vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
4258 double a1 = (double) vgetq_lane_f32(vreinterpretq_f32_m128(a), 1);
4259 return _mm_set_pd(a1, a0);
4260#endif
4261}

◆ _mm_cvtps_pi16()

FORCE_INLINE __m64 _mm_cvtps_pi16 ( __m128  a)

在文件 sse2neon.h 第 1651 行定义.

1652{
1653 return vreinterpret_m64_s16(
1655}
FORCE_INLINE __m128i _mm_cvtps_epi32(__m128)
Definition sse2neon.h:4189

◆ _mm_cvtps_pi8()

FORCE_INLINE __m64 _mm_cvtps_pi8 ( __m128  a)

在文件 sse2neon.h 第 1684 行定义.

1685{
1686 return vreinterpret_m64_s8(vqmovn_s16(
1687 vcombine_s16(vreinterpret_s16_m64(_mm_cvtps_pi16(a)), vdup_n_s16(0))));
1688}
FORCE_INLINE __m64 _mm_cvtps_pi16(__m128 a)
Definition sse2neon.h:1651

◆ _mm_cvtpu16_ps()

FORCE_INLINE __m128 _mm_cvtpu16_ps ( __m64  a)

在文件 sse2neon.h 第 1700 行定义.

1701{
1703 vcvtq_f32_u32(vmovl_u16(vreinterpret_u16_m64(a))));
1704}

◆ _mm_cvtpu8_ps()

FORCE_INLINE __m128 _mm_cvtpu8_ps ( __m64  a)

在文件 sse2neon.h 第 1717 行定义.

1718{
1719 return vreinterpretq_m128_f32(vcvtq_f32_u32(
1720 vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_m64(a))))));
1721}

◆ _mm_cvtsd_f64()

FORCE_INLINE double _mm_cvtsd_f64 ( __m128d  a)

在文件 sse2neon.h 第 4268 行定义.

4269{
4270#if defined(__aarch64__)
4271 return (double) vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0);
4272#else
4273 return ((double *) &a)[0];
4274#endif
4275}

◆ _mm_cvtsd_si32()

FORCE_INLINE int32_t _mm_cvtsd_si32 ( __m128d  a)

在文件 sse2neon.h 第 4283 行定义.

4284{
4285#if defined(__aarch64__)
4286 return (int32_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0);
4287#else
4289 double ret = ((double *) &rnd)[0];
4290 return (int32_t) ret;
4291#endif
4292}

◆ _mm_cvtsd_si64()

FORCE_INLINE int64_t _mm_cvtsd_si64 ( __m128d  a)

在文件 sse2neon.h 第 4300 行定义.

4301{
4302#if defined(__aarch64__)
4303 return (int64_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0);
4304#else
4306 double ret = ((double *) &rnd)[0];
4307 return (int64_t) ret;
4308#endif
4309}

◆ _mm_cvtsd_ss()

FORCE_INLINE __m128 _mm_cvtsd_ss ( __m128  a,
__m128d  b 
)

在文件 sse2neon.h 第 4324 行定义.

4325{
4326#if defined(__aarch64__)
4327 return vreinterpretq_m128_f32(vsetq_lane_f32(
4328 vget_lane_f32(vcvt_f32_f64(vreinterpretq_f64_m128d(b)), 0),
4329 vreinterpretq_f32_m128(a), 0));
4330#else
4331 return vreinterpretq_m128_f32(vsetq_lane_f32((float) ((double *) &b)[0],
4332 vreinterpretq_f32_m128(a), 0));
4333#endif
4334}

◆ _mm_cvtsi128_si32()

FORCE_INLINE int _mm_cvtsi128_si32 ( __m128i  a)

在文件 sse2neon.h 第 4341 行定义.

4342{
4343 return vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0);
4344}

◆ _mm_cvtsi128_si64()

FORCE_INLINE int64_t _mm_cvtsi128_si64 ( __m128i  a)

在文件 sse2neon.h 第 4351 行定义.

4352{
4353 return vgetq_lane_s64(vreinterpretq_s64_m128i(a), 0);
4354}

◆ _mm_cvtsi32_sd()

FORCE_INLINE __m128d _mm_cvtsi32_sd ( __m128d  a,
int32_t  b 
)

在文件 sse2neon.h 第 4364 行定义.

4365{
4366#if defined(__aarch64__)
4367 return vreinterpretq_m128d_f64(
4368 vsetq_lane_f64((double) b, vreinterpretq_f64_m128d(a), 0));
4369#else
4370 double bf = (double) b;
4372 vsetq_lane_s64(*(int64_t *) &bf, vreinterpretq_s64_m128d(a), 0));
4373#endif
4374}

◆ _mm_cvtsi32_si128()

FORCE_INLINE __m128i _mm_cvtsi32_si128 ( int  a)

在文件 sse2neon.h 第 4392 行定义.

4393{
4394 return vreinterpretq_m128i_s32(vsetq_lane_s32(a, vdupq_n_s32(0), 0));
4395}

◆ _mm_cvtsi64_sd()

FORCE_INLINE __m128d _mm_cvtsi64_sd ( __m128d  a,
int64_t  b 
)

在文件 sse2neon.h 第 4401 行定义.

4402{
4403#if defined(__aarch64__)
4404 return vreinterpretq_m128d_f64(
4405 vsetq_lane_f64((double) b, vreinterpretq_f64_m128d(a), 0));
4406#else
4407 double bf = (double) b;
4409 vsetq_lane_s64(*(int64_t *) &bf, vreinterpretq_s64_m128d(a), 0));
4410#endif
4411}

◆ _mm_cvtsi64_si128()

FORCE_INLINE __m128i _mm_cvtsi64_si128 ( int64_t  a)

在文件 sse2neon.h 第 4418 行定义.

4419{
4420 return vreinterpretq_m128i_s64(vsetq_lane_s64(a, vdupq_n_s64(0), 0));
4421}

◆ _mm_cvtsi64_ss()

FORCE_INLINE __m128 _mm_cvtsi64_ss ( __m128  a,
int64_t  b 
)

在文件 sse2neon.h 第 1741 行定义.

1742{
1744 vsetq_lane_f32((float) b, vreinterpretq_f32_m128(a), 0));
1745}

◆ _mm_cvtss_f32()

FORCE_INLINE float _mm_cvtss_f32 ( __m128  a)

在文件 sse2neon.h 第 1752 行定义.

1753{
1754 return vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
1755}

◆ _mm_cvtss_sd()

FORCE_INLINE __m128d _mm_cvtss_sd ( __m128d  a,
__m128  b 
)

在文件 sse2neon.h 第 4443 行定义.

4444{
4445 double d = (double) vgetq_lane_f32(vreinterpretq_f32_m128(b), 0);
4446#if defined(__aarch64__)
4447 return vreinterpretq_m128d_f64(
4448 vsetq_lane_f64(d, vreinterpretq_f64_m128d(a), 0));
4449#else
4451 vsetq_lane_s64(*(int64_t *) &d, vreinterpretq_s64_m128d(a), 0));
4452#endif
4453}

◆ _mm_cvtss_si64()

FORCE_INLINE int64_t _mm_cvtss_si64 ( __m128  a)

在文件 sse2neon.h 第 1771 行定义.

1772{
1773#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
1774 return (int64_t) vgetq_lane_f32(vrndiq_f32(vreinterpretq_f32_m128(a)), 0);
1775#else
1776 float32_t data = vgetq_lane_f32(
1778 return (int64_t) data;
1779#endif
1780}

◆ _mm_cvtt_ps2pi()

FORCE_INLINE __m64 _mm_cvtt_ps2pi ( __m128  a)

在文件 sse2neon.h 第 1791 行定义.

1792{
1793 return vreinterpret_m64_s32(
1794 vget_low_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a))));
1795}

◆ _mm_cvtt_ss2si()

FORCE_INLINE int _mm_cvtt_ss2si ( __m128  a)

在文件 sse2neon.h 第 1803 行定义.

1804{
1805 return vgetq_lane_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)), 0);
1806}

◆ _mm_cvttpd_epi32()

FORCE_INLINE __m128i _mm_cvttpd_epi32 ( __m128d  a)

在文件 sse2neon.h 第 4458 行定义.

4459{
4460 double a0 = ((double *) &a)[0];
4461 double a1 = ((double *) &a)[1];
4462 return _mm_set_epi32(0, 0, (int32_t) a1, (int32_t) a0);
4463}

◆ _mm_cvttpd_pi32()

FORCE_INLINE __m64 _mm_cvttpd_pi32 ( __m128d  a)

在文件 sse2neon.h 第 4468 行定义.

4469{
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};
4473 return vreinterpret_m64_s32(vld1_s32(data));
4474}

◆ _mm_cvttps_epi32()

FORCE_INLINE __m128i _mm_cvttps_epi32 ( __m128  a)

在文件 sse2neon.h 第 4479 行定义.

4480{
4481 return vreinterpretq_m128i_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)));
4482}

◆ _mm_cvttsd_si32()

FORCE_INLINE int32_t _mm_cvttsd_si32 ( __m128d  a)

在文件 sse2neon.h 第 4490 行定义.

4491{
4492 double ret = *((double *) &a);
4493 return (int32_t) ret;
4494}

◆ _mm_cvttsd_si64()

FORCE_INLINE int64_t _mm_cvttsd_si64 ( __m128d  a)

在文件 sse2neon.h 第 4502 行定义.

4503{
4504#if defined(__aarch64__)
4505 return vgetq_lane_s64(vcvtq_s64_f64(vreinterpretq_f64_m128d(a)), 0);
4506#else
4507 double ret = *((double *) &a);
4508 return (int64_t) ret;
4509#endif
4510}

◆ _mm_cvttss_si64()

FORCE_INLINE int64_t _mm_cvttss_si64 ( __m128  a)

在文件 sse2neon.h 第 1833 行定义.

1834{
1835 return (int64_t) vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
1836}

◆ _mm_div_pd()

FORCE_INLINE __m128d _mm_div_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4529 行定义.

4530{
4531#if defined(__aarch64__)
4532 return vreinterpretq_m128d_f64(
4533 vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
4534#else
4535 double *da = (double *) &a;
4536 double *db = (double *) &b;
4537 double c[2];
4538 c[0] = da[0] / db[0];
4539 c[1] = da[1] / db[1];
4540 return vld1q_f32((float32_t *) c);
4541#endif
4542}

◆ _mm_div_ps()

FORCE_INLINE __m128 _mm_div_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1846 行定义.

1847{
1848#if defined(__aarch64__) && !SSE2NEON_PRECISE_DIV
1851#else
1852 float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(b));
1853 recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(b)));
1854#if SSE2NEON_PRECISE_DIV
1855 // Additional Netwon-Raphson iteration for accuracy
1856 recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(b)));
1857#endif
1858 return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(a), recip));
1859#endif
1860}

◆ _mm_div_sd()

FORCE_INLINE __m128d _mm_div_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4549 行定义.

4550{
4551#if defined(__aarch64__)
4552 float64x2_t tmp =
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));
4556#else
4557 return _mm_move_sd(a, _mm_div_pd(a, b));
4558#endif
4559}
FORCE_INLINE __m128d _mm_div_pd(__m128d a, __m128d b)
Definition sse2neon.h:4529

◆ _mm_div_ss()

FORCE_INLINE __m128 _mm_div_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 1864 行定义.

1865{
1866 float32_t value =
1867 vgetq_lane_f32(vreinterpretq_f32_m128(_mm_div_ps(a, b)), 0);
1869 vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0));
1870}
FORCE_INLINE __m128 _mm_div_ps(__m128 a, __m128 b)
Definition sse2neon.h:1846

◆ _mm_dp_pd()

FORCE_INLINE __m128d _mm_dp_pd ( __m128d  a,
__m128d  b,
const int  imm 
)

在文件 sse2neon.h 第 7835 行定义.

7836{
7837 // Generate mask value from constant immediate bit value
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;
7843#endif
7844 // Conditional multiplication
7845#if !SSE2NEON_PRECISE_DP
7846 __m128d mul = _mm_mul_pd(a, b);
7847 const __m128d mulMask =
7848 _mm_castsi128_pd(_mm_set_epi64x(bit5Mask, bit4Mask));
7849 __m128d tmp = _mm_and_pd(mul, mulMask);
7850#else
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)
7854 : 0;
7855 double d1 = (imm & 0x20) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1) *
7856 vgetq_lane_f64(vreinterpretq_f64_m128d(b), 1)
7857 : 0;
7858#else
7859 double d0 = (imm & 0x10) ? ((double *) &a)[0] * ((double *) &b)[0] : 0;
7860 double d1 = (imm & 0x20) ? ((double *) &a)[1] * ((double *) &b)[1] : 0;
7861#endif
7862 __m128d tmp = _mm_set_pd(d1, d0);
7863#endif
7864 // Sum the products
7865#if defined(__aarch64__)
7866 double sum = vpaddd_f64(vreinterpretq_f64_m128d(tmp));
7867#else
7868 double sum = *((double *) &tmp) + *(((double *) &tmp) + 1);
7869#endif
7870 // Conditionally store the sum
7871 const __m128d sumMask =
7872 _mm_castsi128_pd(_mm_set_epi64x(bit1Mask, bit0Mask));
7873 __m128d res = _mm_and_pd(_mm_set_pd1(sum), sumMask);
7874 return res;
7875}
FORCE_INLINE __m128d _mm_and_pd(__m128d a, __m128d b)
Definition sse2neon.h:3245
#define _mm_set_pd1
Definition sse2neon.h:5343

◆ _mm_dp_ps()

FORCE_INLINE __m128 _mm_dp_ps ( __m128  a,
__m128  b,
const int  imm 
)

在文件 sse2neon.h 第 7881 行定义.

7882{
7883#if defined(__aarch64__)
7884 /* shortcuts */
7885 if (imm == 0xFF) {
7886 return _mm_set1_ps(vaddvq_f32(_mm_mul_ps(a, b)));
7887 }
7888 if (imm == 0x7F) {
7889 float32x4_t m = _mm_mul_ps(a, b);
7890 m[3] = 0;
7891 return _mm_set1_ps(vaddvq_f32(m));
7892 }
7893#endif
7894
7895 float s = 0, c = 0;
7896 float32x4_t f32a = vreinterpretq_f32_m128(a);
7897 float32x4_t f32b = vreinterpretq_f32_m128(b);
7898
7899 /* To improve the accuracy of floating-point summation, Kahan algorithm
7900 * is used for each operation.
7901 */
7902 if (imm & (1 << 4))
7903 _sse2neon_kadd_f32(&s, &c, f32a[0] * f32b[0]);
7904 if (imm & (1 << 5))
7905 _sse2neon_kadd_f32(&s, &c, f32a[1] * f32b[1]);
7906 if (imm & (1 << 6))
7907 _sse2neon_kadd_f32(&s, &c, f32a[2] * f32b[2]);
7908 if (imm & (1 << 7))
7909 _sse2neon_kadd_f32(&s, &c, f32a[3] * f32b[3]);
7910 s += c;
7911
7912 float32x4_t res = {
7913 (imm & 0x1) ? s : 0,
7914 (imm & 0x2) ? s : 0,
7915 (imm & 0x4) ? s : 0,
7916 (imm & 0x8) ? s : 0,
7917 };
7918 return vreinterpretq_m128_f32(res);
7919}
FORCE_INLINE __m128 _mm_set1_ps(float _w)
Definition sse2neon.h:2609
FORCE_INLINE void _sse2neon_kadd_f32(float *sum, float *c, float y)
Definition sse2neon.h:825

◆ _mm_empty()

FORCE_INLINE void _mm_empty ( void  )

在文件 sse2neon.h 第 1146 行定义.

1146{}

◆ _mm_floor_pd()

FORCE_INLINE __m128d _mm_floor_pd ( __m128d  a)

在文件 sse2neon.h 第 7947 行定义.

7948{
7949#if defined(__aarch64__)
7950 return vreinterpretq_m128d_f64(vrndmq_f64(vreinterpretq_f64_m128d(a)));
7951#else
7952 double *f = (double *) &a;
7953 return _mm_set_pd(floor(f[1]), floor(f[0]));
7954#endif
7955}

◆ _mm_floor_ps()

FORCE_INLINE __m128 _mm_floor_ps ( __m128  a)

在文件 sse2neon.h 第 7961 行定义.

7962{
7963#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
7964 return vreinterpretq_m128_f32(vrndmq_f32(vreinterpretq_f32_m128(a)));
7965#else
7966 float *f = (float *) &a;
7967 return _mm_set_ps(floorf(f[3]), floorf(f[2]), floorf(f[1]), floorf(f[0]));
7968#endif
7969}

◆ _mm_floor_sd()

FORCE_INLINE __m128d _mm_floor_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 7976 行定义.

7977{
7978 return _mm_move_sd(a, _mm_floor_pd(b));
7979}
FORCE_INLINE __m128d _mm_floor_pd(__m128d)
Definition sse2neon.h:7947

◆ _mm_floor_ss()

FORCE_INLINE __m128 _mm_floor_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 7990 行定义.

7991{
7992 return _mm_move_ss(a, _mm_floor_ps(b));
7993}
FORCE_INLINE __m128 _mm_floor_ps(__m128)
Definition sse2neon.h:7961

◆ _mm_free()

FORCE_INLINE void _mm_free ( void *  addr)

在文件 sse2neon.h 第 1881 行定义.

1882{
1883 free(addr);
1884}

◆ _MM_GET_ROUNDING_MODE()

FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE ( )

在文件 sse2neon.h 第 1915 行定义.

1916{
1917 union {
1918 fpcr_bitfield field;
1919#if defined(__aarch64__)
1920 uint64_t value;
1921#else
1922 uint32_t value;
1923#endif
1924 } r;
1925
1926#if defined(__aarch64__)
1927 __asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value)); /* read */
1928#else
1929 __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */
1930#endif
1931
1932 if (r.field.bit22) {
1933 return r.field.bit23 ? _MM_ROUND_TOWARD_ZERO : _MM_ROUND_UP;
1934 } else {
1935 return r.field.bit23 ? _MM_ROUND_DOWN : _MM_ROUND_NEAREST;
1936 }
1937}
#define _MM_ROUND_TOWARD_ZERO
Definition sse2neon.h:287
uint8_t bit23
Definition sse2neon.h:680

◆ _mm_getcsr()

FORCE_INLINE unsigned int _mm_getcsr ( )

在文件 sse2neon.h 第 2621 行定义.

2622{
2623 return _MM_GET_ROUNDING_MODE();
2624}

◆ _mm_hadd_epi16()

FORCE_INLINE __m128i _mm_hadd_epi16 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 6958 行定义.

6959{
6960 int16x8_t a = vreinterpretq_s16_m128i(_a);
6961 int16x8_t b = vreinterpretq_s16_m128i(_b);
6962#if defined(__aarch64__)
6963 return vreinterpretq_m128i_s16(vpaddq_s16(a, b));
6964#else
6966 vcombine_s16(vpadd_s16(vget_low_s16(a), vget_high_s16(a)),
6967 vpadd_s16(vget_low_s16(b), vget_high_s16(b))));
6968#endif
6969}

◆ _mm_hadd_epi32()

FORCE_INLINE __m128i _mm_hadd_epi32 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 6973 行定义.

6974{
6975 int32x4_t a = vreinterpretq_s32_m128i(_a);
6976 int32x4_t b = vreinterpretq_s32_m128i(_b);
6977#if defined(__aarch64__)
6978 return vreinterpretq_m128i_s32(vpaddq_s32(a, b));
6979#else
6981 vcombine_s32(vpadd_s32(vget_low_s32(a), vget_high_s32(a)),
6982 vpadd_s32(vget_low_s32(b), vget_high_s32(b))));
6983#endif
6984}

◆ _mm_hadd_pd()

FORCE_INLINE __m128d _mm_hadd_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6684 行定义.

6685{
6686#if defined(__aarch64__)
6687 return vreinterpretq_m128d_f64(
6688 vpaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6689#else
6690 double *da = (double *) &a;
6691 double *db = (double *) &b;
6692 double c[] = {da[0] + da[1], db[0] + db[1]};
6693 return vreinterpretq_m128d_u64(vld1q_u64((uint64_t *) c));
6694#endif
6695}

◆ _mm_hadd_pi16()

FORCE_INLINE __m64 _mm_hadd_pi16 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 6989 行定义.

6990{
6991 return vreinterpret_m64_s16(
6992 vpadd_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b)));
6993}

◆ _mm_hadd_pi32()

FORCE_INLINE __m64 _mm_hadd_pi32 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 6998 行定义.

6999{
7000 return vreinterpret_m64_s32(
7001 vpadd_s32(vreinterpret_s32_m64(a), vreinterpret_s32_m64(b)));
7002}

◆ _mm_hadd_ps()

FORCE_INLINE __m128 _mm_hadd_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 6700 行定义.

6701{
6702#if defined(__aarch64__)
6705#else
6706 float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
6707 float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a));
6708 float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
6709 float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b));
6711 vcombine_f32(vpadd_f32(a10, a32), vpadd_f32(b10, b32)));
6712#endif
6713}

◆ _mm_hadds_epi16()

FORCE_INLINE __m128i _mm_hadds_epi16 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7006 行定义.

7007{
7008#if defined(__aarch64__)
7009 int16x8_t a = vreinterpretq_s16_m128i(_a);
7010 int16x8_t b = vreinterpretq_s16_m128i(_b);
7011 return vreinterpretq_s64_s16(
7012 vqaddq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b)));
7013#else
7014 int32x4_t a = vreinterpretq_s32_m128i(_a);
7015 int32x4_t b = vreinterpretq_s32_m128i(_b);
7016 // Interleave using vshrn/vmovn
7017 // [a0|a2|a4|a6|b0|b2|b4|b6]
7018 // [a1|a3|a5|a7|b1|b3|b5|b7]
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));
7021 // Saturated add
7022 return vreinterpretq_m128i_s16(vqaddq_s16(ab0246, ab1357));
7023#endif
7024}

◆ _mm_hadds_pi16()

FORCE_INLINE __m64 _mm_hadds_pi16 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7029 行定义.

7030{
7031 int16x4_t a = vreinterpret_s16_m64(_a);
7032 int16x4_t b = vreinterpret_s16_m64(_b);
7033#if defined(__aarch64__)
7034 return vreinterpret_s64_s16(vqadd_s16(vuzp1_s16(a, b), vuzp2_s16(a, b)));
7035#else
7036 int16x4x2_t res = vuzp_s16(a, b);
7037 return vreinterpret_s64_s16(vqadd_s16(res.val[0], res.val[1]));
7038#endif
7039}

◆ _mm_hsub_epi16()

FORCE_INLINE __m128i _mm_hsub_epi16 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7044 行定义.

7045{
7046 int16x8_t a = vreinterpretq_s16_m128i(_a);
7047 int16x8_t b = vreinterpretq_s16_m128i(_b);
7048#if defined(__aarch64__)
7050 vsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b)));
7051#else
7052 int16x8x2_t c = vuzpq_s16(a, b);
7053 return vreinterpretq_m128i_s16(vsubq_s16(c.val[0], c.val[1]));
7054#endif
7055}

◆ _mm_hsub_epi32()

FORCE_INLINE __m128i _mm_hsub_epi32 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7060 行定义.

7061{
7062 int32x4_t a = vreinterpretq_s32_m128i(_a);
7063 int32x4_t b = vreinterpretq_s32_m128i(_b);
7064#if defined(__aarch64__)
7066 vsubq_s32(vuzp1q_s32(a, b), vuzp2q_s32(a, b)));
7067#else
7068 int32x4x2_t c = vuzpq_s32(a, b);
7069 return vreinterpretq_m128i_s32(vsubq_s32(c.val[0], c.val[1]));
7070#endif
7071}

◆ _mm_hsub_pd()

FORCE_INLINE __m128d _mm_hsub_pd ( __m128d  _a,
__m128d  _b 
)

在文件 sse2neon.h 第 6718 行定义.

6719{
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)));
6725#else
6726 double *da = (double *) &_a;
6727 double *db = (double *) &_b;
6728 double c[] = {da[0] - da[1], db[0] - db[1]};
6729 return vreinterpretq_m128d_u64(vld1q_u64((uint64_t *) c));
6730#endif
6731}

◆ _mm_hsub_pi16()

FORCE_INLINE __m64 _mm_hsub_pi16 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7076 行定义.

7077{
7078 int16x4_t a = vreinterpret_s16_m64(_a);
7079 int16x4_t b = vreinterpret_s16_m64(_b);
7080#if defined(__aarch64__)
7081 return vreinterpret_m64_s16(vsub_s16(vuzp1_s16(a, b), vuzp2_s16(a, b)));
7082#else
7083 int16x4x2_t c = vuzp_s16(a, b);
7084 return vreinterpret_m64_s16(vsub_s16(c.val[0], c.val[1]));
7085#endif
7086}

◆ _mm_hsub_pi32()

FORCE_INLINE __m64 _mm_hsub_pi32 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7091 行定义.

7092{
7093 int32x2_t a = vreinterpret_s32_m64(_a);
7094 int32x2_t b = vreinterpret_s32_m64(_b);
7095#if defined(__aarch64__)
7096 return vreinterpret_m64_s32(vsub_s32(vuzp1_s32(a, b), vuzp2_s32(a, b)));
7097#else
7098 int32x2x2_t c = vuzp_s32(a, b);
7099 return vreinterpret_m64_s32(vsub_s32(c.val[0], c.val[1]));
7100#endif
7101}

◆ _mm_hsub_ps()

FORCE_INLINE __m128 _mm_hsub_ps ( __m128  _a,
__m128  _b 
)

在文件 sse2neon.h 第 6736 行定义.

6737{
6738 float32x4_t a = vreinterpretq_f32_m128(_a);
6739 float32x4_t b = vreinterpretq_f32_m128(_b);
6740#if defined(__aarch64__)
6742 vsubq_f32(vuzp1q_f32(a, b), vuzp2q_f32(a, b)));
6743#else
6744 float32x4x2_t c = vuzpq_f32(a, b);
6745 return vreinterpretq_m128_f32(vsubq_f32(c.val[0], c.val[1]));
6746#endif
6747}

◆ _mm_hsubs_epi16()

FORCE_INLINE __m128i _mm_hsubs_epi16 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7106 行定义.

7107{
7108 int16x8_t a = vreinterpretq_s16_m128i(_a);
7109 int16x8_t b = vreinterpretq_s16_m128i(_b);
7110#if defined(__aarch64__)
7112 vqsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b)));
7113#else
7114 int16x8x2_t c = vuzpq_s16(a, b);
7115 return vreinterpretq_m128i_s16(vqsubq_s16(c.val[0], c.val[1]));
7116#endif
7117}

◆ _mm_hsubs_pi16()

FORCE_INLINE __m64 _mm_hsubs_pi16 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7122 行定义.

7123{
7124 int16x4_t a = vreinterpret_s16_m64(_a);
7125 int16x4_t b = vreinterpret_s16_m64(_b);
7126#if defined(__aarch64__)
7127 return vreinterpret_m64_s16(vqsub_s16(vuzp1_s16(a, b), vuzp2_s16(a, b)));
7128#else
7129 int16x4x2_t c = vuzp_s16(a, b);
7130 return vreinterpret_m64_s16(vqsub_s16(c.val[0], c.val[1]));
7131#endif
7132}

◆ _mm_lfence()

FORCE_INLINE void _mm_lfence ( void  )

在文件 sse2neon.h 第 2697 行定义.

2698{
2700}
FORCE_INLINE void _sse2neon_smp_mb(void)
Definition sse2neon.h:137

◆ _mm_load1_pd()

FORCE_INLINE __m128d _mm_load1_pd ( const double *  p)

在文件 sse2neon.h 第 4638 行定义.

4639{
4640#if defined(__aarch64__)
4641 return vreinterpretq_m128d_f64(vld1q_dup_f64(p));
4642#else
4643 return vreinterpretq_m128d_s64(vdupq_n_s64(*(const int64_t *) p));
4644#endif
4645}

◆ _mm_load1_ps()

FORCE_INLINE __m128 _mm_load1_ps ( const float *  p)

在文件 sse2neon.h 第 1977 行定义.

1978{
1979 return vreinterpretq_m128_f32(vld1q_dup_f32(p));
1980}

◆ _mm_load_pd()

FORCE_INLINE __m128d _mm_load_pd ( const double *  p)

在文件 sse2neon.h 第 4585 行定义.

4586{
4587#if defined(__aarch64__)
4588 return vreinterpretq_m128d_f64(vld1q_f64(p));
4589#else
4590 const float *fp = (const float *) p;
4591 float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], fp[2], fp[3]};
4592 return vreinterpretq_m128d_f32(vld1q_f32(data));
4593#endif
4594}

◆ _mm_load_ps()

FORCE_INLINE __m128 _mm_load_ps ( const float *  p)

在文件 sse2neon.h 第 1950 行定义.

1951{
1952 return vreinterpretq_m128_f32(vld1q_f32(p));
1953}

◆ _mm_load_sd()

FORCE_INLINE __m128d _mm_load_sd ( const double *  p)

在文件 sse2neon.h 第 4613 行定义.

4614{
4615#if defined(__aarch64__)
4616 return vreinterpretq_m128d_f64(vsetq_lane_f64(*p, vdupq_n_f64(0), 0));
4617#else
4618 const float *fp = (const float *) p;
4619 float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], 0, 0};
4620 return vreinterpretq_m128d_f32(vld1q_f32(data));
4621#endif
4622}

◆ _mm_load_si128()

FORCE_INLINE __m128i _mm_load_si128 ( const __m128i *  p)

在文件 sse2neon.h 第 4626 行定义.

4627{
4628 return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p));
4629}

◆ _mm_load_ss()

FORCE_INLINE __m128 _mm_load_ss ( const float *  p)

在文件 sse2neon.h 第 1969 行定义.

1970{
1971 return vreinterpretq_m128_f32(vsetq_lane_f32(*p, vdupq_n_f32(0), 0));
1972}

◆ _mm_loadh_pd()

FORCE_INLINE __m128d _mm_loadh_pd ( __m128d  a,
const double *  p 
)

在文件 sse2neon.h 第 4655 行定义.

4656{
4657#if defined(__aarch64__)
4658 return vreinterpretq_m128d_f64(
4659 vcombine_f64(vget_low_f64(vreinterpretq_f64_m128d(a)), vld1_f64(p)));
4660#else
4661 return vreinterpretq_m128d_f32(vcombine_f32(
4662 vget_low_f32(vreinterpretq_f32_m128d(a)), vld1_f32((const float *) p)));
4663#endif
4664}
#define vreinterpretq_f32_m128d(x)
Definition sse2neon.h:437

◆ _mm_loadh_pi()

FORCE_INLINE __m128 _mm_loadh_pi ( __m128  a,
__m64 const *  p 
)

在文件 sse2neon.h 第 1992 行定义.

1993{
1995 vcombine_f32(vget_low_f32(a), vld1_f32((const float32_t *) p)));
1996}

◆ _mm_loadl_epi64()

FORCE_INLINE __m128i _mm_loadl_epi64 ( __m128i const *  p)

在文件 sse2neon.h 第 4668 行定义.

4669{
4670 /* Load the lower 64 bits of the value pointed to by p into the
4671 * lower 64 bits of the result, zeroing the upper 64 bits of the result.
4672 */
4674 vcombine_s32(vld1_s32((int32_t const *) p), vcreate_s32(0)));
4675}

◆ _mm_loadl_pd()

FORCE_INLINE __m128d _mm_loadl_pd ( __m128d  a,
const double *  p 
)

在文件 sse2neon.h 第 4685 行定义.

4686{
4687#if defined(__aarch64__)
4688 return vreinterpretq_m128d_f64(
4689 vcombine_f64(vld1_f64(p), vget_high_f64(vreinterpretq_f64_m128d(a))));
4690#else
4692 vcombine_f32(vld1_f32((const float *) p),
4693 vget_high_f32(vreinterpretq_f32_m128d(a))));
4694#endif
4695}

◆ _mm_loadl_pi()

FORCE_INLINE __m128 _mm_loadl_pi ( __m128  a,
__m64 const *  p 
)

在文件 sse2neon.h 第 2009 行定义.

2010{
2012 vcombine_f32(vld1_f32((const float32_t *) p), vget_high_f32(a)));
2013}

◆ _mm_loadr_pd()

FORCE_INLINE __m128d _mm_loadr_pd ( const double *  p)

在文件 sse2neon.h 第 4705 行定义.

4706{
4707#if defined(__aarch64__)
4708 float64x2_t v = vld1q_f64(p);
4709 return vreinterpretq_m128d_f64(vextq_f64(v, v, 1));
4710#else
4711 int64x2_t v = vld1q_s64((const int64_t *) p);
4712 return vreinterpretq_m128d_s64(vextq_s64(v, v, 1));
4713#endif
4714}

◆ _mm_loadr_ps()

FORCE_INLINE __m128 _mm_loadr_ps ( const float *  p)

在文件 sse2neon.h 第 2025 行定义.

2026{
2027 float32x4_t v = vrev64q_f32(vld1q_f32(p));
2028 return vreinterpretq_m128_f32(vextq_f32(v, v, 2));
2029}

◆ _mm_loadu_pd()

FORCE_INLINE __m128d _mm_loadu_pd ( const double *  p)

在文件 sse2neon.h 第 4718 行定义.

4719{
4720 return _mm_load_pd(p);
4721}
FORCE_INLINE __m128d _mm_load_pd(const double *p)
Definition sse2neon.h:4585

◆ _mm_loadu_ps()

FORCE_INLINE __m128 _mm_loadu_ps ( const float *  p)

在文件 sse2neon.h 第 2033 行定义.

2034{
2035 // for neon, alignment doesn't matter, so _mm_load_ps and _mm_loadu_ps are
2036 // equivalent for neon
2037 return vreinterpretq_m128_f32(vld1q_f32(p));
2038}

◆ _mm_loadu_si128()

FORCE_INLINE __m128i _mm_loadu_si128 ( const __m128i *  p)

在文件 sse2neon.h 第 4725 行定义.

4726{
4727 return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p));
4728}

◆ _mm_loadu_si16()

FORCE_INLINE __m128i _mm_loadu_si16 ( const void *  p)

在文件 sse2neon.h 第 2046 行定义.

2047{
2049 vsetq_lane_s16(*(const int16_t *) p, vdupq_n_s16(0), 0));
2050}

◆ _mm_loadu_si32()

FORCE_INLINE __m128i _mm_loadu_si32 ( const void *  p)

在文件 sse2neon.h 第 4736 行定义.

4737{
4739 vsetq_lane_s32(*(const int32_t *) p, vdupq_n_s32(0), 0));
4740}

◆ _mm_loadu_si64()

FORCE_INLINE __m128i _mm_loadu_si64 ( const void *  p)

在文件 sse2neon.h 第 2058 行定义.

2059{
2061 vcombine_s64(vld1_s64((const int64_t *) p), vdup_n_s64(0)));
2062}

◆ _mm_madd_epi16()

FORCE_INLINE __m128i _mm_madd_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 4750 行定义.

4751{
4752 int32x4_t low = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)),
4753 vget_low_s16(vreinterpretq_s16_m128i(b)));
4754#if defined(__aarch64__)
4755 int32x4_t high =
4756 vmull_high_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b));
4757
4758 return vreinterpretq_m128i_s32(vpaddq_s32(low, high));
4759#else
4760 int32x4_t high = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)),
4761 vget_high_s16(vreinterpretq_s16_m128i(b)));
4762
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));
4765
4766 return vreinterpretq_m128i_s32(vcombine_s32(low_sum, high_sum));
4767#endif
4768}

◆ _mm_maddubs_epi16()

FORCE_INLINE __m128i _mm_maddubs_epi16 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7144 行定义.

7145{
7146#if defined(__aarch64__)
7147 uint8x16_t a = vreinterpretq_u8_m128i(_a);
7148 int8x16_t b = vreinterpretq_s8_m128i(_b);
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)));
7155#else
7156 // This would be much simpler if x86 would choose to zero extend OR sign
7157 // extend, not both. This could probably be optimized better.
7158 uint16x8_t a = vreinterpretq_u16_m128i(_a);
7159 int16x8_t b = vreinterpretq_s16_m128i(_b);
7160
7161 // Zero extend a
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)));
7164
7165 // Sign extend by shifting left then shifting right.
7166 int16x8_t b_even = vshrq_n_s16(vshlq_n_s16(b, 8), 8);
7167 int16x8_t b_odd = vshrq_n_s16(b, 8);
7168
7169 // multiply
7170 int16x8_t prod1 = vmulq_s16(a_even, b_even);
7171 int16x8_t prod2 = vmulq_s16(a_odd, b_odd);
7172
7173 // saturated add
7174 return vreinterpretq_m128i_s16(vqaddq_s16(prod1, prod2));
7175#endif
7176}

◆ _mm_maddubs_pi16()

FORCE_INLINE __m64 _mm_maddubs_pi16 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7183 行定义.

7184{
7185 uint16x4_t a = vreinterpret_u16_m64(_a);
7186 int16x4_t b = vreinterpret_s16_m64(_b);
7187
7188 // Zero extend a
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)));
7191
7192 // Sign extend by shifting left then shifting right.
7193 int16x4_t b_even = vshr_n_s16(vshl_n_s16(b, 8), 8);
7194 int16x4_t b_odd = vshr_n_s16(b, 8);
7195
7196 // multiply
7197 int16x4_t prod1 = vmul_s16(a_even, b_even);
7198 int16x4_t prod2 = vmul_s16(a_odd, b_odd);
7199
7200 // saturated add
7201 return vreinterpret_m64_s16(vqadd_s16(prod1, prod2));
7202}

◆ _mm_malloc()

FORCE_INLINE void * _mm_malloc ( size_t  size,
size_t  align 
)

在文件 sse2neon.h 第 2068 行定义.

2069{
2070 void *ptr;
2071 if (align == 1)
2072 return malloc(size);
2073 if (align == 2 || (sizeof(void *) == 8 && align == 4))
2074 align = sizeof(void *);
2075 if (!posix_memalign(&ptr, align, size))
2076 return ptr;
2077 return NULL;
2078}

◆ _mm_maskmove_si64()

FORCE_INLINE void _mm_maskmove_si64 ( __m64  a,
__m64  mask,
char *  mem_addr 
)

在文件 sse2neon.h 第 2085 行定义.

2086{
2087 int8x8_t shr_mask = vshr_n_s8(vreinterpret_s8_m64(mask), 7);
2088 __m128 b = _mm_load_ps((const float *) mem_addr);
2089 int8x8_t masked =
2090 vbsl_s8(vreinterpret_u8_s8(shr_mask), vreinterpret_s8_m64(a),
2091 vreinterpret_s8_u64(vget_low_u64(vreinterpretq_u64_m128(b))));
2092 vst1_s8((int8_t *) mem_addr, masked);
2093}
#define vreinterpretq_u64_m128(x)
Definition sse2neon.h:351
FORCE_INLINE __m128 _mm_load_ps(const float *p)
Definition sse2neon.h:1950

◆ _mm_maskmoveu_si128()

FORCE_INLINE void _mm_maskmoveu_si128 ( __m128i  a,
__m128i  mask,
char *  mem_addr 
)

在文件 sse2neon.h 第 4775 行定义.

4776{
4777 int8x16_t shr_mask = vshrq_n_s8(vreinterpretq_s8_m128i(mask), 7);
4778 __m128 b = _mm_load_ps((const float *) mem_addr);
4779 int8x16_t masked =
4780 vbslq_s8(vreinterpretq_u8_s8(shr_mask), vreinterpretq_s8_m128i(a),
4782 vst1q_s8((int8_t *) mem_addr, masked);
4783}
#define vreinterpretq_s8_m128(x)
Definition sse2neon.h:353

◆ _mm_max_epi16()

FORCE_INLINE __m128i _mm_max_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 4788 行定义.

4789{
4792}

◆ _mm_max_epi32()

FORCE_INLINE __m128i _mm_max_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8059 行定义.

8060{
8063}

◆ _mm_max_epi8()

FORCE_INLINE __m128i _mm_max_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8068 行定义.

8069{
8072}

◆ _mm_max_epu16()

FORCE_INLINE __m128i _mm_max_epu16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8077 行定义.

8078{
8081}

◆ _mm_max_epu32()

FORCE_INLINE __m128i _mm_max_epu32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8086 行定义.

8087{
8090}

◆ _mm_max_epu8()

FORCE_INLINE __m128i _mm_max_epu8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 4797 行定义.

4798{
4801}

◆ _mm_max_pd()

FORCE_INLINE __m128d _mm_max_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4806 行定义.

4807{
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));
4813#else
4814 return vreinterpretq_m128d_f64(
4815 vmaxq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
4816#endif
4817#else
4818 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
4819 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
4820 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
4821 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
4822 uint64_t d[2];
4823 d[0] = (*(double *) &a0) > (*(double *) &b0) ? a0 : b0;
4824 d[1] = (*(double *) &a1) > (*(double *) &b1) ? a1 : b1;
4825
4826 return vreinterpretq_m128d_u64(vld1q_u64(d));
4827#endif
4828}

◆ _mm_max_pi16()

FORCE_INLINE __m64 _mm_max_pi16 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 2110 行定义.

2111{
2112 return vreinterpret_m64_s16(
2114}

◆ _mm_max_ps()

FORCE_INLINE __m128 _mm_max_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2119 行定义.

2120{
2121#if SSE2NEON_PRECISE_MINMAX
2122 float32x4_t _a = vreinterpretq_f32_m128(a);
2123 float32x4_t _b = vreinterpretq_f32_m128(b);
2124 return vreinterpretq_m128_f32(vbslq_f32(vcgtq_f32(_a, _b), _a, _b));
2125#else
2128#endif
2129}

◆ _mm_max_pu8()

FORCE_INLINE __m64 _mm_max_pu8 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 2140 行定义.

2141{
2142 return vreinterpret_m64_u8(
2144}

◆ _mm_max_sd()

FORCE_INLINE __m128d _mm_max_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4834 行定义.

4835{
4836#if defined(__aarch64__)
4837 return _mm_move_sd(a, _mm_max_pd(a, b));
4838#else
4839 double *da = (double *) &a;
4840 double *db = (double *) &b;
4841 double c[2] = {da[0] > db[0] ? da[0] : db[0], da[1]};
4842 return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) c));
4843#endif
4844}
FORCE_INLINE __m128d _mm_max_pd(__m128d a, __m128d b)
Definition sse2neon.h:4806

◆ _mm_max_ss()

FORCE_INLINE __m128 _mm_max_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2149 行定义.

2150{
2151 float32_t value = vgetq_lane_f32(_mm_max_ps(a, b), 0);
2153 vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0));
2154}
FORCE_INLINE __m128 _mm_max_ps(__m128 a, __m128 b)
Definition sse2neon.h:2119

◆ _mm_mfence()

FORCE_INLINE void _mm_mfence ( void  )

在文件 sse2neon.h 第 2687 行定义.

2688{
2690}

◆ _mm_min_epi16()

FORCE_INLINE __m128i _mm_min_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 4849 行定义.

4850{
4853}

◆ _mm_min_epi32()

FORCE_INLINE __m128i _mm_min_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8102 行定义.

8103{
8106}

◆ _mm_min_epi8()

FORCE_INLINE __m128i _mm_min_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8111 行定义.

8112{
8115}

◆ _mm_min_epu16()

FORCE_INLINE __m128i _mm_min_epu16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8120 行定义.

8121{
8124}

◆ _mm_min_epu32()

FORCE_INLINE __m128i _mm_min_epu32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8129 行定义.

8130{
8133}

◆ _mm_min_epu8()

FORCE_INLINE __m128i _mm_min_epu8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 4858 行定义.

4859{
4862}

◆ _mm_min_pd()

FORCE_INLINE __m128d _mm_min_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4867 行定义.

4868{
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));
4874#else
4875 return vreinterpretq_m128d_f64(
4876 vminq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
4877#endif
4878#else
4879 uint64_t a0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(a));
4880 uint64_t a1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(a));
4881 uint64_t b0 = (uint64_t) vget_low_u64(vreinterpretq_u64_m128d(b));
4882 uint64_t b1 = (uint64_t) vget_high_u64(vreinterpretq_u64_m128d(b));
4883 uint64_t d[2];
4884 d[0] = (*(double *) &a0) < (*(double *) &b0) ? a0 : b0;
4885 d[1] = (*(double *) &a1) < (*(double *) &b1) ? a1 : b1;
4886 return vreinterpretq_m128d_u64(vld1q_u64(d));
4887#endif
4888}

◆ _mm_min_pi16()

FORCE_INLINE __m64 _mm_min_pi16 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 2165 行定义.

2166{
2167 return vreinterpret_m64_s16(
2169}

◆ _mm_min_ps()

FORCE_INLINE __m128 _mm_min_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2174 行定义.

2175{
2176#if SSE2NEON_PRECISE_MINMAX
2177 float32x4_t _a = vreinterpretq_f32_m128(a);
2178 float32x4_t _b = vreinterpretq_f32_m128(b);
2179 return vreinterpretq_m128_f32(vbslq_f32(vcltq_f32(_a, _b), _a, _b));
2180#else
2183#endif
2184}

◆ _mm_min_pu8()

FORCE_INLINE __m64 _mm_min_pu8 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 2195 行定义.

2196{
2197 return vreinterpret_m64_u8(
2199}

◆ _mm_min_sd()

FORCE_INLINE __m128d _mm_min_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4894 行定义.

4895{
4896#if defined(__aarch64__)
4897 return _mm_move_sd(a, _mm_min_pd(a, b));
4898#else
4899 double *da = (double *) &a;
4900 double *db = (double *) &b;
4901 double c[2] = {da[0] < db[0] ? da[0] : db[0], da[1]};
4902 return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) c));
4903#endif
4904}
FORCE_INLINE __m128d _mm_min_pd(__m128d a, __m128d b)
Definition sse2neon.h:4867

◆ _mm_min_ss()

FORCE_INLINE __m128 _mm_min_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2204 行定义.

2205{
2206 float32_t value = vgetq_lane_f32(_mm_min_ps(a, b), 0);
2208 vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0));
2209}
FORCE_INLINE __m128 _mm_min_ps(__m128 a, __m128 b)
Definition sse2neon.h:2174

◆ _mm_minpos_epu16()

FORCE_INLINE __m128i _mm_minpos_epu16 ( __m128i  a)

在文件 sse2neon.h 第 8152 行定义.

8153{
8154 __m128i dst;
8155 uint16_t min, idx = 0;
8156#if defined(__aarch64__)
8157 // Find the minimum value
8158 min = vminvq_u16(vreinterpretq_u16_m128i(a));
8159
8160 // Get the index of the minimum value
8161 static const uint16_t idxv[] = {0, 1, 2, 3, 4, 5, 6, 7};
8162 uint16x8_t minv = vdupq_n_u16(min);
8163 uint16x8_t cmeq = vceqq_u16(minv, vreinterpretq_u16_m128i(a));
8164 idx = vminvq_u16(vornq_u16(vld1q_u16(idxv), cmeq));
8165#else
8166 // Find the minimum value
8167 __m64 tmp;
8169 vmin_u16(vget_low_u16(vreinterpretq_u16_m128i(a)),
8170 vget_high_u16(vreinterpretq_u16_m128i(a))));
8172 vpmin_u16(vreinterpret_u16_m64(tmp), vreinterpret_u16_m64(tmp)));
8174 vpmin_u16(vreinterpret_u16_m64(tmp), vreinterpret_u16_m64(tmp)));
8175 min = vget_lane_u16(vreinterpret_u16_m64(tmp), 0);
8176 // Get the index of the minimum value
8177 int i;
8178 for (i = 0; i < 8; i++) {
8179 if (min == vgetq_lane_u16(vreinterpretq_u16_m128i(a), 0)) {
8180 idx = (uint16_t) i;
8181 break;
8182 }
8183 a = _mm_srli_si128(a, 2);
8184 }
8185#endif
8186 // Generate result
8187 dst = _mm_setzero_si128();
8189 vsetq_lane_u16(min, vreinterpretq_u16_m128i(dst), 0));
8191 vsetq_lane_u16(idx, vreinterpretq_u16_m128i(dst), 1));
8192 return dst;
8193}

◆ _mm_move_epi64()

FORCE_INLINE __m128i _mm_move_epi64 ( __m128i  a)

在文件 sse2neon.h 第 4913 行定义.

4914{
4916 vsetq_lane_s64(0, vreinterpretq_s64_m128i(a), 1));
4917}

◆ _mm_move_sd()

FORCE_INLINE __m128d _mm_move_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 4927 行定义.

4928{
4930 vcombine_f32(vget_low_f32(vreinterpretq_f32_m128d(b)),
4931 vget_high_f32(vreinterpretq_f32_m128d(a))));
4932}

◆ _mm_move_ss()

FORCE_INLINE __m128 _mm_move_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2213 行定义.

2214{
2216 vsetq_lane_f32(vgetq_lane_f32(vreinterpretq_f32_m128(b), 0),
2217 vreinterpretq_f32_m128(a), 0));
2218}

◆ _mm_movedup_pd()

FORCE_INLINE __m128d _mm_movedup_pd ( __m128d  a)

在文件 sse2neon.h 第 6770 行定义.

6771{
6772#if defined(__aarch64__)
6773 return vreinterpretq_m128d_f64(
6774 vdupq_laneq_f64(vreinterpretq_f64_m128d(a), 0));
6775#else
6777 vdupq_n_u64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)));
6778#endif
6779}

◆ _mm_movehdup_ps()

FORCE_INLINE __m128 _mm_movehdup_ps ( __m128  a)

在文件 sse2neon.h 第 6784 行定义.

6785{
6786#if defined(__aarch64__)
6789#elif defined(_sse2neon_shuffle)
6790 return vreinterpretq_m128_f32(vshuffleq_s32(
6792#else
6793 float32_t a1 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 1);
6794 float32_t a3 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 3);
6795 float ALIGN_STRUCT(16) data[4] = {a1, a1, a3, a3};
6796 return vreinterpretq_m128_f32(vld1q_f32(data));
6797#endif
6798}

◆ _mm_movehl_ps()

FORCE_INLINE __m128 _mm_movehl_ps ( __m128  __A,
__m128  __B 
)

在文件 sse2neon.h 第 2226 行定义.

2227{
2228 float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(__A));
2229 float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(__B));
2230 return vreinterpretq_m128_f32(vcombine_f32(b32, a32));
2231}

◆ _mm_moveldup_ps()

FORCE_INLINE __m128 _mm_moveldup_ps ( __m128  a)

在文件 sse2neon.h 第 6803 行定义.

6804{
6805#if defined(__aarch64__)
6808#elif defined(_sse2neon_shuffle)
6809 return vreinterpretq_m128_f32(vshuffleq_s32(
6811#else
6812 float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
6813 float32_t a2 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 2);
6814 float ALIGN_STRUCT(16) data[4] = {a0, a0, a2, a2};
6815 return vreinterpretq_m128_f32(vld1q_f32(data));
6816#endif
6817}

◆ _mm_movelh_ps()

FORCE_INLINE __m128 _mm_movelh_ps ( __m128  __A,
__m128  __B 
)

在文件 sse2neon.h 第 2239 行定义.

2240{
2241 float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(__A));
2242 float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(__B));
2243 return vreinterpretq_m128_f32(vcombine_f32(a10, b10));
2244}

◆ _mm_movemask_epi8()

FORCE_INLINE int _mm_movemask_epi8 ( __m128i  a)

在文件 sse2neon.h 第 4938 行定义.

4939{
4940 // Use increasingly wide shifts+adds to collect the sign bits
4941 // together.
4942 // Since the widening shifts would be rather confusing to follow in little
4943 // endian, everything will be illustrated in big endian order instead. This
4944 // has a different result - the bits would actually be reversed on a big
4945 // endian machine.
4946
4947 // Starting input (only half the elements are shown):
4948 // 89 ff 1d c0 00 10 99 33
4949 uint8x16_t input = vreinterpretq_u8_m128i(a);
4950
4951 // Shift out everything but the sign bits with an unsigned shift right.
4952 //
4953 // Bytes of the vector::
4954 // 89 ff 1d c0 00 10 99 33
4955 // \ \ \ \ \ \ \ \ high_bits = (uint16x4_t)(input >> 7)
4956 // | | | | | | | |
4957 // 01 01 00 01 00 00 01 00
4958 //
4959 // Bits of first important lane(s):
4960 // 10001001 (89)
4961 // \______
4962 // |
4963 // 00000001 (01)
4964 uint16x8_t high_bits = vreinterpretq_u16_u8(vshrq_n_u8(input, 7));
4965
4966 // Merge the even lanes together with a 16-bit unsigned shift right + add.
4967 // 'xx' represents garbage data which will be ignored in the final result.
4968 // In the important bytes, the add functions like a binary OR.
4969 //
4970 // 01 01 00 01 00 00 01 00
4971 // \_ | \_ | \_ | \_ | paired16 = (uint32x4_t)(input + (input >> 7))
4972 // \| \| \| \|
4973 // xx 03 xx 01 xx 00 xx 02
4974 //
4975 // 00000001 00000001 (01 01)
4976 // \_______ |
4977 // \|
4978 // xxxxxxxx xxxxxx11 (xx 03)
4979 uint32x4_t paired16 =
4980 vreinterpretq_u32_u16(vsraq_n_u16(high_bits, high_bits, 7));
4981
4982 // Repeat with a wider 32-bit shift + add.
4983 // xx 03 xx 01 xx 00 xx 02
4984 // \____ | \____ | paired32 = (uint64x1_t)(paired16 + (paired16 >>
4985 // 14))
4986 // \| \|
4987 // xx xx xx 0d xx xx xx 02
4988 //
4989 // 00000011 00000001 (03 01)
4990 // \\_____ ||
4991 // '----.\||
4992 // xxxxxxxx xxxx1101 (xx 0d)
4993 uint64x2_t paired32 =
4994 vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14));
4995
4996 // Last, an even wider 64-bit shift + add to get our result in the low 8 bit
4997 // lanes. xx xx xx 0d xx xx xx 02
4998 // \_________ | paired64 = (uint8x8_t)(paired32 + (paired32 >>
4999 // 28))
5000 // \|
5001 // xx xx xx xx xx xx xx d2
5002 //
5003 // 00001101 00000010 (0d 02)
5004 // \ \___ | |
5005 // '---. \| |
5006 // xxxxxxxx 11010010 (xx d2)
5007 uint8x16_t paired64 =
5008 vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28));
5009
5010 // Extract the low 8 bits from each 64-bit lane with 2 8-bit extracts.
5011 // xx xx xx xx xx xx xx d2
5012 // || return paired64[0]
5013 // d2
5014 // Note: Little endian would return the correct value 4b (01001011) instead.
5015 return vgetq_lane_u8(paired64, 0) | ((int) vgetq_lane_u8(paired64, 8) << 8);
5016}

◆ _mm_movemask_pd()

FORCE_INLINE int _mm_movemask_pd ( __m128d  a)

在文件 sse2neon.h 第 5021 行定义.

5022{
5023 uint64x2_t input = vreinterpretq_u64_m128d(a);
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);
5026}

◆ _mm_movemask_pi8()

FORCE_INLINE int _mm_movemask_pi8 ( __m64  a)

在文件 sse2neon.h 第 2249 行定义.

2250{
2251 uint8x8_t input = vreinterpret_u8_m64(a);
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));
2256#else
2257 // Refer the implementation of `_mm_movemask_epi8`
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);
2264#endif
2265}

◆ _mm_movemask_ps()

FORCE_INLINE int _mm_movemask_ps ( __m128  a)

在文件 sse2neon.h 第 2271 行定义.

2272{
2273 uint32x4_t input = vreinterpretq_u32_m128(a);
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));
2278#else
2279 // Uses the exact same method as _mm_movemask_epi8, see that for details.
2280 // Shift out everything but the sign bits with a 32-bit unsigned shift
2281 // right.
2282 uint64x2_t high_bits = vreinterpretq_u64_u32(vshrq_n_u32(input, 31));
2283 // Merge the two pairs together with a 64-bit unsigned shift right + add.
2284 uint8x16_t paired =
2285 vreinterpretq_u8_u64(vsraq_n_u64(high_bits, high_bits, 31));
2286 // Extract the result.
2287 return vgetq_lane_u8(paired, 0) | (vgetq_lane_u8(paired, 8) << 2);
2288#endif
2289}
#define vreinterpretq_u32_m128(x)
Definition sse2neon.h:350

◆ _mm_movepi64_pi64()

FORCE_INLINE __m64 _mm_movepi64_pi64 ( __m128i  a)

在文件 sse2neon.h 第 5033 行定义.

5034{
5035 return vreinterpret_m64_s64(vget_low_s64(vreinterpretq_s64_m128i(a)));
5036}

◆ _mm_movpi64_epi64()

FORCE_INLINE __m128i _mm_movpi64_epi64 ( __m64  a)

在文件 sse2neon.h 第 5045 行定义.

5046{
5048 vcombine_s64(vreinterpret_s64_m64(a), vdup_n_s64(0)));
5049}

◆ _mm_mpsadbw_epu8()

FORCE_INLINE __m128i _mm_mpsadbw_epu8 ( __m128i  a,
__m128i  b,
const int  imm 
)

在文件 sse2neon.h 第 8202 行定义.

8203{
8204 uint8x16_t _a, _b;
8205
8206 switch (imm & 0x4) {
8207 case 0:
8208 // do nothing
8209 _a = vreinterpretq_u8_m128i(a);
8210 break;
8211 case 4:
8212 _a = vreinterpretq_u8_u32(vextq_u32(vreinterpretq_u32_m128i(a),
8214 break;
8215 default:
8216#if defined(__GNUC__) || defined(__clang__)
8217 __builtin_unreachable();
8218#endif
8219 break;
8220 }
8221
8222 switch (imm & 0x3) {
8223 case 0:
8224 _b = vreinterpretq_u8_u32(
8225 vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 0)));
8226 break;
8227 case 1:
8228 _b = vreinterpretq_u8_u32(
8229 vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 1)));
8230 break;
8231 case 2:
8232 _b = vreinterpretq_u8_u32(
8233 vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 2)));
8234 break;
8235 case 3:
8236 _b = vreinterpretq_u8_u32(
8237 vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 3)));
8238 break;
8239 default:
8240#if defined(__GNUC__) || defined(__clang__)
8241 __builtin_unreachable();
8242#endif
8243 break;
8244 }
8245
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__)
8256 // |0|4|2|6|
8257 c04 = vpaddq_s16(c04, c26);
8258 // |1|5|3|7|
8259 c15 = vpaddq_s16(c15, c37);
8260
8261 int32x4_t trn1_c =
8262 vtrn1q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15));
8263 int32x4_t trn2_c =
8264 vtrn2q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15));
8265 return vreinterpretq_m128i_s16(vpaddq_s16(vreinterpretq_s16_s32(trn1_c),
8266 vreinterpretq_s16_s32(trn2_c)));
8267#else
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));
8273
8275 vcombine_s16(vpadd_s16(c01, c23), vpadd_s16(c45, c67)));
8276#endif
8277}

◆ _mm_mul_epi32()

FORCE_INLINE __m128i _mm_mul_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8284 行定义.

8285{
8286 // vmull_s32 upcasts instead of masking, so we downcast.
8287 int32x2_t a_lo = vmovn_s64(vreinterpretq_s64_m128i(a));
8288 int32x2_t b_lo = vmovn_s64(vreinterpretq_s64_m128i(b));
8289 return vreinterpretq_m128i_s64(vmull_s32(a_lo, b_lo));
8290}

◆ _mm_mul_epu32()

FORCE_INLINE __m128i _mm_mul_epu32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5056 行定义.

5057{
5058 // vmull_u32 upcasts instead of masking, so we downcast.
5059 uint32x2_t a_lo = vmovn_u64(vreinterpretq_u64_m128i(a));
5060 uint32x2_t b_lo = vmovn_u64(vreinterpretq_u64_m128i(b));
5061 return vreinterpretq_m128i_u64(vmull_u32(a_lo, b_lo));
5062}

◆ _mm_mul_pd()

FORCE_INLINE __m128d _mm_mul_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 5067 行定义.

5068{
5069#if defined(__aarch64__)
5070 return vreinterpretq_m128d_f64(
5071 vmulq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
5072#else
5073 double *da = (double *) &a;
5074 double *db = (double *) &b;
5075 double c[2];
5076 c[0] = da[0] * db[0];
5077 c[1] = da[1] * db[1];
5078 return vld1q_f32((float32_t *) c);
5079#endif
5080}

◆ _mm_mul_ps()

FORCE_INLINE __m128 _mm_mul_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2299 行定义.

2300{
2303}

◆ _mm_mul_sd()

FORCE_INLINE __m128d _mm_mul_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 5086 行定义.

5087{
5088 return _mm_move_sd(a, _mm_mul_pd(a, b));
5089}

◆ _mm_mul_ss()

FORCE_INLINE __m128 _mm_mul_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2313 行定义.

2314{
2315 return _mm_move_ss(a, _mm_mul_ps(a, b));
2316}

◆ _mm_mul_su32()

FORCE_INLINE __m64 _mm_mul_su32 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 5097 行定义.

5098{
5099 return vreinterpret_m64_u64(vget_low_u64(
5100 vmull_u32(vreinterpret_u32_m64(a), vreinterpret_u32_m64(b))));
5101}
#define vreinterpret_u32_m64(x)
Definition sse2neon.h:397
#define vreinterpret_m64_u64(x)
Definition sse2neon.h:389

◆ _mm_mulhi_epi16()

FORCE_INLINE __m128i _mm_mulhi_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5112 行定义.

5113{
5114 /* FIXME: issue with large values because of result saturation */
5115 // int16x8_t ret = vqdmulhq_s16(vreinterpretq_s16_m128i(a),
5116 // vreinterpretq_s16_m128i(b)); /* =2*a*b */ return
5117 // vreinterpretq_m128i_s16(vshrq_n_s16(ret, 1));
5118 int16x4_t a3210 = vget_low_s16(vreinterpretq_s16_m128i(a));
5119 int16x4_t b3210 = vget_low_s16(vreinterpretq_s16_m128i(b));
5120 int32x4_t ab3210 = vmull_s16(a3210, b3210); /* 3333222211110000 */
5121 int16x4_t a7654 = vget_high_s16(vreinterpretq_s16_m128i(a));
5122 int16x4_t b7654 = vget_high_s16(vreinterpretq_s16_m128i(b));
5123 int32x4_t ab7654 = vmull_s16(a7654, b7654); /* 7777666655554444 */
5124 uint16x8x2_t r =
5125 vuzpq_u16(vreinterpretq_u16_s32(ab3210), vreinterpretq_u16_s32(ab7654));
5126 return vreinterpretq_m128i_u16(r.val[1]);
5127}

◆ _mm_mulhi_epu16()

FORCE_INLINE __m128i _mm_mulhi_epu16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5133 行定义.

5134{
5135 uint16x4_t a3210 = vget_low_u16(vreinterpretq_u16_m128i(a));
5136 uint16x4_t b3210 = vget_low_u16(vreinterpretq_u16_m128i(b));
5137 uint32x4_t ab3210 = vmull_u16(a3210, b3210);
5138#if defined(__aarch64__)
5139 uint32x4_t ab7654 =
5140 vmull_high_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b));
5141 uint16x8_t r = vuzp2q_u16(vreinterpretq_u16_u32(ab3210),
5142 vreinterpretq_u16_u32(ab7654));
5143 return vreinterpretq_m128i_u16(r);
5144#else
5145 uint16x4_t a7654 = vget_high_u16(vreinterpretq_u16_m128i(a));
5146 uint16x4_t b7654 = vget_high_u16(vreinterpretq_u16_m128i(b));
5147 uint32x4_t ab7654 = vmull_u16(a7654, b7654);
5148 uint16x8x2_t r =
5149 vuzpq_u16(vreinterpretq_u16_u32(ab3210), vreinterpretq_u16_u32(ab7654));
5150 return vreinterpretq_m128i_u16(r.val[1]);
5151#endif
5152}

◆ _mm_mulhi_pu16()

FORCE_INLINE __m64 _mm_mulhi_pu16 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 2322 行定义.

2323{
2324 return vreinterpret_m64_u16(vshrn_n_u32(
2325 vmull_u16(vreinterpret_u16_m64(a), vreinterpret_u16_m64(b)), 16));
2326}

◆ _mm_mulhrs_epi16()

FORCE_INLINE __m128i _mm_mulhrs_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 7213 行定义.

7214{
7215 // Has issues due to saturation
7216 // return vreinterpretq_m128i_s16(vqrdmulhq_s16(a, b));
7217
7218 // Multiply
7219 int32x4_t mul_lo = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)),
7220 vget_low_s16(vreinterpretq_s16_m128i(b)));
7221 int32x4_t mul_hi = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)),
7222 vget_high_s16(vreinterpretq_s16_m128i(b)));
7223
7224 // Rounding narrowing shift right
7225 // narrow = (int16_t)((mul + 16384) >> 15);
7226 int16x4_t narrow_lo = vrshrn_n_s32(mul_lo, 15);
7227 int16x4_t narrow_hi = vrshrn_n_s32(mul_hi, 15);
7228
7229 // Join together
7230 return vreinterpretq_m128i_s16(vcombine_s16(narrow_lo, narrow_hi));
7231}

◆ _mm_mulhrs_pi16()

FORCE_INLINE __m64 _mm_mulhrs_pi16 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 7237 行定义.

7238{
7239 int32x4_t mul_extend =
7240 vmull_s16((vreinterpret_s16_m64(a)), (vreinterpret_s16_m64(b)));
7241
7242 // Rounding narrowing shift right
7243 return vreinterpret_m64_s16(vrshrn_n_s32(mul_extend, 15));
7244}

◆ _mm_mullo_epi16()

FORCE_INLINE __m128i _mm_mullo_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5163 行定义.

5164{
5167}

◆ _mm_mullo_epi32()

FORCE_INLINE __m128i _mm_mullo_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8295 行定义.

8296{
8299}

◆ _mm_or_pd()

FORCE_INLINE __m128d _mm_or_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 5172 行定义.

5173{
5176}

◆ _mm_or_ps()

FORCE_INLINE __m128 _mm_or_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2331 行定义.

2332{
2335}

◆ _mm_or_si128()

FORCE_INLINE __m128i _mm_or_si128 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5183 行定义.

5184{
5187}

◆ _mm_packs_epi16()

FORCE_INLINE __m128i _mm_packs_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5192 行定义.

5193{
5195 vcombine_s8(vqmovn_s16(vreinterpretq_s16_m128i(a)),
5196 vqmovn_s16(vreinterpretq_s16_m128i(b))));
5197}

◆ _mm_packs_epi32()

FORCE_INLINE __m128i _mm_packs_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5212 行定义.

5213{
5215 vcombine_s16(vqmovn_s32(vreinterpretq_s32_m128i(a)),
5216 vqmovn_s32(vreinterpretq_s32_m128i(b))));
5217}

◆ _mm_packus_epi16()

FORCE_INLINE __m128i _mm_packus_epi16 ( const __m128i  a,
const __m128i  b 
)

在文件 sse2neon.h 第 5232 行定义.

5233{
5235 vcombine_u8(vqmovun_s16(vreinterpretq_s16_m128i(a)),
5236 vqmovun_s16(vreinterpretq_s16_m128i(b))));
5237}

◆ _mm_packus_epi32()

FORCE_INLINE __m128i _mm_packus_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8312 行定义.

8313{
8315 vcombine_u16(vqmovun_s32(vreinterpretq_s32_m128i(a)),
8316 vqmovun_s32(vreinterpretq_s32_m128i(b))));
8317}

◆ _mm_pause()

FORCE_INLINE void _mm_pause ( )

在文件 sse2neon.h 第 5244 行定义.

5245{
5246 __asm__ __volatile__("isb\n");
5247}

◆ _mm_popcnt_u32()

FORCE_INLINE int _mm_popcnt_u32 ( unsigned int  a)

在文件 sse2neon.h 第 9974 行定义.

9975{
9976#if defined(__aarch64__)
9977#if __has_builtin(__builtin_popcount)
9978 return __builtin_popcount(a);
9979#else
9980 return (int) vaddlv_u8(vcnt_u8(vcreate_u8((uint64_t) a)));
9981#endif
9982#else
9983 uint32_t count = 0;
9984 uint8x8_t input_val, count8x8_val;
9985 uint16x4_t count16x4_val;
9986 uint32x2_t count32x2_val;
9987
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);
9992
9993 vst1_u32(&count, count32x2_val);
9994 return count;
9995#endif
9996}

◆ _mm_popcnt_u64()

FORCE_INLINE int64_t _mm_popcnt_u64 ( uint64_t  a)

在文件 sse2neon.h 第 10001 行定义.

10002{
10003#if defined(__aarch64__)
10004#if __has_builtin(__builtin_popcountll)
10005 return __builtin_popcountll(a);
10006#else
10007 return (int64_t) vaddlv_u8(vcnt_u8(vcreate_u8(a)));
10008#endif
10009#else
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;
10015
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);
10022 return count;
10023#endif
10024}

◆ _mm_prefetch()

FORCE_INLINE void _mm_prefetch ( char const *  p,
int  i 
)

在文件 sse2neon.h 第 2403 行定义.

2404{
2405 switch (i) {
2406 case _MM_HINT_NTA:
2407 __builtin_prefetch(p, 0, 0);
2408 break;
2409 case _MM_HINT_T0:
2410 __builtin_prefetch(p, 0, 3);
2411 break;
2412 case _MM_HINT_T1:
2413 __builtin_prefetch(p, 0, 2);
2414 break;
2415 case _MM_HINT_T2:
2416 __builtin_prefetch(p, 0, 1);
2417 break;
2418 }
2419}

◆ _mm_rcp_ps()

FORCE_INLINE __m128 _mm_rcp_ps ( __m128  in)

在文件 sse2neon.h 第 2437 行定义.

2438{
2439 float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in));
2440 recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in)));
2441#if SSE2NEON_PRECISE_DIV
2442 // Additional Netwon-Raphson iteration for accuracy
2443 recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in)));
2444#endif
2445 return vreinterpretq_m128_f32(recip);
2446}

◆ _mm_rcp_ss()

FORCE_INLINE __m128 _mm_rcp_ss ( __m128  a)

在文件 sse2neon.h 第 2457 行定义.

2458{
2459 return _mm_move_ss(a, _mm_rcp_ps(a));
2460}
FORCE_INLINE __m128 _mm_rcp_ps(__m128 in)
Definition sse2neon.h:2437

◆ _mm_round_pd()

FORCE_INLINE __m128d _mm_round_pd ( __m128d  a,
int  rounding 
)

在文件 sse2neon.h 第 8323 行定义.

8324{
8325#if defined(__aarch64__)
8326 switch (rounding) {
8328 return vreinterpretq_m128d_f64(vrndnq_f64(vreinterpretq_f64_m128d(a)));
8330 return _mm_floor_pd(a);
8332 return _mm_ceil_pd(a);
8334 return vreinterpretq_m128d_f64(vrndq_f64(vreinterpretq_f64_m128d(a)));
8335 default: //_MM_FROUND_CUR_DIRECTION
8336 return vreinterpretq_m128d_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)));
8337 }
8338#else
8339 double *v_double = (double *) &a;
8340
8341 if (rounding == (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC) ||
8342 (rounding == _MM_FROUND_CUR_DIRECTION &&
8344 double res[2], tmp;
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); // Round down value
8348 double roundUp = ceil(tmp); // Round up value
8349 double diffDown = tmp - roundDown;
8350 double diffUp = roundUp - tmp;
8351 if (diffDown < diffUp) {
8352 /* If it's closer to the round down value, then use it */
8353 res[i] = roundDown;
8354 } else if (diffDown > diffUp) {
8355 /* If it's closer to the round up value, then use it */
8356 res[i] = roundUp;
8357 } else {
8358 /* If it's equidistant between round up and round down value,
8359 * pick the one which is an even number */
8360 double half = roundDown / 2;
8361 if (half != floor(half)) {
8362 /* If the round down value is odd, return the round up value
8363 */
8364 res[i] = roundUp;
8365 } else {
8366 /* If the round up value is odd, return the round down value
8367 */
8368 res[i] = roundDown;
8369 }
8370 }
8371 res[i] = (v_double[i] < 0) ? -res[i] : res[i];
8372 }
8373 return _mm_set_pd(res[1], res[0]);
8374 } else if (rounding == (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC) ||
8375 (rounding == _MM_FROUND_CUR_DIRECTION &&
8377 return _mm_floor_pd(a);
8378 } else if (rounding == (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC) ||
8379 (rounding == _MM_FROUND_CUR_DIRECTION &&
8381 return _mm_ceil_pd(a);
8382 }
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]));
8385#endif
8386}
#define _MM_FROUND_TO_POS_INF
Definition sse2neon.h:273
#define _MM_FROUND_TO_NEG_INF
Definition sse2neon.h:272
#define _MM_FROUND_TO_NEAREST_INT
Definition sse2neon.h:271
#define _MM_FROUND_TO_ZERO
Definition sse2neon.h:274
#define _MM_FROUND_NO_EXC
Definition sse2neon.h:276

◆ _mm_round_ps()

FORCE_INLINE __m128 _mm_round_ps ( __m128  a,
int  rounding 
)

在文件 sse2neon.h 第 8392 行定义.

8393{
8394#if defined(__aarch64__) || defined(__ARM_FEATURE_DIRECTED_ROUNDING)
8395 switch (rounding) {
8397 return vreinterpretq_m128_f32(vrndnq_f32(vreinterpretq_f32_m128(a)));
8399 return _mm_floor_ps(a);
8401 return _mm_ceil_ps(a);
8403 return vreinterpretq_m128_f32(vrndq_f32(vreinterpretq_f32_m128(a)));
8404 default: //_MM_FROUND_CUR_DIRECTION
8405 return vreinterpretq_m128_f32(vrndiq_f32(vreinterpretq_f32_m128(a)));
8406 }
8407#else
8408 float *v_float = (float *) &a;
8409
8410 if (rounding == (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC) ||
8411 (rounding == _MM_FROUND_CUR_DIRECTION &&
8413 uint32x4_t signmask = vdupq_n_u32(0x80000000);
8414 float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a),
8415 vdupq_n_f32(0.5f)); /* +/- 0.5 */
8416 int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32(
8417 vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/
8418 int32x4_t r_trunc = vcvtq_s32_f32(
8419 vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */
8420 int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32(
8421 vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */
8422 int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone),
8423 vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */
8424 float32x4_t delta = vsubq_f32(
8426 vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */
8427 uint32x4_t is_delta_half =
8428 vceqq_f32(delta, half); /* delta == +/- 0.5 */
8430 vcvtq_f32_s32(vbslq_s32(is_delta_half, r_even, r_normal)));
8431 } else if (rounding == (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC) ||
8432 (rounding == _MM_FROUND_CUR_DIRECTION &&
8434 return _mm_floor_ps(a);
8435 } else if (rounding == (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC) ||
8436 (rounding == _MM_FROUND_CUR_DIRECTION &&
8438 return _mm_ceil_ps(a);
8439 }
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]));
8444#endif
8445}

◆ _mm_round_sd()

FORCE_INLINE __m128d _mm_round_sd ( __m128d  a,
__m128d  b,
int  rounding 
)

在文件 sse2neon.h 第 8452 行定义.

8453{
8454 return _mm_move_sd(a, _mm_round_pd(b, rounding));
8455}

◆ _mm_round_ss()

FORCE_INLINE __m128 _mm_round_ss ( __m128  a,
__m128  b,
int  rounding 
)

在文件 sse2neon.h 第 8472 行定义.

8473{
8474 return _mm_move_ss(a, _mm_round_ps(b, rounding));
8475}

◆ _mm_rsqrt_ps()

FORCE_INLINE __m128 _mm_rsqrt_ps ( __m128  in)

在文件 sse2neon.h 第 2466 行定义.

2467{
2468 float32x4_t out = vrsqrteq_f32(vreinterpretq_f32_m128(in));
2469#if SSE2NEON_PRECISE_SQRT
2470 // Additional Netwon-Raphson iteration for accuracy
2471 out = vmulq_f32(
2472 out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out));
2473 out = vmulq_f32(
2474 out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out));
2475#endif
2476 return vreinterpretq_m128_f32(out);
2477}

◆ _mm_rsqrt_ss()

FORCE_INLINE __m128 _mm_rsqrt_ss ( __m128  in)

在文件 sse2neon.h 第 2484 行定义.

2485{
2486 return vsetq_lane_f32(vgetq_lane_f32(_mm_rsqrt_ps(in), 0), in, 0);
2487}
FORCE_INLINE __m128 _mm_rsqrt_ps(__m128 in)
Definition sse2neon.h:2466

◆ _mm_sad_epu8()

FORCE_INLINE __m128i _mm_sad_epu8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 5254 行定义.

5255{
5256 uint16x8_t t = vpaddlq_u8(vabdq_u8((uint8x16_t) a, (uint8x16_t) b));
5257 return vreinterpretq_m128i_u64(vpaddlq_u32(vpaddlq_u16(t)));
5258}

◆ _mm_sad_pu8()

FORCE_INLINE __m64 _mm_sad_pu8 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 2494 行定义.

2495{
2496 uint64x1_t t = vpaddl_u32(vpaddl_u16(
2497 vpaddl_u8(vabd_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b)))));
2498 return vreinterpret_m64_u16(
2499 vset_lane_u16(vget_lane_u64(t, 0), vdup_n_u16(0), 0));
2500}

◆ _mm_set1_epi16()

FORCE_INLINE __m128i _mm_set1_epi16 ( short  w)

在文件 sse2neon.h 第 5365 行定义.

5366{
5367 return vreinterpretq_m128i_s16(vdupq_n_s16(w));
5368}

◆ _mm_set1_epi32()

FORCE_INLINE __m128i _mm_set1_epi32 ( int  _i)

在文件 sse2neon.h 第 5378 行定义.

5379{
5380 return vreinterpretq_m128i_s32(vdupq_n_s32(_i));
5381}

◆ _mm_set1_epi64()

FORCE_INLINE __m128i _mm_set1_epi64 ( __m64  _i)

在文件 sse2neon.h 第 5385 行定义.

5386{
5387 return vreinterpretq_m128i_s64(vdupq_n_s64((int64_t) _i));
5388}

◆ _mm_set1_epi64x()

FORCE_INLINE __m128i _mm_set1_epi64x ( int64_t  _i)

在文件 sse2neon.h 第 5392 行定义.

5393{
5394 return vreinterpretq_m128i_s64(vdupq_n_s64(_i));
5395}

◆ _mm_set1_epi8()

FORCE_INLINE __m128i _mm_set1_epi8 ( signed char  w)

在文件 sse2neon.h 第 5405 行定义.

5406{
5407 return vreinterpretq_m128i_s8(vdupq_n_s8(w));
5408}

◆ _mm_set1_pd()

FORCE_INLINE __m128d _mm_set1_pd ( double  d)

在文件 sse2neon.h 第 5413 行定义.

5414{
5415#if defined(__aarch64__)
5416 return vreinterpretq_m128d_f64(vdupq_n_f64(d));
5417#else
5418 return vreinterpretq_m128d_s64(vdupq_n_s64(*(int64_t *) &d));
5419#endif
5420}

◆ _mm_set1_ps()

FORCE_INLINE __m128 _mm_set1_ps ( float  _w)

在文件 sse2neon.h 第 2609 行定义.

2610{
2611 return vreinterpretq_m128_f32(vdupq_n_f32(_w));
2612}

◆ _mm_set_epi16()

FORCE_INLINE __m128i _mm_set_epi16 ( short  i7,
short  i6,
short  i5,
short  i4,
short  i3,
short  i2,
short  i1,
short  i0 
)

在文件 sse2neon.h 第 5262 行定义.

5270{
5271 int16_t ALIGN_STRUCT(16) data[8] = {i0, i1, i2, i3, i4, i5, i6, i7};
5272 return vreinterpretq_m128i_s16(vld1q_s16(data));
5273}

◆ _mm_set_epi32()

FORCE_INLINE __m128i _mm_set_epi32 ( int  i3,
int  i2,
int  i1,
int  i0 
)

在文件 sse2neon.h 第 5277 行定义.

5278{
5279 int32_t ALIGN_STRUCT(16) data[4] = {i0, i1, i2, i3};
5280 return vreinterpretq_m128i_s32(vld1q_s32(data));
5281}

◆ _mm_set_epi64()

FORCE_INLINE __m128i _mm_set_epi64 ( __m64  i1,
__m64  i2 
)

在文件 sse2neon.h 第 5286 行定义.

5287{
5288 return _mm_set_epi64x((int64_t) i1, (int64_t) i2);
5289}

◆ _mm_set_epi64x()

FORCE_INLINE __m128i _mm_set_epi64x ( int64_t  i1,
int64_t  i2 
)

在文件 sse2neon.h 第 5294 行定义.

5295{
5297 vcombine_s64(vcreate_s64(i2), vcreate_s64(i1)));
5298}

◆ _mm_set_epi8()

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 
)

在文件 sse2neon.h 第 5302 行定义.

5318{
5319 int8_t ALIGN_STRUCT(16)
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);
5325}

◆ _mm_set_pd()

FORCE_INLINE __m128d _mm_set_pd ( double  e1,
double  e0 
)

在文件 sse2neon.h 第 5330 行定义.

5331{
5332 double ALIGN_STRUCT(16) data[2] = {e0, e1};
5333#if defined(__aarch64__)
5334 return vreinterpretq_m128d_f64(vld1q_f64((float64_t *) data));
5335#else
5336 return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) data));
5337#endif
5338}

◆ _mm_set_ps()

FORCE_INLINE __m128 _mm_set_ps ( float  w,
float  z,
float  y,
float  x 
)

在文件 sse2neon.h 第 2536 行定义.

2537{
2538 float ALIGN_STRUCT(16) data[4] = {x, y, z, w};
2539 return vreinterpretq_m128_f32(vld1q_f32(data));
2540}

◆ _mm_set_ps1()

FORCE_INLINE __m128 _mm_set_ps1 ( float  _w)

在文件 sse2neon.h 第 2544 行定义.

2545{
2546 return vreinterpretq_m128_f32(vdupq_n_f32(_w));
2547}

◆ _MM_SET_ROUNDING_MODE()

FORCE_INLINE void _MM_SET_ROUNDING_MODE ( int  rounding)

在文件 sse2neon.h 第 2554 行定义.

2555{
2556 union {
2557 fpcr_bitfield field;
2558#if defined(__aarch64__)
2559 uint64_t value;
2560#else
2561 uint32_t value;
2562#endif
2563 } r;
2564
2565#if defined(__aarch64__)
2566 __asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value)); /* read */
2567#else
2568 __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */
2569#endif
2570
2571 switch (rounding) {
2573 r.field.bit22 = 1;
2574 r.field.bit23 = 1;
2575 break;
2576 case _MM_ROUND_DOWN:
2577 r.field.bit22 = 0;
2578 r.field.bit23 = 1;
2579 break;
2580 case _MM_ROUND_UP:
2581 r.field.bit22 = 1;
2582 r.field.bit23 = 0;
2583 break;
2584 default: //_MM_ROUND_NEAREST
2585 r.field.bit22 = 0;
2586 r.field.bit23 = 0;
2587 }
2588
2589#if defined(__aarch64__)
2590 __asm__ __volatile__("msr FPCR, %0" ::"r"(r)); /* write */
2591#else
2592 __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */
2593#endif
2594}
uint8_t bit22
Definition sse2neon.h:679

◆ _mm_set_sd()

FORCE_INLINE __m128d _mm_set_sd ( double  a)

在文件 sse2neon.h 第 5348 行定义.

5349{
5350#if defined(__aarch64__)
5351 return vreinterpretq_m128d_f64(vsetq_lane_f64(a, vdupq_n_f64(0), 0));
5352#else
5353 return _mm_set_pd(0, a);
5354#endif
5355}

◆ _mm_set_ss()

FORCE_INLINE __m128 _mm_set_ss ( float  a)

在文件 sse2neon.h 第 2599 行定义.

2600{
2601 return vreinterpretq_m128_f32(vsetq_lane_f32(a, vdupq_n_f32(0), 0));
2602}

◆ _mm_setcsr()

FORCE_INLINE void _mm_setcsr ( unsigned int  a)

在文件 sse2neon.h 第 2615 行定义.

2616{
2618}
FORCE_INLINE void _MM_SET_ROUNDING_MODE(int rounding)
Definition sse2neon.h:2554

◆ _mm_setr_epi16()

FORCE_INLINE __m128i _mm_setr_epi16 ( short  w0,
short  w1,
short  w2,
short  w3,
short  w4,
short  w5,
short  w6,
short  w7 
)

在文件 sse2neon.h 第 5429 行定义.

5437{
5438 int16_t ALIGN_STRUCT(16) data[8] = {w0, w1, w2, w3, w4, w5, w6, w7};
5439 return vreinterpretq_m128i_s16(vld1q_s16((int16_t *) data));
5440}

◆ _mm_setr_epi32()

FORCE_INLINE __m128i _mm_setr_epi32 ( int  i3,
int  i2,
int  i1,
int  i0 
)

在文件 sse2neon.h 第 5444 行定义.

5445{
5446 int32_t ALIGN_STRUCT(16) data[4] = {i3, i2, i1, i0};
5447 return vreinterpretq_m128i_s32(vld1q_s32(data));
5448}

◆ _mm_setr_epi64()

FORCE_INLINE __m128i _mm_setr_epi64 ( __m64  e1,
__m64  e0 
)

在文件 sse2neon.h 第 5452 行定义.

5453{
5454 return vreinterpretq_m128i_s64(vcombine_s64(e1, e0));
5455}

◆ _mm_setr_epi8()

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 
)

在文件 sse2neon.h 第 5459 行定义.

5475{
5476 int8_t ALIGN_STRUCT(16)
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);
5482}

◆ _mm_setr_pd()

FORCE_INLINE __m128d _mm_setr_pd ( double  e1,
double  e0 
)

在文件 sse2neon.h 第 5487 行定义.

5488{
5489 return _mm_set_pd(e0, e1);
5490}

◆ _mm_setr_ps()

FORCE_INLINE __m128 _mm_setr_ps ( float  w,
float  z,
float  y,
float  x 
)

在文件 sse2neon.h 第 2629 行定义.

2630{
2631 float ALIGN_STRUCT(16) data[4] = {w, z, y, x};
2632 return vreinterpretq_m128_f32(vld1q_f32(data));
2633}

◆ _mm_setzero_pd()

FORCE_INLINE __m128d _mm_setzero_pd ( void  )

在文件 sse2neon.h 第 5494 行定义.

5495{
5496#if defined(__aarch64__)
5497 return vreinterpretq_m128d_f64(vdupq_n_f64(0));
5498#else
5499 return vreinterpretq_m128d_f32(vdupq_n_f32(0));
5500#endif
5501}

◆ _mm_setzero_ps()

FORCE_INLINE __m128 _mm_setzero_ps ( void  )

在文件 sse2neon.h 第 2637 行定义.

2638{
2639 return vreinterpretq_m128_f32(vdupq_n_f32(0));
2640}

◆ _mm_setzero_si128()

FORCE_INLINE __m128i _mm_setzero_si128 ( void  )

在文件 sse2neon.h 第 5505 行定义.

5506{
5507 return vreinterpretq_m128i_s32(vdupq_n_s32(0));
5508}

◆ _mm_sfence()

FORCE_INLINE void _mm_sfence ( void  )

在文件 sse2neon.h 第 2676 行定义.

2677{
2679}

◆ _mm_shuffle_epi8()

FORCE_INLINE __m128i _mm_shuffle_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 7249 行定义.

7250{
7251 int8x16_t tbl = vreinterpretq_s8_m128i(a); // input a
7252 uint8x16_t idx = vreinterpretq_u8_m128i(b); // input b
7253 uint8x16_t idx_masked =
7254 vandq_u8(idx, vdupq_n_u8(0x8F)); // avoid using meaningless bits
7255#if defined(__aarch64__)
7256 return vreinterpretq_m128i_s8(vqtbl1q_s8(tbl, idx_masked));
7257#elif defined(__GNUC__)
7258 int8x16_t ret;
7259 // %e and %f represent the even and odd D registers
7260 // respectively.
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"
7264 : [ret] "=&w"(ret)
7265 : [tbl] "w"(tbl), [idx] "w"(idx_masked));
7266 return vreinterpretq_m128i_s8(ret);
7267#else
7268 // use this line if testing on aarch64
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))));
7273#endif
7274}

◆ _mm_shuffle_epi_0101()

FORCE_INLINE __m128i _mm_shuffle_epi_0101 ( __m128i  a)

在文件 sse2neon.h 第 1029 行定义.

1030{
1031 int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
1032 return vreinterpretq_m128i_s32(vcombine_s32(a01, a01));
1033}

◆ _mm_shuffle_epi_0122()

FORCE_INLINE __m128i _mm_shuffle_epi_0122 ( __m128i  a)

在文件 sse2neon.h 第 1042 行定义.

1043{
1044 int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0);
1045 int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
1046 return vreinterpretq_m128i_s32(vcombine_s32(a22, a01));
1047}

◆ _mm_shuffle_epi_0321()

FORCE_INLINE __m128i _mm_shuffle_epi_0321 ( __m128i  a)

在文件 sse2neon.h 第 995 行定义.

996{
999}

◆ _mm_shuffle_epi_1001()

FORCE_INLINE __m128i _mm_shuffle_epi_1001 ( __m128i  a)

在文件 sse2neon.h 第 1019 行定义.

1020{
1021 int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
1022 int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a));
1023 return vreinterpretq_m128i_s32(vcombine_s32(a01, a10));
1024}

◆ _mm_shuffle_epi_1010()

FORCE_INLINE __m128i _mm_shuffle_epi_1010 ( __m128i  a)

在文件 sse2neon.h 第 1011 行定义.

1012{
1013 int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a));
1014 return vreinterpretq_m128i_s32(vcombine_s32(a10, a10));
1015}

◆ _mm_shuffle_epi_1032()

FORCE_INLINE __m128i _mm_shuffle_epi_1032 ( __m128i  a)

在文件 sse2neon.h 第 976 行定义.

977{
978 int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a));
979 int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a));
980 return vreinterpretq_m128i_s32(vcombine_s32(a32, a10));
981}

◆ _mm_shuffle_epi_2103()

FORCE_INLINE __m128i _mm_shuffle_epi_2103 ( __m128i  a)

在文件 sse2neon.h 第 1003 行定义.

1004{
1007}

◆ _mm_shuffle_epi_2211()

FORCE_INLINE __m128i _mm_shuffle_epi_2211 ( __m128i  a)

在文件 sse2neon.h 第 1035 行定义.

1036{
1037 int32x2_t a11 = vdup_lane_s32(vget_low_s32(vreinterpretq_s32_m128i(a)), 1);
1038 int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0);
1039 return vreinterpretq_m128i_s32(vcombine_s32(a11, a22));
1040}

◆ _mm_shuffle_epi_2301()

FORCE_INLINE __m128i _mm_shuffle_epi_2301 ( __m128i  a)

在文件 sse2neon.h 第 986 行定义.

987{
988 int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
989 int32x2_t a23 = vrev64_s32(vget_high_s32(vreinterpretq_s32_m128i(a)));
990 return vreinterpretq_m128i_s32(vcombine_s32(a01, a23));
991}

◆ _mm_shuffle_epi_3332()

FORCE_INLINE __m128i _mm_shuffle_epi_3332 ( __m128i  a)

在文件 sse2neon.h 第 1049 行定义.

1050{
1051 int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a));
1052 int32x2_t a33 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 1);
1053 return vreinterpretq_m128i_s32(vcombine_s32(a32, a33));
1054}

◆ _mm_shuffle_pi8()

FORCE_INLINE __m64 _mm_shuffle_pi8 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 7290 行定义.

7291{
7292 const int8x8_t controlMask =
7293 vand_s8(vreinterpret_s8_m64(b), vdup_n_s8((int8_t) (0x1 << 7 | 0x07)));
7294 int8x8_t res = vtbl1_s8(vreinterpret_s8_m64(a), controlMask);
7295 return vreinterpret_m64_s8(res);
7296}

◆ _mm_shuffle_ps_0011()

FORCE_INLINE __m128 _mm_shuffle_ps_0011 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 755 行定义.

756{
757 float32x2_t a11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 1);
758 float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
759 return vreinterpretq_m128_f32(vcombine_f32(a11, b00));
760}

◆ _mm_shuffle_ps_0022()

FORCE_INLINE __m128 _mm_shuffle_ps_0022 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 762 行定义.

763{
764 float32x2_t a22 =
765 vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0);
766 float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
767 return vreinterpretq_m128_f32(vcombine_f32(a22, b00));
768}

◆ _mm_shuffle_ps_0101()

FORCE_INLINE __m128 _mm_shuffle_ps_0101 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 739 行定义.

740{
741 float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
742 float32x2_t b01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(b)));
743 return vreinterpretq_m128_f32(vcombine_f32(a01, b01));
744}

◆ _mm_shuffle_ps_0321()

FORCE_INLINE __m128 _mm_shuffle_ps_0321 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 707 行定义.

708{
709 float32x2_t a21 = vget_high_f32(
711 float32x2_t b03 = vget_low_f32(
713 return vreinterpretq_m128_f32(vcombine_f32(a21, b03));
714}

◆ _mm_shuffle_ps_1001()

FORCE_INLINE __m128 _mm_shuffle_ps_1001 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 732 行定义.

733{
734 float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
735 float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
736 return vreinterpretq_m128_f32(vcombine_f32(a01, b10));
737}

◆ _mm_shuffle_ps_1010()

FORCE_INLINE __m128 _mm_shuffle_ps_1010 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 725 行定义.

726{
727 float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
728 float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
729 return vreinterpretq_m128_f32(vcombine_f32(a10, b10));
730}

◆ _mm_shuffle_ps_1032()

FORCE_INLINE __m128 _mm_shuffle_ps_1032 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 690 行定义.

691{
692 float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a));
693 float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
694 return vreinterpretq_m128_f32(vcombine_f32(a32, b10));
695}

◆ _mm_shuffle_ps_1133()

FORCE_INLINE __m128 _mm_shuffle_ps_1133 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 788 行定义.

789{
790 float32x2_t a33 =
791 vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 1);
792 float32x2_t b11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 1);
793 return vreinterpretq_m128_f32(vcombine_f32(a33, b11));
794}

◆ _mm_shuffle_ps_2001()

FORCE_INLINE __m128 _mm_shuffle_ps_2001 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 805 行定义.

806{
807 float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
808 float32_t b2 = vgetq_lane_f32(b, 2);
809 float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
810 float32x2_t b20 = vset_lane_f32(b2, b00, 1);
811 return vreinterpretq_m128_f32(vcombine_f32(a01, b20));
812}

◆ _mm_shuffle_ps_2010()

FORCE_INLINE __m128 _mm_shuffle_ps_2010 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 796 行定义.

797{
798 float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
799 float32_t b2 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 2);
800 float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
801 float32x2_t b20 = vset_lane_f32(b2, b00, 1);
802 return vreinterpretq_m128_f32(vcombine_f32(a10, b20));
803}

◆ _mm_shuffle_ps_2032()

FORCE_INLINE __m128 _mm_shuffle_ps_2032 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 814 行定义.

815{
816 float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a));
817 float32_t b2 = vgetq_lane_f32(b, 2);
818 float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
819 float32x2_t b20 = vset_lane_f32(b2, b00, 1);
820 return vreinterpretq_m128_f32(vcombine_f32(a32, b20));
821}

◆ _mm_shuffle_ps_2103()

FORCE_INLINE __m128 _mm_shuffle_ps_2103 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 716 行定义.

717{
718 float32x2_t a03 = vget_low_f32(
720 float32x2_t b21 = vget_high_f32(
722 return vreinterpretq_m128_f32(vcombine_f32(a03, b21));
723}

◆ _mm_shuffle_ps_2200()

FORCE_INLINE __m128 _mm_shuffle_ps_2200 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 770 行定义.

771{
772 float32x2_t a00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 0);
773 float32x2_t b22 =
774 vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(b)), 0);
775 return vreinterpretq_m128_f32(vcombine_f32(a00, b22));
776}

◆ _mm_shuffle_ps_2301()

FORCE_INLINE __m128 _mm_shuffle_ps_2301 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 700 行定义.

701{
702 float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
703 float32x2_t b23 = vrev64_f32(vget_high_f32(vreinterpretq_f32_m128(b)));
704 return vreinterpretq_m128_f32(vcombine_f32(a01, b23));
705}

◆ _mm_shuffle_ps_3202()

FORCE_INLINE __m128 _mm_shuffle_ps_3202 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 778 行定义.

779{
780 float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
781 float32x2_t a22 =
782 vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0);
783 float32x2_t a02 = vset_lane_f32(a0, a22, 1); /* TODO: use vzip ?*/
784 float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b));
785 return vreinterpretq_m128_f32(vcombine_f32(a02, b32));
786}

◆ _mm_shuffle_ps_3210()

FORCE_INLINE __m128 _mm_shuffle_ps_3210 ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 748 行定义.

749{
750 float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
751 float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b));
752 return vreinterpretq_m128_f32(vcombine_f32(a10, b32));
753}

◆ _mm_sign_epi16()

FORCE_INLINE __m128i _mm_sign_epi16 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7312 行定义.

7313{
7314 int16x8_t a = vreinterpretq_s16_m128i(_a);
7315 int16x8_t b = vreinterpretq_s16_m128i(_b);
7316
7317 // signed shift right: faster than vclt
7318 // (b < 0) ? 0xFFFF : 0
7319 uint16x8_t ltMask = vreinterpretq_u16_s16(vshrq_n_s16(b, 15));
7320 // (b == 0) ? 0xFFFF : 0
7321#if defined(__aarch64__)
7322 int16x8_t zeroMask = vreinterpretq_s16_u16(vceqzq_s16(b));
7323#else
7324 int16x8_t zeroMask = vreinterpretq_s16_u16(vceqq_s16(b, vdupq_n_s16(0)));
7325#endif
7326
7327 // bitwise select either a or negative 'a' (vnegq_s16(a) equals to negative
7328 // 'a') based on ltMask
7329 int16x8_t masked = vbslq_s16(ltMask, vnegq_s16(a), a);
7330 // res = masked & (~zeroMask)
7331 int16x8_t res = vbicq_s16(masked, zeroMask);
7332 return vreinterpretq_m128i_s16(res);
7333}

◆ _mm_sign_epi32()

FORCE_INLINE __m128i _mm_sign_epi32 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7349 行定义.

7350{
7351 int32x4_t a = vreinterpretq_s32_m128i(_a);
7352 int32x4_t b = vreinterpretq_s32_m128i(_b);
7353
7354 // signed shift right: faster than vclt
7355 // (b < 0) ? 0xFFFFFFFF : 0
7356 uint32x4_t ltMask = vreinterpretq_u32_s32(vshrq_n_s32(b, 31));
7357
7358 // (b == 0) ? 0xFFFFFFFF : 0
7359#if defined(__aarch64__)
7360 int32x4_t zeroMask = vreinterpretq_s32_u32(vceqzq_s32(b));
7361#else
7362 int32x4_t zeroMask = vreinterpretq_s32_u32(vceqq_s32(b, vdupq_n_s32(0)));
7363#endif
7364
7365 // bitwise select either a or negative 'a' (vnegq_s32(a) equals to negative
7366 // 'a') based on ltMask
7367 int32x4_t masked = vbslq_s32(ltMask, vnegq_s32(a), a);
7368 // res = masked & (~zeroMask)
7369 int32x4_t res = vbicq_s32(masked, zeroMask);
7370 return vreinterpretq_m128i_s32(res);
7371}

◆ _mm_sign_epi8()

FORCE_INLINE __m128i _mm_sign_epi8 ( __m128i  _a,
__m128i  _b 
)

在文件 sse2neon.h 第 7387 行定义.

7388{
7389 int8x16_t a = vreinterpretq_s8_m128i(_a);
7390 int8x16_t b = vreinterpretq_s8_m128i(_b);
7391
7392 // signed shift right: faster than vclt
7393 // (b < 0) ? 0xFF : 0
7394 uint8x16_t ltMask = vreinterpretq_u8_s8(vshrq_n_s8(b, 7));
7395
7396 // (b == 0) ? 0xFF : 0
7397#if defined(__aarch64__)
7398 int8x16_t zeroMask = vreinterpretq_s8_u8(vceqzq_s8(b));
7399#else
7400 int8x16_t zeroMask = vreinterpretq_s8_u8(vceqq_s8(b, vdupq_n_s8(0)));
7401#endif
7402
7403 // bitwise select either a or negative 'a' (vnegq_s8(a) return negative 'a')
7404 // based on ltMask
7405 int8x16_t masked = vbslq_s8(ltMask, vnegq_s8(a), a);
7406 // res = masked & (~zeroMask)
7407 int8x16_t res = vbicq_s8(masked, zeroMask);
7408
7409 return vreinterpretq_m128i_s8(res);
7410}

◆ _mm_sign_pi16()

FORCE_INLINE __m64 _mm_sign_pi16 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7428 行定义.

7429{
7430 int16x4_t a = vreinterpret_s16_m64(_a);
7431 int16x4_t b = vreinterpret_s16_m64(_b);
7432
7433 // signed shift right: faster than vclt
7434 // (b < 0) ? 0xFFFF : 0
7435 uint16x4_t ltMask = vreinterpret_u16_s16(vshr_n_s16(b, 15));
7436
7437 // (b == 0) ? 0xFFFF : 0
7438#if defined(__aarch64__)
7439 int16x4_t zeroMask = vreinterpret_s16_u16(vceqz_s16(b));
7440#else
7441 int16x4_t zeroMask = vreinterpret_s16_u16(vceq_s16(b, vdup_n_s16(0)));
7442#endif
7443
7444 // bitwise select either a or negative 'a' (vneg_s16(a) return negative 'a')
7445 // based on ltMask
7446 int16x4_t masked = vbsl_s16(ltMask, vneg_s16(a), a);
7447 // res = masked & (~zeroMask)
7448 int16x4_t res = vbic_s16(masked, zeroMask);
7449
7450 return vreinterpret_m64_s16(res);
7451}

◆ _mm_sign_pi32()

FORCE_INLINE __m64 _mm_sign_pi32 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7469 行定义.

7470{
7471 int32x2_t a = vreinterpret_s32_m64(_a);
7472 int32x2_t b = vreinterpret_s32_m64(_b);
7473
7474 // signed shift right: faster than vclt
7475 // (b < 0) ? 0xFFFFFFFF : 0
7476 uint32x2_t ltMask = vreinterpret_u32_s32(vshr_n_s32(b, 31));
7477
7478 // (b == 0) ? 0xFFFFFFFF : 0
7479#if defined(__aarch64__)
7480 int32x2_t zeroMask = vreinterpret_s32_u32(vceqz_s32(b));
7481#else
7482 int32x2_t zeroMask = vreinterpret_s32_u32(vceq_s32(b, vdup_n_s32(0)));
7483#endif
7484
7485 // bitwise select either a or negative 'a' (vneg_s32(a) return negative 'a')
7486 // based on ltMask
7487 int32x2_t masked = vbsl_s32(ltMask, vneg_s32(a), a);
7488 // res = masked & (~zeroMask)
7489 int32x2_t res = vbic_s32(masked, zeroMask);
7490
7491 return vreinterpret_m64_s32(res);
7492}

◆ _mm_sign_pi8()

FORCE_INLINE __m64 _mm_sign_pi8 ( __m64  _a,
__m64  _b 
)

在文件 sse2neon.h 第 7510 行定义.

7511{
7512 int8x8_t a = vreinterpret_s8_m64(_a);
7513 int8x8_t b = vreinterpret_s8_m64(_b);
7514
7515 // signed shift right: faster than vclt
7516 // (b < 0) ? 0xFF : 0
7517 uint8x8_t ltMask = vreinterpret_u8_s8(vshr_n_s8(b, 7));
7518
7519 // (b == 0) ? 0xFF : 0
7520#if defined(__aarch64__)
7521 int8x8_t zeroMask = vreinterpret_s8_u8(vceqz_s8(b));
7522#else
7523 int8x8_t zeroMask = vreinterpret_s8_u8(vceq_s8(b, vdup_n_s8(0)));
7524#endif
7525
7526 // bitwise select either a or negative 'a' (vneg_s8(a) return negative 'a')
7527 // based on ltMask
7528 int8x8_t masked = vbsl_s8(ltMask, vneg_s8(a), a);
7529 // res = masked & (~zeroMask)
7530 int8x8_t res = vbic_s8(masked, zeroMask);
7531
7532 return vreinterpret_m64_s8(res);
7533}

◆ _mm_sll_epi16()

FORCE_INLINE __m128i _mm_sll_epi16 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5641 行定义.

5642{
5643 uint64_t c = vreinterpretq_nth_u64_m128i(count, 0);
5644 if (_sse2neon_unlikely(c & ~15))
5645 return _mm_setzero_si128();
5646
5647 int16x8_t vc = vdupq_n_s16((int16_t) c);
5648 return vreinterpretq_m128i_s16(vshlq_s16(vreinterpretq_s16_m128i(a), vc));
5649}
#define vreinterpretq_nth_u64_m128i(x, n)
Definition sse2neon.h:476

◆ _mm_sll_epi32()

FORCE_INLINE __m128i _mm_sll_epi32 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5664 行定义.

5665{
5666 uint64_t c = vreinterpretq_nth_u64_m128i(count, 0);
5667 if (_sse2neon_unlikely(c & ~31))
5668 return _mm_setzero_si128();
5669
5670 int32x4_t vc = vdupq_n_s32((int32_t) c);
5671 return vreinterpretq_m128i_s32(vshlq_s32(vreinterpretq_s32_m128i(a), vc));
5672}

◆ _mm_sll_epi64()

FORCE_INLINE __m128i _mm_sll_epi64 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5687 行定义.

5688{
5689 uint64_t c = vreinterpretq_nth_u64_m128i(count, 0);
5690 if (_sse2neon_unlikely(c & ~63))
5691 return _mm_setzero_si128();
5692
5693 int64x2_t vc = vdupq_n_s64((int64_t) c);
5694 return vreinterpretq_m128i_s64(vshlq_s64(vreinterpretq_s64_m128i(a), vc));
5695}

◆ _mm_slli_epi16()

FORCE_INLINE __m128i _mm_slli_epi16 ( __m128i  a,
int  imm 
)

在文件 sse2neon.h 第 5710 行定义.

5711{
5712 if (_sse2neon_unlikely(imm & ~15))
5713 return _mm_setzero_si128();
5715 vshlq_s16(vreinterpretq_s16_m128i(a), vdupq_n_s16(imm)));
5716}

◆ _mm_slli_epi32()

FORCE_INLINE __m128i _mm_slli_epi32 ( __m128i  a,
int  imm 
)

在文件 sse2neon.h 第 5731 行定义.

5732{
5733 if (_sse2neon_unlikely(imm & ~31))
5734 return _mm_setzero_si128();
5736 vshlq_s32(vreinterpretq_s32_m128i(a), vdupq_n_s32(imm)));
5737}

◆ _mm_slli_epi64()

FORCE_INLINE __m128i _mm_slli_epi64 ( __m128i  a,
int  imm 
)

在文件 sse2neon.h 第 5752 行定义.

5753{
5754 if (_sse2neon_unlikely(imm & ~63))
5755 return _mm_setzero_si128();
5757 vshlq_s64(vreinterpretq_s64_m128i(a), vdupq_n_s64(imm)));
5758}

◆ _mm_sqrt_pd()

FORCE_INLINE __m128d _mm_sqrt_pd ( __m128d  a)

在文件 sse2neon.h 第 5786 行定义.

5787{
5788#if defined(__aarch64__)
5789 return vreinterpretq_m128d_f64(vsqrtq_f64(vreinterpretq_f64_m128d(a)));
5790#else
5791 double a0 = sqrt(((double *) &a)[0]);
5792 double a1 = sqrt(((double *) &a)[1]);
5793 return _mm_set_pd(a1, a0);
5794#endif
5795}

◆ _mm_sqrt_ps()

FORCE_INLINE __m128 _mm_sqrt_ps ( __m128  in)

在文件 sse2neon.h 第 2788 行定义.

2789{
2790#if SSE2NEON_PRECISE_SQRT
2791 float32x4_t recip = vrsqrteq_f32(vreinterpretq_f32_m128(in));
2792
2793 // Test for vrsqrteq_f32(0) -> positive infinity case.
2794 // Change to zero, so that s * 1/sqrt(s) result is zero too.
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)));
2800
2801 // Additional Netwon-Raphson iteration for accuracy
2802 recip = vmulq_f32(
2803 vrsqrtsq_f32(vmulq_f32(recip, recip), vreinterpretq_f32_m128(in)),
2804 recip);
2805 recip = vmulq_f32(
2806 vrsqrtsq_f32(vmulq_f32(recip, recip), vreinterpretq_f32_m128(in)),
2807 recip);
2808
2809 // sqrt(s) = s * 1/sqrt(s)
2810 return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(in), recip));
2811#elif defined(__aarch64__)
2812 return vreinterpretq_m128_f32(vsqrtq_f32(vreinterpretq_f32_m128(in)));
2813#else
2814 float32x4_t recipsq = vrsqrteq_f32(vreinterpretq_f32_m128(in));
2815 float32x4_t sq = vrecpeq_f32(recipsq);
2816 return vreinterpretq_m128_f32(sq);
2817#endif
2818}

◆ _mm_sqrt_sd()

FORCE_INLINE __m128d _mm_sqrt_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 5801 行定义.

5802{
5803#if defined(__aarch64__)
5804 return _mm_move_sd(a, _mm_sqrt_pd(b));
5805#else
5806 return _mm_set_pd(((double *) &a)[1], sqrt(((double *) &b)[0]));
5807#endif
5808}
FORCE_INLINE __m128d _mm_sqrt_pd(__m128d a)
Definition sse2neon.h:5786

◆ _mm_sqrt_ss()

FORCE_INLINE __m128 _mm_sqrt_ss ( __m128  in)

在文件 sse2neon.h 第 2823 行定义.

2824{
2825 float32_t value =
2826 vgetq_lane_f32(vreinterpretq_f32_m128(_mm_sqrt_ps(in)), 0);
2828 vsetq_lane_f32(value, vreinterpretq_f32_m128(in), 0));
2829}
FORCE_INLINE __m128 _mm_sqrt_ps(__m128 in)
Definition sse2neon.h:2788

◆ _mm_sra_epi16()

FORCE_INLINE __m128i _mm_sra_epi16 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5823 行定义.

5824{
5825 int64_t c = (int64_t) vget_low_s64((int64x2_t) count);
5826 if (_sse2neon_unlikely(c & ~15))
5828 return vreinterpretq_m128i_s16(vshlq_s16((int16x8_t) a, vdupq_n_s16(-c)));
5829}
FORCE_INLINE __m128i _mm_cmplt_epi16(__m128i a, __m128i b)
Definition sse2neon.h:3635

◆ _mm_sra_epi32()

FORCE_INLINE __m128i _mm_sra_epi32 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5844 行定义.

5845{
5846 int64_t c = (int64_t) vget_low_s64((int64x2_t) count);
5847 if (_sse2neon_unlikely(c & ~31))
5849 return vreinterpretq_m128i_s32(vshlq_s32((int32x4_t) a, vdupq_n_s32(-c)));
5850}
FORCE_INLINE __m128i _mm_cmplt_epi32(__m128i a, __m128i b)
Definition sse2neon.h:3645

◆ _mm_srai_epi16()

FORCE_INLINE __m128i _mm_srai_epi16 ( __m128i  a,
int  imm 
)

在文件 sse2neon.h 第 5865 行定义.

5866{
5867 const int count = (imm & ~15) ? 15 : imm;
5868 return (__m128i) vshlq_s16((int16x8_t) a, vdupq_n_s16(-count));
5869}

◆ _mm_srl_epi16()

FORCE_INLINE __m128i _mm_srl_epi16 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5913 行定义.

5914{
5915 uint64_t c = vreinterpretq_nth_u64_m128i(count, 0);
5916 if (_sse2neon_unlikely(c & ~15))
5917 return _mm_setzero_si128();
5918
5919 int16x8_t vc = vdupq_n_s16(-(int16_t) c);
5920 return vreinterpretq_m128i_u16(vshlq_u16(vreinterpretq_u16_m128i(a), vc));
5921}

◆ _mm_srl_epi32()

FORCE_INLINE __m128i _mm_srl_epi32 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5936 行定义.

5937{
5938 uint64_t c = vreinterpretq_nth_u64_m128i(count, 0);
5939 if (_sse2neon_unlikely(c & ~31))
5940 return _mm_setzero_si128();
5941
5942 int32x4_t vc = vdupq_n_s32(-(int32_t) c);
5943 return vreinterpretq_m128i_u32(vshlq_u32(vreinterpretq_u32_m128i(a), vc));
5944}

◆ _mm_srl_epi64()

FORCE_INLINE __m128i _mm_srl_epi64 ( __m128i  a,
__m128i  count 
)

在文件 sse2neon.h 第 5959 行定义.

5960{
5961 uint64_t c = vreinterpretq_nth_u64_m128i(count, 0);
5962 if (_sse2neon_unlikely(c & ~63))
5963 return _mm_setzero_si128();
5964
5965 int64x2_t vc = vdupq_n_s64(-(int64_t) c);
5966 return vreinterpretq_m128i_u64(vshlq_u64(vreinterpretq_u64_m128i(a), vc));
5967}

◆ _mm_store_pd()

FORCE_INLINE void _mm_store_pd ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6070 行定义.

6071{
6072#if defined(__aarch64__)
6073 vst1q_f64((float64_t *) mem_addr, vreinterpretq_f64_m128d(a));
6074#else
6075 vst1q_f32((float32_t *) mem_addr, vreinterpretq_f32_m128d(a));
6076#endif
6077}

◆ _mm_store_pd1()

FORCE_INLINE void _mm_store_pd1 ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6083 行定义.

6084{
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)));
6089#else
6090 float32x2_t a_low = vget_low_f32(vreinterpretq_f32_m128d(a));
6091 vst1q_f32((float32_t *) mem_addr,
6092 vreinterpretq_f32_m128d(vcombine_f32(a_low, a_low)));
6093#endif
6094}

◆ _mm_store_ps()

FORCE_INLINE void _mm_store_ps ( float *  p,
__m128  a 
)

在文件 sse2neon.h 第 2833 行定义.

2834{
2835 vst1q_f32(p, vreinterpretq_f32_m128(a));
2836}

◆ _mm_store_ps1()

FORCE_INLINE void _mm_store_ps1 ( float *  p,
__m128  a 
)

在文件 sse2neon.h 第 2848 行定义.

2849{
2850 float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
2851 vst1q_f32(p, vdupq_n_f32(a0));
2852}

◆ _mm_store_sd()

FORCE_INLINE void _mm_store_sd ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6099 行定义.

6100{
6101#if defined(__aarch64__)
6102 vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a)));
6103#else
6104 vst1_u64((uint64_t *) mem_addr, vget_low_u64(vreinterpretq_u64_m128d(a)));
6105#endif
6106}

◆ _mm_store_si128()

FORCE_INLINE void _mm_store_si128 ( __m128i *  p,
__m128i  a 
)

在文件 sse2neon.h 第 6110 行定义.

6111{
6112 vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a));
6113}

◆ _mm_store_ss()

FORCE_INLINE void _mm_store_ss ( float *  p,
__m128  a 
)

在文件 sse2neon.h 第 2856 行定义.

2857{
2858 vst1q_lane_f32(p, vreinterpretq_f32_m128(a), 0);
2859}

◆ _mm_storeh_pd()

FORCE_INLINE void _mm_storeh_pd ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6127 行定义.

6128{
6129#if defined(__aarch64__)
6130 vst1_f64((float64_t *) mem_addr, vget_high_f64(vreinterpretq_f64_m128d(a)));
6131#else
6132 vst1_f32((float32_t *) mem_addr, vget_high_f32(vreinterpretq_f32_m128d(a)));
6133#endif
6134}

◆ _mm_storeh_pi()

FORCE_INLINE void _mm_storeh_pi ( __m64 *  p,
__m128  a 
)

在文件 sse2neon.h 第 2880 行定义.

2881{
2882 *p = vreinterpret_m64_f32(vget_high_f32(a));
2883}
#define vreinterpret_m64_f32(x)
Definition sse2neon.h:392

◆ _mm_storel_epi64()

FORCE_INLINE void _mm_storel_epi64 ( __m128i *  a,
__m128i  b 
)

在文件 sse2neon.h 第 6138 行定义.

6139{
6140 vst1_u64((uint64_t *) a, vget_low_u64(vreinterpretq_u64_m128i(b)));
6141}

◆ _mm_storel_pd()

FORCE_INLINE void _mm_storel_pd ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6149 行定义.

6150{
6151#if defined(__aarch64__)
6152 vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a)));
6153#else
6154 vst1_f32((float32_t *) mem_addr, vget_low_f32(vreinterpretq_f32_m128d(a)));
6155#endif
6156}

◆ _mm_storel_pi()

FORCE_INLINE void _mm_storel_pi ( __m64 *  p,
__m128  a 
)

在文件 sse2neon.h 第 2892 行定义.

2893{
2894 *p = vreinterpret_m64_f32(vget_low_f32(a));
2895}

◆ _mm_storer_pd()

FORCE_INLINE void _mm_storer_pd ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6166 行定义.

6167{
6168 float32x4_t f = vreinterpretq_f32_m128d(a);
6169 _mm_store_pd(mem_addr, vreinterpretq_m128d_f32(vextq_f32(f, f, 2)));
6170}
FORCE_INLINE void _mm_store_pd(double *mem_addr, __m128d a)
Definition sse2neon.h:6070

◆ _mm_storer_ps()

FORCE_INLINE void _mm_storer_ps ( float *  p,
__m128  a 
)

在文件 sse2neon.h 第 2907 行定义.

2908{
2909 float32x4_t tmp = vrev64q_f32(vreinterpretq_f32_m128(a));
2910 float32x4_t rev = vextq_f32(tmp, tmp, 2);
2911 vst1q_f32(p, rev);
2912}

◆ _mm_storeu_pd()

FORCE_INLINE void _mm_storeu_pd ( double *  mem_addr,
__m128d  a 
)

在文件 sse2neon.h 第 6176 行定义.

6177{
6178 _mm_store_pd(mem_addr, a);
6179}

◆ _mm_storeu_ps()

FORCE_INLINE void _mm_storeu_ps ( float *  p,
__m128  a 
)

在文件 sse2neon.h 第 2916 行定义.

2917{
2918 vst1q_f32(p, vreinterpretq_f32_m128(a));
2919}

◆ _mm_storeu_si128()

FORCE_INLINE void _mm_storeu_si128 ( __m128i *  p,
__m128i  a 
)

在文件 sse2neon.h 第 6183 行定义.

6184{
6185 vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a));
6186}

◆ _mm_storeu_si16()

FORCE_INLINE void _mm_storeu_si16 ( void *  p,
__m128i  a 
)

在文件 sse2neon.h 第 2923 行定义.

2924{
2925 vst1q_lane_s16((int16_t *) p, vreinterpretq_s16_m128i(a), 0);
2926}

◆ _mm_storeu_si32()

FORCE_INLINE void _mm_storeu_si32 ( void *  p,
__m128i  a 
)

在文件 sse2neon.h 第 6190 行定义.

6191{
6192 vst1q_lane_s32((int32_t *) p, vreinterpretq_s32_m128i(a), 0);
6193}

◆ _mm_storeu_si64()

FORCE_INLINE void _mm_storeu_si64 ( void *  p,
__m128i  a 
)

在文件 sse2neon.h 第 2930 行定义.

2931{
2932 vst1q_lane_s64((int64_t *) p, vreinterpretq_s64_m128i(a), 0);
2933}

◆ _mm_stream_load_si128()

FORCE_INLINE __m128i _mm_stream_load_si128 ( __m128i *  p)

在文件 sse2neon.h 第 8484 行定义.

8485{
8486#if __has_builtin(__builtin_nontemporal_store)
8487 return __builtin_nontemporal_load(p);
8488#else
8489 return vreinterpretq_m128i_s64(vld1q_s64((int64_t *) p));
8490#endif
8491}

◆ _mm_stream_pd()

FORCE_INLINE void _mm_stream_pd ( double *  p,
__m128d  a 
)

在文件 sse2neon.h 第 6200 行定义.

6201{
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));
6206#else
6207 vst1q_s64((int64_t *) p, vreinterpretq_s64_m128d(a));
6208#endif
6209}

◆ _mm_stream_pi()

FORCE_INLINE void _mm_stream_pi ( __m64 *  p,
__m64  a 
)

在文件 sse2neon.h 第 2938 行定义.

2939{
2940 vst1_s64((int64_t *) p, vreinterpret_s64_m64(a));
2941}

◆ _mm_stream_ps()

FORCE_INLINE void _mm_stream_ps ( float *  p,
__m128  a 
)

在文件 sse2neon.h 第 2946 行定义.

2947{
2948#if __has_builtin(__builtin_nontemporal_store)
2949 __builtin_nontemporal_store(a, (float32x4_t *) p);
2950#else
2951 vst1q_f32(p, vreinterpretq_f32_m128(a));
2952#endif
2953}

◆ _mm_stream_si128()

FORCE_INLINE void _mm_stream_si128 ( __m128i *  p,
__m128i  a 
)

在文件 sse2neon.h 第 6215 行定义.

6216{
6217#if __has_builtin(__builtin_nontemporal_store)
6218 __builtin_nontemporal_store(a, p);
6219#else
6220 vst1q_s64((int64_t *) p, vreinterpretq_s64_m128i(a));
6221#endif
6222}

◆ _mm_stream_si32()

FORCE_INLINE void _mm_stream_si32 ( int *  p,
int  a 
)

在文件 sse2neon.h 第 6228 行定义.

6229{
6230 vst1q_lane_s32((int32_t *) p, vdupq_n_s32(a), 0);
6231}

◆ _mm_stream_si64()

FORCE_INLINE void _mm_stream_si64 ( __int64 *  p,
__int64  a 
)

在文件 sse2neon.h 第 6237 行定义.

6238{
6239 vst1_s64((int64_t *) p, vdup_n_s64((int64_t) a));
6240}

◆ _mm_sub_epi16()

FORCE_INLINE __m128i _mm_sub_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6245 行定义.

6246{
6249}

◆ _mm_sub_epi32()

FORCE_INLINE __m128i _mm_sub_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6260 行定义.

6261{
6264}

◆ _mm_sub_epi64()

FORCE_INLINE __m128i _mm_sub_epi64 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6270 行定义.

6271{
6274}

◆ _mm_sub_epi8()

FORCE_INLINE __m128i _mm_sub_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6279 行定义.

6280{
6283}

◆ _mm_sub_pd()

FORCE_INLINE __m128d _mm_sub_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6295 行定义.

6296{
6297#if defined(__aarch64__)
6298 return vreinterpretq_m128d_f64(
6299 vsubq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6300#else
6301 double *da = (double *) &a;
6302 double *db = (double *) &b;
6303 double c[2];
6304 c[0] = da[0] - db[0];
6305 c[1] = da[1] - db[1];
6306 return vld1q_f32((float32_t *) c);
6307#endif
6308}

◆ _mm_sub_ps()

FORCE_INLINE __m128 _mm_sub_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2963 行定义.

2964{
2967}

◆ _mm_sub_sd()

FORCE_INLINE __m128d _mm_sub_sd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6315 行定义.

6316{
6317 return _mm_move_sd(a, _mm_sub_pd(a, b));
6318}
FORCE_INLINE __m128d _mm_sub_pd(__m128d a, __m128d b)
Definition sse2neon.h:6295

◆ _mm_sub_si64()

FORCE_INLINE __m64 _mm_sub_si64 ( __m64  a,
__m64  b 
)

在文件 sse2neon.h 第 6325 行定义.

6326{
6327 return vreinterpret_m64_s64(
6329}

◆ _mm_sub_ss()

FORCE_INLINE __m128 _mm_sub_ss ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 2978 行定义.

2979{
2980 return _mm_move_ss(a, _mm_sub_ps(a, b));
2981}
FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b)
Definition sse2neon.h:2963

◆ _mm_subs_epi16()

FORCE_INLINE __m128i _mm_subs_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6340 行定义.

6341{
6344}

◆ _mm_subs_epi8()

FORCE_INLINE __m128i _mm_subs_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6355 行定义.

6356{
6359}

◆ _mm_subs_epu16()

FORCE_INLINE __m128i _mm_subs_epu16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6364 行定义.

6365{
6368}

◆ _mm_subs_epu8()

FORCE_INLINE __m128i _mm_subs_epu8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6379 行定义.

6380{
6383}

◆ _mm_test_all_ones()

FORCE_INLINE int _mm_test_all_ones ( __m128i  a)

在文件 sse2neon.h 第 8496 行定义.

8497{
8498 return (uint64_t) (vgetq_lane_s64(a, 0) & vgetq_lane_s64(a, 1)) ==
8499 ~(uint64_t) 0;
8500}

◆ _mm_test_all_zeros()

FORCE_INLINE int _mm_test_all_zeros ( __m128i  a,
__m128i  mask 
)

在文件 sse2neon.h 第 8505 行定义.

8506{
8507 int64x2_t a_and_mask =
8509 return !(vgetq_lane_s64(a_and_mask, 0) | vgetq_lane_s64(a_and_mask, 1));
8510}

◆ _mm_test_mix_ones_zeros()

FORCE_INLINE int _mm_test_mix_ones_zeros ( __m128i  a,
__m128i  mask 
)

在文件 sse2neon.h 第 8518 行定义.

8519{
8520 uint64x2_t zf =
8522 uint64x2_t cf =
8524 uint64x2_t result = vandq_u64(zf, cf);
8525 return !(vgetq_lane_u64(result, 0) | vgetq_lane_u64(result, 1));
8526}

◆ _mm_testc_si128()

FORCE_INLINE int _mm_testc_si128 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8533 行定义.

8534{
8535 int64x2_t s64 =
8537 return !(vgetq_lane_s64(s64, 0) | vgetq_lane_s64(s64, 1));
8538}

◆ _mm_testz_si128()

FORCE_INLINE int _mm_testz_si128 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 8553 行定义.

8554{
8555 int64x2_t s64 =
8557 return !(vgetq_lane_s64(s64, 0) | vgetq_lane_s64(s64, 1));
8558}

◆ _mm_undefined_pd()

FORCE_INLINE __m128d _mm_undefined_pd ( void  )

在文件 sse2neon.h 第 6394 行定义.

6395{
6396#if defined(__GNUC__) || defined(__clang__)
6397#pragma GCC diagnostic push
6398#pragma GCC diagnostic ignored "-Wuninitialized"
6399#endif
6400 __m128d a;
6401 return a;
6402#if defined(__GNUC__) || defined(__clang__)
6403#pragma GCC diagnostic pop
6404#endif
6405}

◆ _mm_undefined_ps()

FORCE_INLINE __m128 _mm_undefined_ps ( void  )

在文件 sse2neon.h 第 3027 行定义.

3028{
3029#if defined(__GNUC__) || defined(__clang__)
3030#pragma GCC diagnostic push
3031#pragma GCC diagnostic ignored "-Wuninitialized"
3032#endif
3033 __m128 a;
3034 return a;
3035#if defined(__GNUC__) || defined(__clang__)
3036#pragma GCC diagnostic pop
3037#endif
3038}

◆ _mm_undefined_si128()

FORCE_INLINE __m128i _mm_undefined_si128 ( void  )

在文件 sse2neon.h 第 3012 行定义.

3013{
3014#if defined(__GNUC__) || defined(__clang__)
3015#pragma GCC diagnostic push
3016#pragma GCC diagnostic ignored "-Wuninitialized"
3017#endif
3018 __m128i a;
3019 return a;
3020#if defined(__GNUC__) || defined(__clang__)
3021#pragma GCC diagnostic pop
3022#endif
3023}

◆ _mm_unpackhi_epi16()

FORCE_INLINE __m128i _mm_unpackhi_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6420 行定义.

6421{
6422#if defined(__aarch64__)
6425#else
6426 int16x4_t a1 = vget_high_s16(vreinterpretq_s16_m128i(a));
6427 int16x4_t b1 = vget_high_s16(vreinterpretq_s16_m128i(b));
6428 int16x4x2_t result = vzip_s16(a1, b1);
6429 return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1]));
6430#endif
6431}

◆ _mm_unpackhi_epi32()

FORCE_INLINE __m128i _mm_unpackhi_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6436 行定义.

6437{
6438#if defined(__aarch64__)
6441#else
6442 int32x2_t a1 = vget_high_s32(vreinterpretq_s32_m128i(a));
6443 int32x2_t b1 = vget_high_s32(vreinterpretq_s32_m128i(b));
6444 int32x2x2_t result = vzip_s32(a1, b1);
6445 return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1]));
6446#endif
6447}

◆ _mm_unpackhi_epi64()

FORCE_INLINE __m128i _mm_unpackhi_epi64 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6454 行定义.

6455{
6456 int64x1_t a_h = vget_high_s64(vreinterpretq_s64_m128i(a));
6457 int64x1_t b_h = vget_high_s64(vreinterpretq_s64_m128i(b));
6458 return vreinterpretq_m128i_s64(vcombine_s64(a_h, b_h));
6459}

◆ _mm_unpackhi_epi8()

FORCE_INLINE __m128i _mm_unpackhi_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6473 行定义.

6474{
6475#if defined(__aarch64__)
6478#else
6479 int8x8_t a1 =
6480 vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(a)));
6481 int8x8_t b1 =
6482 vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(b)));
6483 int8x8x2_t result = vzip_s8(a1, b1);
6484 return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1]));
6485#endif
6486}

◆ _mm_unpackhi_pd()

FORCE_INLINE __m128d _mm_unpackhi_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6499 行定义.

6500{
6501#if defined(__aarch64__)
6502 return vreinterpretq_m128d_f64(
6503 vzip2q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6504#else
6506 vcombine_s64(vget_high_s64(vreinterpretq_s64_m128d(a)),
6507 vget_high_s64(vreinterpretq_s64_m128d(b))));
6508#endif
6509}

◆ _mm_unpackhi_ps()

FORCE_INLINE __m128 _mm_unpackhi_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 3049 行定义.

3050{
3051#if defined(__aarch64__)
3054#else
3055 float32x2_t a1 = vget_high_f32(vreinterpretq_f32_m128(a));
3056 float32x2_t b1 = vget_high_f32(vreinterpretq_f32_m128(b));
3057 float32x2x2_t result = vzip_f32(a1, b1);
3058 return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1]));
3059#endif
3060}

◆ _mm_unpacklo_epi16()

FORCE_INLINE __m128i _mm_unpacklo_epi16 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6524 行定义.

6525{
6526#if defined(__aarch64__)
6529#else
6530 int16x4_t a1 = vget_low_s16(vreinterpretq_s16_m128i(a));
6531 int16x4_t b1 = vget_low_s16(vreinterpretq_s16_m128i(b));
6532 int16x4x2_t result = vzip_s16(a1, b1);
6533 return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1]));
6534#endif
6535}

◆ _mm_unpacklo_epi32()

FORCE_INLINE __m128i _mm_unpacklo_epi32 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6546 行定义.

6547{
6548#if defined(__aarch64__)
6551#else
6552 int32x2_t a1 = vget_low_s32(vreinterpretq_s32_m128i(a));
6553 int32x2_t b1 = vget_low_s32(vreinterpretq_s32_m128i(b));
6554 int32x2x2_t result = vzip_s32(a1, b1);
6555 return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1]));
6556#endif
6557}

◆ _mm_unpacklo_epi64()

FORCE_INLINE __m128i _mm_unpacklo_epi64 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6559 行定义.

6560{
6561 int64x1_t a_l = vget_low_s64(vreinterpretq_s64_m128i(a));
6562 int64x1_t b_l = vget_low_s64(vreinterpretq_s64_m128i(b));
6563 return vreinterpretq_m128i_s64(vcombine_s64(a_l, b_l));
6564}

◆ _mm_unpacklo_epi8()

FORCE_INLINE __m128i _mm_unpacklo_epi8 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6578 行定义.

6579{
6580#if defined(__aarch64__)
6583#else
6584 int8x8_t a1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(a)));
6585 int8x8_t b1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(b)));
6586 int8x8x2_t result = vzip_s8(a1, b1);
6587 return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1]));
6588#endif
6589}

◆ _mm_unpacklo_pd()

FORCE_INLINE __m128d _mm_unpacklo_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6602 行定义.

6603{
6604#if defined(__aarch64__)
6605 return vreinterpretq_m128d_f64(
6606 vzip1q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)));
6607#else
6609 vcombine_s64(vget_low_s64(vreinterpretq_s64_m128d(a)),
6610 vget_low_s64(vreinterpretq_s64_m128d(b))));
6611#endif
6612}

◆ _mm_unpacklo_ps()

FORCE_INLINE __m128 _mm_unpacklo_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 3071 行定义.

3072{
3073#if defined(__aarch64__)
3076#else
3077 float32x2_t a1 = vget_low_f32(vreinterpretq_f32_m128(a));
3078 float32x2_t b1 = vget_low_f32(vreinterpretq_f32_m128(b));
3079 float32x2x2_t result = vzip_f32(a1, b1);
3080 return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1]));
3081#endif
3082}

◆ _mm_xor_pd()

FORCE_INLINE __m128d _mm_xor_pd ( __m128d  a,
__m128d  b 
)

在文件 sse2neon.h 第 6623 行定义.

6624{
6627}

◆ _mm_xor_ps()

FORCE_INLINE __m128 _mm_xor_ps ( __m128  a,
__m128  b 
)

在文件 sse2neon.h 第 3087 行定义.

3088{
3091}

◆ _mm_xor_si128()

FORCE_INLINE __m128i _mm_xor_si128 ( __m128i  a,
__m128i  b 
)

在文件 sse2neon.h 第 6631 行定义.

6632{
6635}

◆ _rdtsc()

FORCE_INLINE uint64_t _rdtsc ( void  )

在文件 sse2neon.h 第 10057 行定义.

10058{
10059#if defined(__aarch64__)
10060 uint64_t val;
10061
10062 /* According to ARM DDI 0487F.c, from Armv8.0 to Armv8.5 inclusive, the
10063 * system counter is at least 56 bits wide; from Armv8.6, the counter
10064 * must be 64 bits wide. So the system counter could be less than 64
10065 * bits wide and it is attributed with the flag 'cap_user_time_short'
10066 * is true.
10067 */
10068 __asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val));
10069
10070 return val;
10071#else
10072 uint32_t pmccntr, pmuseren, pmcntenset;
10073 // Read the user mode Performance Monitoring Unit (PMU)
10074 // User Enable Register (PMUSERENR) access permissions.
10075 __asm__ __volatile__("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren));
10076 if (pmuseren & 1) { // Allows reading PMUSERENR for user mode code.
10077 __asm__ __volatile__("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset));
10078 if (pmcntenset & 0x80000000UL) { // Is it counting?
10079 __asm__ __volatile__("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr));
10080 // The counter is set up to count every 64th cycle
10081 return (uint64_t) (pmccntr) << 6;
10082 }
10083 }
10084
10085 // Fallback to syscall as we can't enable PMUSERENR in user mode.
10086 struct timeval tv;
10087 gettimeofday(&tv, NULL);
10088 return (uint64_t) (tv.tv_sec) * 1000000 + tv.tv_usec;
10089#endif
10090}

◆ _sse2neon_clz()

FORCE_INLINE int _sse2neon_clz ( unsigned int  x)

在文件 sse2neon.h 第 9028 行定义.

9029{
9030#if _MSC_VER
9031 DWORD cnt = 0;
9032 if (_BitScanForward(&cnt, x))
9033 return cnt;
9034 return 32;
9035#else
9036 return x != 0 ? __builtin_clz(x) : 32;
9037#endif
9038}

◆ _sse2neon_ctz()

FORCE_INLINE int _sse2neon_ctz ( unsigned int  x)

在文件 sse2neon.h 第 9040 行定义.

9041{
9042#if _MSC_VER
9043 DWORD cnt = 0;
9044 if (_BitScanReverse(&cnt, x))
9045 return 31 - cnt;
9046 return 32;
9047#else
9048 return x != 0 ? __builtin_ctz(x) : 32;
9049#endif
9050}

◆ _sse2neon_ctzll()

FORCE_INLINE int _sse2neon_ctzll ( unsigned long long  x)

在文件 sse2neon.h 第 9052 行定义.

9053{
9054#if _MSC_VER
9055 unsigned long cnt;
9056#ifdef defined(SSE2NEON_HAS_BITSCAN64)
9057 (defined(_M_AMD64) || defined(__x86_64__))
9058 if((_BitScanForward64(&cnt, x))
9059 return (int)(cnt);
9060#else
9061 if (_BitScanForward(&cnt, (unsigned long) (x)))
9062 return (int) cnt;
9063 if (_BitScanForward(&cnt, (unsigned long) (x >> 32)))
9064 return (int) (cnt + 32);
9065#endif
9066 return 64;
9067#else
9068 return x != 0 ? __builtin_ctzll(x) : 64;
9069#endif
9070}

◆ _sse2neon_kadd_f32()

FORCE_INLINE void _sse2neon_kadd_f32 ( float *  sum,
float *  c,
float  y 
)

在文件 sse2neon.h 第 825 行定义.

826{
827 y -= *c;
828 float t = *sum + y;
829 *c = (t - *sum) - y;
830 *sum = t;
831}

◆ _sse2neon_mm_get_denormals_zero_mode()

FORCE_INLINE unsigned int _sse2neon_mm_get_denormals_zero_mode ( )

在文件 sse2neon.h 第 9951 行定义.

9952{
9953 union {
9954 fpcr_bitfield field;
9955#if defined(__aarch64__)
9956 uint64_t value;
9957#else
9958 uint32_t value;
9959#endif
9960 } r;
9961
9962#if defined(__aarch64__)
9963 __asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value)); /* read */
9964#else
9965 __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */
9966#endif
9967
9969}
#define _MM_DENORMALS_ZERO_OFF
Definition sse2neon.h:295
#define _MM_DENORMALS_ZERO_ON
Definition sse2neon.h:294
uint8_t bit24
Definition sse2neon.h:681

◆ _sse2neon_mm_get_flush_zero_mode()

FORCE_INLINE unsigned int _sse2neon_mm_get_flush_zero_mode ( )

在文件 sse2neon.h 第 1891 行定义.

1892{
1893 union {
1894 fpcr_bitfield field;
1895#if defined(__aarch64__)
1896 uint64_t value;
1897#else
1898 uint32_t value;
1899#endif
1900 } r;
1901
1902#if defined(__aarch64__)
1903 __asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value)); /* read */
1904#else
1905 __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */
1906#endif
1907
1908 return r.field.bit24 ? _MM_FLUSH_ZERO_ON : _MM_FLUSH_ZERO_OFF;
1909}
#define _MM_FLUSH_ZERO_ON
Definition sse2neon.h:290
#define _MM_FLUSH_ZERO_OFF
Definition sse2neon.h:291

◆ _sse2neon_mm_set_denormals_zero_mode()

FORCE_INLINE void _sse2neon_mm_set_denormals_zero_mode ( unsigned int  flag)

在文件 sse2neon.h 第 10026 行定义.

10027{
10028 // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting,
10029 // regardless of the value of the FZ bit.
10030 union {
10031 fpcr_bitfield field;
10032#if defined(__aarch64__)
10033 uint64_t value;
10034#else
10035 uint32_t value;
10036#endif
10037 } r;
10038
10039#if defined(__aarch64__)
10040 __asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value)); /* read */
10041#else
10042 __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */
10043#endif
10044
10046
10047#if defined(__aarch64__)
10048 __asm__ __volatile__("msr FPCR, %0" ::"r"(r)); /* write */
10049#else
10050 __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */
10051#endif
10052}
#define _MM_DENORMALS_ZERO_MASK
Definition sse2neon.h:293

◆ _sse2neon_mm_set_flush_zero_mode()

FORCE_INLINE void _sse2neon_mm_set_flush_zero_mode ( unsigned int  flag)

在文件 sse2neon.h 第 2506 行定义.

2507{
2508 // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting,
2509 // regardless of the value of the FZ bit.
2510 union {
2511 fpcr_bitfield field;
2512#if defined(__aarch64__)
2513 uint64_t value;
2514#else
2515 uint32_t value;
2516#endif
2517 } r;
2518
2519#if defined(__aarch64__)
2520 __asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value)); /* read */
2521#else
2522 __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */
2523#endif
2524
2525 r.field.bit24 = (flag & _MM_FLUSH_ZERO_MASK) == _MM_FLUSH_ZERO_ON;
2526
2527#if defined(__aarch64__)
2528 __asm__ __volatile__("msr FPCR, %0" ::"r"(r)); /* write */
2529#else
2530 __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */
2531#endif
2532}
#define _MM_FLUSH_ZERO_MASK
Definition sse2neon.h:289

◆ _sse2neon_sido_negative()

FORCE_INLINE int _sse2neon_sido_negative ( int  res,
int  lb,
int  imm8,
int  bound 
)

在文件 sse2neon.h 第 9012 行定义.

9013{
9014 switch (imm8 & 0x30) {
9016 res ^= 0xffffffff;
9017 break;
9019 res ^= (1 << lb) - 1;
9020 break;
9021 default:
9022 break;
9023 }
9024
9025 return res & ((bound == 8) ? 0xFF : 0xFFFF);
9026}
#define _SIDD_MASKED_NEGATIVE_POLARITY
Definition sse2neon.h:8586
#define _SIDD_NEGATIVE_POLARITY
Definition sse2neon.h:8585

◆ _sse2neon_smp_mb()

FORCE_INLINE void _sse2neon_smp_mb ( void  )

在文件 sse2neon.h 第 137 行定义.

138{
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);
145#else
146 /* FIXME: MSVC support */
147#endif
148}
#define SSE2NEON_BARRIER()
Definition sse2neon.h:122

◆ _sse2neon_vaddv_u8()

FORCE_INLINE uint8_t _sse2neon_vaddv_u8 ( uint8x8_t  v8)

在文件 sse2neon.h 第 541 行定义.

542{
543 const uint64x1_t v1 = vpaddl_u32(vpaddl_u16(vpaddl_u8(v8)));
544 return vget_lane_u8(vreinterpret_u8_u64(v1), 0);
545}

◆ _sse2neon_vaddvq_u16()

FORCE_INLINE uint16_t _sse2neon_vaddvq_u16 ( uint16x8_t  a)

在文件 sse2neon.h 第 574 行定义.

575{
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);
579
580 return vget_lane_u32((uint32x2_t) o, 0);
581}

◆ _sse2neon_vaddvq_u8()

FORCE_INLINE uint8_t _sse2neon_vaddvq_u8 ( uint8x16_t  a)

在文件 sse2neon.h 第 556 行定义.

557{
558 uint8x8_t tmp = vpadd_u8(vget_low_u8(a), vget_high_u8(a));
559 uint8_t res = 0;
560 for (int i = 0; i < 8; ++i)
561 res += tmp[i];
562 return res;
563}

◆ _sse2neon_vld1q_u8_x4()

FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4 ( const uint8_t *  p)

在文件 sse2neon.h 第 533 行定义.

534{
535 return vld1q_u8_x4(p);
536}

◆ ALIGN_STRUCT()

union ALIGN_STRUCT ( 16  )

在文件 sse2neon.h 第 316 行定义.

463 {
464 float m128_f32[4]; // as floats - DON'T USE. Added for convenience.
465 int8_t m128_i8[16]; // as signed 8-bit integers.
466 int16_t m128_i16[8]; // as signed 16-bit integers.
467 int32_t m128_i32[4]; // as signed 32-bit integers.
468 int64_t m128_i64[2]; // as signed 64-bit integers.
469 uint8_t m128_u8[16]; // as unsigned 8-bit integers.
470 uint16_t m128_u16[8]; // as unsigned 16-bit integers.
471 uint32_t m128_u32[4]; // as unsigned 32-bit integers.
472 uint64_t m128_u64[2]; // as unsigned 64-bit integers.
473} SIMDVec;
SIMDVec
Definition sse2neon.h:473

变量说明

◆ SIMDVec

SIMDVec

在文件 sse2neon.h 第 473 行定义.