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]; \