|
|
1.1 root 1: /*
2: * Alpha emulation cpu micro-operations for qemu.
3: *
4: * Copyright (c) 2007 Jocelyn Mayer
5: *
6: * This library is free software; you can redistribute it and/or
7: * modify it under the terms of the GNU Lesser General Public
8: * License as published by the Free Software Foundation; either
9: * version 2 of the License, or (at your option) any later version.
10: *
11: * This library is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * Lesser General Public License for more details.
15: *
16: * You should have received a copy of the GNU Lesser General Public
17: * License along with this library; if not, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: */
20:
21: #define DEBUG_OP
22:
23: #include "config.h"
24: #include "exec.h"
25: #include "host-utils.h"
26:
27: #include "op_helper.h"
28:
29: #define REG 0
30: #include "op_template.h"
31:
32: #define REG 1
33: #include "op_template.h"
34:
35: #define REG 2
36: #include "op_template.h"
37:
38: #define REG 3
39: #include "op_template.h"
40:
41: #define REG 4
42: #include "op_template.h"
43:
44: #define REG 5
45: #include "op_template.h"
46:
47: #define REG 6
48: #include "op_template.h"
49:
50: #define REG 7
51: #include "op_template.h"
52:
53: #define REG 8
54: #include "op_template.h"
55:
56: #define REG 9
57: #include "op_template.h"
58:
59: #define REG 10
60: #include "op_template.h"
61:
62: #define REG 11
63: #include "op_template.h"
64:
65: #define REG 12
66: #include "op_template.h"
67:
68: #define REG 13
69: #include "op_template.h"
70:
71: #define REG 14
72: #include "op_template.h"
73:
74: #define REG 15
75: #include "op_template.h"
76:
77: #define REG 16
78: #include "op_template.h"
79:
80: #define REG 17
81: #include "op_template.h"
82:
83: #define REG 18
84: #include "op_template.h"
85:
86: #define REG 19
87: #include "op_template.h"
88:
89: #define REG 20
90: #include "op_template.h"
91:
92: #define REG 21
93: #include "op_template.h"
94:
95: #define REG 22
96: #include "op_template.h"
97:
98: #define REG 23
99: #include "op_template.h"
100:
101: #define REG 24
102: #include "op_template.h"
103:
104: #define REG 25
105: #include "op_template.h"
106:
107: #define REG 26
108: #include "op_template.h"
109:
110: #define REG 27
111: #include "op_template.h"
112:
113: #define REG 28
114: #include "op_template.h"
115:
116: #define REG 29
117: #include "op_template.h"
118:
119: #define REG 30
120: #include "op_template.h"
121:
122: #define REG 31
123: #include "op_template.h"
124:
125: /* Debug stuff */
126: void OPPROTO op_no_op (void)
127: {
128: #if !defined (DEBUG_OP)
129: __asm__ __volatile__("nop" : : : "memory");
130: #endif
131: RETURN();
132: }
133:
134: void OPPROTO op_tb_flush (void)
135: {
136: helper_tb_flush();
137: RETURN();
138: }
139:
140: /* Load and stores */
141: #define MEMSUFFIX _raw
142: #include "op_mem.h"
143: #if !defined(CONFIG_USER_ONLY)
144: #define MEMSUFFIX _kernel
145: #include "op_mem.h"
146: #define MEMSUFFIX _executive
147: #include "op_mem.h"
148: #define MEMSUFFIX _supervisor
149: #include "op_mem.h"
150: #define MEMSUFFIX _user
151: #include "op_mem.h"
152: /* This is used for pal modes */
153: #define MEMSUFFIX _data
154: #include "op_mem.h"
155: #endif
156:
157: /* Special operation for load and store */
158: void OPPROTO op_n7 (void)
159: {
160: T0 &= ~(uint64_t)0x7;
161: RETURN();
162: }
163:
164: /* Misc */
165: void OPPROTO op_excp (void)
166: {
167: helper_excp(PARAM(1), PARAM(2));
168: RETURN();
169: }
170:
171: void OPPROTO op_load_amask (void)
172: {
173: helper_amask();
174: RETURN();
175: }
176:
177: void OPPROTO op_load_pcc (void)
178: {
179: helper_load_pcc();
180: RETURN();
181: }
182:
183: void OPPROTO op_load_implver (void)
184: {
185: helper_load_implver();
186: RETURN();
187: }
188:
189: void OPPROTO op_load_fpcr (void)
190: {
191: helper_load_fpcr();
192: RETURN();
193: }
194:
195: void OPPROTO op_store_fpcr (void)
196: {
197: helper_store_fpcr();
198: RETURN();
199: }
200:
201: void OPPROTO op_load_irf (void)
202: {
203: helper_load_irf();
204: RETURN();
205: }
206:
207: void OPPROTO op_set_irf (void)
208: {
209: helper_set_irf();
210: RETURN();
211: }
212:
213: void OPPROTO op_clear_irf (void)
214: {
215: helper_clear_irf();
216: RETURN();
217: }
218:
219: void OPPROTO op_exit_tb (void)
220: {
221: EXIT_TB();
222: }
223:
224: /* Arithmetic */
225: void OPPROTO op_addq (void)
226: {
227: T0 += T1;
228: RETURN();
229: }
230:
231: void OPPROTO op_addqv (void)
232: {
233: helper_addqv();
234: RETURN();
235: }
236:
237: void OPPROTO op_addl (void)
238: {
239: T0 = (int64_t)((int32_t)(T0 + T1));
240: RETURN();
241: }
242:
243: void OPPROTO op_addlv (void)
244: {
245: helper_addlv();
246: RETURN();
247: }
248:
249: void OPPROTO op_subq (void)
250: {
251: T0 -= T1;
252: RETURN();
253: }
254:
255: void OPPROTO op_subqv (void)
256: {
257: helper_subqv();
258: RETURN();
259: }
260:
261: void OPPROTO op_subl (void)
262: {
263: T0 = (int64_t)((int32_t)(T0 - T1));
264: RETURN();
265: }
266:
267: void OPPROTO op_sublv (void)
268: {
269: helper_sublv();
270: RETURN();
271: }
272:
273: void OPPROTO op_s4 (void)
274: {
275: T0 <<= 2;
276: RETURN();
277: }
278:
279: void OPPROTO op_s8 (void)
280: {
281: T0 <<= 3;
282: RETURN();
283: }
284:
285: void OPPROTO op_mull (void)
286: {
287: T0 = (int64_t)((int32_t)T0 * (int32_t)T1);
288: RETURN();
289: }
290:
291: void OPPROTO op_mullv (void)
292: {
293: helper_mullv();
294: RETURN();
295: }
296:
297: void OPPROTO op_mulq (void)
298: {
299: T0 = (int64_t)T0 * (int64_t)T1;
300: RETURN();
301: }
302:
303: void OPPROTO op_mulqv (void)
304: {
305: helper_mulqv();
306: RETURN();
307: }
308:
309: void OPPROTO op_umulh (void)
310: {
311: uint64_t tl, th;
312:
313: mulu64(&tl, &th, T0, T1);
314: T0 = th;
315: RETURN();
316: }
317:
318: /* Logical */
319: void OPPROTO op_and (void)
320: {
321: T0 &= T1;
322: RETURN();
323: }
324:
325: void OPPROTO op_bic (void)
326: {
327: T0 &= ~T1;
328: RETURN();
329: }
330:
331: void OPPROTO op_bis (void)
332: {
333: T0 |= T1;
334: RETURN();
335: }
336:
337: void OPPROTO op_eqv (void)
338: {
339: T0 ^= ~T1;
340: RETURN();
341: }
342:
343: void OPPROTO op_ornot (void)
344: {
345: T0 |= ~T1;
346: RETURN();
347: }
348:
349: void OPPROTO op_xor (void)
350: {
351: T0 ^= T1;
352: RETURN();
353: }
354:
355: void OPPROTO op_sll (void)
356: {
357: T0 <<= T1;
358: RETURN();
359: }
360:
361: void OPPROTO op_srl (void)
362: {
363: T0 >>= T1;
364: RETURN();
365: }
366:
367: void OPPROTO op_sra (void)
368: {
369: T0 = (int64_t)T0 >> T1;
370: RETURN();
371: }
372:
373: void OPPROTO op_sextb (void)
374: {
375: T0 = (int64_t)((int8_t)T0);
376: RETURN();
377: }
378:
379: void OPPROTO op_sextw (void)
380: {
381: T0 = (int64_t)((int16_t)T0);
382: RETURN();
383:
384: }
385:
386: void OPPROTO op_ctpop (void)
387: {
388: helper_ctpop();
389: RETURN();
390: }
391:
392: void OPPROTO op_ctlz (void)
393: {
394: helper_ctlz();
395: RETURN();
396: }
397:
398: void OPPROTO op_cttz (void)
399: {
400: helper_cttz();
401: RETURN();
402: }
403:
404: void OPPROTO op_mskbl (void)
405: {
406: helper_mskbl();
407: RETURN();
408: }
409:
410: void OPPROTO op_extbl (void)
411: {
412: helper_extbl();
413: RETURN();
414: }
415:
416: void OPPROTO op_insbl (void)
417: {
418: helper_insbl();
419: RETURN();
420: }
421:
422: void OPPROTO op_mskwl (void)
423: {
424: helper_mskwl();
425: RETURN();
426: }
427:
428: void OPPROTO op_extwl (void)
429: {
430: helper_extwl();
431: RETURN();
432: }
433:
434: void OPPROTO op_inswl (void)
435: {
436: helper_inswl();
437: RETURN();
438: }
439:
440: void OPPROTO op_mskll (void)
441: {
442: helper_mskll();
443: RETURN();
444: }
445:
446: void OPPROTO op_extll (void)
447: {
448: helper_extll();
449: RETURN();
450: }
451:
452: void OPPROTO op_insll (void)
453: {
454: helper_insll();
455: RETURN();
456: }
457:
458: void OPPROTO op_zap (void)
459: {
460: helper_zap();
461: RETURN();
462: }
463:
464: void OPPROTO op_zapnot (void)
465: {
466: helper_zapnot();
467: RETURN();
468: }
469:
470: void OPPROTO op_mskql (void)
471: {
472: helper_mskql();
473: RETURN();
474: }
475:
476: void OPPROTO op_extql (void)
477: {
478: helper_extql();
479: RETURN();
480: }
481:
482: void OPPROTO op_insql (void)
483: {
484: helper_insql();
485: RETURN();
486: }
487:
488: void OPPROTO op_mskwh (void)
489: {
490: helper_mskwh();
491: RETURN();
492: }
493:
494: void OPPROTO op_inswh (void)
495: {
496: helper_inswh();
497: RETURN();
498: }
499:
500: void OPPROTO op_extwh (void)
501: {
502: helper_extwh();
503: RETURN();
504: }
505:
506: void OPPROTO op_msklh (void)
507: {
508: helper_msklh();
509: RETURN();
510: }
511:
512: void OPPROTO op_inslh (void)
513: {
514: helper_inslh();
515: RETURN();
516: }
517:
518: void OPPROTO op_extlh (void)
519: {
520: helper_extlh();
521: RETURN();
522: }
523:
524: void OPPROTO op_mskqh (void)
525: {
526: helper_mskqh();
527: RETURN();
528: }
529:
530: void OPPROTO op_insqh (void)
531: {
532: helper_insqh();
533: RETURN();
534: }
535:
536: void OPPROTO op_extqh (void)
537: {
538: helper_extqh();
539: RETURN();
540: }
541:
542: /* Tests */
543: void OPPROTO op_cmpult (void)
544: {
545: if (T0 < T1)
546: T0 = 1;
547: else
548: T0 = 0;
549: RETURN();
550: }
551:
552: void OPPROTO op_cmpule (void)
553: {
554: if (T0 <= T1)
555: T0 = 1;
556: else
557: T0 = 0;
558: RETURN();
559: }
560:
561: void OPPROTO op_cmpeq (void)
562: {
563: if (T0 == T1)
564: T0 = 1;
565: else
566: T0 = 0;
567: RETURN();
568: }
569:
570: void OPPROTO op_cmplt (void)
571: {
572: if ((int64_t)T0 < (int64_t)T1)
573: T0 = 1;
574: else
575: T0 = 0;
576: RETURN();
577: }
578:
579: void OPPROTO op_cmple (void)
580: {
581: if ((int64_t)T0 <= (int64_t)T1)
582: T0 = 1;
583: else
584: T0 = 0;
585: RETURN();
586: }
587:
588: void OPPROTO op_cmpbge (void)
589: {
590: helper_cmpbge();
591: RETURN();
592: }
593:
594: void OPPROTO op_cmpeqz (void)
595: {
596: if (T0 == 0)
597: T0 = 1;
598: else
599: T0 = 0;
600: RETURN();
601: }
602:
603: void OPPROTO op_cmpnez (void)
604: {
605: if (T0 != 0)
606: T0 = 1;
607: else
608: T0 = 0;
609: RETURN();
610: }
611:
612: void OPPROTO op_cmpltz (void)
613: {
614: if ((int64_t)T0 < 0)
615: T0 = 1;
616: else
617: T0 = 0;
618: RETURN();
619: }
620:
621: void OPPROTO op_cmplez (void)
622: {
623: if ((int64_t)T0 <= 0)
624: T0 = 1;
625: else
626: T0 = 0;
627: RETURN();
628: }
629:
630: void OPPROTO op_cmpgtz (void)
631: {
632: if ((int64_t)T0 > 0)
633: T0 = 1;
634: else
635: T0 = 0;
636: RETURN();
637: }
638:
639: void OPPROTO op_cmpgez (void)
640: {
641: if ((int64_t)T0 >= 0)
642: T0 = 1;
643: else
644: T0 = 0;
645: RETURN();
646: }
647:
648: void OPPROTO op_cmplbs (void)
649: {
650: T0 &= 1;
651: RETURN();
652: }
653:
654: void OPPROTO op_cmplbc (void)
655: {
656: T0 = (~T0) & 1;
657: RETURN();
658: }
659:
660: /* Branches */
661: void OPPROTO op_branch (void)
662: {
663: env->pc = T0 & ~3;
664: RETURN();
665: }
666:
667: void OPPROTO op_addq1 (void)
668: {
669: T1 += T0;
670: RETURN();
671: }
672:
673: #if 0 // Qemu does not know how to do this...
674: void OPPROTO op_bcond (void)
675: {
676: if (T0)
677: env->pc = T1 & ~3;
678: else
679: env->pc = PARAM(1);
680: RETURN();
681: }
682: #else
683: void OPPROTO op_bcond (void)
684: {
685: if (T0)
686: env->pc = T1 & ~3;
687: else
688: env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
689: RETURN();
690: }
691: #endif
692:
693: #if 0 // Qemu does not know how to do this...
694: void OPPROTO op_update_pc (void)
695: {
696: env->pc = PARAM(1);
697: RETURN();
698: }
699: #else
700: void OPPROTO op_update_pc (void)
701: {
702: env->pc = ((uint64_t)PARAM(1) << 32) | (uint64_t)PARAM(2);
703: RETURN();
704: }
705: #endif
706:
707: /* Optimization for 32 bits hosts architectures */
708: void OPPROTO op_update_pc32 (void)
709: {
710: env->pc = (uint64_t)PARAM(1);
711: RETURN();
712: }
713:
714: /* IEEE floating point arithmetic */
715: /* S floating (single) */
716: void OPPROTO op_adds (void)
717: {
718: FT0 = float32_add(FT0, FT1, &FP_STATUS);
719: RETURN();
720: }
721:
722: void OPPROTO op_subs (void)
723: {
724: FT0 = float32_sub(FT0, FT1, &FP_STATUS);
725: RETURN();
726: }
727:
728: void OPPROTO op_muls (void)
729: {
730: FT0 = float32_mul(FT0, FT1, &FP_STATUS);
731: RETURN();
732: }
733:
734: void OPPROTO op_divs (void)
735: {
736: FT0 = float32_div(FT0, FT1, &FP_STATUS);
737: RETURN();
738: }
739:
740: void OPPROTO op_sqrts (void)
741: {
742: helper_sqrts();
743: RETURN();
744: }
745:
746: void OPPROTO op_cpys (void)
747: {
748: helper_cpys();
749: RETURN();
750: }
751:
752: void OPPROTO op_cpysn (void)
753: {
754: helper_cpysn();
755: RETURN();
756: }
757:
758: void OPPROTO op_cpyse (void)
759: {
760: helper_cpyse();
761: RETURN();
762: }
763:
764: void OPPROTO op_itofs (void)
765: {
766: helper_itofs();
767: RETURN();
768: }
769:
770: void OPPROTO op_ftois (void)
771: {
772: helper_ftois();
773: RETURN();
774: }
775:
776: /* T floating (double) */
777: void OPPROTO op_addt (void)
778: {
779: FT0 = float64_add(FT0, FT1, &FP_STATUS);
780: RETURN();
781: }
782:
783: void OPPROTO op_subt (void)
784: {
785: FT0 = float64_sub(FT0, FT1, &FP_STATUS);
786: RETURN();
787: }
788:
789: void OPPROTO op_mult (void)
790: {
791: FT0 = float64_mul(FT0, FT1, &FP_STATUS);
792: RETURN();
793: }
794:
795: void OPPROTO op_divt (void)
796: {
797: FT0 = float64_div(FT0, FT1, &FP_STATUS);
798: RETURN();
799: }
800:
801: void OPPROTO op_sqrtt (void)
802: {
803: helper_sqrtt();
804: RETURN();
805: }
806:
807: void OPPROTO op_cmptun (void)
808: {
809: helper_cmptun();
810: RETURN();
811: }
812:
813: void OPPROTO op_cmpteq (void)
814: {
815: helper_cmpteq();
816: RETURN();
817: }
818:
819: void OPPROTO op_cmptle (void)
820: {
821: helper_cmptle();
822: RETURN();
823: }
824:
825: void OPPROTO op_cmptlt (void)
826: {
827: helper_cmptlt();
828: RETURN();
829: }
830:
831: void OPPROTO op_itoft (void)
832: {
833: helper_itoft();
834: RETURN();
835: }
836:
837: void OPPROTO op_ftoit (void)
838: {
839: helper_ftoit();
840: RETURN();
841: }
842:
843: /* VAX floating point arithmetic */
844: /* F floating */
845: void OPPROTO op_addf (void)
846: {
847: helper_addf();
848: RETURN();
849: }
850:
851: void OPPROTO op_subf (void)
852: {
853: helper_subf();
854: RETURN();
855: }
856:
857: void OPPROTO op_mulf (void)
858: {
859: helper_mulf();
860: RETURN();
861: }
862:
863: void OPPROTO op_divf (void)
864: {
865: helper_divf();
866: RETURN();
867: }
868:
869: void OPPROTO op_sqrtf (void)
870: {
871: helper_sqrtf();
872: RETURN();
873: }
874:
875: void OPPROTO op_cmpfeq (void)
876: {
877: helper_cmpfeq();
878: RETURN();
879: }
880:
881: void OPPROTO op_cmpfne (void)
882: {
883: helper_cmpfne();
884: RETURN();
885: }
886:
887: void OPPROTO op_cmpflt (void)
888: {
889: helper_cmpflt();
890: RETURN();
891: }
892:
893: void OPPROTO op_cmpfle (void)
894: {
895: helper_cmpfle();
896: RETURN();
897: }
898:
899: void OPPROTO op_cmpfgt (void)
900: {
901: helper_cmpfgt();
902: RETURN();
903: }
904:
905: void OPPROTO op_cmpfge (void)
906: {
907: helper_cmpfge();
908: RETURN();
909: }
910:
911: void OPPROTO op_itoff (void)
912: {
913: helper_itoff();
914: RETURN();
915: }
916:
917: /* G floating */
918: void OPPROTO op_addg (void)
919: {
920: helper_addg();
921: RETURN();
922: }
923:
924: void OPPROTO op_subg (void)
925: {
926: helper_subg();
927: RETURN();
928: }
929:
930: void OPPROTO op_mulg (void)
931: {
932: helper_mulg();
933: RETURN();
934: }
935:
936: void OPPROTO op_divg (void)
937: {
938: helper_divg();
939: RETURN();
940: }
941:
942: void OPPROTO op_sqrtg (void)
943: {
944: helper_sqrtg();
945: RETURN();
946: }
947:
948: void OPPROTO op_cmpgeq (void)
949: {
950: helper_cmpgeq();
951: RETURN();
952: }
953:
954: void OPPROTO op_cmpglt (void)
955: {
956: helper_cmpglt();
957: RETURN();
958: }
959:
960: void OPPROTO op_cmpgle (void)
961: {
962: helper_cmpgle();
963: RETURN();
964: }
965:
966: /* Floating point format conversion */
967: void OPPROTO op_cvtst (void)
968: {
969: FT0 = (float)FT0;
970: RETURN();
971: }
972:
973: void OPPROTO op_cvtqs (void)
974: {
975: helper_cvtqs();
976: RETURN();
977: }
978:
979: void OPPROTO op_cvtts (void)
980: {
981: FT0 = (float)FT0;
982: RETURN();
983: }
984:
985: void OPPROTO op_cvttq (void)
986: {
987: helper_cvttq();
988: RETURN();
989: }
990:
991: void OPPROTO op_cvtqt (void)
992: {
993: helper_cvtqt();
994: RETURN();
995: }
996:
997: void OPPROTO op_cvtqf (void)
998: {
999: helper_cvtqf();
1000: RETURN();
1001: }
1002:
1003: void OPPROTO op_cvtgf (void)
1004: {
1005: helper_cvtgf();
1006: RETURN();
1007: }
1008:
1009: void OPPROTO op_cvtgd (void)
1010: {
1011: helper_cvtgd();
1012: RETURN();
1013: }
1014:
1015: void OPPROTO op_cvtgq (void)
1016: {
1017: helper_cvtgq();
1018: RETURN();
1019: }
1020:
1021: void OPPROTO op_cvtqg (void)
1022: {
1023: helper_cvtqg();
1024: RETURN();
1025: }
1026:
1027: void OPPROTO op_cvtdg (void)
1028: {
1029: helper_cvtdg();
1030: RETURN();
1031: }
1032:
1033: void OPPROTO op_cvtlq (void)
1034: {
1035: helper_cvtlq();
1036: RETURN();
1037: }
1038:
1039: void OPPROTO op_cvtql (void)
1040: {
1041: helper_cvtql();
1042: RETURN();
1043: }
1044:
1045: void OPPROTO op_cvtqlv (void)
1046: {
1047: helper_cvtqlv();
1048: RETURN();
1049: }
1050:
1051: void OPPROTO op_cvtqlsv (void)
1052: {
1053: helper_cvtqlsv();
1054: RETURN();
1055: }
1056:
1057: /* PALcode support special instructions */
1058: #if !defined (CONFIG_USER_ONLY)
1059: void OPPROTO op_hw_rei (void)
1060: {
1061: env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
1062: env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
1063: /* XXX: re-enable interrupts and memory mapping */
1064: RETURN();
1065: }
1066:
1067: void OPPROTO op_hw_ret (void)
1068: {
1069: env->pc = T0 & ~3;
1070: env->ipr[IPR_EXC_ADDR] = T0 & 1;
1071: /* XXX: re-enable interrupts and memory mapping */
1072: RETURN();
1073: }
1074:
1075: void OPPROTO op_mfpr (void)
1076: {
1077: helper_mfpr(PARAM(1));
1078: RETURN();
1079: }
1080:
1081: void OPPROTO op_mtpr (void)
1082: {
1083: helper_mtpr(PARAM(1));
1084: RETURN();
1085: }
1086:
1087: void OPPROTO op_set_alt_mode (void)
1088: {
1089: env->saved_mode = env->ps & 0xC;
1090: env->ps = (env->ps & ~0xC) | (env->ipr[IPR_ALT_MODE] & 0xC);
1091: RETURN();
1092: }
1093:
1094: void OPPROTO op_restore_mode (void)
1095: {
1096: env->ps = (env->ps & ~0xC) | env->saved_mode;
1097: RETURN();
1098: }
1099:
1100: void OPPROTO op_ld_phys_to_virt (void)
1101: {
1102: helper_ld_phys_to_virt();
1103: RETURN();
1104: }
1105:
1106: void OPPROTO op_st_phys_to_virt (void)
1107: {
1108: helper_st_phys_to_virt();
1109: RETURN();
1110: }
1111: #endif /* !defined (CONFIG_USER_ONLY) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.