DPDK  18.11.10
rte_lru_lsx.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #ifndef __INCLUDE_RTE_LRU_LOONGARCH_H__
6 #define __INCLUDE_RTE_LRU_LOONGARCH_H__
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #include <stdint.h>
13 
14 #include <rte_config.h>
15 #include <rte_vect.h>
16 
17 #ifndef RTE_TABLE_HASH_LRU_STRATEGY
18 #define RTE_TABLE_HASH_LRU_STRATEGY 3
19 #endif
20 
21 #if RTE_TABLE_HASH_LRU_STRATEGY == 3
22 
23 #define lru_init(bucket) \
24  { bucket->lru_list = ~0LLU; }
25 
26 static inline int
27 f_lru_pos(uint64_t lru_list)
28 {
29  xmm_t lst = (xmm_t) {.i64 = { lru_list, (uint64_t)-1} };
30  uint16_t min_val, i, j = 0;
31 
32  min_val = lst.u16[0];
33  for (i = 0; i < 8; i++) {
34  if (min_val > lst.u16[i]) {
35  min_val = lst.u16[i];
36  j = i;
37  }
38  }
39 
40  return j;
41 }
42 #define lru_pos(bucket) f_lru_pos(bucket->lru_list)
43 
44 #define lru_update(bucket, mru_val) \
45 do { \
46  const uint64_t orvals[] = {0xFFFFLLU, 0xFFFFLLU << 16, \
47  0xFFFFLLU << 32, 0xFFFFLLU << 48, 0LLU}; \
48  const uint64_t decs[] = {0x1000100010001LLU, 0}; \
49  __m128i v_zeros = __lsx_vldi(0); \
50  __m128i lru = v_zeros, vdec = v_zeros; \
51  lru = __lsx_vinsgr2vr_d(lru, bucket->lru_list, 0); \
52  vdec = __lsx_vinsgr2vr_d(vdec, decs[mru_val>>2], 0); \
53  lru = __lsx_vsub_h(lru, vdec); \
54  bucket->lru_list = __lsx_vpickve2gr_d(lru, 0); \
55  bucket->lru_list |= orvals[mru_val]; \
56 } while (0)
57 #endif
58 
59 #ifdef __cplusplus
60 }
61 #endif
62 
63 #endif