On Fri, 23 Oct 2015 15:17:11 +0100 David Hunt <david.hunt at intel.com> wrote:
> + > +typedef float32x4_t __m128; > + > +typedef int32x4_t __m128i; > + > +typedef __m128i xmm_t; > + > +#define XMM_SIZE (sizeof(xmm_t)) > +#define XMM_MASK (XMM_SIZE - 1) > + > +typedef union rte_xmm { > + xmm_t x; > + uint8_t u8[XMM_SIZE / sizeof(uint8_t)]; > + uint16_t u16[XMM_SIZE / sizeof(uint16_t)]; > + uint32_t u32[XMM_SIZE / sizeof(uint32_t)]; > + uint64_t u64[XMM_SIZE / sizeof(uint64_t)]; > + double pd[XMM_SIZE / sizeof(double)]; > +} rte_xmm_t __aligned(16); > + > +#define _mm_srli_epi32(a, imm) { (__m128i)vshrq_n_u32((uint32x4_t)a, imm) } > + > +#define _mm_srli_si128(a, imm) { (__m128i)vextq_s8((int8x16_t)a, \ > + vdupq_n_s8(0), (imm)) } > + > +static inline __m128i > +_mm_set_epi32(int i3, int i2, int i1, int i0); > +static inline int > +_mm_cvtsi128_si64(__m128i a); > + > +static inline __m128i > +_mm_set_epi32(int i3, int i2, int i1, int i0) > +{ > + int32_t __aligned(16) data[4] = { i0, i1, i2, i3 }; > + return vld1q_s32(data); > +} > + > +static inline int > +_mm_cvtsi128_si64(__m128i a) > +{ > + return vgetq_lane_s64(a, 0); > +} > + > +static inline __m128i > +_mm_and_si128(__m128i a, __m128i b) > +{ > + return (__m128i)vandq_s32(a, b); > +} > + What is the purpose of those wrappers? I mean, does it help to compile some SSE-dependent libraries in DPDK for NEON? Jan -- Jan Viktorin E-mail: Viktorin at RehiveTech.com System Architect Web: www.RehiveTech.com RehiveTech Brno, Czech Republic