Home | History | Annotate | Line # | Download | only in vax
      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
    445 get_byte(long ib)
    446 {
    447 	return *((u_int8_t *)ib);
    448 }
    449 
    450 long
    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
    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