xref: /dpdk/examples/common/sse/port_group.h (revision 732115ce38c63184cb706b9179c02ed04b961afa)
1*732115ceSRahul Bhansali /* SPDX-License-Identifier: BSD-3-Clause
2*732115ceSRahul Bhansali  * Copyright(c) 2016 Intel Corporation.
3*732115ceSRahul Bhansali  * Copyright(C) 2022 Marvell.
4*732115ceSRahul Bhansali  */
5*732115ceSRahul Bhansali 
6*732115ceSRahul Bhansali #ifndef PORT_GROUP_H
7*732115ceSRahul Bhansali #define PORT_GROUP_H
8*732115ceSRahul Bhansali 
9*732115ceSRahul Bhansali #include "pkt_group.h"
10*732115ceSRahul Bhansali 
11*732115ceSRahul Bhansali /*
12*732115ceSRahul Bhansali  * Group consecutive packets with the same destination port in bursts of 4.
13*732115ceSRahul Bhansali  * Suppose we have array of destination ports:
14*732115ceSRahul Bhansali  * dst_port[] = {a, b, c, d,, e, ... }
15*732115ceSRahul Bhansali  * dp1 should contain: <a, b, c, d>, dp2: <b, c, d, e>.
16*732115ceSRahul Bhansali  * We doing 4 comparisons at once and the result is 4 bit mask.
17*732115ceSRahul Bhansali  * This mask is used as an index into prebuild array of pnum values.
18*732115ceSRahul Bhansali  */
19*732115ceSRahul Bhansali static inline uint16_t *
port_groupx4(uint16_t pn[FWDSTEP+1],uint16_t * lp,__m128i dp1,__m128i dp2)20*732115ceSRahul Bhansali port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, __m128i dp1,
21*732115ceSRahul Bhansali 		 __m128i dp2)
22*732115ceSRahul Bhansali {
23*732115ceSRahul Bhansali 	union {
24*732115ceSRahul Bhansali 		uint16_t u16[FWDSTEP + 1];
25*732115ceSRahul Bhansali 		uint64_t u64;
26*732115ceSRahul Bhansali 	} *pnum = (void *)pn;
27*732115ceSRahul Bhansali 
28*732115ceSRahul Bhansali 	int32_t v;
29*732115ceSRahul Bhansali 
30*732115ceSRahul Bhansali 	dp1 = _mm_cmpeq_epi16(dp1, dp2);
31*732115ceSRahul Bhansali 	dp1 = _mm_unpacklo_epi16(dp1, dp1);
32*732115ceSRahul Bhansali 	v = _mm_movemask_ps((__m128)dp1);
33*732115ceSRahul Bhansali 
34*732115ceSRahul Bhansali 	/* update last port counter. */
35*732115ceSRahul Bhansali 	lp[0] += gptbl[v].lpv;
36*732115ceSRahul Bhansali 
37*732115ceSRahul Bhansali 	/* if dest port value has changed. */
38*732115ceSRahul Bhansali 	if (v != GRPMSK) {
39*732115ceSRahul Bhansali 		pnum->u64 = gptbl[v].pnum;
40*732115ceSRahul Bhansali 		pnum->u16[FWDSTEP] = 1;
41*732115ceSRahul Bhansali 		lp = pnum->u16 + gptbl[v].idx;
42*732115ceSRahul Bhansali 	}
43*732115ceSRahul Bhansali 
44*732115ceSRahul Bhansali 	return lp;
45*732115ceSRahul Bhansali }
46*732115ceSRahul Bhansali 
47*732115ceSRahul Bhansali #endif /* PORT_GROUP_H */
48