Annotation of researchv10no/cmd/sml/src/mips/mipsdecode.sml, revision 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.