DPDK  18.11.10
rte_lru_loongarch.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 #ifdef RTE_ARCH_NO_VECTOR
45 #define lru_update(bucket, mru_val) \
46 do { \
47  const uint64_t orvals[] = {0xFFFFLLU, 0xFFFFLLU << 16, \
48  0xFFFFLLU << 32, 0xFFFFLLU << 48, 0LLU}; \
49  const uint64_t decs[] = {0x1000100010001LLU, 0}; \
50  int j = 0; \
51  xmm_t v_zeros = (xmm_t) {.u64 = {0, 0} }; \
52  xmm_t lru = v_zeros, vdec = v_zeros; \
53  lru.i64[0] = bucket->lru_list; \
54  vdec.i64[0] = decs[mru_val>>2]; \
55  for (j = 0; j < 8; j++) \
56  lru.u16[j] -= vdec.u16[j]; \
57  bucket->lru_list = lru.i64[0] | orvals[mru_val]; \
58 } while (0)
59 #else
60 #define lru_update(bucket, mru_val) \
61 do { \
62  //TODO add vec support
63 } while (0)
64 #endif
65 #endif
66 
67 #ifdef __cplusplus
68 }
69 #endif
70 
71 #endif