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