Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2010-2014 Intel Corporation 3 : : */ 4 : : 5 : : #ifndef _RTE_LPM_SSE_H_ 6 : : #define _RTE_LPM_SSE_H_ 7 : : 8 : : #include <rte_branch_prediction.h> 9 : : #include <rte_byteorder.h> 10 : : #include <rte_common.h> 11 : : #include <rte_vect.h> 12 : : 13 : : #ifdef __cplusplus 14 : : extern "C" { 15 : : #endif 16 : : 17 : : static inline void 18 [ + + ]: 1577 : rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], 19 : : uint32_t defv) 20 : : { 21 : : __m128i i24; 22 : : rte_xmm_t i8; 23 : : uint32_t tbl[4]; 24 : : uint64_t idx, pt, pt2; 25 : : const uint32_t *ptbl; 26 : : 27 : : const __m128i mask8 = 28 : : _mm_set_epi32(UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX); 29 : : 30 : : /* 31 : : * RTE_LPM_VALID_EXT_ENTRY_BITMASK for 2 LPM entries 32 : : * as one 64-bit value (0x0300000003000000). 33 : : */ 34 : : const uint64_t mask_xv = 35 : : ((uint64_t)RTE_LPM_VALID_EXT_ENTRY_BITMASK | 36 : : (uint64_t)RTE_LPM_VALID_EXT_ENTRY_BITMASK << 32); 37 : : 38 : : /* 39 : : * RTE_LPM_LOOKUP_SUCCESS for 2 LPM entries 40 : : * as one 64-bit value (0x0100000001000000). 41 : : */ 42 : : const uint64_t mask_v = 43 : : ((uint64_t)RTE_LPM_LOOKUP_SUCCESS | 44 : : (uint64_t)RTE_LPM_LOOKUP_SUCCESS << 32); 45 : : 46 : : /* get 4 indexes for tbl24[]. */ 47 : : i24 = _mm_srli_epi32(ip, CHAR_BIT); 48 : : 49 : : /* extract values from tbl24[] */ 50 [ + + ]: 1577 : idx = _mm_cvtsi128_si64(i24); 51 : : /* With -O0 option, gcc 4.8 - 5.4 fails to fold sizeof() into a constant */ 52 : : i24 = _mm_srli_si128(i24, /* sizeof(uint64_t) */ 8); 53 : : 54 : 1577 : ptbl = (const uint32_t *)&lpm->tbl24[(uint32_t)idx]; 55 : 1577 : tbl[0] = *ptbl; 56 : 1577 : ptbl = (const uint32_t *)&lpm->tbl24[idx >> 32]; 57 : 1577 : tbl[1] = *ptbl; 58 : : 59 : 1577 : idx = _mm_cvtsi128_si64(i24); 60 : : 61 : 1577 : ptbl = (const uint32_t *)&lpm->tbl24[(uint32_t)idx]; 62 : 1577 : tbl[2] = *ptbl; 63 : 1577 : ptbl = (const uint32_t *)&lpm->tbl24[idx >> 32]; 64 [ + + ]: 1577 : tbl[3] = *ptbl; 65 : : 66 : : /* get 4 indexes for tbl8[]. */ 67 : : i8.x = _mm_and_si128(ip, mask8); 68 : : 69 : 1577 : pt = (uint64_t)tbl[0] | 70 : 1577 : (uint64_t)tbl[1] << 32; 71 : 1577 : pt2 = (uint64_t)tbl[2] | 72 : 1577 : (uint64_t)tbl[3] << 32; 73 : : 74 : : /* search successfully finished for all 4 IP addresses. */ 75 [ + + ]: 1577 : if (likely((pt & mask_xv) == mask_v) && 76 [ - + ]: 24 : likely((pt2 & mask_xv) == mask_v)) { 77 : 0 : *(uint64_t *)hop = pt & RTE_LPM_MASKX4_RES; 78 : 0 : *(uint64_t *)(hop + 2) = pt2 & RTE_LPM_MASKX4_RES; 79 : : return; 80 : : } 81 : : 82 [ + + ]: 1577 : if (unlikely((pt & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == 83 : : RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { 84 : 520 : i8.u32[0] = i8.u32[0] + 85 : 520 : (tbl[0] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; 86 : 520 : ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[0]]; 87 : 520 : tbl[0] = *ptbl; 88 : : } 89 [ + + ]: 1577 : if (unlikely((pt >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == 90 : : RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { 91 : 1527 : i8.u32[1] = i8.u32[1] + 92 : 1527 : (tbl[1] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; 93 : 1527 : ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[1]]; 94 : 1527 : tbl[1] = *ptbl; 95 : : } 96 [ + + ]: 1577 : if (unlikely((pt2 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == 97 : : RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { 98 : 1512 : i8.u32[2] = i8.u32[2] + 99 : 1512 : (tbl[2] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; 100 : 1512 : ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[2]]; 101 : 1512 : tbl[2] = *ptbl; 102 : : } 103 [ + + ]: 1577 : if (unlikely((pt2 >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == 104 : : RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { 105 : 1521 : i8.u32[3] = i8.u32[3] + 106 : 1521 : (tbl[3] & 0x00FFFFFF) * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; 107 : 1521 : ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[3]]; 108 : 1521 : tbl[3] = *ptbl; 109 : : } 110 : : 111 [ + + ]: 1577 : hop[0] = (tbl[0] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[0] & 0x00FFFFFF : defv; 112 [ + + ]: 1577 : hop[1] = (tbl[1] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[1] & 0x00FFFFFF : defv; 113 [ - + ]: 1577 : hop[2] = (tbl[2] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[2] & 0x00FFFFFF : defv; 114 [ + + ]: 1577 : hop[3] = (tbl[3] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[3] & 0x00FFFFFF : defv; 115 : : } 116 : : 117 : : #ifdef __cplusplus 118 : : } 119 : : #endif 120 : : 121 : : #endif /* _RTE_LPM_SSE_H_ */