|
|
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 *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.