xref: /netbsd-src/sys/arch/vax/vax/opcodes.c (revision 6a6027692662ba623e7bf5274322989a7b5d1440)
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