ack/mach/ns/as/mach3.c

458 lines
19 KiB
C

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
#define RCSID3 "$Id$"
/*
* NS 16032 keywords
*/
/* Registers */
{0, REG, 0, "r0"},
{0, REG, 1, "r1"},
{0, REG, 2, "r2"},
{0, REG, 3, "r3"},
{0, REG, 4, "r4"},
{0, REG, 5, "r5"},
{0, REG, 6, "r6"},
{0, REG, 7, "r7"},
{0, FREG, 0, "f0"},
{0, FREG, 1, "f1"},
{0, FREG, 2, "f2"},
{0, FREG, 3, "f3"},
{0, FREG, 4, "f4"},
{0, FREG, 5, "f5"},
{0, FREG, 6, "f6"},
{0, FREG, 7, "f7"},
/* CPU dedicated registers */
{0, AREG, 0x0, "us"},
{0, AREG, 0x8, "fp"},
{0, AREG, 0x9, "sp"},
{0, AREG, 0xA, "sb"},
{0, AREG, 0xD, "psr"},
{0, AREG, 0xE, "intbase"},
{0, AREG, 0xF, "mod"},
/* Tokens dedicated to addressing modes */
{0, TOS, 0x17, "tos"},
{0, EXTERNAL, 0x16, "external"},
{0, PC, 0, "pc"},
{0, INDICATOR, 'b', "b"},
{0, INDICATOR, 'c', "c"},
{0, INDICATOR, 'd', "d"},
{0, INDICATOR, 'f', "f"},
{0, INDICATOR, 'i', "i"},
{0, INDICATOR, 'm', "m"},
{0, INDICATOR, 'q', "q"},
{0, INDICATOR, 'u', "u"},
{0, INDICATOR, 'w', "w"},
/* Memory management registers */
{0, MREG, 0x0, "bpr0"},
{0, MREG, 0x1, "bpr1"},
{0, MREG, 0x4, "pf0"},
{0, MREG, 0x5, "pf1"},
{0, MREG, 0x8, "sc"},
{0, MREG, 0xA, "msr"},
{0, MREG, 0xB, "bcnt"},
{0, MREG, 0xC, "ptb0"},
{0, MREG, 0xD, "ptb1"},
{0, MREG, 0xF, "eia"},
/* Instruction types */
/* Integer instructions */
{0, ADD_I, mk_op2(0x5,I_BYTE,I_BYTE), "movb"},
{0, ADD_I, mk_op2(0x5,I_WORD,I_WORD), "movw"},
{0, ADD_I, mk_op2(0x5,I_DOUBLE,I_DOUBLE), "movd"},
{0, ADD_I, mk_op2(0x1,I_BYTE,I_BYTE), "cmpb"},
{0, ADD_I, mk_op2(0x1,I_WORD,I_WORD), "cmpw"},
{0, ADD_I, mk_op2(0x1,I_DOUBLE,I_DOUBLE), "cmpd"},
{0, ADD_I, mk_op2(0x0,I_BYTE,I_BYTE), "addb"},
{0, ADD_I, mk_op2(0x0,I_WORD,I_WORD), "addw"},
{0, ADD_I, mk_op2(0x0,I_DOUBLE,I_DOUBLE), "addd"},
{0, ADD_I, mk_op2(0x4,I_BYTE,I_BYTE), "addcb"},
{0, ADD_I, mk_op2(0x4,I_WORD,I_WORD), "addcw"},
{0, ADD_I, mk_op2(0x4,I_DOUBLE,I_DOUBLE), "addcd"},
{0, ADD_I, mk_op2(0x8,I_BYTE,I_BYTE), "subb"},
{0, ADD_I, mk_op2(0x8,I_WORD,I_WORD), "subw"},
{0, ADD_I, mk_op2(0x8,I_DOUBLE,I_DOUBLE), "subd"},
{0, ADD_I, mk_op2(0xC,I_BYTE,I_BYTE), "subcb"},
{0, ADD_I, mk_op2(0xC,I_WORD,I_WORD), "subcw"},
{0, ADD_I, mk_op2(0xC,I_DOUBLE,I_DOUBLE), "subcd"},
{0, COM, mk_op2(0x8,I_BYTE,I_BYTE), "negb"},
{0, COM, mk_op2(0x8,I_WORD,I_WORD), "negw"},
{0, COM, mk_op2(0x8,I_DOUBLE,I_DOUBLE), "negd"},
{0, COM, mk_op2(0xC,I_BYTE,I_BYTE), "absb"},
{0, COM, mk_op2(0xC,I_WORD,I_WORD), "absw"},
{0, COM, mk_op2(0xC,I_DOUBLE,I_DOUBLE), "absd"},
{0, MUL_I, mk_op2(0x8,I_BYTE,I_BYTE), "mulb"},
{0, MUL_I, mk_op2(0x8,I_WORD,I_WORD), "mulw"},
{0, MUL_I, mk_op2(0x8,I_DOUBLE,I_DOUBLE), "muld"},
{0, MUL_I, mk_op2(0xF,I_BYTE,I_BYTE), "divb"},
{0, MUL_I, mk_op2(0xF,I_WORD,I_WORD), "divw"},
{0, MUL_I, mk_op2(0xF,I_DOUBLE,I_DOUBLE), "divd"},
{0, MUL_I, mk_op2(0xE,I_BYTE,I_BYTE), "modb"},
{0, MUL_I, mk_op2(0xE,I_WORD,I_WORD), "modw"},
{0, MUL_I, mk_op2(0xE,I_DOUBLE,I_DOUBLE), "modd"},
{0, MUL_I, mk_op2(0xC,I_BYTE,I_BYTE), "quob"},
{0, MUL_I, mk_op2(0xC,I_WORD,I_WORD), "quow"},
{0, MUL_I, mk_op2(0xC,I_DOUBLE,I_DOUBLE), "quod"},
{0, MUL_I, mk_op2(0xD,I_BYTE,I_BYTE), "remb"},
{0, MUL_I, mk_op2(0xD,I_WORD,I_WORD), "remw"},
{0, MUL_I, mk_op2(0xD,I_DOUBLE,I_DOUBLE), "remd"},
{0, ADD_I, mk_op2(0xA,I_BYTE,I_BYTE), "andb"},
{0, ADD_I, mk_op2(0xA,I_WORD,I_WORD), "andw"},
{0, ADD_I, mk_op2(0xA,I_DOUBLE,I_DOUBLE), "andd"},
{0, ADD_I, mk_op2(0x6,I_BYTE,I_BYTE), "orb"},
{0, ADD_I, mk_op2(0x6,I_WORD,I_WORD), "orw"},
{0, ADD_I, mk_op2(0x6,I_DOUBLE,I_DOUBLE), "ord"},
{0, ADD_I, mk_op2(0x2,I_BYTE,I_BYTE), "bicb"},
{0, ADD_I, mk_op2(0x2,I_WORD,I_WORD), "bicw"},
{0, ADD_I, mk_op2(0x2,I_DOUBLE,I_DOUBLE), "bicd"},
{0, ADD_I, mk_op2(0xE,I_BYTE,I_BYTE), "xorb"},
{0, ADD_I, mk_op2(0xE,I_WORD,I_WORD), "xorw"},
{0, ADD_I, mk_op2(0xE,I_DOUBLE,I_DOUBLE), "xord"},
{0, COM, mk_op2(0xD,I_BYTE,I_BYTE), "comb"},
{0, COM, mk_op2(0xD,I_WORD,I_WORD), "comw"},
{0, COM, mk_op2(0xD,I_DOUBLE,I_DOUBLE), "comd"},
{0, COM, mk_op2(0x1,I_BYTE,I_BYTE), "ashb"},
{0, COM, mk_op2(0x1,I_BYTE,I_WORD), "ashw"},
{0, COM, mk_op2(0x1,I_BYTE,I_DOUBLE), "ashd"},
{0, COM, mk_op2(0x5,I_BYTE,I_BYTE), "lshb"},
{0, COM, mk_op2(0x5,I_BYTE,I_WORD), "lshw"},
{0, COM, mk_op2(0x5,I_BYTE,I_DOUBLE), "lshd"},
{0, COM, mk_op2(0x0,I_BYTE,I_BYTE), "rotb"},
{0, COM, mk_op2(0x0,I_BYTE,I_WORD), "rotw"},
{0, COM, mk_op2(0x0,I_BYTE,I_DOUBLE), "rotd"},
{0, MOVID, mk_op2(0x4,I_BYTE,I_WORD), "movxbw"},
{0, MOVID, mk_op2(0x7,I_BYTE,I_DOUBLE), "movxbd"},
{0, MOVID, mk_op2(0x7,I_WORD,I_DOUBLE), "movxwd"},
{0, MOVID, mk_op2(0x5,I_BYTE,I_WORD), "movzbw"},
{0, MOVID, mk_op2(0x6,I_BYTE,I_DOUBLE), "movzbd"},
{0, MOVID, mk_op2(0x6,I_WORD,I_DOUBLE), "movzwd"},
#ifdef UNUSED
{0, MOVID, mk_op2(0x7,I_DOUBLE,I_DOUBLE), "movxdd"},
{0, MOVID, mk_op2(0x6,I_DOUBLE,I_DOUBLE), "movzdd"},
#endif
{0, ADD_I, mk_op2(0x9,I_DOUBLE,I_DOUBLE), "addr"},
/* Quick integer instructions */
{0, MOVQ, mk_op1(0x5,I_BYTE), "movqb"},
{0, MOVQ, mk_op1(0x5,I_WORD), "movqw"},
{0, MOVQ, mk_op1(0x5,I_DOUBLE), "movqd"},
{0, MOVQ, mk_op1(0x1,I_BYTE), "cmpqb"},
{0, MOVQ, mk_op1(0x1,I_WORD), "cmpqw"},
{0, MOVQ, mk_op1(0x1,I_DOUBLE), "cmpqd"},
{0, MOVQ, mk_op1(0x0,I_BYTE), "addqb"},
{0, MOVQ, mk_op1(0x0,I_WORD), "addqw"},
{0, MOVQ, mk_op1(0x0,I_DOUBLE), "addqd"},
/* Extended integer instructions */
{0, MUL_I, mk_op2(0x9,I_BYTE,I_BYTE), "meib"},
{0, MUL_I, mk_op2(0x9,I_WORD,I_WORD), "meiw"},
{0, MUL_I, mk_op2(0x9,I_DOUBLE,I_DOUBLE), "meid"},
{0, MUL_I, mk_op2(0xB,I_BYTE,I_BYTE), "deib"},
{0, MUL_I, mk_op2(0xB,I_WORD,I_WORD), "deiw"},
{0, MUL_I, mk_op2(0xB,I_DOUBLE,I_DOUBLE), "deid"},
/* Boolean instructions */
{0, COM, mk_op2(0x9,I_BYTE,I_BYTE), "notb"},
{0, COM, mk_op2(0x9,I_WORD,I_WORD), "notw"},
{0, COM, mk_op2(0x9,I_DOUBLE,I_DOUBLE), "notd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_EQ), "seqb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_EQ), "seqw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_EQ), "seqd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_NE), "sneb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_NE), "snew"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_NE), "sned"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_CS), "scsb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_CS), "scsw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_CS), "scsd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_CC), "sccb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_CC), "sccw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_CC), "sccd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_HI), "shib"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_HI), "shiw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_HI), "shid"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_LS), "slsb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_LS), "slsw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_LS), "slsd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_GT), "sgtb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_GT), "sgtw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_GT), "sgtd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_LE), "sleb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_LE), "slew"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_LE), "sled"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_FS), "sfsb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_FS), "sfsw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_FS), "sfsd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_FC), "sfcb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_FC), "sfcw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_FC), "sfcd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_LO), "slob"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_LO), "slow"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_LO), "slod"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_HS), "shsb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_HS), "shsw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_HS), "shsd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_LT), "sltb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_LT), "sltw"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_LT), "sltd"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_GE), "sgeb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_GE), "sgew"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_GE), "sged"},
#ifdef UNUSED
{0, SEQ, mk_op1c(0x3,I_BYTE,B_TRUE), "strueb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_TRUE), "struew"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_TRUE), "strued"},
{0, SEQ, mk_op1c(0x3,I_BYTE,B_FALSE), "sfalseb"},
{0, SEQ, mk_op1c(0x3,I_WORD,B_FALSE), "sfalsew"},
{0, SEQ, mk_op1c(0x3,I_DOUBLE,B_FALSE), "sfalsed"},
#endif
/* Bit instructions */
{0, ADD_I, mk_op2(0xD,I_BYTE,I_BYTE), "tbitb"},
{0, ADD_I, mk_op2(0xD,I_WORD,I_WORD), "tbitw"},
{0, ADD_I, mk_op2(0xD,I_DOUBLE,I_DOUBLE), "tbitd"},
{0, COM, mk_op2(0x6,I_BYTE,I_BYTE), "sbitb"},
{0, COM, mk_op2(0x6,I_WORD,I_WORD), "sbitw"},
{0, COM, mk_op2(0x6,I_DOUBLE,I_DOUBLE), "sbitd"},
{0, COM, mk_op2(0x7,I_BYTE,I_BYTE), "sbitib"},
{0, COM, mk_op2(0x7,I_WORD,I_WORD), "sbitiw"},
{0, COM, mk_op2(0x7,I_DOUBLE,I_DOUBLE), "sbitid"},
{0, COM, mk_op2(0x2,I_BYTE,I_BYTE), "cbitb"},
{0, COM, mk_op2(0x2,I_WORD,I_WORD), "cbitw"},
{0, COM, mk_op2(0x2,I_DOUBLE,I_DOUBLE), "cbitd"},
{0, COM, mk_op2(0x3,I_BYTE,I_BYTE), "cbitib"},
{0, COM, mk_op2(0x3,I_WORD,I_WORD), "cbitiw"},
{0, COM, mk_op2(0x3,I_DOUBLE,I_DOUBLE), "cbitid"},
{0, COM, mk_op2(0xE,I_BYTE,I_BYTE), "ibitb"},
{0, COM, mk_op2(0xE,I_WORD,I_WORD), "ibitw"},
{0, COM, mk_op2(0xE,I_DOUBLE,I_DOUBLE), "ibitd"},
{0, CHECK, mk_op1(0x1,I_DOUBLE), "cvtp"},
{0, FFS, mk_op2c(0x5,I_BYTE,I_BYTE,0), "ffsb"},
{0, FFS, mk_op2c(0x5,I_WORD,I_BYTE,0), "ffsw"},
{0, FFS, mk_op2c(0x5,I_DOUBLE,I_BYTE,0), "ffsd"},
/* Field instructions */
{0, INS, mk_op2(0x0,I_BYTE,I_BYTE), "extb"},
{0, INS, mk_op2(0x0,I_WORD,I_WORD), "extw"},
{0, INS, mk_op2(0x0,I_DOUBLE,I_DOUBLE), "extd"},
{0, INSS, mk_op2(0x3,I_BYTE,I_BYTE), "extsb"},
{0, INSS, mk_op2(0x3,I_WORD,I_WORD), "extsw"},
{0, INSS, mk_op2(0x3,I_DOUBLE,I_DOUBLE), "extsd"},
{0, INS, mk_op2(0x2,I_BYTE,I_BYTE), "insb"},
{0, INS, mk_op2(0x2,I_WORD,I_WORD), "insw"},
{0, INS, mk_op2(0x2,I_DOUBLE,I_DOUBLE), "insd"},
{0, INSS, mk_op2(0x2,I_BYTE,I_BYTE), "inssb"},
{0, INSS, mk_op2(0x2,I_WORD,I_WORD), "inssw"},
{0, INSS, mk_op2(0x2,I_DOUBLE,I_DOUBLE), "inssd"},
/* String instructions */
{0, MOVS, mk_op1c(0x0,I_BYTE,0), "movsb"},
{0, MOVS, mk_op1c(0x0,I_WORD,0), "movsw"},
{0, MOVS, mk_op1c(0x0,I_DOUBLE,0), "movsd"},
{0, MOVS, mk_op1c(0x0,I_BYTE,SO_TRANS), "movst"},
{0, MOVS, mk_op1c(0x1,I_BYTE,0), "cmpsb"},
{0, MOVS, mk_op1c(0x1,I_WORD,0), "cmpsw"},
{0, MOVS, mk_op1c(0x1,I_DOUBLE,0), "cmpsd"},
{0, MOVS, mk_op1c(0x1,I_BYTE,SO_TRANS), "cmpst"},
{0, MOVS, mk_op1c(0x3,I_BYTE,0), "skpsb"},
{0, MOVS, mk_op1c(0x3,I_WORD,0), "skpsw"},
{0, MOVS, mk_op1c(0x3,I_DOUBLE,0), "skpsd"},
{0, MOVS, mk_op1c(0x3,I_BYTE,SO_TRANS), "skpst"},
/* Block instructions */
{0, MOVM, mk_op2(0x0,I_BYTE,I_BYTE), "movmb"},
{0, MOVM, mk_op2(0x0,I_WORD,I_WORD), "movmw"},
{0, MOVM, mk_op2(0x0,I_DOUBLE,I_DOUBLE), "movmd"},
{0, MOVM, mk_op2(0x1,I_BYTE,I_BYTE), "cmpmb"},
{0, MOVM, mk_op2(0x1,I_WORD,I_WORD), "cmpmw"},
{0, MOVM, mk_op2(0x1,I_DOUBLE,I_DOUBLE), "cmpmd"},
/* Packed decimal instructions */
{0, COM, mk_op2(0xF,I_BYTE,I_BYTE), "addpb"},
{0, COM, mk_op2(0xF,I_WORD,I_WORD), "addpw"},
{0, COM, mk_op2(0xF,I_DOUBLE,I_DOUBLE), "addpd"},
{0, COM, mk_op2(0xB,I_BYTE,I_BYTE), "subpb"},
{0, COM, mk_op2(0xB,I_WORD,I_WORD), "subpw"},
{0, COM, mk_op2(0xB,I_DOUBLE,I_DOUBLE), "subpd"},
/* Array instructions */
{0, CHECK, mk_op2(0x4,I_BYTE,I_BYTE), "indexb"},
{0, CHECK, mk_op2(0x4,I_WORD,I_WORD), "indexw"},
{0, CHECK, mk_op2(0x4,I_DOUBLE,I_DOUBLE), "indexd"},
{0, CHECK, mk_op2(0x3,I_BYTE,I_BYTE), "checkb"},
{0, CHECK, mk_op2(0x3,I_WORD,I_WORD), "checkw"},
{0, CHECK, mk_op2(0x3,I_DOUBLE,I_DOUBLE), "checkd"},
/* Processor control instructions */
{0, JUMP, mk_op1(0x4,I_DOUBLE), "jump"},
{0, BR, mk_c(B_EQ), "beq"},
{0, BR, mk_c(B_NE), "bne"},
{0, BR, mk_c(B_CS), "bcs"},
{0, BR, mk_c(B_CC), "bcc"},
{0, BR, mk_c(B_HI), "bhi"},
{0, BR, mk_c(B_LS), "bls"},
{0, BR, mk_c(B_GT), "bgt"},
{0, BR, mk_c(B_LE), "ble"},
{0, BR, mk_c(B_FS), "bfs"},
{0, BR, mk_c(B_FC), "bfc"},
{0, BR, mk_c(B_LO), "blo"},
{0, BR, mk_c(B_HS), "bhs"},
{0, BR, mk_c(B_LT), "blt"},
{0, BR, mk_c(B_GE), "bge"},
{0, BR, mk_c(B_TRUE), "br"},
#ifdef UNUSED
{0, BR, mk_c(B_FALSE), "bfalse"},
#endif
{0, ADJSP, mk_op1(0xE,I_BYTE), "caseb"},
{0, ADJSP, mk_op1(0xE,I_WORD), "casew"},
{0, ADJSP, mk_op1(0xE,I_DOUBLE), "cased"},
{0, ACB, mk_op1(0x4,I_BYTE), "acbb"},
{0, ACB, mk_op1(0x4,I_WORD), "acbw"},
{0, ACB, mk_op1(0x4,I_DOUBLE), "acbd"},
{0, JSR, mk_op1(0xC,I_DOUBLE), "jsr"},
{0, BSR, mk_op(0x0), "bsr"},
{0, RET, mk_op(0x1), "ret"},
{0, RET, mk_op(0x2), "cxp"},
{0, ADJSP, mk_op1(0x0,I_DOUBLE), "cxpd"},
{0, RET, mk_op(0x3), "rxp"},
{0, RET, mk_op(0x4), "rett"},
{0, WAIT, mk_op(0x5), "reti"},
{0, WAIT, mk_op(0xC), "dia"},
/* Processor service instructions */
{0, ADJSP, mk_op1(0xA,I_BYTE), "adjspb"},
{0, ADJSP, mk_op1(0xA,I_WORD), "adjspw"},
{0, ADJSP, mk_op1(0xA,I_DOUBLE), "adjspd"},
{0, ADJSP, mk_op1(0x2,I_BYTE), "bicpsrb"},
{0, ADJSP, mk_op1(0x2,I_WORD), "bicpsrw"},
{0, ADJSP, mk_op1(0x6,I_BYTE), "bispsrb"},
{0, ADJSP, mk_op1(0x6,I_WORD), "bispsrw"},
#ifdef UNUSED
{0, ADJSP, mk_op1(0x2,I_DOUBLE), "bicpsrd"},
{0, ADJSP, mk_op1(0x6,I_DOUBLE), "bispsrd"},
#endif
{0, SAVE, mk_op(0x6), "save"},
{0, SAVE, mk_op(0x7), "restore"},
{0, ENTER, mk_op(0x8), "enter"},
{0, SAVE, mk_op(0x9), "exit"},
{0, LPR, mk_op1(0x6,I_BYTE), "lprb"},
{0, LPR, mk_op1(0x6,I_WORD), "lprw"},
{0, LPR, mk_op1(0x6,I_DOUBLE), "lprd"},
{0, LPR, mk_op1(0x2,I_BYTE), "sprb"},
{0, LPR, mk_op1(0x2,I_WORD), "sprw"},
{0, LPR, mk_op1(0x2,I_DOUBLE), "sprd"},
{0, SETCFG, mk_op1(0x2,I_DOUBLE), "setcfg"},
{0, WAIT, mk_op(0xF), "bpt"},
{0, WAIT, mk_op(0xD), "flag"},
{0, WAIT, mk_op(0xE), "svc"},
{0, WAIT, mk_op(0xA), "nop"},
{0, WAIT, mk_op(0xB), "wait"},
/* Memory management instructions */
{0, LMR, mk_op1(0x2,I_DOUBLE), "lmr"},
{0, LMR, mk_op1(0x3,I_DOUBLE), "smr"},
{0, RDVAL, mk_op1(0x0,I_DOUBLE), "rdval"},
{0, RDVAL, mk_op1(0x1,I_DOUBLE), "wrval"},
#ifdef SU_ASSEM
/* The assembler ref. man and the CPU description booklet differ
in the encoding of these instructions
*/
{0, FFS, mk_op2c(0x6,I_BYTE,I_BYTE,1), "movsub"},
{0, FFS, mk_op2c(0x6,I_WORD,I_WORD,1), "movsuw"},
{0, FFS, mk_op2c(0x6,I_DOUBLE,I_DOUBLE,1),"movsud"},
{0, FFS, mk_op2c(0x6,I_BYTE,I_BYTE,3), "movusb"},
{0, FFS, mk_op2c(0x6,I_WORD,I_WORD,3), "movusw"},
{0, FFS, mk_op2c(0x6,I_DOUBLE,I_DOUBLE,3),"movusd"},
#else
/* assembler reference manual version */
{0, FFS, mk_op2c(0x7,I_BYTE,I_BYTE,0), "movsub"},
{0, FFS, mk_op2c(0x7,I_WORD,I_WORD,0), "movsuw"},
{0, FFS, mk_op2c(0x7,I_DOUBLE,I_DOUBLE,0),"movsud"},
{0, FFS, mk_op2c(0x6,I_BYTE,I_BYTE,0), "movusb"},
{0, FFS, mk_op2c(0x6,I_WORD,I_WORD,0), "movusw"},
{0, FFS, mk_op2c(0x6,I_DOUBLE,I_DOUBLE,0),"movusd"},
#endif
/* Floating point instructions */
{0, ADD_F, mk_op2(0xD,F_FLOAT,F_FLOAT), "absf"},
{0, ADD_F, mk_op2(0xD,F_LONG,F_LONG), "absl"},
{0, ADD_F, mk_op2(0x0,F_FLOAT,F_FLOAT), "addf"},
{0, ADD_F, mk_op2(0x0,F_LONG,F_LONG), "addl"},
{0, ADD_F, mk_op2(0x2,F_FLOAT,F_FLOAT), "cmpf"},
{0, ADD_F, mk_op2(0x2,F_LONG,F_LONG), "cmpl"},
{0, ADD_F, mk_op2(0x8,F_FLOAT,F_FLOAT), "divf"},
{0, ADD_F, mk_op2(0x8,F_LONG,F_LONG), "divl"},
{0, ADD_F, mk_op2(0xC,F_FLOAT,F_FLOAT), "mulf"},
{0, ADD_F, mk_op2(0xC,F_LONG,F_LONG), "mull"},
{0, ADD_F, mk_op2(0x4,F_FLOAT,F_FLOAT), "subf"},
{0, ADD_F, mk_op2(0x4,F_LONG,F_LONG), "subl"},
{0, ADD_F, mk_op2(0x5,F_FLOAT,F_FLOAT), "negf"},
{0, ADD_F, mk_op2(0x5,F_LONG,F_LONG), "negl"},
{0, ADD_F, mk_op2(0x1,F_FLOAT,F_FLOAT), "movf"},
{0, ADD_F, mk_op2(0x1,F_LONG,F_LONG), "movl"},
{0, MOVIF, mk_op2(0x0,I_BYTE,F_FLOAT), "movbf"},
{0, MOVIF, mk_op2(0x0,I_WORD,F_FLOAT), "movwf"},
{0, MOVIF, mk_op2(0x0,I_DOUBLE,F_FLOAT), "movdf"},
{0, MOVIF, mk_op2(0x0,I_BYTE,F_LONG), "movbl"},
{0, MOVIF, mk_op2(0x0,I_WORD,F_LONG), "movwl"},
{0, MOVIF, mk_op2(0x0,I_DOUBLE,F_LONG), "movdl"},
{0, MOVFL, mk_op2(0x3,F_FLOAT,F_LONG), "movfl"},
{0, MOVFL, mk_op2(0x2,F_LONG,F_FLOAT), "movlf"},
{0, TRUNC, mk_op2(0x7,F_FLOAT,I_BYTE), "floorfb"},
{0, TRUNC, mk_op2(0x7,F_FLOAT,I_WORD), "floorfw"},
{0, TRUNC, mk_op2(0x7,F_FLOAT,I_DOUBLE), "floorfd"},
{0, TRUNC, mk_op2(0x7,F_LONG,I_BYTE), "floorlb"},
{0, TRUNC, mk_op2(0x7,F_LONG,I_WORD), "floorlw"},
{0, TRUNC, mk_op2(0x7,F_LONG,I_DOUBLE), "floorld"},
{0, TRUNC, mk_op2(0x4,F_FLOAT,I_BYTE), "roundfb"},
{0, TRUNC, mk_op2(0x4,F_FLOAT,I_WORD), "roundfw"},
{0, TRUNC, mk_op2(0x4,F_FLOAT,I_DOUBLE), "roundfd"},
{0, TRUNC, mk_op2(0x4,F_LONG,I_BYTE), "roundlb"},
{0, TRUNC, mk_op2(0x4,F_LONG,I_WORD), "roundlw"},
{0, TRUNC, mk_op2(0x4,F_LONG,I_DOUBLE), "roundld"},
{0, TRUNC, mk_op2(0x5,F_FLOAT,I_BYTE), "truncfb"},
{0, TRUNC, mk_op2(0x5,F_FLOAT,I_WORD), "truncfw"},
{0, TRUNC, mk_op2(0x5,F_FLOAT,I_DOUBLE), "truncfd"},
{0, TRUNC, mk_op2(0x5,F_LONG,I_BYTE), "trunclb"},
{0, TRUNC, mk_op2(0x5,F_LONG,I_WORD), "trunclw"},
{0, TRUNC, mk_op2(0x5,F_LONG,I_DOUBLE), "truncld"},
{0, LFSR, mk_op(0x1), "lfsr"},
{0, LFSR, mk_op(0x6), "sfsr"},
/* Slave processor instructions */
{0, LCR, mk_op1(0x2,I_DOUBLE), "lcr"}, /* Sure ? */
{0, LCR, mk_op1(0x3,I_DOUBLE), "scr"}, /* Sure ? */
{0, CATST, mk_op1(0x0,I_DOUBLE), "catst0"},/* Sure ? */
{0, CATST, mk_op1(0x1,I_DOUBLE), "catst1"},/* Sure ? */
{0, LCSR, mk_op1(0x1,S_DOUBLE), "lcsr"}, /* Sure ? */
{0, LCSR, mk_op1(0x6,S_DOUBLE), "scsr"}, /* Sure ? */
{0, CCVSI, mk_op2(0x7,S_DOUBLE,I_BYTE), "ccv0db"},
{0, CCVSI, mk_op2(0x7,S_DOUBLE,I_WORD), "ccv0dw"},
{0, CCVSI, mk_op2(0x7,S_DOUBLE,I_DOUBLE), "ccv0dd"},
{0, CCVSI, mk_op2(0x7,S_QUAD,I_BYTE), "ccv0qb"},
{0, CCVSI, mk_op2(0x7,S_QUAD,I_WORD), "ccv0qw"},
{0, CCVSI, mk_op2(0x7,S_QUAD,I_DOUBLE), "ccv0qd"},
{0, CCVSI, mk_op2(0x5,S_DOUBLE,I_BYTE), "ccv1db"},
{0, CCVSI, mk_op2(0x5,S_DOUBLE,I_WORD), "ccv1dw"},
{0, CCVSI, mk_op2(0x5,S_DOUBLE,I_DOUBLE), "ccv1dd"},
{0, CCVSI, mk_op2(0x5,S_QUAD,I_BYTE), "ccv1qb"},
{0, CCVSI, mk_op2(0x5,S_QUAD,I_WORD), "ccv1qw"},
{0, CCVSI, mk_op2(0x5,S_QUAD,I_DOUBLE), "ccv1qd"},
{0, CCVSI, mk_op2(0x4,S_DOUBLE,I_BYTE), "ccv2db"},
{0, CCVSI, mk_op2(0x4,S_DOUBLE,I_WORD), "ccv2dw"},
{0, CCVSI, mk_op2(0x4,S_DOUBLE,I_DOUBLE), "ccv2dd"},
{0, CCVSI, mk_op2(0x4,S_QUAD,I_BYTE), "ccv2qb"},
{0, CCVSI, mk_op2(0x4,S_QUAD,I_WORD), "ccv2qw"},
{0, CCVSI, mk_op2(0x4,S_QUAD,I_DOUBLE), "ccv2qd"},
{0, CCVIS, mk_op2(0x0,I_BYTE,S_DOUBLE), "ccv3bd"},
{0, CCVIS, mk_op2(0x0,I_WORD,S_DOUBLE), "ccv3wd"},
{0, CCVIS, mk_op2(0x0,I_DOUBLE,S_DOUBLE), "ccv3dd"},
{0, CCVIS, mk_op2(0x0,I_BYTE,S_QUAD), "ccv3bq"},
{0, CCVIS, mk_op2(0x0,I_WORD,S_QUAD), "ccv3wq"},
{0, CCVIS, mk_op2(0x0,I_DOUBLE,S_QUAD), "ccv3dq"},
{0, CCVSS, mk_op2(0x3,S_DOUBLE,S_QUAD), "ccv4dq"},
{0, CCVSS, mk_op2(0x2,S_QUAD,S_DOUBLE), "ccv5qd"},
{0, CMOV, mk_op2(0x0,S_DOUBLE,S_DOUBLE), "ccal0d"},
{0, CMOV, mk_op2(0x0,S_QUAD,S_QUAD), "ccal0q"},
{0, CMOV, mk_op2(0x4,S_DOUBLE,S_DOUBLE), "ccal1d"},
{0, CMOV, mk_op2(0x4,S_QUAD,S_QUAD), "ccal1q"},
{0, CMOV, mk_op2(0xC,S_DOUBLE,S_DOUBLE), "ccal2d"},
{0, CMOV, mk_op2(0xC,S_QUAD,S_QUAD), "ccal2q"},
{0, CMOV, mk_op2(0x8,S_DOUBLE,S_DOUBLE), "ccal3d"},
{0, CMOV, mk_op2(0x8,S_QUAD,S_QUAD), "ccal3q"},
{0, CMOV, mk_op2(0x2,S_DOUBLE,S_DOUBLE), "ccmpd"},
{0, CMOV, mk_op2(0x2,S_QUAD,S_QUAD), "ccmpq"},
{0, CMOV, mk_op2(0x1,S_DOUBLE,S_DOUBLE), "cmov0d"},
{0, CMOV, mk_op2(0x1,S_QUAD,S_QUAD), "cmov0q"},
{0, CMOV, mk_op2(0xD,S_DOUBLE,S_DOUBLE), "cmov1d"},
{0, CMOV, mk_op2(0xD,S_QUAD,S_QUAD), "cmov1q"},
{0, CMOV, mk_op2(0x5,S_DOUBLE,S_DOUBLE), "cmov2d"},
{0, CMOV, mk_op2(0x5,S_QUAD,S_QUAD), "cmov2q"},