From a71a7c68827210036cb863f380f9e25d3708cea2 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 28 May 2016 06:03:21 -0700 Subject: [PATCH] VAX: Add octaword result information to instruction history Also reworked drom result bitfield macros to use standard shift and masks --- VAX/vax_cpu.c | 69 +++++++++++++++++--------------------- VAX/vax_defs.h | 41 ++++++++++++++++++----- VAX/vax_octa.c | 90 +++++++++++++++++++++++++++++--------------------- VAX/vax_sys.c | 28 ++++++++-------- 4 files changed, 129 insertions(+), 99 deletions(-) diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index 17cb9b0b..0249f216 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -230,19 +230,6 @@ rh = arh -#define HIST_MIN 64 -#define HIST_MAX 250000 - -typedef struct { - double time; - int32 iPC; - int32 PSL; - int32 opc; - uint8 inst[INST_SIZE]; - uint32 opnd[OPND_SIZE]; - uint32 res[6]; - } InstHistory; - uint32 *M = NULL; /* memory */ int32 R[16]; /* registers */ int32 STK[5]; /* stack pointers */ @@ -603,32 +590,35 @@ for ( ;; ) { if (hst_lnt) { InstHistory *hlast = &hst[hst_p ? hst_p-1 : hst_lnt -1]; - int res = (drom[hlast->opc][0] & DR_M_RESMASK) >> DR_V_RESMASK; - switch ((drom[hlast->opc][0] & DR_M_RESMASK) >> DR_V_RESMASK) { - case RB_O>>DR_V_RESMASK: + switch (DR_GETRES(drom[hlast->opc][0]) << DR_V_RESMASK) { + case RB_O: + case RB_OB: + case RB_OW: + case RB_OL: + case RB_OQ: break; - case RB_Q>>DR_V_RESMASK: + case RB_Q: hlast->res[1] = rh; hlast->res[0] = r; break; - case RB_B>>DR_V_RESMASK: - case RB_W>>DR_V_RESMASK: - case RB_L>>DR_V_RESMASK: + case RB_B: + case RB_W: + case RB_L: hlast->res[0] = r; break; - case RB_R5>>DR_V_RESMASK: + case RB_R5: hlast->res[5] = R[5]; hlast->res[4] = R[4]; - case RB_R3>>DR_V_RESMASK: + case RB_R3: hlast->res[3] = R[3]; hlast->res[2] = R[2]; - case RB_R1>>DR_V_RESMASK: + case RB_R1: hlast->res[1] = R[1]; - case RB_R0>>DR_V_RESMASK: + case RB_R0: hlast->res[0] = R[0]; break; - case RB_SP>>DR_V_RESMASK: + case RB_SP: hlast->res[0] = Read (SP, L_LONG, RA); break; default: @@ -3104,7 +3094,8 @@ for ( ;; ) { case ADDH2: case ADDH3: case SUBH2: case SUBH3: case MULH2: case MULH3: case DIVH2: case DIVH3: case ACBH: case POLYH: case EMODH: - cc = op_octa (opnd, cc, opc, acc, spec, va); + cc = op_octa (opnd, cc, opc, acc, spec, va, + (hst_lnt ? &hst[hst_p ? hst_p-1 : hst_lnt -1] : NULL) ); if (cc & LSIGN) { /* ACBH branch? */ BRANCHW (brdisp); cc = cc & CC_MASK; /* mask off flag */ @@ -3569,33 +3560,33 @@ for (i = 1, j = 0, more = FALSE; i <= numspec; i++) { /* loop thru specs */ break; } /* end case */ } /* end for */ -if ((line == 0) && ((drom[h->opc][0] & DR_M_RESMASK) >> DR_V_RESMASK)) { +if ((line == 0) && (DR_GETRES(drom[h->opc][0]))) { fprintf (st, " ->"); - switch ((drom[h->opc][0] & DR_M_RESMASK) >> DR_V_RESMASK) { - case RB_O>>DR_V_RESMASK: + switch (DR_GETRES(drom[h->opc][0]) << DR_V_RESMASK) { + case RB_O: fprintf (st, " %08X %08X %08X %08X", h->res[0], h->res[1], h->res[2], h->res[3]); break; - case RB_Q>>DR_V_RESMASK: + case RB_Q: fprintf (st, " %08X %08X", h->res[0], h->res[1]); break; - case RB_B>>DR_V_RESMASK: - case RB_W>>DR_V_RESMASK: - case RB_L>>DR_V_RESMASK: + case RB_B: + case RB_W: + case RB_L: fprintf (st, " %08X", h->res[0]); break; - case RB_R5>>DR_V_RESMASK: - case RB_R3>>DR_V_RESMASK: - case RB_R1>>DR_V_RESMASK: - case RB_R0>>DR_V_RESMASK: + case RB_R5: + case RB_R3: + case RB_R1: + case RB_R0: if (1) { static const int rcnts[] = {1, 2, 4, 6}; int i; - for (i = 0; i < rcnts[((drom[h->opc][0] & DR_M_RESMASK) - RB_R0) >> DR_V_RESMASK]; i++) + for (i = 0; i < rcnts[DR_GETRES(drom[h->opc][0]) - DR_GETRES(RB_R0)]; i++) fprintf (st, " R%d:%08X", i, h->res[i]); } break; - case RB_SP>>DR_V_RESMASK: + case RB_SP: fprintf (st, " SP: %08X", h->res[0]); break; default: diff --git a/VAX/vax_defs.h b/VAX/vax_defs.h index 06a590f3..2ee21c94 100644 --- a/VAX/vax_defs.h +++ b/VAX/vax_defs.h @@ -379,25 +379,30 @@ extern jmp_buf save_env; #define DR_F 0x80 /* FPD ok flag */ #define DR_NSPMASK 0x07 /* #specifiers */ #define DR_V_USPMASK 4 -#define DR_M_USPMASK 0x70 /* #spec, sym_ */ +#define DR_M_USPMASK 0x07 /* #spec, sym_ */ #define DR_GETNSP(x) ((x) & DR_NSPMASK) -#define DR_GETUSP(x) (((x) & DR_M_USPMASK) >> DR_V_USPMASK) +#define DR_GETUSP(x) (((x) >> DR_V_USPMASK) & DR_M_USPMASK) /* Extra bits in the opcode flag word of the Decode ROM array only for history results */ #define DR_V_RESMASK 8 -#define DR_M_RESMASK 0x0F00 +#define DR_M_RESMASK 0x000F #define RB_0 (0 << DR_V_RESMASK) /* No Results */ #define RB_B (1 << DR_V_RESMASK) /* Byte Result */ #define RB_W (2 << DR_V_RESMASK) /* Word Result */ #define RB_L (3 << DR_V_RESMASK) /* Long Result */ #define RB_Q (4 << DR_V_RESMASK) /* Quad Result */ #define RB_O (5 << DR_V_RESMASK) /* Octa Result */ -#define RB_R0 (6 << DR_V_RESMASK) /* Reg R0 */ -#define RB_R1 (7 << DR_V_RESMASK) /* Regs R0-R1 */ -#define RB_R3 (8 << DR_V_RESMASK) /* Regs R0-R3 */ -#define RB_R5 (9 << DR_V_RESMASK) /* Regs R0-R5 */ -#define RB_SP (10 << DR_V_RESMASK) /* @SP */ +#define RB_OB (6 << DR_V_RESMASK) /* Octa Byte Result */ +#define RB_OW (7 << DR_V_RESMASK) /* Octa Word Result */ +#define RB_OL (8 << DR_V_RESMASK) /* Octa Long Result */ +#define RB_OQ (9 << DR_V_RESMASK) /* Octa Quad Result */ +#define RB_R0 (10 << DR_V_RESMASK) /* Reg R0 */ +#define RB_R1 (11 << DR_V_RESMASK) /* Regs R0-R1 */ +#define RB_R3 (12 << DR_V_RESMASK) /* Regs R0-R3 */ +#define RB_R5 (13 << DR_V_RESMASK) /* Regs R0-R5 */ +#define RB_SP (14 << DR_V_RESMASK) /* @SP */ +#define DR_GETRES(x) (((x) >> DR_V_RESMASK) & DR_M_RESMASK) /* Decode ROM: specifier entry */ @@ -760,6 +765,24 @@ enum opcodes { extern uint32 cpu_idle_mask; /* idle mask */ void cpu_idle (void); +/* Instruction History */ +#define HIST_MIN 64 +#define HIST_MAX 250000 + +#define OPND_SIZE 16 +#define INST_SIZE 52 + +typedef struct { + double time; + int32 iPC; + int32 PSL; + int32 opc; + uint8 inst[INST_SIZE]; + uint32 opnd[OPND_SIZE]; + uint32 res[6]; + } InstHistory; + + /* CPU Register definitions */ extern int32 R[16]; /* registers */ @@ -850,7 +873,7 @@ extern void op_polyd (int32 *opnd, int32 acc); extern void op_polyg (int32 *opnd, int32 acc); /* vax_octa.c externals */ -extern int32 op_octa (int32 *opnd, int32 cc, int32 opc, int32 acc, int32 spec, int32 va); +extern int32 op_octa (int32 *opnd, int32 cc, int32 opc, int32 acc, int32 spec, int32 va, InstHistory *hst); /* vax_cmode.c externals */ extern int32 op_cmode (int32 cc); diff --git a/VAX/vax_octa.c b/VAX/vax_octa.c index 682b9352..2891d2f6 100644 --- a/VAX/vax_octa.c +++ b/VAX/vax_octa.c @@ -83,11 +83,11 @@ int32 op_mulh (int32 *opnd, int32 *hf); int32 op_divh (int32 *opnd, int32 *hf); int32 op_emodh (int32 *opnd, int32 *hflt, int32 *intgr, int32 *flg); void op_polyh (int32 *opnd, int32 acc); -void h_write_b (int32 spec, int32 va, int32 val, int32 acc); -void h_write_w (int32 spec, int32 va, int32 val, int32 acc); -void h_write_l (int32 spec, int32 va, int32 val, int32 acc); -void h_write_q (int32 spec, int32 va, int32 vl, int32 vh, int32 acc); -void h_write_o (int32 spec, int32 va, int32 *val, int32 acc); +void h_write_b (int32 spec, int32 va, int32 val, int32 acc, InstHistory *hst); +void h_write_w (int32 spec, int32 va, int32 val, int32 acc, InstHistory *hst); +void h_write_l (int32 spec, int32 va, int32 val, int32 acc, InstHistory *hst); +void h_write_q (int32 spec, int32 va, int32 vl, int32 vh, int32 acc, InstHistory *hst); +void h_write_o (int32 spec, int32 va, int32 *val, int32 acc, InstHistory *hst); void vax_hadd (UFPH *a, UFPH *b, uint32 mlo); void vax_hmul (UFPH *a, UFPH *b, uint32 mlo); void vax_hmod (UFPH *a, int32 *intgr, int32 *flg); @@ -112,7 +112,7 @@ static int32 z_octa[4] = { 0, 0, 0, 0 }; /* Octaword instructions */ -int32 op_octa (int32 *opnd, int32 cc, int32 opc, int32 acc, int32 spec, int32 va) +int32 op_octa (int32 *opnd, int32 cc, int32 opc, int32 acc, int32 spec, int32 va, InstHistory *hst) { int32 r, rh, temp, flg; int32 r_octa[4]; @@ -139,7 +139,7 @@ switch (opc) { */ case MOVAO: - h_write_l (spec, va, opnd[0], acc); /* write operand */ + h_write_l (spec, va, opnd[0], acc, hst); /* write operand */ CC_IIZP_L (opnd[0]); /* set cc's */ break; @@ -151,7 +151,7 @@ switch (opc) { */ case CLRO: - h_write_o (spec, va, z_octa, acc); /* write 0's */ + h_write_o (spec, va, z_octa, acc, hst); /* write 0's */ CC_ZZ1P; /* set cc's */ break; @@ -174,17 +174,17 @@ switch (opc) { */ case MOVO: - h_write_o (spec, va, opnd, acc); /* write src */ + h_write_o (spec, va, opnd, acc, hst); /* write src */ CC_IIZP_O (opnd[0], opnd[1], opnd[2], opnd[3]); /* set cc's */ break; case MOVH: if ((r = op_tsth (opnd[0]))) { /* test for 0 */ - h_write_o (spec, va, opnd, acc); /* nz, write result */ + h_write_o (spec, va, opnd, acc, hst); /* nz, write result */ CC_IIZP_FP (r); /* set cc's */ } else { /* zero */ - h_write_o (spec, va, z_octa, acc); /* write 0 */ + h_write_o (spec, va, z_octa, acc, hst); /* write 0 */ cc = (cc & CC_C) | CC_Z; /* set cc's */ } break; @@ -192,11 +192,11 @@ switch (opc) { case MNEGH: if ((r = op_tsth (opnd[0]))) { /* test for 0 */ opnd[0] = opnd[0] ^ FPSIGN; /* nz, invert sign */ - h_write_o (spec, va, opnd, acc); /* write result */ + h_write_o (spec, va, opnd, acc, hst); /* write result */ CC_IIZZ_FP (opnd[0]); /* set cc's */ } else { /* zero */ - h_write_o (spec, va, z_octa, acc); /* write 0 */ + h_write_o (spec, va, z_octa, acc, hst); /* write 0 */ cc = CC_Z; /* set cc's */ } break; @@ -221,19 +221,19 @@ switch (opc) { case CVTBH: r = op_cvtih (SXTB (opnd[0]), r_octa); /* convert */ - h_write_o (spec, va, r_octa, acc); /* write reslt */ + h_write_o (spec, va, r_octa, acc, hst); /* write reslt */ CC_IIZZ_FP (r); /* set cc's */ break; case CVTWH: r = op_cvtih (SXTW (opnd[0]), r_octa); /* convert */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case CVTLH: r = op_cvtih (opnd[0], r_octa); /* convert */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; @@ -247,7 +247,7 @@ switch (opc) { case CVTHB: r = op_cvthi (opnd, &flg, opc) & BMASK; /* convert */ - h_write_b (spec, va, r, acc); /* write result */ + h_write_b (spec, va, r, acc, hst); /* write result */ CC_IIZZ_B (r); /* set cc's */ if (flg) { V_INTOV; @@ -256,7 +256,7 @@ switch (opc) { case CVTHW: r = op_cvthi (opnd, &flg, opc) & WMASK; /* convert */ - h_write_w (spec, va, r, acc); /* write result */ + h_write_w (spec, va, r, acc, hst); /* write result */ CC_IIZZ_W (r); /* set cc's */ if (flg) { V_INTOV; @@ -265,7 +265,7 @@ switch (opc) { case CVTHL: case CVTRHL: r = op_cvthi (opnd, &flg, opc) & LMASK; /* convert */ - h_write_l (spec, va, r, acc); /* write result */ + h_write_l (spec, va, r, acc, hst); /* write result */ CC_IIZZ_L (r); /* set cc's */ if (flg) { V_INTOV; @@ -282,7 +282,7 @@ switch (opc) { case CVTFH: r = op_cvtfdh (opnd[0], 0, r_octa); /* convert */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; @@ -296,13 +296,13 @@ switch (opc) { case CVTDH: r = op_cvtfdh (opnd[0], opnd[1], r_octa); /* convert */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case CVTGH: r = op_cvtgh (opnd[0], opnd[1], r_octa); /* convert */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; @@ -316,19 +316,19 @@ switch (opc) { case CVTHF: r = op_cvthfd (opnd, NULL); /* convert */ - h_write_l (spec, va, r, acc); /* write result */ + h_write_l (spec, va, r, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case CVTHD: r = op_cvthfd (opnd, &rh); /* convert */ - h_write_q (spec, va, r, rh, acc); /* write result */ + h_write_q (spec, va, r, rh, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case CVTHG: r = op_cvthg (opnd, &rh); /* convert */ - h_write_q (spec, va, r, rh, acc); /* write result */ + h_write_q (spec, va, r, rh, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; @@ -351,25 +351,25 @@ switch (opc) { case ADDH2: case ADDH3: r = op_addh (opnd, r_octa, FALSE); /* add */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case SUBH2: case SUBH3: r = op_addh (opnd, r_octa, TRUE); /* subtract */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case MULH2: case MULH3: r = op_mulh (opnd, r_octa); /* multiply */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; case DIVH2: case DIVH3: r = op_divh (opnd, r_octa); /* divide */ - h_write_o (spec, va, r_octa, acc); /* write result */ + h_write_o (spec, va, r_octa, acc, hst); /* write result */ CC_IIZZ_FP (r); /* set cc's */ break; @@ -387,7 +387,7 @@ switch (opc) { r = op_addh (opnd + 4, r_octa, FALSE); /* add + index */ CC_IIZP_FP (r); /* set cc's */ temp = op_cmph (r_octa, opnd); /* result : limit */ - h_write_o (spec, va, r_octa, acc); /* write 2nd */ + h_write_o (spec, va, r_octa, acc, hst); /* write 2nd */ if ((temp & CC_Z) || ((opnd[4] & FPSIGN)? /* test br cond */ !(temp & CC_N): (temp & CC_N))) cc = cc | LSIGN; /* hack for branch */ @@ -425,7 +425,7 @@ switch (opc) { if (opnd[9] >= 0) /* store 1st */ R[opnd[9]] = temp; else Write (opnd[10], temp, L_LONG, WA); - h_write_o (spec, va, r_octa, acc); /* write 2nd */ + h_write_o (spec, va, r_octa, acc, hst); /* write 2nd */ CC_IIZZ_FP (r); /* set cc's */ if (flg) { V_INTOV; @@ -1163,10 +1163,12 @@ hflt[3] = WORDSWAP (r->frac.f0); return hflt[0]; } -void h_write_b (int32 spec, int32 va, int32 val, int32 acc) +void h_write_b (int32 spec, int32 va, int32 val, int32 acc, InstHistory *hst) { int32 rn; +if (hst) + hst->res[0] = val; if (spec > (GRN | nPC)) Write (va, val, L_BYTE, WA); else { @@ -1176,10 +1178,12 @@ else { return; } -void h_write_w (int32 spec, int32 va, int32 val, int32 acc) +void h_write_w (int32 spec, int32 va, int32 val, int32 acc, InstHistory *hst) { int32 rn; +if (hst) + hst->res[0] = val; if (spec > (GRN | nPC)) Write (va, val, L_WORD, WA); else { @@ -1189,18 +1193,24 @@ else { return; } -void h_write_l (int32 spec, int32 va, int32 val, int32 acc) +void h_write_l (int32 spec, int32 va, int32 val, int32 acc, InstHistory *hst) { +if (hst) + hst->res[0] = val; if (spec > (GRN | nPC)) Write (va, val, L_LONG, WA); else R[spec & 0xF] = val; return; } -void h_write_q (int32 spec, int32 va, int32 vl, int32 vh, int32 acc) +void h_write_q (int32 spec, int32 va, int32 vl, int32 vh, int32 acc, InstHistory *hst) { int32 rn, mstat; +if (hst) { + hst->res[0] = vl; + hst->res[1] = vh; + } if (spec > (GRN | nPC)) { if ((Test (va + 7, WA, &mstat) >= 0) || (Test (va, WA, &mstat) < 0)) @@ -1217,10 +1227,16 @@ else { return; } -void h_write_o (int32 spec, int32 va, int32 *val, int32 acc) +void h_write_o (int32 spec, int32 va, int32 *val, int32 acc, InstHistory *hst) { int32 rn, mstat; +if (hst) { + hst->res[0] = val[0]; + hst->res[1] = val[0]; + hst->res[2] = val[0]; + hst->res[3] = val[0]; + } if (spec > (GRN | nPC)) { if ((Test (va + 15, WA, &mstat) >= 0) || (Test (va, WA, &mstat) < 0)) @@ -1243,7 +1259,7 @@ return; #else -int32 op_octa (int32 *opnd, int32 cc, int32 opc, int32 acc, int32 spec, int32 va) +int32 op_octa (int32 *opnd, int32 cc, int32 opc, int32 acc, int32 spec, int32 va, InstHistory *hst) { RSVD_INST_FAULT; return cc; diff --git a/VAX/vax_sys.c b/VAX/vax_sys.c index 70feae99..da916dc1 100644 --- a/VAX/vax_sys.c +++ b/VAX/vax_sys.c @@ -200,7 +200,7 @@ const uint16 drom[NUM_INST][MAX_SPEC + 1] = { {2 +RB_L, RF, WL, 0, 0, 0, 0}, /* MNEGF */ {1, RF, 0, 0, 0, 0, 0}, /* TSTF */ {5, RF, RB, RF, WL, WL, 0}, /* EMODF */ -{3 +RB_R0, RF, RW, AB, 0, 0, 0}, /* POLYF */ +{3 +RB_R3, RF, RW, AB, 0, 0, 0}, /* POLYF */ {2 +RB_Q, RF, WQ, 0, 0, 0, 0}, /* CVTFD */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ {2 +RB_W, RW, WW, 0, 0, 0, 0}, /* ADAWI */ @@ -232,7 +232,7 @@ const uint16 drom[NUM_INST][MAX_SPEC + 1] = { {2 +RB_Q, RD, WQ, 0, 0, 0, 0}, /* MNEGD */ {1, RD, 0, 0, 0, 0, 0}, /* TSTD */ {5, RD, RB, RD, WL, WQ, 0}, /* EMODD */ -{3 +RB_R1, RD, RW, AB, 0, 0, 0}, /* POLYD */ +{3 +RB_R5, RD, RW, AB, 0, 0, 0}, /* POLYD */ {2 +RB_L, RD, WL, 0, 0, 0, 0}, /* CVTDF */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ {3 +RB_L, RB, RL, WL, 0, 0, 0}, /* ASHL */ @@ -456,7 +456,7 @@ const uint16 drom[NUM_INST][MAX_SPEC + 1] = { {2 +RB_Q, RG, WQ, 0, 0, 0, 0}, /* MNEGG */ {1, RG, 0, 0, 0, 0, 0}, /* TSTG */ {5, RG, RW, RG, WL, WQ, 0}, /* EMODG */ -{3 +RB_R1, RG, RW, AB, 0, 0, 0}, /* POLYG */ +{3 +RB_R5, RG, RW, AB, 0, 0, 0}, /* POLYG */ {ODC(2) +RB_O, RG, WO, 0, 0, 0, 0}, /* CVTGH */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ @@ -475,21 +475,21 @@ const uint16 drom[NUM_INST][MAX_SPEC + 1] = { {ODC(3) +RB_O, RH, RH, WO, 0, 0, 0}, /* MULH3 */ {ODC(2) +RB_O, RH, MO, 0, 0, 0, 0}, /* DIVH2 */ {ODC(3) +RB_O, RH, RH, WO, 0, 0, 0}, /* DIVH3 */ -{ODC(2) +RB_B, RH, WB, 0, 0, 0, 0}, /* CVTHB */ -{ODC(2) +RB_W, RH, WW, 0, 0, 0, 0}, /* CVTHW */ -{ODC(2) +RB_L, RH, WL, 0, 0, 0, 0}, /* CVTHL */ -{ODC(2) +RB_O, RH, WL, 0, 0, 0, 0}, /* CVTRHL */ +{ODC(2) +RB_OB, RH, WB, 0, 0, 0, 0}, /* CVTHB */ +{ODC(2) +RB_OW, RH, WW, 0, 0, 0, 0}, /* CVTHW */ +{ODC(2) +RB_OL, RH, WL, 0, 0, 0, 0}, /* CVTHL */ +{ODC(2) +RB_OL, RH, WL, 0, 0, 0, 0}, /* CVTRHL */ {ODC(2) +RB_O, RB, WO, 0, 0, 0, 0}, /* CVTBH */ {ODC(2) +RB_O, RW, WO, 0, 0, 0, 0}, /* CVTWH */ {ODC(2) +RB_O, RL, WO, 0, 0, 0, 0}, /* CVTLH */ -{ODC(4), RH, RH, MO, BW, 0, 0}, /* ACBH */ +{ODC(4) +RB_O, RH, RH, MO, BW, 0, 0}, /* ACBH */ {ODC(2) +RB_O, RH, RO, 0, 0, 0, 0}, /* MOVH */ {ODC(2), RH, RH, 0, 0, 0, 0}, /* CMPH */ {ODC(2) +RB_O, RH, WO, 0, 0, 0, 0}, /* MNEGH */ {ODC(1), RH, 0, 0, 0, 0, 0}, /* TSTH */ -{ODC(5), RH, RW, RH, WL, WO, 0}, /* EMODH */ -{ODC(3) +RB_R3, RH, RW, AB, 0, 0, 0}, /* POLYH */ -{ODC(2) +RB_Q, RH, WQ, 0, 0, 0, 0}, /* CVTHG */ +{ODC(5) +RB_O, RH, RW, RH, WL, WO, 0}, /* EMODH */ +{ODC(3) +RB_R5, RH, RW, AB, 0, 0, 0}, /* POLYH */ +{ODC(2) +RB_OQ, RH, WQ, 0, 0, 0, 0}, /* CVTHG */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ {0, 0, 0, 0, 0, 0, 0}, /* reserved */ @@ -497,7 +497,7 @@ const uint16 drom[NUM_INST][MAX_SPEC + 1] = { {0, 0, 0, 0, 0, 0, 0}, /* reserved */ {ODC(1) +RB_O, WO, 0, 0, 0, 0, 0}, /* CLRO */ {ODC(2) +RB_O, RO, RO, 0, 0, 0, 0}, /* MOVO */ -{ODC(2) +RB_L, AO, WL, 0, 0, 0, 0}, /* MOVAO*/ +{ODC(2) +RB_OL, AO, WL, 0, 0, 0, 0}, /* MOVAO*/ {ODC(1) +RB_SP, AO, 0, 0, 0, 0, 0}, /* PUSHAO*/ {0, 0, 0, 0, 0, 0, 0}, /* 180-18F */ {0, 0, 0, 0, 0, 0, 0}, @@ -617,8 +617,8 @@ const uint16 drom[NUM_INST][MAX_SPEC + 1] = { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, -{ODC(2) +RB_B, RH, WL, 0, 0, 0, 0}, /* CVTHF */ -{ODC(2) +RB_Q, RH, WQ, 0, 0, 0, 0}, /* CVTHD */ +{ODC(2) +RB_OL, RH, WL, 0, 0, 0, 0}, /* CVTHF */ +{ODC(2) +RB_OQ, RH, WQ, 0, 0, 0, 0}, /* CVTHD */ {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0},