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