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

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: structure MipsDecode = struct
                      3: val andb = Bits.andb
                      4: fun rshift(op1,amt) = 
                      5:     if amt<0 then Bits.lshift(op1,0-amt)
                      6:     else Bits.rshift(op1,amt)
                      7: fun THEop'(A1,A2) = 0 + rshift(andb(A1,65535),10)
                      8: fun THErs(A1,A2) = 0 + rshift(andb(A1,1023),5)
                      9: fun THErt(A1,A2) = 0 + rshift(andb(A1,31),0)
                     10: fun THEimmed(A1,A2) = let val n = andb(rshift(A2,0),65535) + 0
                     11: in if n < 32768 then n else n - 65536
                     12: end
                     13: fun THEoffset(A1,A2) = let val n = andb(rshift(A2,0),65535) + 0
                     14: in if n < 32768 then n else n - 65536
                     15: end
                     16: fun THEbase(A1,A2) = 0 + rshift(andb(A1,1023),5)
                     17: fun THEtarget(A1,A2) = andb(rshift(A2,0),65535) + rshift(andb(A1,1023),~16)
                     18: fun THErd(A1,A2) = andb(rshift(A2,11),31) + 0
                     19: fun THEshamt(A1,A2) = andb(rshift(A2,6),31) + 0
                     20: fun THEfunct(A1,A2) = andb(rshift(A2,0),63) + 0
                     21: fun THEcond(A1,A2) = 0 + rshift(andb(A1,31),0)
                     22: fun THEft(A1,A2) = 0 + rshift(andb(A1,31),0)
                     23: fun THEfmt(A1,A2) = 0 + rshift(andb(A1,1023),5)
                     24: fun THEfs(A1,A2) = andb(rshift(A2,11),31) + 0
                     25: fun THEfd(A1,A2) = andb(rshift(A2,6),31) + 0
                     26: fun decode(A1,A2) = let
                     27: val rt = THErt(A1,A2)
                     28: val Srt = Integer.makestring rt
                     29: val base = THEbase(A1,A2)
                     30: val Sbase = Integer.makestring base
                     31: val immed = THEimmed(A1,A2)
                     32: val Simmed = Integer.makestring immed
                     33: val target = THEtarget(A1,A2)
                     34: val Starget = Integer.makestring target
                     35: val fd = THEfd(A1,A2)
                     36: val Sfd = Integer.makestring fd
                     37: val fmt = THEfmt(A1,A2)
                     38: val Sfmt = Integer.makestring fmt
                     39: val fs = THEfs(A1,A2)
                     40: val Sfs = Integer.makestring fs
                     41: val ft = THEft(A1,A2)
                     42: val Sft = Integer.makestring ft
                     43: val op' = THEop'(A1,A2)
                     44: val Sop' = Integer.makestring op'
                     45: val funct = THEfunct(A1,A2)
                     46: val Sfunct = Integer.makestring funct
                     47: val rd = THErd(A1,A2)
                     48: val Srd = Integer.makestring rd
                     49: val cond = THEcond(A1,A2)
                     50: val Scond = Integer.makestring cond
                     51: val shamt = THEshamt(A1,A2)
                     52: val Sshamt = Integer.makestring shamt
                     53: val offset = THEoffset(A1,A2)
                     54: val Soffset = Integer.makestring offset
                     55: val rs = THErs(A1,A2)
                     56: val Srs = Integer.makestring rs
                     57: val do_special =
                     58: (case funct of
                     59:    0 => "sll " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "shamt = " ^ Sshamt ^ "\n"
                     60:  | 2 => "srl " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "shamt = " ^ Sshamt ^ "\n"
                     61:  | 3 => "sra " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "shamt = " ^ Sshamt ^ "\n"
                     62:  | 4 => "sllv " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ "\n"
                     63:  | 6 => "srlv " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ "\n"
                     64:  | 7 => "srav " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ "\n"
                     65:  | 8 => "jr " ^ "rs = " ^ Srs ^ "\n"
                     66:  | 9 => "jalr " ^ "rs = " ^ Srs ^ ","  ^ "rd = " ^ Srd ^ "\n"
                     67:  | 12 => "syscall " ^ "\n"
                     68:  | 13 => "break " ^ "\n"
                     69:  | 16 => "mfhi " ^ "rd = " ^ Srd ^ "\n"
                     70:  | 17 => "mthi " ^ "rs = " ^ Srs ^ "\n"
                     71:  | 18 => "mflo " ^ "rd = " ^ Srd ^ "\n"
                     72:  | 19 => "mtlo " ^ "rs = " ^ Srs ^ "\n"
                     73:  | 24 => "mult " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     74:  | 25 => "multu " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     75:  | 26 => "div " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     76:  | 27 => "divu " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     77:  | 32 => "add " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     78:  | 33 => "addu " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     79:  | 34 => "sub " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     80:  | 35 => "subu " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     81:  | 36 => "and' " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     82:  | 37 => "or " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     83:  | 38 => "xor " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     84:  | 39 => "nor " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     85:  | 42 => "slt " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     86:  | 43 => "sltu " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
                     87:  | _ => "unknown special\n"
                     88:    ) 
                     89: val do_bcond =
                     90: (case cond of
                     91:    0 => "bltz " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                     92:  | 1 => "bgez " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                     93:  | 16 => "bltzal " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                     94:  | 17 => "bgezal " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                     95:  | _ => "unknown bcond\n"
                     96:    ) 
                     97: val do_cop1 =
                     98: (case funct of
                     99:    0 => "add_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
                    100:  | 1 => "sub_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
                    101:  | 2 => "mul_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
                    102:  | 3 => "div_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
                    103:  | 5 => "abs_fmt(??? unknown format???)\n"
                    104:  | 6 => "mov_fmt(??? unknown format???)\n"
                    105:  | 7 => "neg_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ "\n"
                    106:  | 32 => "cvt_s(??? unknown format???)\n"
                    107:  | 33 => "cvt_d(??? unknown format???)\n"
                    108:  | 36 => "cvt_w(??? unknown format???)\n"
                    109:  | 48 => "c_f(??? unknown format???)\n"
                    110:  | 49 => "c_un(??? unknown format???)\n"
                    111:  | 50 => "c_eq(??? unknown format???)\n"
                    112:  | 51 => "c_ueq(??? unknown format???)\n"
                    113:  | 52 => "c_olt(??? unknown format???)\n"
                    114:  | 53 => "c_ult(??? unknown format???)\n"
                    115:  | 54 => "c_ole(??? unknown format???)\n"
                    116:  | 55 => "c_ule(??? unknown format???)\n"
                    117:  | 56 => "c_sf(??? unknown format???)\n"
                    118:  | 57 => "c_ngle(??? unknown format???)\n"
                    119:  | 58 => "c_seq " ^ "fmt = " ^ Sfmt ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
                    120:  | 59 => "c_ngl(??? unknown format???)\n"
                    121:  | 60 => "c_lt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
                    122:  | 61 => "c_nge(??? unknown format???)\n"
                    123:  | 62 => "c_le(??? unknown format???)\n"
                    124:  | 63 => "c_ngt(??? unknown format???)\n"
                    125:  | _ => "unknown cop1\n"
                    126:    ) 
                    127: in
                    128: (case op' of
                    129:    0 => do_special
                    130:  | 1 => do_bcond
                    131:  | 2 => "j " ^ "target = " ^ Starget ^ "\n"
                    132:  | 3 => "jal " ^ "target = " ^ Starget ^ "\n"
                    133:  | 4 => "beq " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                    134:  | 5 => "bne " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                    135:  | 6 => "blez " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                    136:  | 7 => "bgtz " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
                    137:  | 8 => "addi " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    138:  | 9 => "addiu " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    139:  | 10 => "slti " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    140:  | 11 => "sltiu " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    141:  | 12 => "andi " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    142:  | 13 => "ori " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    143:  | 14 => "xori " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    144:  | 15 => "lui " ^ "rt = " ^ Srt ^ ","  ^ "immed = " ^ Simmed ^ "\n"
                    145:  | 16 => "cop0(??? unknown format???)\n"
                    146:  | 17 => do_cop1
                    147:  | 18 => "cop2(??? unknown format???)\n"
                    148:  | 19 => "cop3(??? unknown format???)\n"
                    149:  | 32 => "lb " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    150:  | 33 => "lh " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    151:  | 34 => "lwl " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    152:  | 35 => "lw " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    153:  | 36 => "lbu " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    154:  | 37 => "lhu " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    155:  | 38 => "lwr " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    156:  | 40 => "sb " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    157:  | 41 => "sh " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    158:  | 42 => "swl " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    159:  | 43 => "sw " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    160:  | 46 => "swr " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    161:  | 48 => "lwc0(??? unknown format???)\n"
                    162:  | 49 => "lwc1 " ^ "ft = " ^ Sft ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    163:  | 50 => "lwc2(??? unknown format???)\n"
                    164:  | 51 => "lwc3(??? unknown format???)\n"
                    165:  | 56 => "swc0(??? unknown format???)\n"
                    166:  | 57 => "swc1 " ^ "ft = " ^ Sft ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
                    167:  | 58 => "swc2(??? unknown format???)\n"
                    168:  | 59 => "swc3(??? unknown format???)\n"
                    169:  | _ => "unknown opcode\n"
                    170:    ) 
                    171: end
                    172: end (* Decode *)

unix.superglobalmegacorp.com

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