lib: use SPDX tag for Intel copyright files
[dpdk.git] / lib / librte_eal / common / include / arch / x86 / rte_vect.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2015 Intel Corporation
3  */
4
5 #ifndef _RTE_VECT_X86_H_
6 #define _RTE_VECT_X86_H_
7
8 /**
9  * @file
10  *
11  * RTE SSE/AVX related header.
12  */
13
14 #include <stdint.h>
15 #include "generic/rte_vect.h"
16
17 #if (defined(__ICC) || (__GNUC__ == 4 &&  __GNUC_MINOR__ < 4))
18
19 #include <smmintrin.h> /* SSE4 */
20
21 #if defined(__AVX__)
22 #include <immintrin.h>
23 #endif
24
25 #else
26
27 #include <x86intrin.h>
28
29 #endif
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 typedef __m128i xmm_t;
36
37 #define XMM_SIZE        (sizeof(xmm_t))
38 #define XMM_MASK        (XMM_SIZE - 1)
39
40 typedef union rte_xmm {
41         xmm_t    x;
42         uint8_t  u8[XMM_SIZE / sizeof(uint8_t)];
43         uint16_t u16[XMM_SIZE / sizeof(uint16_t)];
44         uint32_t u32[XMM_SIZE / sizeof(uint32_t)];
45         uint64_t u64[XMM_SIZE / sizeof(uint64_t)];
46         double   pd[XMM_SIZE / sizeof(double)];
47 } rte_xmm_t;
48
49 #ifdef __AVX__
50
51 typedef __m256i ymm_t;
52
53 #define YMM_SIZE        (sizeof(ymm_t))
54 #define YMM_MASK        (YMM_SIZE - 1)
55
56 typedef union rte_ymm {
57         ymm_t    y;
58         xmm_t    x[YMM_SIZE / sizeof(xmm_t)];
59         uint8_t  u8[YMM_SIZE / sizeof(uint8_t)];
60         uint16_t u16[YMM_SIZE / sizeof(uint16_t)];
61         uint32_t u32[YMM_SIZE / sizeof(uint32_t)];
62         uint64_t u64[YMM_SIZE / sizeof(uint64_t)];
63         double   pd[YMM_SIZE / sizeof(double)];
64 } rte_ymm_t;
65
66 #endif /* __AVX__ */
67
68 #ifdef RTE_ARCH_I686
69 #define _mm_cvtsi128_si64(a)    \
70 __extension__ ({                \
71         rte_xmm_t m;            \
72         m.x = (a);              \
73         (m.u64[0]);             \
74 })
75 #endif
76
77 /*
78  * Prior to version 12.1 icc doesn't support _mm_set_epi64x.
79  */
80 #if (defined(__ICC) && __ICC < 1210)
81 #define _mm_set_epi64x(a, b)     \
82 __extension__ ({                 \
83         rte_xmm_t m;             \
84         m.u64[0] = b;            \
85         m.u64[1] = a;            \
86         (m.x);                   \
87 })
88 #endif /* (defined(__ICC) && __ICC < 1210) */
89
90 #ifdef __cplusplus
91 }
92 #endif
93
94 #endif /* _RTE_VECT_X86_H_ */