1 /*        $OpenBSD: opcodes.c,v 1.1 2002/05/16 07:37:44 miod Exp $    */
2 
3 /*
4  * Copyright (c) 2002, Miodrag Vallat.
5  * Copyright (c) 1996 Ludd, University of Lule}, Sweden.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to Ludd by
9  * Bertram Barth.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include <sys/param.h>
35 #include <sys/types.h>
36 
37 #include <vax/vax/db_disasm.h>
38 /*
39  * argdesc describes each arguments by two characters denoting
40  * the access-type and the data-type.
41  *
42  * Arguments (Access-Types):
43  *        r: operand is read only
44  *        w: operand is written only
45  *        m: operand is modified (both R and W)
46  *        b: no operand reference. Branch displacement is specified.
47  *        a: calculate the address of the specified operand
48  *        v: if not "Rn", same as a. If "RN," R[n+1]R[n]
49  * Arguments (Data-Types):
50  *        b: Byte
51  *        w: Word
52  *        l: Longword
53  *        q: Quadword
54  *        o: Octaword
55  *        d: D_floating
56  *        f: F_floating
57  *        g: G_floating
58  *        h: H_floating
59  *        r: Register
60  *        x: first data type specified by instruction
61  *        y: second data type spcified by instructin
62  *        -: no-args
63  *        ?: unknown (variable?)
64  */
65 
66 /* one-byte instructions */
67 vax_instr_t vax_inst[256] = {
68 /* 0x00 */          {         "halt",   NULL                          },
69 /* 0x01 */          {         "nop",              NULL                          },
70 /* 0x02 */          {         "rei",              NULL                          },
71 /* 0x03 */          {         "bpt",              NULL                          },
72 /* 0x04 */          {         "ret",              NULL                          },
73 /* 0x05 */          {         "rsb",              NULL                          },
74 /* 0x06 */          {         "ldpctx",           NULL                          },
75 /* 0x07 */          {         "svpctx",           NULL                          },
76 /* 0x08 */          {         "cvtps",  "rw,ab,rw,ab"                 },
77 /* 0x09 */          {         "cvtsp",  "rw,ab,rw,ab"                 },
78 /* 0x0a */          {         "index",  "rl,rl,rl,rl,rl,wl"           },
79 /* 0x0b */          {         "crc",              "ab,rl,rw,ab"                 },
80 /* 0x0c */          {         "prober",           "rb,rw,ab"                    },
81 /* 0x0d */          {         "probew",           "rb,rw,ab"                    },
82 /* 0x0e */          {         "insque",           "ab,wl"                       },
83 /* 0x0f */          {         "remque",           "ab,wl"                       },
84 
85 /* 0x10 */          {         "bsbb",   "bb"                          },
86 /* 0x11 */          {         "brb",              "bb"                          },
87 /* 0x12 */          {         "*bneq",  "bb"                          },
88 /* 0x13 */          {         "*beql",  "bb"                          },
89 /* 0x14 */          {         "bgtr",   "bb"                          },
90 /* 0x15 */          {         "bleq",   "bb"                          },
91 /* 0x16 */          {         "jsb",              "ab"                          },
92 /* 0x17 */          {         "jmp",              "ab"                          },
93 /* 0x18 */          {         "bgeq",   "bb"                          },
94 /* 0x19 */          {         "blss",   "bb"                          },
95 /* 0x1a */          {         "bgtru",  "bb"                          },
96 /* 0x1b */          {         "blequ",  "bb"                          },
97 /* 0x1c */          {         "bvc",              "bb"                          },
98 /* 0x1d */          {         "bvs",              "bb"                          },
99 /* 0x1e */          {         "*bcc",   "bb"                          },
100 /* 0x1f */          {         "*bcs",   "bb"                          },
101 
102 /* 0x20 */          {         "addp4",  "rw,ab,rw,ab"                 },
103 /* 0x21 */          {         "addp6",  "rw,ab,rw,ab,rw,ab" },
104 /* 0x22 */          {         "subp4",  "rw,ab,rw,ab"                 },
105 /* 0x23 */          {         "subp6",  "rw,ab,rw,ab,rw,ab" },
106 /* 0x24 */          {         "cvtpt",  "rw,ab,ab,rw,ab"    },
107 /* 0x25 */          {         "mulp",   "rw,ab,rw,ab,rw,ab" },
108 /* 0x26 */          {         "cvttp",  "rw,ab,ab,rw,ab"    },
109 /* 0x27 */          {         "divp",   "rw,ab,rw,ab,rw,ab" },
110 /* 0x28 */          {         "movc3",  "rw,ab,ab"                    },
111 /* 0x29 */          {         "cmpc3",  "rw,ab,ab"                    },
112 /* 0x2a */          {         "scanc",  "rw,ab,ab,rb"                 },
113 /* 0x2b */          {         "spanc",  "rw,ab,ab,rb"                 },
114 /* 0x2c */          {         "movc5",  "rw,ab,rb,rw,ab"    },
115 /* 0x2d */          {         "cmpc5",  "rw,ab,rb,rw,ab"    },
116 /* 0x2e */          {         "movtc",  "rw,ab,rb,ab,rw,ab" },
117 /* 0x2f */          {         "movtuc",           "rw,ab,rb,ab,rw,ab" },
118 
119 /* 0x30 */          {         "bsbw",   "bw"                          },
120 /* 0x31 */          {         "brw",              "bw"                          },
121 /* 0x32 */          {         "cvtwl",  "rw,wl"                       },
122 /* 0x33 */          {         "cvtwb",  "rw,wb"                       },
123 /* 0x34 */          {         "movp",   "rw,ab,ab"                    },
124 /* 0x35 */          {         "cmpp3",  "rw,ab,ab"                    },
125 /* 0x36 */          {         "cvtpl",  "rw,ab,wl"                    },
126 /* 0x37 */          {         "cmpp4",  "rw,ab,rw,ab"                 },
127 /* 0x38 */          {         "editpc",           "rw,ab,ab,ab"                 },
128 /* 0x39 */          {         "matchc",           "rw,ab,rw,ab"                 },
129 /* 0x3a */          {         "locc",   "rb,rw,ab"                    },
130 /* 0x3b */          {         "skpc",   "rb,rw,ab"                    },
131 /* 0x3c */          {         "movzwl",           "rw,wl"                       },
132 /* 0x3d */          {         "acbw",   "rw,rw,mw,bw"                 },
133 /* 0x3e */          {         "movaw",  "aw,wl"                       },
134 /* 0x3f */          {         "pushaw",           "aw"                          },
135 
136 /* 0x40 */          {         "addf2",  "rf,mf"                       },
137 /* 0x41 */          {         "addf3",  "rf,rf,wf"                    },
138 /* 0x42 */          {         "subf2",  "rf,mf"                       },
139 /* 0x43 */          {         "subf3",  "rf,rf,wf"                    },
140 /* 0x44 */          {         "mulf2",  "rf,mf"                       },
141 /* 0x45 */          {         "mulf3",  "rf,rf,wf"                    },
142 /* 0x46 */          {         "divf2",  "rf,mf"                       },
143 /* 0x47 */          {         "divf3",  "rf,rf,wf"                    },
144 /* 0x48 */          {         "cvtfb",  "rf,wb"                       },
145 /* 0x49 */          {         "cvtfw",  "rf,ww"                       },
146 /* 0x4a */          {         "cvtfl",  "rf,wl"                       },
147 /* 0x4b */          {         "cvtrfl",           "rf,wl"                       },
148 /* 0x4c */          {         "cvtbf",  "rb,wf"                       },
149 /* 0x4d */          {         "cvtwf",  "rw,wf"                       },
150 /* 0x4e */          {         "cvtlf",  "rl,wf"                       },
151 /* 0x4f */          {         "acbf",   "rf,rf,rf,bw"                 },
152 
153 /* 0x50 */          {         "movf",   "rf,wf"                       },
154 /* 0x51 */          {         "cmpf",   "rf,rf"                       },
155 /* 0x52 */          {         "mnegf",  "rf,wf"                       },
156 /* 0x53 */          {         "tstf",   "rf"                          },
157 /* 0x54 */          {         "emodf",  "rf,rb,rf,wl,wf"    },
158 /* 0x55 */          {         "polyf",  "rf,rw,ab"                    },
159 /* 0x56 */          {         "cvtfd",  "rf,wd"                       },
160 /* 0x57 */          {         "-reserved-",       NULL                          },
161 /* 0x58 */          {         "adawi",  "rw,mw"                       },
162 /* 0x59 */          {         "-reserved-",       NULL                          },
163 /* 0x5a */          {         "-reserved-",       NULL                          },
164 /* 0x5b */          {         "-reserved-",       NULL                          },
165 /* 0x5c */          {         "insqhi",           "ab,aq"                       },
166 /* 0x5d */          {         "insqti",           "ab,aq"                       },
167 /* 0x5e */          {         "remqhi",           "aq,wl"                       },
168 /* 0x5f */          {         "remqti",           "aq,wl"                       },
169 
170 /* 0x60 */          {         "addd2",  "rd,md"                       },
171 /* 0x61 */          {         "addd3",  "rd,rd,wd"                    },
172 /* 0x62 */          {         "subd2",  "rd,md"                       },
173 /* 0x63 */          {         "subd3",  "rd,rd,wd"                    },
174 /* 0x64 */          {         "muld2",  "rd,md"                       },
175 /* 0x65 */          {         "muld3",  "rd,rd,wd"                    },
176 /* 0x66 */          {         "divd2",  "rd,md"                       },
177 /* 0x67 */          {         "divd3",  "rd,rd,wd"                    },
178 /* 0x68 */          {         "cvtdb",  "rd,wb"                       },
179 /* 0x69 */          {         "cvtdw",  "rd,ww"                       },
180 /* 0x6a */          {         "cvtdl",  "rd,wl"                       },
181 /* 0x6b */          {         "cvtrdl",           "rd,wl"                       },
182 /* 0x6c */          {         "cvtbd",  "rb,wd"                       },
183 /* 0x6d */          {         "cvtwd",  "rw,wd"                       },
184 /* 0x6e */          {         "cvtld",  "rl,wd"                       },
185 /* 0x6f */          {         "acbd",   "rd,rd,md,bw"                 },
186 
187 /* 0x70 */          {         "movd",   "rd,wd"                       },
188 /* 0x71 */          {         "cmpd",   "rd,rd"                       },
189 /* 0x72 */          {         "mnegd",  "rd,wd"                       },
190 /* 0x73 */          {         "tstd",   "rd"                          },
191 /* 0x74 */          {         "emodd",  "rd,rb,rd,wl,wd"    },
192 /* 0x75 */          {         "polyd",  "rd,rw,ab"                    },
193 /* 0x76 */          {         "cvtdf",  "rd,wf"                       },
194 /* 0x77 */          {         "-reserved-",       NULL                          },
195 /* 0x78 */          {         "ashl",   "rb,rl,wl"                    },
196 /* 0x79 */          {         "ashq",   "rb,rq,wq"                    },
197 /* 0x7a */          {         "emul",   "rl,rl,rl,wq"                 },
198 /* 0x7b */          {         "ediv",   "rl,rq,wl,wl"                 },
199 /* 0x7c */          {         "*clrq",  "wq"                          },
200 /* 0x7d */          {         "movq",   "rq,wq"                       },
201 /* 0x7e */          {         "*movaq",           "aq,wl"                       },
202 /* 0x7f */          {         "*pushaq",          "aq"                          },
203 
204 /* 0x80 */          {         "addb2",  "rb,mb"                       },
205 /* 0x81 */          {         "addb3",  "rb,rb,wb"                    },
206 /* 0x82 */          {         "subb2",  "rb,mb"                       },
207 /* 0x83 */          {         "subb3",  "rb,rb,wb"                    },
208 /* 0x84 */          {         "mulb2",  "rb,mb"                       },
209 /* 0x85 */          {         "mulb3",  "rb,rb,wb"                    },
210 /* 0x86 */          {         "divb2",  "rb,mb"                       },
211 /* 0x87 */          {         "divb3",  "rb,rb,wb"                    },
212 /* 0x88 */          {         "bisb2",  "rb,mb"                       },
213 /* 0x89 */          {         "bisb3",  "rb,rb,wb"                    },
214 /* 0x8a */          {         "bicb2",  "rb,mb"                       },
215 /* 0x8b */          {         "bicb3",  "rb,rb,wb"                    },
216 /* 0x8c */          {         "xorb2",  "rb,mb"                       },
217 /* 0x8d */          {         "xorb3",  "rb,rb,wb"                    },
218 /* 0x8e */          {         "mnegb",  "rb,wb"                       },
219 /* 0x8f */          {         "caseb",  "rb,rb,rb,bw-list"  },
220 
221 /* 0x90 */          {         "movb",   "rb,wb"                       },
222 /* 0x91 */          {         "cmpb",   "rb,rb"                       },
223 /* 0x92 */          {         "mcomb",  "rb,wb"                       },
224 /* 0x93 */          {         "bitb",   "rb,rb"                       },
225 /* 0x94 */          {         "clrb",   "wb"                          },
226 /* 0x95 */          {         "tstb",   "rb"                          },
227 /* 0x96 */          {         "incb",   "mb"                          },
228 /* 0x97 */          {         "decb",   "mb"                          },
229 /* 0x98 */          {         "cvtbl",  "rb,wl"                       },
230 /* 0x99 */          {         "cvtbw",  "rb,ww"                       },
231 /* 0x9a */          {         "movzbl",           "rb,wl"                       },
232 /* 0x9b */          {         "movzbw",           "wb,ww"                       },
233 /* 0x9c */          {         "rotl",   "rb,rl,wl"                    },
234 /* 0x9d */          {         "acbb",   "rb,rb,mb,bw"                 },
235 /* 0x9e */          {         "movab",  "ab,wl"                       },
236 /* 0x9f */          {         "pushab",           "ab"                          },
237 
238 /* 0xa0 */          {         "addw2",  "rw,mw"                       },
239 /* 0xa1 */          {         "addw3",  "rw,rw,ww"                    },
240 /* 0xa2 */          {         "subw2",  "rw,mw"                       },
241 /* 0xa3 */          {         "subw3",  "rw,rw,ww"                    },
242 /* 0xa4 */          {         "mulw2",  "rw,mw"                       },
243 /* 0xa5 */          {         "mulw3",  "rw,rw,ww"                    },
244 /* 0xa6 */          {         "divw2",  "rw,mw"                       },
245 /* 0xa7 */          {         "divw3",  "rw,rw,ww"                    },
246 /* 0xa8 */          {         "bisw2",  "rw,mw"                       },
247 /* 0xa9 */          {         "bisw3",  "rw,rw,ww"                    },
248 /* 0xaa */          {         "bicw2",  "rw,mw"                       },
249 /* 0xab */          {         "bicw3",  "rw,rw,ww"                    },
250 /* 0xac */          {         "xorw2",  "rw,mw"                       },
251 /* 0xad */          {         "xorw3",  "rw,rw,ww"                    },
252 /* 0xae */          {         "mnegw",  "rw,ww"                       },
253 /* 0xaf */          {         "casew",  "rw,rw,rw,bw-list"  },
254 
255 /* 0xb0 */          {         "movw",   "rw,ww"                       },
256 /* 0xb1 */          {         "cmpw",   "rw,rw"                       },
257 /* 0xb2 */          {         "mcomw",  "rw,ww"                       },
258 /* 0xb3 */          {         "bitw",   "rw,rw"                       },
259 /* 0xb4 */          {         "clrw",   "mw"                          },
260 /* 0xb5 */          {         "tstw",   "rw"                          },
261 /* 0xb6 */          {         "incw",   "mw"                          },
262 /* 0xb7 */          {         "decw",   "mw"                          },
263 /* 0xb8 */          {         "bispsw",           "rw"                          },
264 /* 0xb9 */          {         "bicpsw",           "rw"                          },
265 /* 0xba */          {         "popr",   "rw"                          },
266 /* 0xbb */          {         "pushr",  "rw"                          },
267 /* 0xbc */          {         "chmk",   "rw"                          },
268 /* 0xbd */          {         "chme",   "rw"                          },
269 /* 0xbe */          {         "chms",   "rw"                          },
270 /* 0xbf */          {         "chmu",   "rw"                          },
271 
272 /* 0xc0 */          {         "addl2",  "rl,ml"                       },
273 /* 0xc1 */          {         "addl3",  "rl,rl,wl"                    },
274 /* 0xc2 */          {         "subl2",  "rl,ml"                       },
275 /* 0xc3 */          {         "subl3",  "rl,rl,wl"                    },
276 /* 0xc4 */          {         "mull2",  "rl,ml"                       },
277 /* 0xc5 */          {         "mull3",  "rl,rl,wl"                    },
278 /* 0xc6 */          {         "divl2",  "rl,ml"                       },
279 /* 0xc7 */          {         "divl3",  "rl,rl,wl"                    },
280 /* 0xc8 */          {         "bisl2",  "rl,ml"                       },
281 /* 0xc9 */          {         "bisl3",  "rl,rl,wl"                    },
282 /* 0xca */          {         "bicl2",  "rl,ml"                       },
283 /* 0xcb */          {         "bicl3",  "rl,rl,wl"                    },
284 /* 0xcc */          {         "xorl2",  "rl,ml"                       },
285 /* 0xcd */          {         "xorl3",  "rl,rl,wl"                    },
286 /* 0xce */          {         "mnegl",  "rl,wl"                       },
287 /* 0xcf */          {         "casel",  "rl,rl,rl,bw-list"  },
288 
289 /* 0xd0 */          {         "movl",   "rl,wl"                       },
290 /* 0xd1 */          {         "cmpl",   "rl,rl"                       },
291 /* 0xd2 */          {         "mcoml",  "rl,wl"                       },
292 /* 0xd3 */          {         "bitl",   "rl,rl"                       },
293 /* 0xd4 */          {         "*clrl",  "wl"                          },
294 /* 0xd5 */          {         "tstl",   "rl"                          },
295 /* 0xd6 */          {         "incl",   "ml"                          },
296 /* 0xd7 */          {         "decl",   "ml"                          },
297 /* 0xd8 */          {         "adwc",   "rl,ml"                       },
298 /* 0xd9 */          {         "sbwc",   "rl,ml"                       },
299 /* 0xda */          {         "mtpr",   "rl,rl"                       },
300 /* 0xdb */          {         "mfpr",   "rl,wl"                       },
301 /* 0xdc */          {         "movpsl",           "wl"                          },
302 /* 0xdd */          {         "pushl",  "rl"                          },
303 /* 0xde */          {         "*moval",           "al,wl"                       },
304 /* 0xdf */          {         "*pushal",          "al"                          },
305 
306 /* 0xe0 */          {         "bbs",              "rl,vb,bb"                    },
307 /* 0xe1 */          {         "bbc",              "rl,vb,bb"                    },
308 /* 0xe2 */          {         "bbss",   "rl,vb,bb"                    },
309 /* 0xe3 */          {         "bbcs",   "rl,vb,bb"                    },
310 /* 0xe4 */          {         "bbsc",   "rl,vb,bb"                    },
311 /* 0xe5 */          {         "bbcc",   "rl,vb,bb"                    },
312 /* 0xe6 */          {         "bbssi",  "rl,vb,bb"                    },
313 /* 0xe7 */          {         "bbcci",  "rl,vb,bb"                    },
314 /* 0xe8 */          {         "blbs",   "rl,bb"                       },
315 /* 0xe9 */          {         "blbc",   "rl,bb"                       },
316 /* 0xea */          {         "ffs",              "rl,rb,vb"                    },
317 /* 0xeb */          {         "ffc",              "rl,rb,vb"                    },
318 /* 0xec */          {         "cmpv",   "rl,rb,vb,rl"                 },
319 /* 0xed */          {         "cmpzv",  "rl,rb,vb,rl"                 },
320 /* 0xee */          {         "extv",   "rl,rb,vb,wl"                 },
321 /* 0xef */          {         "extzv",  "rl,rb,vb,wl"                 },
322 
323 /* 0xf0 */          {         "insv",   "rl,rl,rb,vb"                 },
324 /* 0xf1 */          {         "acbl",   "rl,rl,ml,bw"                 },
325 /* 0xf2 */          {         "aoblss",           "rl,ml,bb"                    },
326 /* 0xf3 */          {         "aobleq",           "rl,ml,bb"                    },
327 /* 0xf4 */          {         "sobgeq",           "ml,bb"                       },
328 /* 0xf5 */          {         "sobgtr",           "ml,bb"                       },
329 /* 0xf6 */          {         "cvtlb",  "rl,wb"                       },
330 /* 0xf7 */          {         "cvtlw",  "rl,ww"                       },
331 /* 0xf8 */          {         "ashp",   "rb,rw,ab,rb,rw,ab" },
332 /* 0xf9 */          {         "cvtlp",  "rl,rw,ab"                    },
333 /* 0xfa */          {         "callg",  "ab,ab"                       },
334 /* 0xfb */          {         "calls",  "rl,ab"                       },
335 /* 0xfc */          {         "xfc",              "?"                           },
336 /* 0xfd */          {         "-reserved-",       NULL                          },
337 /* 0xfe */          {         "-reserved-",       NULL                          },
338 /* 0xff */          {         "-reserved-",       NULL                          },
339 };
340 
341 /* two-byte instructions */
342 vax_instr_t vax_inst2[0x56] = {
343 /* reserved */      {         NULL,               NULL                          },
344 /* 0xfd31 */        {         NULL,               NULL                          },
345 /* 0xfd32 */        {         "cvtdh",  "rd,wh"                       },
346 /* 0xfd33 */        {         "cvtgf",  "rg,wf"                       },
347 /* 0xfd34 */        {         NULL,               NULL                          },
348 /* 0xfd35 */        {         NULL,               NULL                          },
349 /* 0xfd36 */        {         NULL,               NULL                          },
350 /* 0xfd37 */        {         NULL,               NULL                          },
351 /* 0xfd38 */        {         NULL,               NULL                          },
352 /* 0xfd39 */        {         NULL,               NULL                          },
353 /* 0xfd3a */        {         NULL,               NULL                          },
354 /* 0xfd3b */        {         NULL,               NULL                          },
355 /* 0xfd3c */        {         NULL,               NULL                          },
356 /* 0xfd3d */        {         NULL,               NULL                          },
357 /* 0xfd3e */        {         NULL,               NULL                          },
358 /* 0xfd3f */        {         NULL,               NULL                          },
359 
360 /* 0xfd40 */        {         "addg2",  "rg,mg"                       },
361 /* 0xfd41 */        {         "addg3",  "rg,rg,wg"                    },
362 /* 0xfd42 */        {         "subg2",  "rg,mg"                       },
363 /* 0xfd43 */        {         "subg3",  "rg,rg,wg"                    },
364 /* 0xfd44 */        {         "mulg2",  "rg,mg"                       },
365 /* 0xfd45 */        {         "mulg3",  "rg,rg,wg"                    },
366 /* 0xfd46 */        {         "divg2",  "rg,mg"                       },
367 /* 0xfd47 */        {         "divg3",  "rg,rg,wg"                    },
368 /* 0xfd48 */        {         "cvtgb",  "rg,wb"                       },
369 /* 0xfd49 */        {         "cvtgw",  "rg,ww"                       },
370 /* 0xfd4a */        {         "cvtgl",  "rg,wl"                       },
371 /* 0xfd4b */        {         "cvtrgl", "rg,wl"                       },
372 /* 0xfd4c */        {         "cvtbg",  "rb,wg"                       },
373 /* 0xfd4d */        {         "cvtwg",  "rw,wg"                       },
374 /* 0xfd4e */        {         "cvtlg",  "rl,wg"                       },
375 /* 0xfd4f */        {         "acbg",             "rg,rg,mg,bg"                 },
376 
377 /* 0xfd50 */        {         "movg",             "rg,wg"                       },
378 /* 0xfd51 */        {         "cmpg",             "rg,rg"                       },
379 /* 0xfd52 */        {         "mnegg",  "rg,wg"                       },
380 /* 0xfd53 */        {         "tstg",             "rg"                          },
381 /* 0xfd54 */        {         "emodg",  "rg,rb,rg,wl,wg"    },
382 /* 0xfd55 */        {         "polyg",  "rg,rw,ab"                    },
383 /* 0xfd56 */        {         "cvtgh",  "rg,wh"                       },
384 /* 0xfd57 */        {         NULL,               NULL                          },
385 /* 0xfd58 */        {         NULL,               NULL                          },
386 /* 0xfd59 */        {         NULL,               NULL                          },
387 /* 0xfd5a */        {         NULL,               NULL                          },
388 /* 0xfd5b */        {         NULL,               NULL                          },
389 /* 0xfd5c */        {         NULL,               NULL                          },
390 /* 0xfd5d */        {         NULL,               NULL                          },
391 /* 0xfd5e */        {         NULL,               NULL                          },
392 /* 0xfd5f */        {         NULL,               NULL                          },
393 
394 /* 0xfd60 */        {         "addh2",  "rh,mh"                       },
395 /* 0xfd61 */        {         "addh3",  "rh,rh,wh"                    },
396 /* 0xfd62 */        {         "subh2",  "rh,mh"                       },
397 /* 0xfd63 */        {         "subh3",  "rh,rh,wh"                    },
398 /* 0xfd64 */        {         "mulh2",  "rh,mh"                       },
399 /* 0xfd65 */        {         "mulh3",  "rh,rh,wh"                    },
400 /* 0xfd66 */        {         "divh2",  "rh,mh"                       },
401 /* 0xfd67 */        {         "divh3",  "rh,rh,wh"                    },
402 /* 0xfd68 */        {         "cvthb",  "wh,rb"                       },
403 /* 0xfd69 */        {         "cvthw",  "rh,ww"                       },
404 /* 0xfd6a */        {         "cvthl",  "rh,wl"                       },
405 /* 0xfd6b */        {         "cvtrhl", "rh,wl"                       },
406 /* 0xfd6c */        {         "cvtbh",  "rb,wh"                       },
407 /* 0xfd6d */        {         "cvtwh",  "rw,wh"                       },
408 /* 0xfd6e */        {         "cvtlh",  "rl,wh"                       },
409 /* 0xfd6f */        {         "acbh",             "rh,rh,mh,bh"                 },
410 
411 /* 0xfd70 */        {         "movh",             "rh,wh"                       },
412 /* 0xfd71 */        {         "cmph",             "rh,rh"                       },
413 /* 0xfd72 */        {         "mnegh",  "rh,wh"                       },
414 /* 0xfd73 */        {         "tsth",             "rh"                          },
415 /* 0xfd74 */        {         "emodh"             "rh,rb,rh,wl,wh"    },
416 /* 0xfd75 */        {         "polyh",  "rh,rw,ab"                    },
417 /* 0xfd76 */        {         "cvthg",  "rh,wg"                       },
418 /* 0xfd77 */        {         NULL,               NULL                          },
419 /* 0xfd78 */        {         NULL,               NULL                          },
420 /* 0xfd79 */        {         NULL,               NULL                          },
421 /* 0xfd7a */        {         NULL,               NULL                          },
422 /* 0xfd7b */        {         NULL,               NULL                          },
423 /* 0xfd7c */        {         "clrh",             "wh"                          },
424 /* 0xfd7d */        {         "movo",             "ro,wo"                       },
425 /* 0xfd7e */        {         "*mova",  "ao,wl"                       },
426 /* 0xfd7f */        {         "*pusha", "ao"                          },
427 
428 /* 0xfd98 */        {         "cvtfh",  "rf,wh"                       },
429 /* 0xfd99 */        {         "cvtfg",  "rf,wg"                       },
430 /* 0xfdf6 */        {         "cvthf",  "rh,wf"                       },
431 /* 0xfdf7 */        {         "cvthd",  "rh,wd"                       },
432 /* 0xfffd */        {         "bugl",             "bl"                          },
433 /* 0xfffe */        {         "bugw",             "bw"                          },
434 };
435 
436 /*
437  * The following is a very stripped-down db_disasm.c, with only the logic
438  * to skip instructions.
439  */
440 
441 static u_int8_t get_byte(long);
442 static long skip_operand(long, int);
443 
444 static __inline__ u_int8_t
get_byte(long ib)445 get_byte(long ib)
446 {
447           return *((u_int8_t *)ib);
448 }
449 
450 long
skip_opcode(long ib)451 skip_opcode(long ib)
452 {
453           u_int opc;
454           int size;
455           const char *argp;   /* pointer into argument-list */
456 
457           opc = get_byte(ib++);
458           if (opc >= 0xfd) {
459                     /* two byte op-code */
460                     opc = opc << 8;
461                     opc += get_byte(ib++);
462                     argp = vax_inst2[INDEX_OPCODE(opc)].argdesc;
463           } else
464                     argp = vax_inst[opc].argdesc;
465 
466           if (argp == NULL || *argp == '\0')
467                     return ib;
468 
469           while (*argp) {
470                     switch (*argp) {
471 
472                     case 'b': /* branch displacement */
473                               switch (*(++argp)) {
474                               case 'b':
475                                         ib++;
476                                         break;
477                               case 'w':
478                                         ib += 2;
479                                         break;
480                               case 'l':
481                                         ib += 4;
482                                         break;
483                               }
484                               break;
485 
486                     case 'a': /* absolute addressing mode */
487                               /* FALLTHROUGH */
488                     default:
489                               switch (*(++argp)) {
490                               case 'b': /* Byte */
491                                         size = 1;
492                                         break;
493                               case 'w': /* Word */
494                                         size = 2;
495                                         break;
496                               case 'l': /* Long-Word */
497                               case 'f': /* F_Floating */
498                                         size = 4;
499                                         break;
500                               case 'q': /* Quad-Word */
501                               case 'd': /* D_Floating */
502                               case 'g': /* G_Floating */
503                                         size = 8;
504                                         break;
505                               case 'o': /* Octa-Word */
506                               case 'h': /* H_Floating */
507                                         size = 16;
508                                         break;
509                               default:
510                                         size = 0;
511                               }
512                               ib = skip_operand(ib, size);
513                     }
514 
515                     if (!*argp || !*++argp)
516                               break;
517                     if (*argp++ != ',')
518                               break;
519           }
520 
521           return ib;
522 }
523 
524 static long
skip_operand(long ib,int size)525 skip_operand(long ib, int size)
526 {
527           int c = get_byte(ib++);
528 
529           switch (c >> 4) { /* mode */
530           case 4:             /* indexed */
531                     ib = skip_operand(ib, 0);
532                     break;
533 
534           case 9:             /* autoincrement deferred */
535                     if (c == 0x9f) {    /* pc: immediate deferred */
536                               /*
537                                * addresses are always longwords!
538                                */
539                               ib += 4;
540                     }
541                     break;
542           case 8:             /* autoincrement */
543                     if (c == 0x8f) {    /* pc: immediate ==> special syntax */
544                               ib += size;
545                     }
546                     break;
547 
548           case 11:  /* byte displacement deferred/ relative deferred  */
549           case 10:  /* byte displacement / relative mode */
550                     ib++;
551                     break;
552 
553           case 13:            /* word displacement deferred */
554           case 12:            /* word displacement */
555                     ib += 2;
556                     break;
557 
558           case 15:            /* long displacement referred */
559           case 14:            /* long displacement */
560                     ib += 4;
561                     break;
562           }
563 
564           return ib;
565 }
566