Annotation of researchv10no/cmd/sml/src/mips/opcodes.awk, revision 1.1.1.1

1.1       root        1: BEGIN {
                      2:   print "structure Opcodes = struct"
                      3:   print "val andb = Bits.andb"
                      4:   print "fun lshift(op1,amt) = "
                      5:   print "    if amt<0 then Bits.rshift(op1,0-amt)"
                      6:   print "    else Bits.lshift(op1,amt)"
                      7:   print "nonfix sub"   # bug fixes; want [[sub]] to be a MIPS opcode
                      8:   print "nonfix div"   # bug fixes; want [[div]] to be a MIPS opcode
                      9:   
                     10:   decode = "mipsdecode.sml";
                     11:   print "structure MipsDecode = struct" > decode
                     12:   print "val andb = Bits.andb" > decode
                     13:   print "fun rshift(op1,amt) = " > decode
                     14:   print "    if amt<0 then Bits.lshift(op1,0-amt)" > decode
                     15:   print "    else Bits.rshift(op1,amt)" > decode
                     16:   OPCODE = 1 ; SPECIAL = 2 ; BCOND = 3 ; COP1 = 4
                     17:   stderr="/dev/tty"
                     18: }
                     19: function mlnumber(n, s) {
                     20:        if (n<0) s = sprintf("~%d", -n)
                     21:        else s = sprintf("%d", n)
                     22:        return s
                     23: }
                     24: function min(x,y){
                     25:        if (x<y) return x
                     26:        else return y
                     27: }
                     28: function function_definition(name, argc,  i, temp) {
                     29:        if (argc==0) {
                     30:                temp = sprintf("val %s = ", name)
                     31:        } else {
                     32:                temp = sprintf( "fun %s(", name)
                     33:                for (i=1; i< argc; i++) temp = sprintf("%sA%d,", temp,i)
                     34:                temp = sprintf( "%sA%d) = ", temp, argc)
                     35:        }
                     36:        return temp
                     37: }
                     38: function insist_fields(n) {
                     39:        if (NF != n) {
                     40:                print "Must have", n, "fields on line",NR ":", $0 > stderr
                     41:                return 0
                     42:        } else {
                     43:                return 1
                     44:        }
                     45: }
                     46: NF == 1 && $1 == "opcode" {
                     47:        startline = NR
                     48:        opcodes = 1
                     49:        next
                     50: }
                     51: NF == 1 && $1 == "special" {
                     52:        startline = NR
                     53:        specials = 1
                     54:        next
                     55: }
                     56: NF == 1 && $1 == "bcond" {
                     57:        startline = NR
                     58:        bconds = 1
                     59:        next
                     60: }
                     61: NF == 1 && $1 == "cop1" {
                     62:        startline = NR
                     63:        cop1s = 1
                     64:        next
                     65: }
                     66: NF == 0 {opcodes = 0; specials = 0; bconds = 0; cop1s = 0
                     67:        fields = 0
                     68:         instructions= 0
                     69: }
                     70: opcodes || specials || bconds || cop1s {
                     71:        if (!insist_fields(8)) next
                     72:        type = OPCODE * opcodes + SPECIAL * specials + BCOND * bconds + COP1 * cop1s
                     73:        major = NR - startline - 1              # major octal digit from row
                     74:        for (i=1; i<= NF; i++) {
                     75:                minor = i-1                     # minor octal digit from column
                     76:                code = minor + 8 * major
                     77:                if ($i != "*") {
                     78:                        numberof[$i] = code
                     79:                        typeof[$i] = type
                     80:                        opcode[type,code] = $i
                     81:                } else {
                     82:                        opcode[type,code] = "reserved"
                     83:                }
                     84:        }
                     85: }
                     86: NF == 1 && $1 == "fields" {
                     87:        startline = NR
                     88:        fields = 1
                     89:        print "val S_fmt = 16+0"
                     90:         print "val D_fmt = 16+1"
                     91:         print "val W_fmt = 16+4"
                     92: 
                     93:        next
                     94: }
                     95: fields {
                     96:        if (!insist_fields(3)) next
                     97:        fieldname = $1;  low = $2; high = $3
                     98:        if (substr(fieldname,1,1)=="+") {
                     99:                signed = 1
                    100:                fieldname = substr(fieldname,2)
                    101:         } else {
                    102:                signed = 0
                    103:         }
                    104:        fieldnames[fieldname]= 1        # rememeber all the field names
                    105: 
                    106:        if (low >= 16) {
                    107:                printf "%s", function_definition(fieldname "LO",1); print "0"
                    108:         } else {
                    109:                printf "%s", function_definition(fieldname "LO",1)
                    110:                 printf "andb(lshift(A1,%d),65535)\n", low
                    111:         }
                    112:         if (high < 16) {
                    113:                printf "%s", function_definition(fieldname "HI",1); print "0"
                    114:         } else {
                    115:                printf "%s", function_definition(fieldname "HI",1)
                    116:                 printf "lshift(A1,%s)\n", mlnumber(low - 16)
                    117:         }
                    118:        printf "%s", function_definition("THE" fieldname,2) > decode
                    119:         if (signed) printf "let val n = " > decode
                    120:         if (low >= 16) {
                    121:                printf "0" > decode
                    122:         } else {
                    123:                 printf "andb(rshift(A2,%d),%d)", low,
                    124:                                (2**(min(15,high)-low+1)-1) > decode
                    125:         }
                    126:         printf " + " > decode
                    127:         if (high < 16) {
                    128:                printf "0\n" > decode
                    129:         } else {
                    130:                 printf "rshift(andb(A1,%d),%s)\n", (2**(high-16+1)-1),
                    131:                                mlnumber(low - 16) > decode
                    132:         }
                    133:         if (signed) {
                    134:                printf "in if n < %d then n else n - %d\nend\n",
                    135:                        2**(high-low), 2**(high-low+1) > decode
                    136:         }
                    137: 
                    138: 
                    139: }
                    140: NF == 1 && $1 == "instructions" {
                    141:        startline = NR
                    142:        instructions = 1
                    143:        next
                    144: }
                    145: instructions && $0 !~ /^#/ {
                    146:        opname = $1
                    147: 
                    148:        temp = "\"" opname " \""
                    149:         for (i=2; i<=NF; i++) {
                    150:                temp = sprintf( "%s ^ \"%s = \" ^ S%s", temp, $i, $i)
                    151:                if (i<NF) temp = sprintf("%s ^ \",\" ", temp)
                    152:         }
                    153:         displayof[opname]=temp " ^ \"\\n\""
                    154: 
                    155: ########       gsub("[^a-z']+"," ")   ### ill-advised
                    156: 
                    157:                printf "%s", function_definition(opname, NF-1)
                    158:                printf "("      # open parenthesis for pair
                    159:                for (i=2; i<= NF; i++) {
                    160:                        if (!($i in fieldnames)) {
                    161:                                                        print "unknown field", $i, "on line", NR > stderr
                    162:                                                        next
                    163:                                                 }
                    164:                        printf "%sHI(A%d)+", $i, i-1
                    165:                }
                    166:                if (typeof[opname]==OPCODE) {
                    167:                        printf "op'HI(%d)", numberof[opname]
                    168:                } else if (typeof[opname]==SPECIAL) {
                    169:                        printf "op'HI(%d)+", numberof["special"]
                    170:                        printf "functHI(%d)", numberof[opname]
                    171:                } else if (typeof[opname]==BCOND) {
                    172:                        printf "op'HI(%d)+", numberof["bcond"]
                    173:                        printf "condHI(%d)", numberof[opname]
                    174:                } else if (typeof[opname]==COP1) {
                    175:                        printf "op'HI(%d)+", numberof["cop1"]
                    176:                        printf "functHI(%d)", numberof[opname]
                    177:                } else {
                    178:                        print "unknown opcode", opname, "on line", NR > stderr
                    179:                        next
                    180:                       }
                    181:                printf ", "
                    182:                for (i=2; i<= NF; i++) {
                    183:                        if (!($i in fieldnames)) {
                    184:                                                        print "unknown field", $i, "on line", NR > stderr
                    185:                                                        next
                    186:                                                 }
                    187:                        printf "%sLO(A%d)+", $i, i-1
                    188:                }
                    189:                if (typeof[opname]==OPCODE) {
                    190:                        printf "op'LO(%d)", numberof[opname]
                    191:                } else if (typeof[opname]==SPECIAL) {
                    192:                        printf "op'LO(%d)+", numberof["special"]
                    193:                        printf "functLO(%d)", numberof[opname]
                    194:                } else if (typeof[opname]==BCOND) {
                    195:                        printf "op'LO(%d)+", numberof["bcond"]
                    196:                        printf "condLO(%d)", numberof[opname]
                    197:                } else if (typeof[opname]==COP1) {
                    198:                        printf "op'LO(%d)+", numberof["cop1"]
                    199:                        printf "functLO(%d)", numberof[opname]
                    200:                } else {
                    201:                        print "unknown opcode", opname, "on line", NR > stderr
                    202:                        next
                    203:                       }
                    204:                printf ")\n"
                    205: }
                    206: 
                    207: END {
                    208:   printf "%s", function_definition("decode",2) > decode
                    209:     print "let" > decode
                    210:       for (f in fieldnames) {
                    211:        printf "val %s = THE%s(A1,A2)\n", f, f  > decode
                    212:        printf "val S%s = Integer.makestring %s\n", f, f  > decode
                    213:       }
                    214:       print "val do_special ="  > decode
                    215:       print "(case funct of" > decode
                    216:       for (code=0; code<256; code++) {
                    217:        name = opcode[SPECIAL,code]
                    218:        if (name != ""  && name != "reserved") {
                    219:                if (code!=0) printf " | "  > decode # hack but it works
                    220:                      else printf "   " > decode
                    221:                disp = displayof[name]
                    222:                if (disp=="") disp="\"" name "(??? unknown format???)\\n\""
                    223:                printf "%d => %s\n", code, disp > decode
                    224:              }
                    225:       }
                    226:       printf " | _ => \"unknown special\\n\"\n" > decode
                    227:       print "   ) " > decode
                    228:       print "val do_bcond =" > decode
                    229:       print "(case cond of" > decode
                    230:       for (code=0; code<256; code++) {
                    231:        name = opcode[BCOND,code]
                    232:        if (name != ""  && name != "reserved") {
                    233:                if (code!=0) printf " | "  > decode # hack but it works
                    234:                      else printf "   " > decode
                    235:                disp = displayof[name]
                    236:                if (disp=="") disp="\"" name "(??? unknown format???)\\n\""
                    237:                printf "%d => %s\n", code, disp > decode
                    238:              }
                    239:       }
                    240:       printf " | _ => \"unknown bcond\\n\"\n" > decode
                    241:       print "   ) " > decode
                    242:       print "val do_cop1 =" > decode
                    243:       print "(case funct of" > decode
                    244:       for (code=0; code<256; code++) {
                    245:        name = opcode[COP1,code]
                    246:        if (name != ""  && name != "reserved") {
                    247:                if (code!=0) printf " | "  > decode # hack but it works
                    248:                      else printf "   " > decode
                    249:                disp = displayof[name]
                    250:                if (disp=="") disp="\"" name "(??? unknown format???)\\n\""
                    251:                printf "%d => %s\n", code, disp > decode
                    252:              }
                    253:       }
                    254:       printf " | _ => \"unknown cop1\\n\"\n" > decode
                    255:       print "   ) " > decode
                    256:     print "in" > decode
                    257:       print "(case op' of" > decode
                    258:       for (code=0; code<256; code++) {
                    259:        name = opcode[OPCODE,code]
                    260:        if (name=="special") {
                    261:                if (code!=0) printf " | "  > decode # hack but it works
                    262:                      else printf "   " > decode
                    263:                printf "%d => %s\n", code, "do_special" > decode
                    264:        } else if (name=="bcond") {
                    265:                if (code!=0) printf " | "  > decode # hack but it works
                    266:                      else printf "   " > decode
                    267:                printf "%d => %s\n", code, "do_bcond" > decode
                    268:        } else if (name=="cop1") {
                    269:                if (code!=0) printf " | "  > decode # hack but it works
                    270:                      else printf "   " > decode
                    271:                printf "%d => %s\n", code, "do_cop1" > decode
                    272:        } else if (name != ""  && name != "reserved") {
                    273:                        if (code!=0) printf " | "  > decode # hack but it works
                    274:                             else printf "   " > decode
                    275:                        disp = displayof[name]
                    276:                        if (disp=="") disp="\"" name "(??? unknown format???)\\n\""
                    277:                        printf "%d => %s\n", code, disp > decode
                    278:                     }
                    279:       }
                    280:       printf " | _ => \"unknown opcode\\n\"\n" > decode
                    281:       print "   ) " > decode
                    282:     print "end" > decode
                    283:   print "end (* Opcodes *)"
                    284:   print "end (* Decode *)" > decode
                    285: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.