File:  [Research Unix] / researchv10no / cmd / sml / src / mips / mipsdecode.sml
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

(* Copyright 1989 by AT&T Bell Laboratories *)
structure MipsDecode = struct
val andb = Bits.andb
fun rshift(op1,amt) = 
    if amt<0 then Bits.lshift(op1,0-amt)
    else Bits.rshift(op1,amt)
fun THEop'(A1,A2) = 0 + rshift(andb(A1,65535),10)
fun THErs(A1,A2) = 0 + rshift(andb(A1,1023),5)
fun THErt(A1,A2) = 0 + rshift(andb(A1,31),0)
fun THEimmed(A1,A2) = let val n = andb(rshift(A2,0),65535) + 0
in if n < 32768 then n else n - 65536
end
fun THEoffset(A1,A2) = let val n = andb(rshift(A2,0),65535) + 0
in if n < 32768 then n else n - 65536
end
fun THEbase(A1,A2) = 0 + rshift(andb(A1,1023),5)
fun THEtarget(A1,A2) = andb(rshift(A2,0),65535) + rshift(andb(A1,1023),~16)
fun THErd(A1,A2) = andb(rshift(A2,11),31) + 0
fun THEshamt(A1,A2) = andb(rshift(A2,6),31) + 0
fun THEfunct(A1,A2) = andb(rshift(A2,0),63) + 0
fun THEcond(A1,A2) = 0 + rshift(andb(A1,31),0)
fun THEft(A1,A2) = 0 + rshift(andb(A1,31),0)
fun THEfmt(A1,A2) = 0 + rshift(andb(A1,1023),5)
fun THEfs(A1,A2) = andb(rshift(A2,11),31) + 0
fun THEfd(A1,A2) = andb(rshift(A2,6),31) + 0
fun decode(A1,A2) = let
val rt = THErt(A1,A2)
val Srt = Integer.makestring rt
val base = THEbase(A1,A2)
val Sbase = Integer.makestring base
val immed = THEimmed(A1,A2)
val Simmed = Integer.makestring immed
val target = THEtarget(A1,A2)
val Starget = Integer.makestring target
val fd = THEfd(A1,A2)
val Sfd = Integer.makestring fd
val fmt = THEfmt(A1,A2)
val Sfmt = Integer.makestring fmt
val fs = THEfs(A1,A2)
val Sfs = Integer.makestring fs
val ft = THEft(A1,A2)
val Sft = Integer.makestring ft
val op' = THEop'(A1,A2)
val Sop' = Integer.makestring op'
val funct = THEfunct(A1,A2)
val Sfunct = Integer.makestring funct
val rd = THErd(A1,A2)
val Srd = Integer.makestring rd
val cond = THEcond(A1,A2)
val Scond = Integer.makestring cond
val shamt = THEshamt(A1,A2)
val Sshamt = Integer.makestring shamt
val offset = THEoffset(A1,A2)
val Soffset = Integer.makestring offset
val rs = THErs(A1,A2)
val Srs = Integer.makestring rs
val do_special =
(case funct of
   0 => "sll " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "shamt = " ^ Sshamt ^ "\n"
 | 2 => "srl " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "shamt = " ^ Sshamt ^ "\n"
 | 3 => "sra " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "shamt = " ^ Sshamt ^ "\n"
 | 4 => "sllv " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ "\n"
 | 6 => "srlv " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ "\n"
 | 7 => "srav " ^ "rd = " ^ Srd ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ "\n"
 | 8 => "jr " ^ "rs = " ^ Srs ^ "\n"
 | 9 => "jalr " ^ "rs = " ^ Srs ^ ","  ^ "rd = " ^ Srd ^ "\n"
 | 12 => "syscall " ^ "\n"
 | 13 => "break " ^ "\n"
 | 16 => "mfhi " ^ "rd = " ^ Srd ^ "\n"
 | 17 => "mthi " ^ "rs = " ^ Srs ^ "\n"
 | 18 => "mflo " ^ "rd = " ^ Srd ^ "\n"
 | 19 => "mtlo " ^ "rs = " ^ Srs ^ "\n"
 | 24 => "mult " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 25 => "multu " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 26 => "div " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 27 => "divu " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 32 => "add " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 33 => "addu " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 34 => "sub " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 35 => "subu " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 36 => "and' " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 37 => "or " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 38 => "xor " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 39 => "nor " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 42 => "slt " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | 43 => "sltu " ^ "rd = " ^ Srd ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ "\n"
 | _ => "unknown special\n"
   ) 
val do_bcond =
(case cond of
   0 => "bltz " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 1 => "bgez " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 16 => "bltzal " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 17 => "bgezal " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | _ => "unknown bcond\n"
   ) 
val do_cop1 =
(case funct of
   0 => "add_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
 | 1 => "sub_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
 | 2 => "mul_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
 | 3 => "div_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
 | 5 => "abs_fmt(??? unknown format???)\n"
 | 6 => "mov_fmt(??? unknown format???)\n"
 | 7 => "neg_fmt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fd = " ^ Sfd ^ ","  ^ "fs = " ^ Sfs ^ "\n"
 | 32 => "cvt_s(??? unknown format???)\n"
 | 33 => "cvt_d(??? unknown format???)\n"
 | 36 => "cvt_w(??? unknown format???)\n"
 | 48 => "c_f(??? unknown format???)\n"
 | 49 => "c_un(??? unknown format???)\n"
 | 50 => "c_eq(??? unknown format???)\n"
 | 51 => "c_ueq(??? unknown format???)\n"
 | 52 => "c_olt(??? unknown format???)\n"
 | 53 => "c_ult(??? unknown format???)\n"
 | 54 => "c_ole(??? unknown format???)\n"
 | 55 => "c_ule(??? unknown format???)\n"
 | 56 => "c_sf(??? unknown format???)\n"
 | 57 => "c_ngle(??? unknown format???)\n"
 | 58 => "c_seq " ^ "fmt = " ^ Sfmt ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
 | 59 => "c_ngl(??? unknown format???)\n"
 | 60 => "c_lt " ^ "fmt = " ^ Sfmt ^ ","  ^ "fs = " ^ Sfs ^ ","  ^ "ft = " ^ Sft ^ "\n"
 | 61 => "c_nge(??? unknown format???)\n"
 | 62 => "c_le(??? unknown format???)\n"
 | 63 => "c_ngt(??? unknown format???)\n"
 | _ => "unknown cop1\n"
   ) 
in
(case op' of
   0 => do_special
 | 1 => do_bcond
 | 2 => "j " ^ "target = " ^ Starget ^ "\n"
 | 3 => "jal " ^ "target = " ^ Starget ^ "\n"
 | 4 => "beq " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 5 => "bne " ^ "rs = " ^ Srs ^ ","  ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 6 => "blez " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 7 => "bgtz " ^ "rs = " ^ Srs ^ ","  ^ "offset = " ^ Soffset ^ "\n"
 | 8 => "addi " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 9 => "addiu " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 10 => "slti " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 11 => "sltiu " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 12 => "andi " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 13 => "ori " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 14 => "xori " ^ "rt = " ^ Srt ^ ","  ^ "rs = " ^ Srs ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 15 => "lui " ^ "rt = " ^ Srt ^ ","  ^ "immed = " ^ Simmed ^ "\n"
 | 16 => "cop0(??? unknown format???)\n"
 | 17 => do_cop1
 | 18 => "cop2(??? unknown format???)\n"
 | 19 => "cop3(??? unknown format???)\n"
 | 32 => "lb " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 33 => "lh " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 34 => "lwl " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 35 => "lw " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 36 => "lbu " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 37 => "lhu " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 38 => "lwr " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 40 => "sb " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 41 => "sh " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 42 => "swl " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 43 => "sw " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 46 => "swr " ^ "rt = " ^ Srt ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 48 => "lwc0(??? unknown format???)\n"
 | 49 => "lwc1 " ^ "ft = " ^ Sft ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 50 => "lwc2(??? unknown format???)\n"
 | 51 => "lwc3(??? unknown format???)\n"
 | 56 => "swc0(??? unknown format???)\n"
 | 57 => "swc1 " ^ "ft = " ^ Sft ^ ","  ^ "offset = " ^ Soffset ^ ","  ^ "base = " ^ Sbase ^ "\n"
 | 58 => "swc2(??? unknown format???)\n"
 | 59 => "swc3(??? unknown format???)\n"
 | _ => "unknown opcode\n"
   ) 
end
end (* Decode *)

unix.superglobalmegacorp.com

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