5 #ifndef __INCLUDE_RTE_LRU_LOONGARCH_H__
6 #define __INCLUDE_RTE_LRU_LOONGARCH_H__
14 #include <rte_config.h>
17 #ifndef RTE_TABLE_HASH_LRU_STRATEGY
18 #define RTE_TABLE_HASH_LRU_STRATEGY 3
21 #if RTE_TABLE_HASH_LRU_STRATEGY == 3
23 #define lru_init(bucket) \
24 { bucket->lru_list = ~0LLU; }
27 f_lru_pos(uint64_t lru_list)
29 xmm_t lst = (xmm_t) {.i64 = { lru_list, (uint64_t)-1} };
30 uint16_t min_val, i, j = 0;
33 for (i = 0; i < 8; i++) {
34 if (min_val > lst.u16[i]) {
42 #define lru_pos(bucket) f_lru_pos(bucket->lru_list)
44 #define lru_update(bucket, mru_val) \
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]; \