blob: 89a614c86e18ad08c7b59ae6e32cd3f661dc2eaf [file] [log] [blame]
njn4f9c9342002-04-29 16:03:24 +00001/* L2 cache simulator, generated by vg_cachegen.
2 * total size = 262144 bytes
3 * line size = 64 bytes
4 * associativity = 8-way associative
5 *
6 * This file should be #include-d into vg_cachesim.c
7 */
8
9static char L2_desc_line[] =
10 "desc: L2 cache: 262144 B, 64 B, 8-way associative\n";
11
12static UInt L2_tags[512][8];
13
14static void cachesim_L2_initcache(void)
15{
16 UInt set, way;
17 for (set = 0; set < 512; set++)
18 for (way = 0; way < 8; way++)
19 L2_tags[set][way] = 0;
20}
21
22static __inline__
23void cachesim_L2_doref(Addr a, UChar size, ULong *m2)
24{
njn9aae6742002-04-30 13:44:01 +000025 register UInt set1 = ( a >> 6) & (512-1);
26 register UInt set2 = ((a + size - 1) >> 6) & (512-1);
njn4f9c9342002-04-29 16:03:24 +000027 register UInt tag = a >> (6 + 9);
28
29 if (set1 == set2) {
30
31 if (tag == L2_tags[set1][0]) {
32 return;
33 }
34 else if (tag == L2_tags[set1][1]) {
35 L2_tags[set1][1] = L2_tags[set1][0];
36 L2_tags[set1][0] = tag;
37 return;
38 }
39 else if (tag == L2_tags[set1][2]) {
40 L2_tags[set1][2] = L2_tags[set1][1];
41 L2_tags[set1][1] = L2_tags[set1][0];
42 L2_tags[set1][0] = tag;
43 return;
44 }
45 else if (tag == L2_tags[set1][3]) {
46 L2_tags[set1][3] = L2_tags[set1][2];
47 L2_tags[set1][2] = L2_tags[set1][1];
48 L2_tags[set1][1] = L2_tags[set1][0];
49 L2_tags[set1][0] = tag;
50 return;
51 }
52 else if (tag == L2_tags[set1][4]) {
53 L2_tags[set1][4] = L2_tags[set1][3];
54 L2_tags[set1][3] = L2_tags[set1][2];
55 L2_tags[set1][2] = L2_tags[set1][1];
56 L2_tags[set1][1] = L2_tags[set1][0];
57 L2_tags[set1][0] = tag;
58 return;
59 }
60 else if (tag == L2_tags[set1][5]) {
61 L2_tags[set1][5] = L2_tags[set1][4];
62 L2_tags[set1][4] = L2_tags[set1][3];
63 L2_tags[set1][3] = L2_tags[set1][2];
64 L2_tags[set1][2] = L2_tags[set1][1];
65 L2_tags[set1][1] = L2_tags[set1][0];
66 L2_tags[set1][0] = tag;
67 return;
68 }
69 else if (tag == L2_tags[set1][6]) {
70 L2_tags[set1][6] = L2_tags[set1][5];
71 L2_tags[set1][5] = L2_tags[set1][4];
72 L2_tags[set1][4] = L2_tags[set1][3];
73 L2_tags[set1][3] = L2_tags[set1][2];
74 L2_tags[set1][2] = L2_tags[set1][1];
75 L2_tags[set1][1] = L2_tags[set1][0];
76 L2_tags[set1][0] = tag;
77 return;
78 }
79 else if (tag == L2_tags[set1][7]) {
80 L2_tags[set1][7] = L2_tags[set1][6];
81 L2_tags[set1][6] = L2_tags[set1][5];
82 L2_tags[set1][5] = L2_tags[set1][4];
83 L2_tags[set1][4] = L2_tags[set1][3];
84 L2_tags[set1][3] = L2_tags[set1][2];
85 L2_tags[set1][2] = L2_tags[set1][1];
86 L2_tags[set1][1] = L2_tags[set1][0];
87 L2_tags[set1][0] = tag;
88 return;
89 }
90 else {
91 /* A miss */
92 L2_tags[set1][7] = L2_tags[set1][6];
93 L2_tags[set1][6] = L2_tags[set1][5];
94 L2_tags[set1][5] = L2_tags[set1][4];
95 L2_tags[set1][4] = L2_tags[set1][3];
96 L2_tags[set1][3] = L2_tags[set1][2];
97 L2_tags[set1][2] = L2_tags[set1][1];
98 L2_tags[set1][1] = L2_tags[set1][0];
99 L2_tags[set1][0] = tag;
100
101 (*m2)++;
102 }
103
104 } else if ((set1 + 1) % 512 == set2) {
105
106 Bool is_L2_miss = False;
107
108 /* Block one */
109 if (tag == L2_tags[set1][0]) {
110 }
111 else if (tag == L2_tags[set1][1]) {
112 L2_tags[set1][1] = L2_tags[set1][0];
113 L2_tags[set1][0] = tag;
114 }
115 else if (tag == L2_tags[set1][2]) {
116 L2_tags[set1][2] = L2_tags[set1][1];
117 L2_tags[set1][1] = L2_tags[set1][0];
118 L2_tags[set1][0] = tag;
119 }
120 else if (tag == L2_tags[set1][3]) {
121 L2_tags[set1][3] = L2_tags[set1][2];
122 L2_tags[set1][2] = L2_tags[set1][1];
123 L2_tags[set1][1] = L2_tags[set1][0];
124 L2_tags[set1][0] = tag;
125 }
126 else if (tag == L2_tags[set1][4]) {
127 L2_tags[set1][4] = L2_tags[set1][3];
128 L2_tags[set1][3] = L2_tags[set1][2];
129 L2_tags[set1][2] = L2_tags[set1][1];
130 L2_tags[set1][1] = L2_tags[set1][0];
131 L2_tags[set1][0] = tag;
132 }
133 else if (tag == L2_tags[set1][5]) {
134 L2_tags[set1][5] = L2_tags[set1][4];
135 L2_tags[set1][4] = L2_tags[set1][3];
136 L2_tags[set1][3] = L2_tags[set1][2];
137 L2_tags[set1][2] = L2_tags[set1][1];
138 L2_tags[set1][1] = L2_tags[set1][0];
139 L2_tags[set1][0] = tag;
140 }
141 else if (tag == L2_tags[set1][6]) {
142 L2_tags[set1][6] = L2_tags[set1][5];
143 L2_tags[set1][5] = L2_tags[set1][4];
144 L2_tags[set1][4] = L2_tags[set1][3];
145 L2_tags[set1][3] = L2_tags[set1][2];
146 L2_tags[set1][2] = L2_tags[set1][1];
147 L2_tags[set1][1] = L2_tags[set1][0];
148 L2_tags[set1][0] = tag;
149 }
150 else if (tag == L2_tags[set1][7]) {
151 L2_tags[set1][7] = L2_tags[set1][6];
152 L2_tags[set1][6] = L2_tags[set1][5];
153 L2_tags[set1][5] = L2_tags[set1][4];
154 L2_tags[set1][4] = L2_tags[set1][3];
155 L2_tags[set1][3] = L2_tags[set1][2];
156 L2_tags[set1][2] = L2_tags[set1][1];
157 L2_tags[set1][1] = L2_tags[set1][0];
158 L2_tags[set1][0] = tag;
159 }
160 else {
161 /* A miss */
162 L2_tags[set1][7] = L2_tags[set1][6];
163 L2_tags[set1][6] = L2_tags[set1][5];
164 L2_tags[set1][5] = L2_tags[set1][4];
165 L2_tags[set1][4] = L2_tags[set1][3];
166 L2_tags[set1][3] = L2_tags[set1][2];
167 L2_tags[set1][2] = L2_tags[set1][1];
168 L2_tags[set1][1] = L2_tags[set1][0];
169 L2_tags[set1][0] = tag;
170
171 is_L2_miss = True;
172 }
173
174 /* Block two */
175 if (tag == L2_tags[set2][0]) {
176 }
177 else if (tag == L2_tags[set2][1]) {
178 L2_tags[set2][1] = L2_tags[set2][0];
179 L2_tags[set2][0] = tag;
180 }
181 else if (tag == L2_tags[set2][2]) {
182 L2_tags[set2][2] = L2_tags[set2][1];
183 L2_tags[set2][1] = L2_tags[set2][0];
184 L2_tags[set2][0] = tag;
185 }
186 else if (tag == L2_tags[set2][3]) {
187 L2_tags[set2][3] = L2_tags[set2][2];
188 L2_tags[set2][2] = L2_tags[set2][1];
189 L2_tags[set2][1] = L2_tags[set2][0];
190 L2_tags[set2][0] = tag;
191 }
192 else if (tag == L2_tags[set2][4]) {
193 L2_tags[set2][4] = L2_tags[set2][3];
194 L2_tags[set2][3] = L2_tags[set2][2];
195 L2_tags[set2][2] = L2_tags[set2][1];
196 L2_tags[set2][1] = L2_tags[set2][0];
197 L2_tags[set2][0] = tag;
198 }
199 else if (tag == L2_tags[set2][5]) {
200 L2_tags[set2][5] = L2_tags[set2][4];
201 L2_tags[set2][4] = L2_tags[set2][3];
202 L2_tags[set2][3] = L2_tags[set2][2];
203 L2_tags[set2][2] = L2_tags[set2][1];
204 L2_tags[set2][1] = L2_tags[set2][0];
205 L2_tags[set2][0] = tag;
206 }
207 else if (tag == L2_tags[set2][6]) {
208 L2_tags[set2][6] = L2_tags[set2][5];
209 L2_tags[set2][5] = L2_tags[set2][4];
210 L2_tags[set2][4] = L2_tags[set2][3];
211 L2_tags[set2][3] = L2_tags[set2][2];
212 L2_tags[set2][2] = L2_tags[set2][1];
213 L2_tags[set2][1] = L2_tags[set2][0];
214 L2_tags[set2][0] = tag;
215 }
216 else if (tag == L2_tags[set2][7]) {
217 L2_tags[set2][7] = L2_tags[set2][6];
218 L2_tags[set2][6] = L2_tags[set2][5];
219 L2_tags[set2][5] = L2_tags[set2][4];
220 L2_tags[set2][4] = L2_tags[set2][3];
221 L2_tags[set2][3] = L2_tags[set2][2];
222 L2_tags[set2][2] = L2_tags[set2][1];
223 L2_tags[set2][1] = L2_tags[set2][0];
224 L2_tags[set2][0] = tag;
225 }
226 else {
227 /* A miss */
228 L2_tags[set2][7] = L2_tags[set2][6];
229 L2_tags[set2][6] = L2_tags[set2][5];
230 L2_tags[set2][5] = L2_tags[set2][4];
231 L2_tags[set2][4] = L2_tags[set2][3];
232 L2_tags[set2][3] = L2_tags[set2][2];
233 L2_tags[set2][2] = L2_tags[set2][1];
234 L2_tags[set2][1] = L2_tags[set2][0];
235 L2_tags[set2][0] = tag;
236
237 is_L2_miss = True;
238 }
239
240 /* Miss treatment */
241 if (is_L2_miss) {
242 (*m2)++;
243 }
244
245 } else {
246 VG_(printf)("\nERROR: Data item 0x%x of size %u bytes is in two non-adjacent\n", a, size);
247 VG_(printf)("sets %d and %d.\n", set1, set2);
248 VG_(panic)("L2 cache set mismatch");
249 }
250}