1 print ".text\n"; 2 print "\t.type _start,@","function\n"; 3 print "_start:\n\n"; 4 5 print "// Fixed and stacked integer registers.\n"; 6 for ($i = 1; $i < 128; ++$i) { 7 print "\t{ .mii; mov r$i = r0; nop.i 0; nop.i 0;; }\n"; 8 } 9 print "\n"; 10 11 print "// Alternate names for input registers\n"; 12 print "\t.regstk 96, 0, 0, 0\n"; 13 for ($i = 0; $i < 96; ++$i) { 14 print "\t{ .mii; mov in$i = r0; nop.i 0; nop.i 0;; }\n"; 15 } 16 print "\n"; 17 18 print "// Alternate names for output registers\n"; 19 print "\t.regstk 0, 0, 96, 0\n"; 20 for ($i = 0; $i < 96; ++$i) { 21 print "\t{ .mii; mov out$i = r0; nop.i 0; nop.i 0;; }\n"; 22 } 23 print "\n"; 24 25 print "// Alternate names for local registers\n"; 26 print "\t.regstk 0, 96, 0, 0\n"; 27 for ($i = 0; $i < 96; ++$i) { 28 print "\t{ .mii; mov loc$i = r0; nop.i 0; nop.i 0;; }\n"; 29 } 30 print "\n"; 31 32 print "// Return value registers\n"; 33 for ($i = 0; $i < 4; ++$i) { 34 print "\t{ .mii; mov ret$i = r0; nop.i 0; nop.i 0;; }\n"; 35 } 36 print "\n"; 37 38 print "\t{ .mii;\n"; 39 print "\tmov gp = r0\n"; 40 print "\tmov sp = r0\n"; 41 print "\tmov tp = r0;; }\n\n"; 42 43 print "// Floating point registers\n"; 44 for ($i = 2; $i < 128; ++$i) { 45 print "\t{ .mfi; mov f$i = f0 ;; }\n"; 46 } 47 print "\n"; 48 49 print "// Floating point argument registers\n"; 50 for ($i = 0; $i < 8; ++$i) { 51 print "\t{ .mfi; mov farg$i = f1 ;; }\n"; 52 } 53 print "\n"; 54 55 print "// Floating point return value registers\n"; 56 for ($i = 0; $i < 8; ++$i) { 57 print "\t{ .mfi; mov fret$i = f1 ;; }\n"; 58 } 59 print "\n"; 60 61 print "// Predicate registers\n"; 62 for ($i = 0; $i < 64; ++$i) { 63 print "\t{ .mii; (p$i)\tmov r", $i+1, " = r0; nop.i 0; nop.i 0;; }\n"; 64 } 65 print "\n"; 66 67 print "// Predicates as a unit\n"; 68 print "\t{ .mmi; nop.m 0; mov r1 = pr ;; }\n"; 69 print "//\tmov r2 = pr.rot\n"; 70 print "\n"; 71 72 print "// Branch registers.\n"; 73 for ($i = 0; $i < 8; ++$i) { 74 print "\t{ .mmi; mov b$i = r0;; }\n"; 75 } 76 print "\n"; 77 78 print "\t{ .mmi; mov rp = r0;; }\n"; 79 print "\n"; 80 81 print "// Application registers\n"; 82 @reserved = ( 8..15, 20, 22..23, 31, 33..35, 37..39, 41..47, 67..111 ); 83 %reserved = (); 84 foreach $i (@reserved) { 85 $reserved{$i} = 1; 86 } 87 for ($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 } 93 print "\n"; 94 95 print "// Application registers by name\n"; 96 for ($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" ); 102 foreach $i (@regs) { 103 print "\t{ .mmi; nop.m 0; mov r1 = ar.$i ;; }\n"; 104 } 105 print "\n"; 106 107 print "// Control registers\n"; 108 @reserved = ( 3..7, 10..15, 18, 26..63, 75..79, 82..127 ); 109 %reserved = (); 110 foreach $i (@reserved) { 111 $reserved{$i} = 1; 112 } 113 for ($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 } 119 print "\n"; 120 121 print "// 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" 128 foreach $i (@regs) { 129 print "\t{ .mfb; mov r1 = cr.$i ;; }\n"; 130 } 131 print "\n"; 132 133 134 print "// Other registers\n"; 135 print "\t{ .mfb; mov r1 = psr ;; }\n"; 136 print "//\t{ .mfb; mov r1 = psr.l ;; }\n"; 137 print "\t{ .mfb; mov r1 = psr.um ;; }\n"; 138 print "\t{ .mmi; mov r1 = ip ;; }\n"; 139 print "\n"; 140 141 print "// 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"; 145 foreach $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