5 #ifndef __INCLUDE_RTE_LRU_X86_H__
6 #define __INCLUDE_RTE_LRU_X86_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 xmm_t v_zeros = (xmm_t) {.u64 = {0, 0} }; \
50 xmm_t lru = v_zeros, vdec = v_zeros; \
51 lru.v2i64 = __msa_insert_d(lru.v2i64, 0, bucket->lru_list); \
52 vdec.v2i64 = __msa_insert_d(vdec.v2i64, 0, decs[mru_val>>2]); \
53 lru.v8u16 = __msa_subs_u_h(lru.v8u16, vdec.v8u16); \
54 bucket->lru_list = __msa_copy_u_d(lru.v2i64, 0) | orvals[mru_val]; \