1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
/*
* Copyright (C) 2014-2016 FAUmachine Team <info@faumachine.org>.
* This program is free software. You can redistribute it and/or modify it
* under the terms of the GNU General Public License, either version 2 of
* the License, or (at your option) any later version. See COPYING.
*/
#include <assert.h>
#include <inttypes.h>
#include <stdio.h>
static void
printb(int count, int v)
{
int i;
printf("0b");
for (i = count - 1; 0 <= i; i--) {
printf("%d", (v >> i) & 1);
}
}
static void
_lru_set(uint8_t *info, int off, int bit)
{
info[off / 8] &= ~(1 << (off % 8));
info[off / 8] |= bit << (off % 8);
}
static int
_lru_get(uint8_t *info, int off)
{
return (info[off / 8] >> (off % 8)) & 1;
}
static void
_lru_use(int count, uint8_t *info, int off, int used)
{
if (1 < count) {
int bit;
bit = used & 1;
used >>= 1;
count >>= 1;
_lru_set(info, off + used, bit);
_lru_use(count, info, off + count, used);
}
}
static void
lru_use(int count, uint8_t *info, int used)
{
_lru_use(count, info, 0, used);
}
static int
_lru_oldest(int count, uint8_t *info, int off)
{
int oldest;
if (1 < count) {
count >>= 1;
oldest = _lru_oldest(count, info, off + count);
oldest = (oldest << 1) + ! _lru_get(info, off + oldest);
} else {
oldest = 0;
}
return oldest;
}
static int
lru_oldest(int count, uint8_t *info)
{
int oldest;
oldest = _lru_oldest(count, info, 0);
return oldest;
}
static void
table(int assoc)
{
int i;
/* use */
printf("static const uint8_t NAME_(lru%d_use_table)[%d][%d] = {\n",
assoc, 1 << (assoc - 1), assoc);
for (i = 0; i < 1 << (assoc - 1); i++) {
int u;
printf("/*");
printb(assoc - 1, i);
printf("*/ {", i);
for (u = 0; u < assoc; u++) {
uint8_t info;
info = i;
lru_use(assoc, &info, u);
printf(" ");
printb(assoc - 1, info);
printf(",");
}
printf(" },\n");
}
printf("};\n");
/* old */
printf("static const uint8_t NAME_(lru%d_old_table)[%d] = {\n",
assoc, 1 << (assoc - 1));
for (i = 0; i < 1 << (assoc - 1); i++) {
uint8_t info;
uint8_t oldest;
printf("/*");
printb(assoc - 1, i);
printf("*/ ", i);
info = i;
oldest = lru_oldest(assoc, &info);
printb(assoc, oldest);
printf(",\n");
}
printf("};\n");
}
int
main(void)
{
int assoc;
for (assoc = 4; assoc <= 8; assoc *= 2) {
table(assoc);
}
return 0;
}
|