aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--SConstruct1
-rw-r--r--include/pm_arch.h1084
-rw-r--r--pm_test/pm_task.c279
3 files changed, 1364 insertions, 0 deletions
diff --git a/SConstruct b/SConstruct
index 85aaeab..8ad97b6 100644
--- a/SConstruct
+++ b/SConstruct
@@ -154,3 +154,4 @@ test.Program('runtests', Glob('tests/*.c'))
154pmrt = rt.Clone() 154pmrt = rt.Clone()
155pmrt.Append(CCFLAGS = '-O2'); 155pmrt.Append(CCFLAGS = '-O2');
156pmrt.Program('pm_try_read_ctrl_page', 'pm_test/pm_try_read_ctrl_page.c') 156pmrt.Program('pm_try_read_ctrl_page', 'pm_test/pm_try_read_ctrl_page.c')
157pmrt.Program('pm_task', ['pm_test/pm_task.c', 'pm_test/pm_common.c'])
diff --git a/include/pm_arch.h b/include/pm_arch.h
new file mode 100644
index 0000000..8db9935
--- /dev/null
+++ b/include/pm_arch.h
@@ -0,0 +1,1084 @@
1/*
2 * preemption and migration overhead measurement
3 *
4 * platform dependent functions
5 */
6#ifndef PM_ARCH_H
7#define PM_ARCH_H
8
9#if defined(__i386__) || defined(__x86_64__)
10#define RWCYCLE 4
11static inline void readwrite_one_thousand_ints(int *mem_ptr)
12{
13 int i, dummy;
14 for (i=0; i<1024; i++) {
15 if((i%RWCYCLE) == (RWCYCLE - 1)) {
16 /* write */
17 mem_ptr[i]++;
18 } else {
19 /* read */
20 dummy = mem_ptr[i];
21 }
22 }
23}
24
25static inline void read_mem(int *loc_ptr)
26{
27 int dummy;
28 dummy = *loc_ptr;
29}
30
31static inline void write_mem(int *loc_ptr)
32{
33 int dummy;
34 dummy = ++(*loc_ptr);
35}
36#endif /* !__i386__ && !__x86_64__ */
37
38#ifdef __sparc__
39static inline void read_mem(int *loc_ptr)
40{
41 __asm__ __volatile__("ld [%0], %%g1"
42 : : "r"(loc_ptr)
43 : "g1", "cc", "memory");
44}
45
46static inline void write_mem(int *loc_ptr)
47{
48 __asm__ __volatile__("st %%g1, [%0]"
49 : : "r"(loc_ptr)
50 : "g1", "cc", "memory");
51}
52
53static inline void readwrite_one_thousand_ints(int *mem_ptr)
54{
55 __asm__ __volatile__(
56 "ld [%0], %%g1\n"
57 "ld [%0+4], %%g1\n"
58 "ld [%0+8], %%g1\n"
59 "st %%g1, [%0+12]\n"
60 "ld [%0+16], %%g1\n"
61 "ld [%0+20], %%g1\n"
62 "ld [%0+24], %%g1\n"
63 "st %%g1, [%0+28]\n"
64 "ld [%0+32], %%g1\n"
65 "ld [%0+36], %%g1\n"
66 "ld [%0+40], %%g1\n"
67 "st %%g1, [%0+44]\n"
68 "ld [%0+48], %%g1\n"
69 "ld [%0+52], %%g1\n"
70 "ld [%0+56], %%g1\n"
71 "st %%g1, [%0+60]\n"
72 "ld [%0+64], %%g1\n"
73 "ld [%0+68], %%g1\n"
74 "ld [%0+72], %%g1\n"
75 "st %%g1, [%0+76]\n"
76 "ld [%0+80], %%g1\n"
77 "ld [%0+84], %%g1\n"
78 "ld [%0+88], %%g1\n"
79 "st %%g1, [%0+92]\n"
80 "ld [%0+96], %%g1\n"
81 "ld [%0+100], %%g1\n"
82 "ld [%0+104], %%g1\n"
83 "st %%g1, [%0+108]\n"
84 "ld [%0+112], %%g1\n"
85 "ld [%0+116], %%g1\n"
86 "ld [%0+120], %%g1\n"
87 "st %%g1, [%0+124]\n"
88 "ld [%0+128], %%g1\n"
89 "ld [%0+132], %%g1\n"
90 "ld [%0+136], %%g1\n"
91 "st %%g1, [%0+140]\n"
92 "ld [%0+144], %%g1\n"
93 "ld [%0+148], %%g1\n"
94 "ld [%0+152], %%g1\n"
95 "st %%g1, [%0+156]\n"
96 "ld [%0+160], %%g1\n"
97 "ld [%0+164], %%g1\n"
98 "ld [%0+168], %%g1\n"
99 "st %%g1, [%0+172]\n"
100 "ld [%0+176], %%g1\n"
101 "ld [%0+180], %%g1\n"
102 "ld [%0+184], %%g1\n"
103 "st %%g1, [%0+188]\n"
104 "ld [%0+192], %%g1\n"
105 "ld [%0+196], %%g1\n"
106 "ld [%0+200], %%g1\n"
107 "st %%g1, [%0+204]\n"
108 "ld [%0+208], %%g1\n"
109 "ld [%0+212], %%g1\n"
110 "ld [%0+216], %%g1\n"
111 "st %%g1, [%0+220]\n"
112 "ld [%0+224], %%g1\n"
113 "ld [%0+228], %%g1\n"
114 "ld [%0+232], %%g1\n"
115 "st %%g1, [%0+236]\n"
116 "ld [%0+240], %%g1\n"
117 "ld [%0+244], %%g1\n"
118 "ld [%0+248], %%g1\n"
119 "st %%g1, [%0+252]\n"
120 "ld [%0+256], %%g1\n"
121 "ld [%0+260], %%g1\n"
122 "ld [%0+264], %%g1\n"
123 "st %%g1, [%0+268]\n"
124 "ld [%0+272], %%g1\n"
125 "ld [%0+276], %%g1\n"
126 "ld [%0+280], %%g1\n"
127 "st %%g1, [%0+284]\n"
128 "ld [%0+288], %%g1\n"
129 "ld [%0+292], %%g1\n"
130 "ld [%0+296], %%g1\n"
131 "st %%g1, [%0+300]\n"
132 "ld [%0+304], %%g1\n"
133 "ld [%0+308], %%g1\n"
134 "ld [%0+312], %%g1\n"
135 "st %%g1, [%0+316]\n"
136 "ld [%0+320], %%g1\n"
137 "ld [%0+324], %%g1\n"
138 "ld [%0+328], %%g1\n"
139 "st %%g1, [%0+332]\n"
140 "ld [%0+336], %%g1\n"
141 "ld [%0+340], %%g1\n"
142 "ld [%0+344], %%g1\n"
143 "st %%g1, [%0+348]\n"
144 "ld [%0+352], %%g1\n"
145 "ld [%0+356], %%g1\n"
146 "ld [%0+360], %%g1\n"
147 "st %%g1, [%0+364]\n"
148 "ld [%0+368], %%g1\n"
149 "ld [%0+372], %%g1\n"
150 "ld [%0+376], %%g1\n"
151 "st %%g1, [%0+380]\n"
152 "ld [%0+384], %%g1\n"
153 "ld [%0+388], %%g1\n"
154 "ld [%0+392], %%g1\n"
155 "st %%g1, [%0+396]\n"
156 "ld [%0+400], %%g1\n"
157 "ld [%0+404], %%g1\n"
158 "ld [%0+408], %%g1\n"
159 "st %%g1, [%0+412]\n"
160 "ld [%0+416], %%g1\n"
161 "ld [%0+420], %%g1\n"
162 "ld [%0+424], %%g1\n"
163 "st %%g1, [%0+428]\n"
164 "ld [%0+432], %%g1\n"
165 "ld [%0+436], %%g1\n"
166 "ld [%0+440], %%g1\n"
167 "st %%g1, [%0+444]\n"
168 "ld [%0+448], %%g1\n"
169 "ld [%0+452], %%g1\n"
170 "ld [%0+456], %%g1\n"
171 "st %%g1, [%0+460]\n"
172 "ld [%0+464], %%g1\n"
173 "ld [%0+468], %%g1\n"
174 "ld [%0+472], %%g1\n"
175 "st %%g1, [%0+476]\n"
176 "ld [%0+480], %%g1\n"
177 "ld [%0+484], %%g1\n"
178 "ld [%0+488], %%g1\n"
179 "st %%g1, [%0+492]\n"
180 "ld [%0+496], %%g1\n"
181 "ld [%0+500], %%g1\n"
182 "ld [%0+504], %%g1\n"
183 "st %%g1, [%0+508]\n"
184 "ld [%0+512], %%g1\n"
185 "ld [%0+516], %%g1\n"
186 "ld [%0+520], %%g1\n"
187 "st %%g1, [%0+524]\n"
188 "ld [%0+528], %%g1\n"
189 "ld [%0+532], %%g1\n"
190 "ld [%0+536], %%g1\n"
191 "st %%g1, [%0+540]\n"
192 "ld [%0+544], %%g1\n"
193 "ld [%0+548], %%g1\n"
194 "ld [%0+552], %%g1\n"
195 "st %%g1, [%0+556]\n"
196 "ld [%0+560], %%g1\n"
197 "ld [%0+564], %%g1\n"
198 "ld [%0+568], %%g1\n"
199 "st %%g1, [%0+572]\n"
200 "ld [%0+576], %%g1\n"
201 "ld [%0+580], %%g1\n"
202 "ld [%0+584], %%g1\n"
203 "st %%g1, [%0+588]\n"
204 "ld [%0+592], %%g1\n"
205 "ld [%0+596], %%g1\n"
206 "ld [%0+600], %%g1\n"
207 "st %%g1, [%0+604]\n"
208 "ld [%0+608], %%g1\n"
209 "ld [%0+612], %%g1\n"
210 "ld [%0+616], %%g1\n"
211 "st %%g1, [%0+620]\n"
212 "ld [%0+624], %%g1\n"
213 "ld [%0+628], %%g1\n"
214 "ld [%0+632], %%g1\n"
215 "st %%g1, [%0+636]\n"
216 "ld [%0+640], %%g1\n"
217 "ld [%0+644], %%g1\n"
218 "ld [%0+648], %%g1\n"
219 "st %%g1, [%0+652]\n"
220 "ld [%0+656], %%g1\n"
221 "ld [%0+660], %%g1\n"
222 "ld [%0+664], %%g1\n"
223 "st %%g1, [%0+668]\n"
224 "ld [%0+672], %%g1\n"
225 "ld [%0+676], %%g1\n"
226 "ld [%0+680], %%g1\n"
227 "st %%g1, [%0+684]\n"
228 "ld [%0+688], %%g1\n"
229 "ld [%0+692], %%g1\n"
230 "ld [%0+696], %%g1\n"
231 "st %%g1, [%0+700]\n"
232 "ld [%0+704], %%g1\n"
233 "ld [%0+708], %%g1\n"
234 "ld [%0+712], %%g1\n"
235 "st %%g1, [%0+716]\n"
236 "ld [%0+720], %%g1\n"
237 "ld [%0+724], %%g1\n"
238 "ld [%0+728], %%g1\n"
239 "st %%g1, [%0+732]\n"
240 "ld [%0+736], %%g1\n"
241 "ld [%0+740], %%g1\n"
242 "ld [%0+744], %%g1\n"
243 "st %%g1, [%0+748]\n"
244 "ld [%0+752], %%g1\n"
245 "ld [%0+756], %%g1\n"
246 "ld [%0+760], %%g1\n"
247 "st %%g1, [%0+764]\n"
248 "ld [%0+768], %%g1\n"
249 "ld [%0+772], %%g1\n"
250 "ld [%0+776], %%g1\n"
251 "st %%g1, [%0+780]\n"
252 "ld [%0+784], %%g1\n"
253 "ld [%0+788], %%g1\n"
254 "ld [%0+792], %%g1\n"
255 "st %%g1, [%0+796]\n"
256 "ld [%0+800], %%g1\n"
257 "ld [%0+804], %%g1\n"
258 "ld [%0+808], %%g1\n"
259 "st %%g1, [%0+812]\n"
260 "ld [%0+816], %%g1\n"
261 "ld [%0+820], %%g1\n"
262 "ld [%0+824], %%g1\n"
263 "st %%g1, [%0+828]\n"
264 "ld [%0+832], %%g1\n"
265 "ld [%0+836], %%g1\n"
266 "ld [%0+840], %%g1\n"
267 "st %%g1, [%0+844]\n"
268 "ld [%0+848], %%g1\n"
269 "ld [%0+852], %%g1\n"
270 "ld [%0+856], %%g1\n"
271 "st %%g1, [%0+860]\n"
272 "ld [%0+864], %%g1\n"
273 "ld [%0+868], %%g1\n"
274 "ld [%0+872], %%g1\n"
275 "st %%g1, [%0+876]\n"
276 "ld [%0+880], %%g1\n"
277 "ld [%0+884], %%g1\n"
278 "ld [%0+888], %%g1\n"
279 "st %%g1, [%0+892]\n"
280 "ld [%0+896], %%g1\n"
281 "ld [%0+900], %%g1\n"
282 "ld [%0+904], %%g1\n"
283 "st %%g1, [%0+908]\n"
284 "ld [%0+912], %%g1\n"
285 "ld [%0+916], %%g1\n"
286 "ld [%0+920], %%g1\n"
287 "st %%g1, [%0+924]\n"
288 "ld [%0+928], %%g1\n"
289 "ld [%0+932], %%g1\n"
290 "ld [%0+936], %%g1\n"
291 "st %%g1, [%0+940]\n"
292 "ld [%0+944], %%g1\n"
293 "ld [%0+948], %%g1\n"
294 "ld [%0+952], %%g1\n"
295 "st %%g1, [%0+956]\n"
296 "ld [%0+960], %%g1\n"
297 "ld [%0+964], %%g1\n"
298 "ld [%0+968], %%g1\n"
299 "st %%g1, [%0+972]\n"
300 "ld [%0+976], %%g1\n"
301 "ld [%0+980], %%g1\n"
302 "ld [%0+984], %%g1\n"
303 "st %%g1, [%0+988]\n"
304 "ld [%0+992], %%g1\n"
305 "ld [%0+996], %%g1\n"
306 "ld [%0+1000], %%g1\n"
307 "st %%g1, [%0+1004]\n"
308 "ld [%0+1008], %%g1\n"
309 "ld [%0+1012], %%g1\n"
310 "ld [%0+1016], %%g1\n"
311 "st %%g1, [%0+1020]\n"
312 "ld [%0+1024], %%g1\n"
313 "ld [%0+1028], %%g1\n"
314 "ld [%0+1032], %%g1\n"
315 "st %%g1, [%0+1036]\n"
316 "ld [%0+1040], %%g1\n"
317 "ld [%0+1044], %%g1\n"
318 "ld [%0+1048], %%g1\n"
319 "st %%g1, [%0+1052]\n"
320 "ld [%0+1056], %%g1\n"
321 "ld [%0+1060], %%g1\n"
322 "ld [%0+1064], %%g1\n"
323 "st %%g1, [%0+1068]\n"
324 "ld [%0+1072], %%g1\n"
325 "ld [%0+1076], %%g1\n"
326 "ld [%0+1080], %%g1\n"
327 "st %%g1, [%0+1084]\n"
328 "ld [%0+1088], %%g1\n"
329 "ld [%0+1092], %%g1\n"
330 "ld [%0+1096], %%g1\n"
331 "st %%g1, [%0+1100]\n"
332 "ld [%0+1104], %%g1\n"
333 "ld [%0+1108], %%g1\n"
334 "ld [%0+1112], %%g1\n"
335 "st %%g1, [%0+1116]\n"
336 "ld [%0+1120], %%g1\n"
337 "ld [%0+1124], %%g1\n"
338 "ld [%0+1128], %%g1\n"
339 "st %%g1, [%0+1132]\n"
340 "ld [%0+1136], %%g1\n"
341 "ld [%0+1140], %%g1\n"
342 "ld [%0+1144], %%g1\n"
343 "st %%g1, [%0+1148]\n"
344 "ld [%0+1152], %%g1\n"
345 "ld [%0+1156], %%g1\n"
346 "ld [%0+1160], %%g1\n"
347 "st %%g1, [%0+1164]\n"
348 "ld [%0+1168], %%g1\n"
349 "ld [%0+1172], %%g1\n"
350 "ld [%0+1176], %%g1\n"
351 "st %%g1, [%0+1180]\n"
352 "ld [%0+1184], %%g1\n"
353 "ld [%0+1188], %%g1\n"
354 "ld [%0+1192], %%g1\n"
355 "st %%g1, [%0+1196]\n"
356 "ld [%0+1200], %%g1\n"
357 "ld [%0+1204], %%g1\n"
358 "ld [%0+1208], %%g1\n"
359 "st %%g1, [%0+1212]\n"
360 "ld [%0+1216], %%g1\n"
361 "ld [%0+1220], %%g1\n"
362 "ld [%0+1224], %%g1\n"
363 "st %%g1, [%0+1228]\n"
364 "ld [%0+1232], %%g1\n"
365 "ld [%0+1236], %%g1\n"
366 "ld [%0+1240], %%g1\n"
367 "st %%g1, [%0+1244]\n"
368 "ld [%0+1248], %%g1\n"
369 "ld [%0+1252], %%g1\n"
370 "ld [%0+1256], %%g1\n"
371 "st %%g1, [%0+1260]\n"
372 "ld [%0+1264], %%g1\n"
373 "ld [%0+1268], %%g1\n"
374 "ld [%0+1272], %%g1\n"
375 "st %%g1, [%0+1276]\n"
376 "ld [%0+1280], %%g1\n"
377 "ld [%0+1284], %%g1\n"
378 "ld [%0+1288], %%g1\n"
379 "st %%g1, [%0+1292]\n"
380 "ld [%0+1296], %%g1\n"
381 "ld [%0+1300], %%g1\n"
382 "ld [%0+1304], %%g1\n"
383 "st %%g1, [%0+1308]\n"
384 "ld [%0+1312], %%g1\n"
385 "ld [%0+1316], %%g1\n"
386 "ld [%0+1320], %%g1\n"
387 "st %%g1, [%0+1324]\n"
388 "ld [%0+1328], %%g1\n"
389 "ld [%0+1332], %%g1\n"
390 "ld [%0+1336], %%g1\n"
391 "st %%g1, [%0+1340]\n"
392 "ld [%0+1344], %%g1\n"
393 "ld [%0+1348], %%g1\n"
394 "ld [%0+1352], %%g1\n"
395 "st %%g1, [%0+1356]\n"
396 "ld [%0+1360], %%g1\n"
397 "ld [%0+1364], %%g1\n"
398 "ld [%0+1368], %%g1\n"
399 "st %%g1, [%0+1372]\n"
400 "ld [%0+1376], %%g1\n"
401 "ld [%0+1380], %%g1\n"
402 "ld [%0+1384], %%g1\n"
403 "st %%g1, [%0+1388]\n"
404 "ld [%0+1392], %%g1\n"
405 "ld [%0+1396], %%g1\n"
406 "ld [%0+1400], %%g1\n"
407 "st %%g1, [%0+1404]\n"
408 "ld [%0+1408], %%g1\n"
409 "ld [%0+1412], %%g1\n"
410 "ld [%0+1416], %%g1\n"
411 "st %%g1, [%0+1420]\n"
412 "ld [%0+1424], %%g1\n"
413 "ld [%0+1428], %%g1\n"
414 "ld [%0+1432], %%g1\n"
415 "st %%g1, [%0+1436]\n"
416 "ld [%0+1440], %%g1\n"
417 "ld [%0+1444], %%g1\n"
418 "ld [%0+1448], %%g1\n"
419 "st %%g1, [%0+1452]\n"
420 "ld [%0+1456], %%g1\n"
421 "ld [%0+1460], %%g1\n"
422 "ld [%0+1464], %%g1\n"
423 "st %%g1, [%0+1468]\n"
424 "ld [%0+1472], %%g1\n"
425 "ld [%0+1476], %%g1\n"
426 "ld [%0+1480], %%g1\n"
427 "st %%g1, [%0+1484]\n"
428 "ld [%0+1488], %%g1\n"
429 "ld [%0+1492], %%g1\n"
430 "ld [%0+1496], %%g1\n"
431 "st %%g1, [%0+1500]\n"
432 "ld [%0+1504], %%g1\n"
433 "ld [%0+1508], %%g1\n"
434 "ld [%0+1512], %%g1\n"
435 "st %%g1, [%0+1516]\n"
436 "ld [%0+1520], %%g1\n"
437 "ld [%0+1524], %%g1\n"
438 "ld [%0+1528], %%g1\n"
439 "st %%g1, [%0+1532]\n"
440 "ld [%0+1536], %%g1\n"
441 "ld [%0+1540], %%g1\n"
442 "ld [%0+1544], %%g1\n"
443 "st %%g1, [%0+1548]\n"
444 "ld [%0+1552], %%g1\n"
445 "ld [%0+1556], %%g1\n"
446 "ld [%0+1560], %%g1\n"
447 "st %%g1, [%0+1564]\n"
448 "ld [%0+1568], %%g1\n"
449 "ld [%0+1572], %%g1\n"
450 "ld [%0+1576], %%g1\n"
451 "st %%g1, [%0+1580]\n"
452 "ld [%0+1584], %%g1\n"
453 "ld [%0+1588], %%g1\n"
454 "ld [%0+1592], %%g1\n"
455 "st %%g1, [%0+1596]\n"
456 "ld [%0+1600], %%g1\n"
457 "ld [%0+1604], %%g1\n"
458 "ld [%0+1608], %%g1\n"
459 "st %%g1, [%0+1612]\n"
460 "ld [%0+1616], %%g1\n"
461 "ld [%0+1620], %%g1\n"
462 "ld [%0+1624], %%g1\n"
463 "st %%g1, [%0+1628]\n"
464 "ld [%0+1632], %%g1\n"
465 "ld [%0+1636], %%g1\n"
466 "ld [%0+1640], %%g1\n"
467 "st %%g1, [%0+1644]\n"
468 "ld [%0+1648], %%g1\n"
469 "ld [%0+1652], %%g1\n"
470 "ld [%0+1656], %%g1\n"
471 "st %%g1, [%0+1660]\n"
472 "ld [%0+1664], %%g1\n"
473 "ld [%0+1668], %%g1\n"
474 "ld [%0+1672], %%g1\n"
475 "st %%g1, [%0+1676]\n"
476 "ld [%0+1680], %%g1\n"
477 "ld [%0+1684], %%g1\n"
478 "ld [%0+1688], %%g1\n"
479 "st %%g1, [%0+1692]\n"
480 "ld [%0+1696], %%g1\n"
481 "ld [%0+1700], %%g1\n"
482 "ld [%0+1704], %%g1\n"
483 "st %%g1, [%0+1708]\n"
484 "ld [%0+1712], %%g1\n"
485 "ld [%0+1716], %%g1\n"
486 "ld [%0+1720], %%g1\n"
487 "st %%g1, [%0+1724]\n"
488 "ld [%0+1728], %%g1\n"
489 "ld [%0+1732], %%g1\n"
490 "ld [%0+1736], %%g1\n"
491 "st %%g1, [%0+1740]\n"
492 "ld [%0+1744], %%g1\n"
493 "ld [%0+1748], %%g1\n"
494 "ld [%0+1752], %%g1\n"
495 "st %%g1, [%0+1756]\n"
496 "ld [%0+1760], %%g1\n"
497 "ld [%0+1764], %%g1\n"
498 "ld [%0+1768], %%g1\n"
499 "st %%g1, [%0+1772]\n"
500 "ld [%0+1776], %%g1\n"
501 "ld [%0+1780], %%g1\n"
502 "ld [%0+1784], %%g1\n"
503 "st %%g1, [%0+1788]\n"
504 "ld [%0+1792], %%g1\n"
505 "ld [%0+1796], %%g1\n"
506 "ld [%0+1800], %%g1\n"
507 "st %%g1, [%0+1804]\n"
508 "ld [%0+1808], %%g1\n"
509 "ld [%0+1812], %%g1\n"
510 "ld [%0+1816], %%g1\n"
511 "st %%g1, [%0+1820]\n"
512 "ld [%0+1824], %%g1\n"
513 "ld [%0+1828], %%g1\n"
514 "ld [%0+1832], %%g1\n"
515 "st %%g1, [%0+1836]\n"
516 "ld [%0+1840], %%g1\n"
517 "ld [%0+1844], %%g1\n"
518 "ld [%0+1848], %%g1\n"
519 "st %%g1, [%0+1852]\n"
520 "ld [%0+1856], %%g1\n"
521 "ld [%0+1860], %%g1\n"
522 "ld [%0+1864], %%g1\n"
523 "st %%g1, [%0+1868]\n"
524 "ld [%0+1872], %%g1\n"
525 "ld [%0+1876], %%g1\n"
526 "ld [%0+1880], %%g1\n"
527 "st %%g1, [%0+1884]\n"
528 "ld [%0+1888], %%g1\n"
529 "ld [%0+1892], %%g1\n"
530 "ld [%0+1896], %%g1\n"
531 "st %%g1, [%0+1900]\n"
532 "ld [%0+1904], %%g1\n"
533 "ld [%0+1908], %%g1\n"
534 "ld [%0+1912], %%g1\n"
535 "st %%g1, [%0+1916]\n"
536 "ld [%0+1920], %%g1\n"
537 "ld [%0+1924], %%g1\n"
538 "ld [%0+1928], %%g1\n"
539 "st %%g1, [%0+1932]\n"
540 "ld [%0+1936], %%g1\n"
541 "ld [%0+1940], %%g1\n"
542 "ld [%0+1944], %%g1\n"
543 "st %%g1, [%0+1948]\n"
544 "ld [%0+1952], %%g1\n"
545 "ld [%0+1956], %%g1\n"
546 "ld [%0+1960], %%g1\n"
547 "st %%g1, [%0+1964]\n"
548 "ld [%0+1968], %%g1\n"
549 "ld [%0+1972], %%g1\n"
550 "ld [%0+1976], %%g1\n"
551 "st %%g1, [%0+1980]\n"
552 "ld [%0+1984], %%g1\n"
553 "ld [%0+1988], %%g1\n"
554 "ld [%0+1992], %%g1\n"
555 "st %%g1, [%0+1996]\n"
556 "ld [%0+2000], %%g1\n"
557 "ld [%0+2004], %%g1\n"
558 "ld [%0+2008], %%g1\n"
559 "st %%g1, [%0+2012]\n"
560 "ld [%0+2016], %%g1\n"
561 "ld [%0+2020], %%g1\n"
562 "ld [%0+2024], %%g1\n"
563 "st %%g1, [%0+2028]\n"
564 "ld [%0+2032], %%g1\n"
565 "ld [%0+2036], %%g1\n"
566 "ld [%0+2040], %%g1\n"
567 "st %%g1, [%0+2044]\n"
568 "ld [%0+2048], %%g1\n"
569 "ld [%0+2052], %%g1\n"
570 "ld [%0+2056], %%g1\n"
571 "st %%g1, [%0+2060]\n"
572 "ld [%0+2064], %%g1\n"
573 "ld [%0+2068], %%g1\n"
574 "ld [%0+2072], %%g1\n"
575 "st %%g1, [%0+2076]\n"
576 "ld [%0+2080], %%g1\n"
577 "ld [%0+2084], %%g1\n"
578 "ld [%0+2088], %%g1\n"
579 "st %%g1, [%0+2092]\n"
580 "ld [%0+2096], %%g1\n"
581 "ld [%0+2100], %%g1\n"
582 "ld [%0+2104], %%g1\n"
583 "st %%g1, [%0+2108]\n"
584 "ld [%0+2112], %%g1\n"
585 "ld [%0+2116], %%g1\n"
586 "ld [%0+2120], %%g1\n"
587 "st %%g1, [%0+2124]\n"
588 "ld [%0+2128], %%g1\n"
589 "ld [%0+2132], %%g1\n"
590 "ld [%0+2136], %%g1\n"
591 "st %%g1, [%0+2140]\n"
592 "ld [%0+2144], %%g1\n"
593 "ld [%0+2148], %%g1\n"
594 "ld [%0+2152], %%g1\n"
595 "st %%g1, [%0+2156]\n"
596 "ld [%0+2160], %%g1\n"
597 "ld [%0+2164], %%g1\n"
598 "ld [%0+2168], %%g1\n"
599 "st %%g1, [%0+2172]\n"
600 "ld [%0+2176], %%g1\n"
601 "ld [%0+2180], %%g1\n"
602 "ld [%0+2184], %%g1\n"
603 "st %%g1, [%0+2188]\n"
604 "ld [%0+2192], %%g1\n"
605 "ld [%0+2196], %%g1\n"
606 "ld [%0+2200], %%g1\n"
607 "st %%g1, [%0+2204]\n"
608 "ld [%0+2208], %%g1\n"
609 "ld [%0+2212], %%g1\n"
610 "ld [%0+2216], %%g1\n"
611 "st %%g1, [%0+2220]\n"
612 "ld [%0+2224], %%g1\n"
613 "ld [%0+2228], %%g1\n"
614 "ld [%0+2232], %%g1\n"
615 "st %%g1, [%0+2236]\n"
616 "ld [%0+2240], %%g1\n"
617 "ld [%0+2244], %%g1\n"
618 "ld [%0+2248], %%g1\n"
619 "st %%g1, [%0+2252]\n"
620 "ld [%0+2256], %%g1\n"
621 "ld [%0+2260], %%g1\n"
622 "ld [%0+2264], %%g1\n"
623 "st %%g1, [%0+2268]\n"
624 "ld [%0+2272], %%g1\n"
625 "ld [%0+2276], %%g1\n"
626 "ld [%0+2280], %%g1\n"
627 "st %%g1, [%0+2284]\n"
628 "ld [%0+2288], %%g1\n"
629 "ld [%0+2292], %%g1\n"
630 "ld [%0+2296], %%g1\n"
631 "st %%g1, [%0+2300]\n"
632 "ld [%0+2304], %%g1\n"
633 "ld [%0+2308], %%g1\n"
634 "ld [%0+2312], %%g1\n"
635 "st %%g1, [%0+2316]\n"
636 "ld [%0+2320], %%g1\n"
637 "ld [%0+2324], %%g1\n"
638 "ld [%0+2328], %%g1\n"
639 "st %%g1, [%0+2332]\n"
640 "ld [%0+2336], %%g1\n"
641 "ld [%0+2340], %%g1\n"
642 "ld [%0+2344], %%g1\n"
643 "st %%g1, [%0+2348]\n"
644 "ld [%0+2352], %%g1\n"
645 "ld [%0+2356], %%g1\n"
646 "ld [%0+2360], %%g1\n"
647 "st %%g1, [%0+2364]\n"
648 "ld [%0+2368], %%g1\n"
649 "ld [%0+2372], %%g1\n"
650 "ld [%0+2376], %%g1\n"
651 "st %%g1, [%0+2380]\n"
652 "ld [%0+2384], %%g1\n"
653 "ld [%0+2388], %%g1\n"
654 "ld [%0+2392], %%g1\n"
655 "st %%g1, [%0+2396]\n"
656 "ld [%0+2400], %%g1\n"
657 "ld [%0+2404], %%g1\n"
658 "ld [%0+2408], %%g1\n"
659 "st %%g1, [%0+2412]\n"
660 "ld [%0+2416], %%g1\n"
661 "ld [%0+2420], %%g1\n"
662 "ld [%0+2424], %%g1\n"
663 "st %%g1, [%0+2428]\n"
664 "ld [%0+2432], %%g1\n"
665 "ld [%0+2436], %%g1\n"
666 "ld [%0+2440], %%g1\n"
667 "st %%g1, [%0+2444]\n"
668 "ld [%0+2448], %%g1\n"
669 "ld [%0+2452], %%g1\n"
670 "ld [%0+2456], %%g1\n"
671 "st %%g1, [%0+2460]\n"
672 "ld [%0+2464], %%g1\n"
673 "ld [%0+2468], %%g1\n"
674 "ld [%0+2472], %%g1\n"
675 "st %%g1, [%0+2476]\n"
676 "ld [%0+2480], %%g1\n"
677 "ld [%0+2484], %%g1\n"
678 "ld [%0+2488], %%g1\n"
679 "st %%g1, [%0+2492]\n"
680 "ld [%0+2496], %%g1\n"
681 "ld [%0+2500], %%g1\n"
682 "ld [%0+2504], %%g1\n"
683 "st %%g1, [%0+2508]\n"
684 "ld [%0+2512], %%g1\n"
685 "ld [%0+2516], %%g1\n"
686 "ld [%0+2520], %%g1\n"
687 "st %%g1, [%0+2524]\n"
688 "ld [%0+2528], %%g1\n"
689 "ld [%0+2532], %%g1\n"
690 "ld [%0+2536], %%g1\n"
691 "st %%g1, [%0+2540]\n"
692 "ld [%0+2544], %%g1\n"
693 "ld [%0+2548], %%g1\n"
694 "ld [%0+2552], %%g1\n"
695 "st %%g1, [%0+2556]\n"
696 "ld [%0+2560], %%g1\n"
697 "ld [%0+2564], %%g1\n"
698 "ld [%0+2568], %%g1\n"
699 "st %%g1, [%0+2572]\n"
700 "ld [%0+2576], %%g1\n"
701 "ld [%0+2580], %%g1\n"
702 "ld [%0+2584], %%g1\n"
703 "st %%g1, [%0+2588]\n"
704 "ld [%0+2592], %%g1\n"
705 "ld [%0+2596], %%g1\n"
706 "ld [%0+2600], %%g1\n"
707 "st %%g1, [%0+2604]\n"
708 "ld [%0+2608], %%g1\n"
709 "ld [%0+2612], %%g1\n"
710 "ld [%0+2616], %%g1\n"
711 "st %%g1, [%0+2620]\n"
712 "ld [%0+2624], %%g1\n"
713 "ld [%0+2628], %%g1\n"
714 "ld [%0+2632], %%g1\n"
715 "st %%g1, [%0+2636]\n"
716 "ld [%0+2640], %%g1\n"
717 "ld [%0+2644], %%g1\n"
718 "ld [%0+2648], %%g1\n"
719 "st %%g1, [%0+2652]\n"
720 "ld [%0+2656], %%g1\n"
721 "ld [%0+2660], %%g1\n"
722 "ld [%0+2664], %%g1\n"
723 "st %%g1, [%0+2668]\n"
724 "ld [%0+2672], %%g1\n"
725 "ld [%0+2676], %%g1\n"
726 "ld [%0+2680], %%g1\n"
727 "st %%g1, [%0+2684]\n"
728 "ld [%0+2688], %%g1\n"
729 "ld [%0+2692], %%g1\n"
730 "ld [%0+2696], %%g1\n"
731 "st %%g1, [%0+2700]\n"
732 "ld [%0+2704], %%g1\n"
733 "ld [%0+2708], %%g1\n"
734 "ld [%0+2712], %%g1\n"
735 "st %%g1, [%0+2716]\n"
736 "ld [%0+2720], %%g1\n"
737 "ld [%0+2724], %%g1\n"
738 "ld [%0+2728], %%g1\n"
739 "st %%g1, [%0+2732]\n"
740 "ld [%0+2736], %%g1\n"
741 "ld [%0+2740], %%g1\n"
742 "ld [%0+2744], %%g1\n"
743 "st %%g1, [%0+2748]\n"
744 "ld [%0+2752], %%g1\n"
745 "ld [%0+2756], %%g1\n"
746 "ld [%0+2760], %%g1\n"
747 "st %%g1, [%0+2764]\n"
748 "ld [%0+2768], %%g1\n"
749 "ld [%0+2772], %%g1\n"
750 "ld [%0+2776], %%g1\n"
751 "st %%g1, [%0+2780]\n"
752 "ld [%0+2784], %%g1\n"
753 "ld [%0+2788], %%g1\n"
754 "ld [%0+2792], %%g1\n"
755 "st %%g1, [%0+2796]\n"
756 "ld [%0+2800], %%g1\n"
757 "ld [%0+2804], %%g1\n"
758 "ld [%0+2808], %%g1\n"
759 "st %%g1, [%0+2812]\n"
760 "ld [%0+2816], %%g1\n"
761 "ld [%0+2820], %%g1\n"
762 "ld [%0+2824], %%g1\n"
763 "st %%g1, [%0+2828]\n"
764 "ld [%0+2832], %%g1\n"
765 "ld [%0+2836], %%g1\n"
766 "ld [%0+2840], %%g1\n"
767 "st %%g1, [%0+2844]\n"
768 "ld [%0+2848], %%g1\n"
769 "ld [%0+2852], %%g1\n"
770 "ld [%0+2856], %%g1\n"
771 "st %%g1, [%0+2860]\n"
772 "ld [%0+2864], %%g1\n"
773 "ld [%0+2868], %%g1\n"
774 "ld [%0+2872], %%g1\n"
775 "st %%g1, [%0+2876]\n"
776 "ld [%0+2880], %%g1\n"
777 "ld [%0+2884], %%g1\n"
778 "ld [%0+2888], %%g1\n"
779 "st %%g1, [%0+2892]\n"
780 "ld [%0+2896], %%g1\n"
781 "ld [%0+2900], %%g1\n"
782 "ld [%0+2904], %%g1\n"
783 "st %%g1, [%0+2908]\n"
784 "ld [%0+2912], %%g1\n"
785 "ld [%0+2916], %%g1\n"
786 "ld [%0+2920], %%g1\n"
787 "st %%g1, [%0+2924]\n"
788 "ld [%0+2928], %%g1\n"
789 "ld [%0+2932], %%g1\n"
790 "ld [%0+2936], %%g1\n"
791 "st %%g1, [%0+2940]\n"
792 "ld [%0+2944], %%g1\n"
793 "ld [%0+2948], %%g1\n"
794 "ld [%0+2952], %%g1\n"
795 "st %%g1, [%0+2956]\n"
796 "ld [%0+2960], %%g1\n"
797 "ld [%0+2964], %%g1\n"
798 "ld [%0+2968], %%g1\n"
799 "st %%g1, [%0+2972]\n"
800 "ld [%0+2976], %%g1\n"
801 "ld [%0+2980], %%g1\n"
802 "ld [%0+2984], %%g1\n"
803 "st %%g1, [%0+2988]\n"
804 "ld [%0+2992], %%g1\n"
805 "ld [%0+2996], %%g1\n"
806 "ld [%0+3000], %%g1\n"
807 "st %%g1, [%0+3004]\n"
808 "ld [%0+3008], %%g1\n"
809 "ld [%0+3012], %%g1\n"
810 "ld [%0+3016], %%g1\n"
811 "st %%g1, [%0+3020]\n"
812 "ld [%0+3024], %%g1\n"
813 "ld [%0+3028], %%g1\n"
814 "ld [%0+3032], %%g1\n"
815 "st %%g1, [%0+3036]\n"
816 "ld [%0+3040], %%g1\n"
817 "ld [%0+3044], %%g1\n"
818 "ld [%0+3048], %%g1\n"
819 "st %%g1, [%0+3052]\n"
820 "ld [%0+3056], %%g1\n"
821 "ld [%0+3060], %%g1\n"
822 "ld [%0+3064], %%g1\n"
823 "st %%g1, [%0+3068]\n"
824 "ld [%0+3072], %%g1\n"
825 "ld [%0+3076], %%g1\n"
826 "ld [%0+3080], %%g1\n"
827 "st %%g1, [%0+3084]\n"
828 "ld [%0+3088], %%g1\n"
829 "ld [%0+3092], %%g1\n"
830 "ld [%0+3096], %%g1\n"
831 "st %%g1, [%0+3100]\n"
832 "ld [%0+3104], %%g1\n"
833 "ld [%0+3108], %%g1\n"
834 "ld [%0+3112], %%g1\n"
835 "st %%g1, [%0+3116]\n"
836 "ld [%0+3120], %%g1\n"
837 "ld [%0+3124], %%g1\n"
838 "ld [%0+3128], %%g1\n"
839 "st %%g1, [%0+3132]\n"
840 "ld [%0+3136], %%g1\n"
841 "ld [%0+3140], %%g1\n"
842 "ld [%0+3144], %%g1\n"
843 "st %%g1, [%0+3148]\n"
844 "ld [%0+3152], %%g1\n"
845 "ld [%0+3156], %%g1\n"
846 "ld [%0+3160], %%g1\n"
847 "st %%g1, [%0+3164]\n"
848 "ld [%0+3168], %%g1\n"
849 "ld [%0+3172], %%g1\n"
850 "ld [%0+3176], %%g1\n"
851 "st %%g1, [%0+3180]\n"
852 "ld [%0+3184], %%g1\n"
853 "ld [%0+3188], %%g1\n"
854 "ld [%0+3192], %%g1\n"
855 "st %%g1, [%0+3196]\n"
856 "ld [%0+3200], %%g1\n"
857 "ld [%0+3204], %%g1\n"
858 "ld [%0+3208], %%g1\n"
859 "st %%g1, [%0+3212]\n"
860 "ld [%0+3216], %%g1\n"
861 "ld [%0+3220], %%g1\n"
862 "ld [%0+3224], %%g1\n"
863 "st %%g1, [%0+3228]\n"
864 "ld [%0+3232], %%g1\n"
865 "ld [%0+3236], %%g1\n"
866 "ld [%0+3240], %%g1\n"
867 "st %%g1, [%0+3244]\n"
868 "ld [%0+3248], %%g1\n"
869 "ld [%0+3252], %%g1\n"
870 "ld [%0+3256], %%g1\n"
871 "st %%g1, [%0+3260]\n"
872 "ld [%0+3264], %%g1\n"
873 "ld [%0+3268], %%g1\n"
874 "ld [%0+3272], %%g1\n"
875 "st %%g1, [%0+3276]\n"
876 "ld [%0+3280], %%g1\n"
877 "ld [%0+3284], %%g1\n"
878 "ld [%0+3288], %%g1\n"
879 "st %%g1, [%0+3292]\n"
880 "ld [%0+3296], %%g1\n"
881 "ld [%0+3300], %%g1\n"
882 "ld [%0+3304], %%g1\n"
883 "st %%g1, [%0+3308]\n"
884 "ld [%0+3312], %%g1\n"
885 "ld [%0+3316], %%g1\n"
886 "ld [%0+3320], %%g1\n"
887 "st %%g1, [%0+3324]\n"
888 "ld [%0+3328], %%g1\n"
889 "ld [%0+3332], %%g1\n"
890 "ld [%0+3336], %%g1\n"
891 "st %%g1, [%0+3340]\n"
892 "ld [%0+3344], %%g1\n"
893 "ld [%0+3348], %%g1\n"
894 "ld [%0+3352], %%g1\n"
895 "st %%g1, [%0+3356]\n"
896 "ld [%0+3360], %%g1\n"
897 "ld [%0+3364], %%g1\n"
898 "ld [%0+3368], %%g1\n"
899 "st %%g1, [%0+3372]\n"
900 "ld [%0+3376], %%g1\n"
901 "ld [%0+3380], %%g1\n"
902 "ld [%0+3384], %%g1\n"
903 "st %%g1, [%0+3388]\n"
904 "ld [%0+3392], %%g1\n"
905 "ld [%0+3396], %%g1\n"
906 "ld [%0+3400], %%g1\n"
907 "st %%g1, [%0+3404]\n"
908 "ld [%0+3408], %%g1\n"
909 "ld [%0+3412], %%g1\n"
910 "ld [%0+3416], %%g1\n"
911 "st %%g1, [%0+3420]\n"
912 "ld [%0+3424], %%g1\n"
913 "ld [%0+3428], %%g1\n"
914 "ld [%0+3432], %%g1\n"
915 "st %%g1, [%0+3436]\n"
916 "ld [%0+3440], %%g1\n"
917 "ld [%0+3444], %%g1\n"
918 "ld [%0+3448], %%g1\n"
919 "st %%g1, [%0+3452]\n"
920 "ld [%0+3456], %%g1\n"
921 "ld [%0+3460], %%g1\n"
922 "ld [%0+3464], %%g1\n"
923 "st %%g1, [%0+3468]\n"
924 "ld [%0+3472], %%g1\n"
925 "ld [%0+3476], %%g1\n"
926 "ld [%0+3480], %%g1\n"
927 "st %%g1, [%0+3484]\n"
928 "ld [%0+3488], %%g1\n"
929 "ld [%0+3492], %%g1\n"
930 "ld [%0+3496], %%g1\n"
931 "st %%g1, [%0+3500]\n"
932 "ld [%0+3504], %%g1\n"
933 "ld [%0+3508], %%g1\n"
934 "ld [%0+3512], %%g1\n"
935 "st %%g1, [%0+3516]\n"
936 "ld [%0+3520], %%g1\n"
937 "ld [%0+3524], %%g1\n"
938 "ld [%0+3528], %%g1\n"
939 "st %%g1, [%0+3532]\n"
940 "ld [%0+3536], %%g1\n"
941 "ld [%0+3540], %%g1\n"
942 "ld [%0+3544], %%g1\n"
943 "st %%g1, [%0+3548]\n"
944 "ld [%0+3552], %%g1\n"
945 "ld [%0+3556], %%g1\n"
946 "ld [%0+3560], %%g1\n"
947 "st %%g1, [%0+3564]\n"
948 "ld [%0+3568], %%g1\n"
949 "ld [%0+3572], %%g1\n"
950 "ld [%0+3576], %%g1\n"
951 "st %%g1, [%0+3580]\n"
952 "ld [%0+3584], %%g1\n"
953 "ld [%0+3588], %%g1\n"
954 "ld [%0+3592], %%g1\n"
955 "st %%g1, [%0+3596]\n"
956 "ld [%0+3600], %%g1\n"
957 "ld [%0+3604], %%g1\n"
958 "ld [%0+3608], %%g1\n"
959 "st %%g1, [%0+3612]\n"
960 "ld [%0+3616], %%g1\n"
961 "ld [%0+3620], %%g1\n"
962 "ld [%0+3624], %%g1\n"
963 "st %%g1, [%0+3628]\n"
964 "ld [%0+3632], %%g1\n"
965 "ld [%0+3636], %%g1\n"
966 "ld [%0+3640], %%g1\n"
967 "st %%g1, [%0+3644]\n"
968 "ld [%0+3648], %%g1\n"
969 "ld [%0+3652], %%g1\n"
970 "ld [%0+3656], %%g1\n"
971 "st %%g1, [%0+3660]\n"
972 "ld [%0+3664], %%g1\n"
973 "ld [%0+3668], %%g1\n"
974 "ld [%0+3672], %%g1\n"
975 "st %%g1, [%0+3676]\n"
976 "ld [%0+3680], %%g1\n"
977 "ld [%0+3684], %%g1\n"
978 "ld [%0+3688], %%g1\n"
979 "st %%g1, [%0+3692]\n"
980 "ld [%0+3696], %%g1\n"
981 "ld [%0+3700], %%g1\n"
982 "ld [%0+3704], %%g1\n"
983 "st %%g1, [%0+3708]\n"
984 "ld [%0+3712], %%g1\n"
985 "ld [%0+3716], %%g1\n"
986 "ld [%0+3720], %%g1\n"
987 "st %%g1, [%0+3724]\n"
988 "ld [%0+3728], %%g1\n"
989 "ld [%0+3732], %%g1\n"
990 "ld [%0+3736], %%g1\n"
991 "st %%g1, [%0+3740]\n"
992 "ld [%0+3744], %%g1\n"
993 "ld [%0+3748], %%g1\n"
994 "ld [%0+3752], %%g1\n"
995 "st %%g1, [%0+3756]\n"
996 "ld [%0+3760], %%g1\n"
997 "ld [%0+3764], %%g1\n"
998 "ld [%0+3768], %%g1\n"
999 "st %%g1, [%0+3772]\n"
1000 "ld [%0+3776], %%g1\n"
1001 "ld [%0+3780], %%g1\n"
1002 "ld [%0+3784], %%g1\n"
1003 "st %%g1, [%0+3788]\n"
1004 "ld [%0+3792], %%g1\n"
1005 "ld [%0+3796], %%g1\n"
1006 "ld [%0+3800], %%g1\n"
1007 "st %%g1, [%0+3804]\n"
1008 "ld [%0+3808], %%g1\n"
1009 "ld [%0+3812], %%g1\n"
1010 "ld [%0+3816], %%g1\n"
1011 "st %%g1, [%0+3820]\n"
1012 "ld [%0+3824], %%g1\n"
1013 "ld [%0+3828], %%g1\n"
1014 "ld [%0+3832], %%g1\n"
1015 "st %%g1, [%0+3836]\n"
1016 "ld [%0+3840], %%g1\n"
1017 "ld [%0+3844], %%g1\n"
1018 "ld [%0+3848], %%g1\n"
1019 "st %%g1, [%0+3852]\n"
1020 "ld [%0+3856], %%g1\n"
1021 "ld [%0+3860], %%g1\n"
1022 "ld [%0+3864], %%g1\n"
1023 "st %%g1, [%0+3868]\n"
1024 "ld [%0+3872], %%g1\n"
1025 "ld [%0+3876], %%g1\n"
1026 "ld [%0+3880], %%g1\n"
1027 "st %%g1, [%0+3884]\n"
1028 "ld [%0+3888], %%g1\n"
1029 "ld [%0+3892], %%g1\n"
1030 "ld [%0+3896], %%g1\n"
1031 "st %%g1, [%0+3900]\n"
1032 "ld [%0+3904], %%g1\n"
1033 "ld [%0+3908], %%g1\n"
1034 "ld [%0+3912], %%g1\n"
1035 "st %%g1, [%0+3916]\n"
1036 "ld [%0+3920], %%g1\n"
1037 "ld [%0+3924], %%g1\n"
1038 "ld [%0+3928], %%g1\n"
1039 "st %%g1, [%0+3932]\n"
1040 "ld [%0+3936], %%g1\n"
1041 "ld [%0+3940], %%g1\n"
1042 "ld [%0+3944], %%g1\n"
1043 "st %%g1, [%0+3948]\n"
1044 "ld [%0+3952], %%g1\n"
1045 "ld [%0+3956], %%g1\n"
1046 "ld [%0+3960], %%g1\n"
1047 "st %%g1, [%0+3964]\n"
1048 "ld [%0+3968], %%g1\n"
1049 "ld [%0+3972], %%g1\n"
1050 "ld [%0+3976], %%g1\n"
1051 "st %%g1, [%0+3980]\n"
1052 "ld [%0+3984], %%g1\n"
1053 "ld [%0+3988], %%g1\n"
1054 "ld [%0+3992], %%g1\n"
1055 "st %%g1, [%0+3996]\n"
1056 "ld [%0+4000], %%g1\n"
1057 "ld [%0+4004], %%g1\n"
1058 "ld [%0+4008], %%g1\n"
1059 "st %%g1, [%0+4012]\n"
1060 "ld [%0+4016], %%g1\n"
1061 "ld [%0+4020], %%g1\n"
1062 "ld [%0+4024], %%g1\n"
1063 "st %%g1, [%0+4028]\n"
1064 "ld [%0+4032], %%g1\n"
1065 "ld [%0+4036], %%g1\n"
1066 "ld [%0+4040], %%g1\n"
1067 "st %%g1, [%0+4044]\n"
1068 "ld [%0+4048], %%g1\n"
1069 "ld [%0+4052], %%g1\n"
1070 "ld [%0+4056], %%g1\n"
1071 "st %%g1, [%0+4060]\n"
1072 "ld [%0+4064], %%g1\n"
1073 "ld [%0+4068], %%g1\n"
1074 "ld [%0+4072], %%g1\n"
1075 "st %%g1, [%0+4076]\n"
1076 "ld [%0+4080], %%g1\n"
1077 "ld [%0+4084], %%g1\n"
1078 "ld [%0+4088], %%g1\n"
1079 "st %%g1, [%0+4092]\n"
1080 : : "r"(mem_ptr) : "g1", "cc", "memory");
1081}
1082#endif /* ! __sparc__ */
1083
1084#endif
diff --git a/pm_test/pm_task.c b/pm_test/pm_task.c
new file mode 100644
index 0000000..e6e630b
--- /dev/null
+++ b/pm_test/pm_task.c
@@ -0,0 +1,279 @@
1/*
2 * pm_task.c
3 *
4 * A real-time task that measures preemption and migration costs
5 * for a specific working set size.
6 *
7 * 2008 Original version and idea by John Calandrino
8 * (litmus2008, liblitmus2008)
9 *
10 * 2010 Porting of original program to litmus2010 and
11 * integration within liblitmus2010 by Andrea Bastoni
12 */
13
14/* common data structures and defines */
15#include "pm_common.h"
16
17#include "litmus.h"
18#include "asm.h"
19#include "cycles.h"
20
21/* architectural dependend code for pm measurement */
22#include "pm_arch.h"
23
24int mem_block[NUMWS][INTS_PER_WSS] __attribute__ ((aligned(CACHEALIGNMENT)));
25
26/* Setup flags, then enter loop to measure costs. */
27int main(int argc, char **argv)
28{
29 /* control_page to read data from kernel */
30 struct control_page *ctrl = NULL;
31
32 unsigned long curr_job_count = 0;
33 unsigned long curr_sched_count = 0;
34 unsigned int curr_cpu = 0;
35 unsigned long curr_last_rt_task = 0;
36 unsigned long curr_ws = 0;
37
38 unsigned long long curr_preemption_length = 0;
39
40 unsigned long long start_time, end_time;
41
42 int *mem_ptr = NULL;
43 int *mem_ptr_end = NULL;
44
45 struct data_entry data_points[DATAPOINTS];
46 int data_count = 0;
47 int data_wrapped = 0;
48
49 int refcount;
50
51 int task_pid = gettid();
52 int task_period;
53 int read, *loc_ptr;
54 struct rt_task param;
55
56 char *filename;
57#ifdef DEBUG
58 int i;
59#endif
60
61 if (argc < 2) {
62 printf("pm_task: need a filename\n");
63 return -1;
64 }
65
66 filename = argv[1];
67#ifdef DEBUG
68 fprintf(stderr, "Saving on %s\n",filename);
69#endif
70
71 /* Initialize random library for read/write ratio enforcement. */
72 srandom(SEEDVAL);
73
74 /* this will lock all pages and will call init_kernel_iface */
75 init_litmus();
76
77 /* Ensure that the pages that we care about, either because they
78 * are shared with the kernel or they are performance-critical,
79 * are loaded and locked in memory before benchmarking begins.
80 */
81 memset(&param, 0, sizeof(struct rt_task));
82
83 memset(&mem_block, 0, sizeof(int) * NUMWS * INTS_PER_WSS);
84
85 memset(&mem_ptr, 0, sizeof(int*));
86 memset(&mem_ptr_end, 0, sizeof(int*));
87
88 /* Get task period. */
89 if (get_rt_task_param(task_pid, &param) < 0) {
90 perror("Cannot get task parameters\n");
91 return -1;
92 }
93
94 task_period = param.period / NS_PER_MS;
95
96 /* get the shared control page for this task */
97 if (!(ctrl = get_ctrl_page())) {
98 perror("Cannot get the shared control page\n");
99 return -1;
100 }
101
102 /* Enter loop that measures preemption and migration costs. */
103 while (curr_job_count * task_period < SIMRUNTIME) {
104
105 if (curr_job_count != ctrl->job_count) {
106
107 /* ok, this is a new job. Get info from kernel */
108
109 curr_job_count = ctrl->job_count;
110 curr_sched_count = ctrl->sched_count;
111 curr_cpu = ctrl->cpu;
112 curr_last_rt_task = ctrl->last_rt_task;
113
114 barrier();
115
116 /* job's portion of the mem_block */
117 curr_ws = curr_job_count % NUMWS;
118
119 mem_ptr = &mem_block[curr_ws][0];
120 mem_ptr_end = mem_ptr + INTS_PER_WSS;
121
122 /* Access WS when cache cold, then immediately
123 * re-access to calculate "cache-hot" access time.
124 */
125
126 /* Cache-cold accesses. */
127 start_time = get_cycles();
128 for (; mem_ptr < mem_ptr_end; mem_ptr += 1024)
129 readwrite_one_thousand_ints(mem_ptr);
130 end_time = get_cycles();
131
132 data_points[data_count].timestamp = end_time;
133
134 /* Am I the same I was before? */
135 if (curr_job_count != ctrl->job_count ||
136 curr_sched_count != ctrl->sched_count ||
137 curr_cpu != ctrl->cpu)
138 /* fishiness */
139 data_points[data_count].access_type = 'c';
140 else
141 /* okay */
142 data_points[data_count].access_type = 'C';
143
144 data_points[data_count].access_time =
145 end_time - start_time;
146 data_points[data_count].cpu = curr_cpu;
147 data_points[data_count].job_count = curr_job_count;
148 data_points[data_count].sched_count = curr_sched_count;
149 data_points[data_count].last_rt_task = curr_last_rt_task;
150 data_points[data_count].preemption_length = 0;
151
152 data_wrapped = ((data_count+1) / DATAPOINTS > 0);
153 data_count = (data_count+1) % DATAPOINTS;
154
155 barrier();
156
157 /* "Best case". Read multiple times. */
158 for (refcount = 0; refcount < REFTOTAL; refcount++) {
159
160 mem_ptr = &mem_block[curr_ws][0];
161
162 start_time = get_cycles();
163 for (; mem_ptr < mem_ptr_end; mem_ptr += 1024)
164 readwrite_one_thousand_ints(mem_ptr);
165 end_time = get_cycles();
166
167 data_points[data_count].timestamp = end_time;
168
169 if (curr_job_count != ctrl->job_count ||
170 curr_sched_count != ctrl->sched_count ||
171 curr_cpu != ctrl->cpu)
172 /* fishiness */
173 data_points[data_count].
174 access_type = 'h';
175 else
176 /* okay */
177 data_points[data_count].
178 access_type = 'H';
179
180 data_points[data_count].access_time =
181 end_time - start_time;
182 data_points[data_count].cpu = curr_cpu;
183 data_points[data_count].job_count =
184 curr_job_count;
185 data_points[data_count].sched_count =
186 curr_sched_count;
187 data_points[data_count].last_rt_task =
188 curr_last_rt_task;
189 data_points[data_count].preemption_length = 0;
190
191 data_wrapped =
192 ((data_count+1) / DATAPOINTS > 0);
193 data_count = (data_count+1) % DATAPOINTS;
194 }
195
196 } else if (mem_ptr && mem_ptr_end &&
197 (curr_sched_count != ctrl->sched_count ||
198 curr_cpu != ctrl->cpu)) {
199 /* we have done at least one go in the "best case".
200 * job is the same => preempted / migrated
201 */
202 curr_preemption_length =
203 ctrl->preempt_end - ctrl->preempt_start;
204 curr_job_count = ctrl->job_count;
205 curr_sched_count = ctrl->sched_count;
206 curr_cpu = ctrl->cpu;
207 curr_last_rt_task = ctrl->last_rt_task;
208
209 barrier();
210
211 /* Measure preemption or migration cost. */
212 mem_ptr = &mem_block[curr_ws][0];
213
214 start_time = get_cycles();
215 for (; mem_ptr < mem_ptr_end; mem_ptr += 1024)
216 readwrite_one_thousand_ints(mem_ptr);
217 end_time = get_cycles();
218
219 data_points[data_count].timestamp = end_time;
220
221 /* just record pP, we tell the difference later */
222 if (curr_job_count != ctrl->job_count ||
223 curr_sched_count != ctrl->sched_count ||
224 curr_cpu != ctrl->cpu)
225 /* fishiness */
226 data_points[data_count].access_type = 'p';
227 else
228 /* okay */
229 data_points[data_count].access_type = 'P';
230
231 data_points[data_count].access_time =
232 end_time - start_time;
233 data_points[data_count].cpu = curr_cpu;
234 data_points[data_count].job_count = curr_job_count;
235 data_points[data_count].sched_count = curr_sched_count;
236 data_points[data_count].last_rt_task =
237 curr_last_rt_task;
238 data_points[data_count].preemption_length =
239 curr_preemption_length;
240
241 data_wrapped = ((data_count+1) / DATAPOINTS > 0);
242 data_count = (data_count+1) % DATAPOINTS;
243
244 } else if (mem_ptr && mem_ptr_end) {
245 /*
246 * Ok, we run:
247 * Read or write some random location in the WS
248 * to keep the task "cache warm". We only do
249 * this if the pointers are valid, because we
250 * do not want to skew the "cold" read of the WS
251 * on the first job.
252 */
253 read = (random() % 100) < READRATIO;
254 loc_ptr = &mem_block[curr_ws][0];
255 loc_ptr += (random() % INTS_PER_WSS);
256
257 barrier();
258
259 if (read)
260 read_mem(loc_ptr);
261 else
262 write_mem(loc_ptr);
263 }
264 }
265
266#ifdef DEBUG
267 /* Print (most recent) results. */
268 for (i = 0; i < (data_wrapped ? DATAPOINTS : data_count) ; i++)
269 fprintf(stderr, "(%c) - ACC %llu, CPU %u, PLEN %llu\n",
270 data_points[i].access_type,
271 data_points[i].access_time, data_points[i].cpu,
272 data_points[i].preemption_length);
273#endif
274 serialize_data_entry(filename, data_points,
275 (data_wrapped ? DATAPOINTS : data_count));
276
277 return 0;
278}
279