xref: /dpdk/app/test/test_xmmt_ops.h (revision 29631ee5c8906aba039c26d092137b09dbc949d8)
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