1print ".text\n";
2print "\t.type _start,@","function\n";
3print "_start:\n\n";
4
5print "// Fixed and stacked integer registers.\n";
6for ($i = 1; $i < 128; ++$i) {
7  print "\t{ .mii; mov r$i = r0; nop.i 0; nop.i 0;; }\n";
8}
9print "\n";
10
11print "// Alternate names for input registers\n";
12print "\t.regstk 96, 0, 0, 0\n";
13for ($i = 0; $i < 96; ++$i) {
14  print "\t{ .mii; mov in$i = r0; nop.i 0; nop.i 0;; }\n";
15}
16print "\n";
17
18print "// Alternate names for output registers\n";
19print "\t.regstk 0, 0, 96, 0\n";
20for ($i = 0; $i < 96; ++$i) {
21  print "\t{ .mii; mov out$i = r0; nop.i 0; nop.i 0;; }\n";
22}
23print "\n";
24
25print "// Alternate names for local registers\n";
26print "\t.regstk 0, 96, 0, 0\n";
27for ($i = 0; $i < 96; ++$i) {
28  print "\t{ .mii; mov loc$i = r0; nop.i 0; nop.i 0;; }\n";
29}
30print "\n";
31
32print "// Return value registers\n";
33for ($i = 0; $i < 4; ++$i) {
34  print "\t{ .mii; mov ret$i = r0; nop.i 0; nop.i 0;; }\n";
35}
36print "\n";
37
38print "\t{ .mii;\n";
39print "\tmov gp = r0\n";
40print "\tmov sp = r0\n";
41print "\tmov tp = r0;; }\n\n";
42
43print "// Floating point registers\n";
44for ($i = 2; $i < 128; ++$i) {
45  print "\t{ .mfi; mov f$i = f0 ;; }\n";
46}
47print "\n";
48
49print "// Floating point argument registers\n";
50for ($i = 0; $i < 8; ++$i) {
51  print "\t{ .mfi; mov farg$i = f1 ;; }\n";
52}
53print "\n";
54
55print "// Floating point return value registers\n";
56for ($i = 0; $i < 8; ++$i) {
57  print "\t{ .mfi; mov fret$i = f1 ;; }\n";
58}
59print "\n";
60
61print "// Predicate registers\n";
62for ($i = 0; $i < 64; ++$i) {
63  print "\t{ .mii; (p$i)\tmov r", $i+1, " = r0; nop.i 0; nop.i 0;; }\n";
64}
65print "\n";
66
67print "// Predicates as a unit\n";
68print "\t{ .mmi; nop.m 0; mov r1 = pr ;; }\n";
69print "//\tmov r2 = pr.rot\n";
70print "\n";
71
72print "// Branch registers.\n";
73for ($i = 0; $i < 8; ++$i) {
74  print "\t{ .mmi; mov b$i = r0;; }\n";
75}
76print "\n";
77
78print "\t{ .mmi; mov rp = r0;; }\n";
79print "\n";
80
81print "// Application registers\n";
82@reserved = ( 8..15, 20, 22..23, 31, 33..35, 37..39, 41..47, 67..111 );
83%reserved = ();
84foreach $i (@reserved) {
85  $reserved{$i} = 1;
86}
87for ($i = 0; $i < 128; ++$i) {
88  print "//" if $reserved{$i};
89  print "\t{ .mmi; nop.m 0; mov r1 = ar$i ;; }";
90  print "\t\t// reserved" if $reserved{$i};
91  print "\n";
92}
93print "\n";
94
95print "// Application registers by name\n";
96for ($i = 0; $i < 8; ++$i) {
97  print "\t{ .mmi; nop.m 0; mov r1 = ar.k$i ;;}\n";
98}
99
100@regs = ( "rsc", "bsp", "bspstore", "rnat", "ccv", "unat", "fpsr", "itc",
101	  "pfs", "lc", "ec" );
102foreach $i (@regs) {
103  print "\t{ .mmi; nop.m 0; mov r1 = ar.$i ;; }\n";
104}
105print "\n";
106
107print "// Control registers\n";
108@reserved = ( 3..7, 10..15, 18, 26..63, 75..79, 82..127 );
109%reserved = ();
110foreach $i (@reserved) {
111  $reserved{$i} = 1;
112}
113for ($i = 0; $i < 128; ++$i) {
114  print "//" if $reserved{$i};
115  print "\t{ .mfb; mov r1 = cr$i ;; }";
116  print "\t\t// reserved" if $reserved{$i};
117  print "\n";
118}
119print "\n";
120
121print "// Control registers by name\n";
122@regs = ( "dcr", "itm", "iva", "pta", "ipsr", "isr", "iip",
123	  "iipa", "ifs", "iim", "iha", "lid", "ivr",
124	  "tpr", "eoi", "irr0", "irr1", "irr2", "irr3", "itv", "pmv",
125	  "lrr0", "lrr1", "cmcv" );
126# ias doesn't accept these, despite documentation to the contrary.
127# push @regs, "ida", "idtr", "iitr"
128foreach $i (@regs) {
129  print "\t{ .mfb; mov r1 = cr.$i ;; }\n";
130}
131print "\n";
132
133
134print "// Other registers\n";
135print "\t{ .mfb; mov r1 = psr ;; }\n";
136print "//\t{ .mfb; mov r1 = psr.l ;; }\n";
137print "\t{ .mfb; mov r1 = psr.um ;; }\n";
138print "\t{ .mmi; mov r1 = ip ;; }\n";
139print "\n";
140
141print "// Indirect register files\n";
142@regs = ("pmc", "pmd", "pkr", "rr", "ibr", "dbr", "CPUID", "cpuid");
143# ias doesn't accept these, despite documentation to the contrary.
144# push @regs, "itr", "dtr";
145foreach $i (@regs) {
146  print "\t{ .mmi\n";
147  print "\tmov r1 = ${i}[r3]\n";
148  print "\tmov r2 = ${i}[r4]\n";
149  print "\tnop.i 0;; }\n";
150}
151