1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson * Copyright(c) 2015 Cavium, Inc
3f22e705eSMichal Mazurek * Copyright(c) 2022 StarFive
4f22e705eSMichal Mazurek * Copyright(c) 2022 SiFive
5f22e705eSMichal Mazurek * Copyright(c) 2022 Semihalf
6a9de470cSBruce Richardson */
7a9de470cSBruce Richardson
8a9de470cSBruce Richardson #ifndef _TEST_XMMT_OPS_H_
9a9de470cSBruce Richardson #define _TEST_XMMT_OPS_H_
10a9de470cSBruce Richardson
11a9de470cSBruce Richardson #include <rte_vect.h>
12a9de470cSBruce Richardson
13e9b97392SRuifeng Wang #if defined(RTE_ARCH_ARM)
14a9de470cSBruce Richardson
15a9de470cSBruce Richardson /* vect_* abstraction implementation using NEON */
16a9de470cSBruce Richardson
17a9de470cSBruce Richardson /* loads the xmm_t value from address p(does not need to be 16-byte aligned)*/
18a9de470cSBruce Richardson #define vect_loadu_sil128(p) vld1q_s32((const int32_t *)p)
19a9de470cSBruce Richardson
20a9de470cSBruce Richardson /* sets the 4 signed 32-bit integer values and returns the xmm_t variable */
21a9de470cSBruce Richardson static __rte_always_inline xmm_t
vect_set_epi32(int i3,int i2,int i1,int i0)22a9de470cSBruce Richardson vect_set_epi32(int i3, int i2, int i1, int i0)
23a9de470cSBruce Richardson {
24a9de470cSBruce Richardson int32_t data[4] = {i0, i1, i2, i3};
25a9de470cSBruce Richardson
26a9de470cSBruce Richardson return vld1q_s32(data);
27a9de470cSBruce Richardson }
28a9de470cSBruce Richardson
29a9de470cSBruce Richardson #elif defined(RTE_ARCH_X86)
30a9de470cSBruce Richardson
31a9de470cSBruce Richardson /* vect_* abstraction implementation using SSE */
32a9de470cSBruce Richardson
33a9de470cSBruce Richardson /* loads the xmm_t value from address p(does not need to be 16-byte aligned)*/
34a9de470cSBruce Richardson #define vect_loadu_sil128(p) _mm_loadu_si128(p)
35a9de470cSBruce Richardson
36a9de470cSBruce Richardson /* sets the 4 signed 32-bit integer values and returns the xmm_t variable */
37a9de470cSBruce Richardson #define vect_set_epi32(i3, i2, i1, i0) _mm_set_epi32(i3, i2, i1, i0)
38a9de470cSBruce Richardson
39a9de470cSBruce Richardson #elif defined(RTE_ARCH_PPC_64)
40a9de470cSBruce Richardson
41a9de470cSBruce Richardson /* vect_* abstraction implementation using ALTIVEC */
42a9de470cSBruce Richardson
43a9de470cSBruce Richardson /* loads the xmm_t value from address p(does not need to be 16-byte aligned)*/
44a9de470cSBruce Richardson #define vect_loadu_sil128(p) vec_ld(0, p)
45a9de470cSBruce Richardson
46a9de470cSBruce Richardson /* sets the 4 signed 32-bit integer values and returns the xmm_t variable */
47a9de470cSBruce Richardson static __rte_always_inline xmm_t
vect_set_epi32(int i3,int i2,int i1,int i0)48a9de470cSBruce Richardson vect_set_epi32(int i3, int i2, int i1, int i0)
49a9de470cSBruce Richardson {
50a9de470cSBruce Richardson xmm_t data = (xmm_t){i0, i1, i2, i3};
51a9de470cSBruce Richardson
52a9de470cSBruce Richardson return data;
53a9de470cSBruce Richardson }
54a9de470cSBruce Richardson
55f22e705eSMichal Mazurek #elif defined(RTE_ARCH_RISCV)
56f22e705eSMichal Mazurek
57f22e705eSMichal Mazurek #define vect_loadu_sil128(p) vect_load_128(p)
58f22e705eSMichal Mazurek
59f22e705eSMichal Mazurek /* sets the 4 signed 32-bit integer values and returns the xmm_t variable */
60f22e705eSMichal Mazurek static __rte_always_inline xmm_t
vect_set_epi32(int i3,int i2,int i1,int i0)61f22e705eSMichal Mazurek vect_set_epi32(int i3, int i2, int i1, int i0)
62f22e705eSMichal Mazurek {
63f22e705eSMichal Mazurek xmm_t data = (xmm_t){i0, i1, i2, i3};
64f22e705eSMichal Mazurek
65f22e705eSMichal Mazurek return data;
66f22e705eSMichal Mazurek }
67f22e705eSMichal Mazurek
68*29631ee5SMin Zhou #elif defined(RTE_ARCH_LOONGARCH)
69*29631ee5SMin Zhou
70*29631ee5SMin Zhou #define vect_loadu_sil128(p) vect_load_128(p)
71*29631ee5SMin Zhou
72*29631ee5SMin Zhou /* sets the 4 signed 32-bit integer values and returns the xmm_t variable */
73*29631ee5SMin Zhou static __rte_always_inline xmm_t
vect_set_epi32(int i3,int i2,int i1,int i0)74*29631ee5SMin Zhou vect_set_epi32(int i3, int i2, int i1, int i0)
75*29631ee5SMin Zhou {
76*29631ee5SMin Zhou xmm_t data = (xmm_t){.u32 = {i0, i1, i2, i3}};
77*29631ee5SMin Zhou
78*29631ee5SMin Zhou return data;
79*29631ee5SMin Zhou }
80a9de470cSBruce Richardson #endif
81a9de470cSBruce Richardson
82a9de470cSBruce Richardson #endif /* _TEST_XMMT_OPS_H_ */
83