#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: opcodes.c,v 1.5 2025/12/11 05:18:03 andvar Exp $");
#include <sys/param.h>
#include <sys/types.h>
#include <vax/vax/db_disasm.h>
vax_instr_t vax_inst[256] = {
{ "halt", NULL },
{ "nop", NULL },
{ "rei", NULL },
{ "bpt", NULL },
{ "ret", NULL },
{ "rsb", NULL },
{ "ldpctx", NULL },
{ "svpctx", NULL },
{ "cvtps", "rw,ab,rw,ab" },
{ "cvtsp", "rw,ab,rw,ab" },
{ "index", "rl,rl,rl,rl,rl,wl" },
{ "crc", "ab,rl,rw,ab" },
{ "prober", "rb,rw,ab" },
{ "probew", "rb,rw,ab" },
{ "insque", "ab,wl" },
{ "remque", "ab,wl" },
{ "bsbb", "bb" },
{ "brb", "bb" },
{ "*bneq", "bb" },
{ "*beql", "bb" },
{ "bgtr", "bb" },
{ "bleq", "bb" },
{ "jsb", "ab" },
{ "jmp", "ab" },
{ "bgeq", "bb" },
{ "blss", "bb" },
{ "bgtru", "bb" },
{ "blequ", "bb" },
{ "bvc", "bb" },
{ "bvs", "bb" },
{ "*bcc", "bb" },
{ "*bcs", "bb" },
{ "addp4", "rw,ab,rw,ab" },
{ "addp6", "rw,ab,rw,ab,rw,ab" },
{ "subp4", "rw,ab,rw,ab" },
{ "subp6", "rw,ab,rw,ab,rw,ab" },
{ "cvtpt", "rw,ab,ab,rw,ab" },
{ "mulp", "rw,ab,rw,ab,rw,ab" },
{ "cvttp", "rw,ab,ab,rw,ab" },
{ "divp", "rw,ab,rw,ab,rw,ab" },
{ "movc3", "rw,ab,ab" },
{ "cmpc3", "rw,ab,ab" },
{ "scanc", "rw,ab,ab,rb" },
{ "spanc", "rw,ab,ab,rb" },
{ "movc5", "rw,ab,rb,rw,ab" },
{ "cmpc5", "rw,ab,rb,rw,ab" },
{ "movtc", "rw,ab,rb,ab,rw,ab" },
{ "movtuc", "rw,ab,rb,ab,rw,ab" },
{ "bsbw", "bw" },
{ "brw", "bw" },
{ "cvtwl", "rw,wl" },
{ "cvtwb", "rw,wb" },
{ "movp", "rw,ab,ab" },
{ "cmpp3", "rw,ab,ab" },
{ "cvtpl", "rw,ab,wl" },
{ "cmpp4", "rw,ab,rw,ab" },
{ "editpc", "rw,ab,ab,ab" },
{ "matchc", "rw,ab,rw,ab" },
{ "locc", "rb,rw,ab" },
{ "skpc", "rb,rw,ab" },
{ "movzwl", "rw,wl" },
{ "acbw", "rw,rw,mw,bw" },
{ "movaw", "aw,wl" },
{ "pushaw", "aw" },
{ "addf2", "rf,mf" },
{ "addf3", "rf,rf,wf" },
{ "subf2", "rf,mf" },
{ "subf3", "rf,rf,wf" },
{ "mulf2", "rf,mf" },
{ "mulf3", "rf,rf,wf" },
{ "divf2", "rf,mf" },
{ "divf3", "rf,rf,wf" },
{ "cvtfb", "rf,wb" },
{ "cvtfw", "rf,ww" },
{ "cvtfl", "rf,wl" },
{ "cvtrfl", "rf,wl" },
{ "cvtbf", "rb,wf" },
{ "cvtwf", "rw,wf" },
{ "cvtlf", "rl,wf" },
{ "acbf", "rf,rf,rf,bw" },
{ "movf", "rf,wf" },
{ "cmpf", "rf,rf" },
{ "mnegf", "rf,wf" },
{ "tstf", "rf" },
{ "emodf", "rf,rb,rf,wl,wf" },
{ "polyf", "rf,rw,ab" },
{ "cvtfd", "rf,wd" },
{ "-reserved-", NULL },
{ "adawi", "rw,mw" },
{ "-reserved-", NULL },
{ "-reserved-", NULL },
{ "-reserved-", NULL },
{ "insqhi", "ab,aq" },
{ "insqti", "ab,aq" },
{ "remqhi", "aq,wl" },
{ "remqti", "aq,wl" },
{ "addd2", "rd,md" },
{ "addd3", "rd,rd,wd" },
{ "subd2", "rd,md" },
{ "subd3", "rd,rd,wd" },
{ "muld2", "rd,md" },
{ "muld3", "rd,rd,wd" },
{ "divd2", "rd,md" },
{ "divd3", "rd,rd,wd" },
{ "cvtdb", "rd,wb" },
{ "cvtdw", "rd,ww" },
{ "cvtdl", "rd,wl" },
{ "cvtrdl", "rd,wl" },
{ "cvtbd", "rb,wd" },
{ "cvtwd", "rw,wd" },
{ "cvtld", "rl,wd" },
{ "acbd", "rd,rd,md,bw" },
{ "movd", "rd,wd" },
{ "cmpd", "rd,rd" },
{ "mnegd", "rd,wd" },
{ "tstd", "rd" },
{ "emodd", "rd,rb,rd,wl,wd" },
{ "polyd", "rd,rw,ab" },
{ "cvtdf", "rd,wf" },
{ "-reserved-", NULL },
{ "ashl", "rb,rl,wl" },
{ "ashq", "rb,rq,wq" },
{ "emul", "rl,rl,rl,wq" },
{ "ediv", "rl,rq,wl,wl" },
{ "*clrq", "wq" },
{ "movq", "rq,wq" },
{ "*movaq", "aq,wl" },
{ "*pushaq", "aq" },
{ "addb2", "rb,mb" },
{ "addb3", "rb,rb,wb" },
{ "subb2", "rb,mb" },
{ "subb3", "rb,rb,wb" },
{ "mulb2", "rb,mb" },
{ "mulb3", "rb,rb,wb" },
{ "divb2", "rb,mb" },
{ "divb3", "rb,rb,wb" },
{ "bisb2", "rb,mb" },
{ "bisb3", "rb,rb,wb" },
{ "bicb2", "rb,mb" },
{ "bicb3", "rb,rb,wb" },
{ "xorb2", "rb,mb" },
{ "xorb3", "rb,rb,wb" },
{ "mnegb", "rb,wb" },
{ "caseb", "rb,rb,rb,bw-list" },
{ "movb", "rb,wb" },
{ "cmpb", "rb,rb" },
{ "mcomb", "rb,wb" },
{ "bitb", "rb,rb" },
{ "clrb", "wb" },
{ "tstb", "rb" },
{ "incb", "mb" },
{ "decb", "mb" },
{ "cvtbl", "rb,wl" },
{ "cvtbw", "rb,ww" },
{ "movzbl", "rb,wl" },
{ "movzbw", "wb,ww" },
{ "rotl", "rb,rl,wl" },
{ "acbb", "rb,rb,mb,bw" },
{ "movab", "ab,wl" },
{ "pushab", "ab" },
{ "addw2", "rw,mw" },
{ "addw3", "rw,rw,ww" },
{ "subw2", "rw,mw" },
{ "subw3", "rw,rw,ww" },
{ "mulw2", "rw,mw" },
{ "mulw3", "rw,rw,ww" },
{ "divw2", "rw,mw" },
{ "divw3", "rw,rw,ww" },
{ "bisw2", "rw,mw" },
{ "bisw3", "rw,rw,ww" },
{ "bicw2", "rw,mw" },
{ "bicw3", "rw,rw,ww" },
{ "xorw2", "rw,mw" },
{ "xorw3", "rw,rw,ww" },
{ "mnegw", "rw,ww" },
{ "casew", "rw,rw,rw,bw-list" },
{ "movw", "rw,ww" },
{ "cmpw", "rw,rw" },
{ "mcomw", "rw,ww" },
{ "bitw", "rw,rw" },
{ "clrw", "mw" },
{ "tstw", "rw" },
{ "incw", "mw" },
{ "decw", "mw" },
{ "bispsw", "rw" },
{ "bicpsw", "rw" },
{ "popr", "rw" },
{ "pushr", "rw" },
{ "chmk", "rw" },
{ "chme", "rw" },
{ "chms", "rw" },
{ "chmu", "rw" },
{ "addl2", "rl,ml" },
{ "addl3", "rl,rl,wl" },
{ "subl2", "rl,ml" },
{ "subl3", "rl,rl,wl" },
{ "mull2", "rl,ml" },
{ "mull3", "rl,rl,wl" },
{ "divl2", "rl,ml" },
{ "divl3", "rl,rl,wl" },
{ "bisl2", "rl,ml" },
{ "bisl3", "rl,rl,wl" },
{ "bicl2", "rl,ml" },
{ "bicl3", "rl,rl,wl" },
{ "xorl2", "rl,ml" },
{ "xorl3", "rl,rl,wl" },
{ "mnegl", "rl,wl" },
{ "casel", "rl,rl,rl,bw-list" },
{ "movl", "rl,wl" },
{ "cmpl", "rl,rl" },
{ "mcoml", "rl,wl" },
{ "bitl", "rl,rl" },
{ "*clrl", "wl" },
{ "tstl", "rl" },
{ "incl", "ml" },
{ "decl", "ml" },
{ "adwc", "rl,ml" },
{ "sbwc", "rl,ml" },
{ "mtpr", "rl,rl" },
{ "mfpr", "rl,wl" },
{ "movpsl", "wl" },
{ "pushl", "rl" },
{ "*moval", "al,wl" },
{ "*pushal", "al" },
{ "bbs", "rl,vb,bb" },
{ "bbc", "rl,vb,bb" },
{ "bbss", "rl,vb,bb" },
{ "bbcs", "rl,vb,bb" },
{ "bbsc", "rl,vb,bb" },
{ "bbcc", "rl,vb,bb" },
{ "bbssi", "rl,vb,bb" },
{ "bbcci", "rl,vb,bb" },
{ "blbs", "rl,bb" },
{ "blbc", "rl,bb" },
{ "ffs", "rl,rb,vb" },
{ "ffc", "rl,rb,vb" },
{ "cmpv", "rl,rb,vb,rl" },
{ "cmpzv", "rl,rb,vb,rl" },
{ "extv", "rl,rb,vb,wl" },
{ "extzv", "rl,rb,vb,wl" },
{ "insv", "rl,rl,rb,vb" },
{ "acbl", "rl,rl,ml,bw" },
{ "aoblss", "rl,ml,bb" },
{ "aobleq", "rl,ml,bb" },
{ "sobgeq", "ml,bb" },
{ "sobgtr", "ml,bb" },
{ "cvtlb", "rl,wb" },
{ "cvtlw", "rl,ww" },
{ "ashp", "rb,rw,ab,rb,rw,ab" },
{ "cvtlp", "rl,rw,ab" },
{ "callg", "ab,ab" },
{ "calls", "rl,ab" },
{ "xfc", "?" },
{ "-reserved-", NULL },
{ "-reserved-", NULL },
{ "-reserved-", NULL },
};
vax_instr_t vax_inst2[0x56] = {
{ NULL, NULL },
{ NULL, NULL },
{ "cvtdh", "rd,wh" },
{ "cvtgf", "rg,wf" },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ "addg2", "rg,mg" },
{ "addg3", "rg,rg,wg" },
{ "subg2", "rg,mg" },
{ "subg3", "rg,rg,wg" },
{ "mulg2", "rg,mg" },
{ "mulg3", "rg,rg,wg" },
{ "divg2", "rg,mg" },
{ "divg3", "rg,rg,wg" },
{ "cvtgb", "rg,wb" },
{ "cvtgw", "rg,ww" },
{ "cvtgl", "rg,wl" },
{ "cvtrgl", "rg,wl" },
{ "cvtbg", "rb,wg" },
{ "cvtwg", "rw,wg" },
{ "cvtlg", "rl,wg" },
{ "acbg", "rg,rg,mg,bg" },
{ "movg", "rg,wg" },
{ "cmpg", "rg,rg" },
{ "mnegg", "rg,wg" },
{ "tstg", "rg" },
{ "emodg", "rg,rb,rg,wl,wg" },
{ "polyg", "rg,rw,ab" },
{ "cvtgh", "rg,wh" },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ "addh2", "rh,mh" },
{ "addh3", "rh,rh,wh" },
{ "subh2", "rh,mh" },
{ "subh3", "rh,rh,wh" },
{ "mulh2", "rh,mh" },
{ "mulh3", "rh,rh,wh" },
{ "divh2", "rh,mh" },
{ "divh3", "rh,rh,wh" },
{ "cvthb", "wh,rb" },
{ "cvthw", "rh,ww" },
{ "cvthl", "rh,wl" },
{ "cvtrhl", "rh,wl" },
{ "cvtbh", "rb,wh" },
{ "cvtwh", "rw,wh" },
{ "cvtlh", "rl,wh" },
{ "acbh", "rh,rh,mh,bh" },
{ "movh", "rh,wh" },
{ "cmph", "rh,rh" },
{ "mnegh", "rh,wh" },
{ "tsth", "rh" },
{ "emodh" "rh,rb,rh,wl,wh" },
{ "polyh", "rh,rw,ab" },
{ "cvthg", "rh,wg" },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ NULL, NULL },
{ "clrh", "wh" },
{ "movo", "ro,wo" },
{ "*mova", "ao,wl" },
{ "*pusha", "ao" },
{ "cvtfh", "rf,wh" },
{ "cvtfg", "rf,wg" },
{ "cvthf", "rh,wf" },
{ "cvthd", "rh,wd" },
{ "bugl", "bl" },
{ "bugw", "bw" },
};
static u_int8_t get_byte(long);
static long skip_operand(long, int);
static __inline__ u_int8_t
get_byte(long ib)
{
return *((u_int8_t *)ib);
}
long
skip_opcode(long ib)
{
u_int opc;
int size;
const char *argp;
opc = get_byte(ib++);
if (opc >= 0xfd) {
opc = opc << 8;
opc += get_byte(ib++);
argp = vax_inst2[INDEX_OPCODE(opc)].argdesc;
} else
argp = vax_inst[opc].argdesc;
if (argp == NULL || *argp == '\0')
return ib;
while (*argp) {
switch (*argp) {
case 'b':
switch (*(++argp)) {
case 'b':
ib++;
break;
case 'w':
ib += 2;
break;
case 'l':
ib += 4;
break;
}
break;
case 'a':
default:
switch (*(++argp)) {
case 'b':
size = 1;
break;
case 'w':
size = 2;
break;
case 'l':
case 'f':
size = 4;
break;
case 'q':
case 'd':
case 'g':
size = 8;
break;
case 'o':
case 'h':
size = 16;
break;
default:
size = 0;
}
ib = skip_operand(ib, size);
}
if (!*argp || !*++argp)
break;
if (*argp++ != ',')
break;
}
return ib;
}
static long
skip_operand(long ib, int size)
{
int c = get_byte(ib++);
switch (c >> 4) {
case 4:
ib = skip_operand(ib, 0);
break;
case 9:
if (c == 0x9f) {
ib += 4;
}
break;
case 8:
if (c == 0x8f) {
ib += size;
}
break;
case 11:
case 10:
ib++;
break;
case 13:
case 12:
ib += 2;
break;
case 15:
case 14:
ib += 4;
break;
}
return ib;
}