lib: use SPDX tag for Intel copyright files
[dpdk.git] / lib / librte_table / rte_lru.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4
5 #ifndef __INCLUDE_RTE_LRU_H__
6 #define __INCLUDE_RTE_LRU_H__
7
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11
12 #ifdef RTE_ARCH_X86_64
13 #include "rte_lru_x86.h"
14 #elif defined(RTE_ARCH_ARM64)
15 #include "rte_lru_arm64.h"
16 #else
17 #undef RTE_TABLE_HASH_LRU_STRATEGY
18 #define RTE_TABLE_HASH_LRU_STRATEGY                        1
19 #endif
20
21 #if RTE_TABLE_HASH_LRU_STRATEGY == 0
22
23 #define lru_init(bucket)                                                \
24 do                                                                      \
25         bucket = bucket;                                                \
26 while (0)
27
28 #define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
29
30 #define lru_update(bucket, mru_val)                                     \
31 do {                                                                    \
32         bucket = bucket;                                                \
33         mru_val = mru_val;                                              \
34 } while (0)
35
36 #elif RTE_TABLE_HASH_LRU_STRATEGY == 1
37
38 #define lru_init(bucket)                                                \
39 do                                                                      \
40         bucket->lru_list = 0x0000000100020003LLU;                       \
41 while (0)
42
43 #define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
44
45 #define lru_update(bucket, mru_val)                                     \
46 do {                                                                    \
47         uint64_t x, pos, x0, x1, x2, mask;                              \
48                                                                         \
49         x = bucket->lru_list;                                           \
50                                                                         \
51         pos = 4;                                                        \
52         if ((x >> 48) == ((uint64_t) mru_val))                          \
53                 pos = 3;                                                \
54                                                                         \
55         if (((x >> 32) & 0xFFFFLLU) == ((uint64_t) mru_val))            \
56                 pos = 2;                                                \
57                                                                         \
58         if (((x >> 16) & 0xFFFFLLU) == ((uint64_t) mru_val))            \
59                 pos = 1;                                                \
60                                                                         \
61         if ((x & 0xFFFFLLU) == ((uint64_t) mru_val))                    \
62                 pos = 0;                                                \
63                                                                         \
64                                                                         \
65         pos <<= 4;                                                      \
66         mask = (~0LLU) << pos;                                          \
67         x0 = x & (~mask);                                               \
68         x1 = (x >> 16) & mask;                                          \
69         x2 = (x << (48 - pos)) & (0xFFFFLLU << 48);                     \
70         x = x0 | x1 | x2;                                               \
71                                                                         \
72         if (pos != 64)                                                  \
73                 bucket->lru_list = x;                                   \
74 } while (0)
75
76 #elif (RTE_TABLE_HASH_LRU_STRATEGY == 2) || (RTE_TABLE_HASH_LRU_STRATEGY == 3)
77
78 /**
79  * These strategies are implemented in architecture specific header files.
80  */
81
82 #else
83
84 #error "Incorrect value for RTE_TABLE_HASH_LRU_STRATEGY"
85
86 #endif
87
88 #ifdef __cplusplus
89 }
90 #endif
91
92 #endif