--- nono/m88xx0/m88100ops.cpp 2026/04/29 17:04:41 1.1.1.4 +++ nono/m88xx0/m88100ops.cpp 2026/04/29 17:04:54 1.1.1.8 @@ -5,6 +5,8 @@ // #include "m88100acc.h" +#include +#include // 命令のフィールド取り出し #define FLD_D m88100opf_D(opX) @@ -30,8 +32,80 @@ #define rS1 (r[FLD_S1]) #define rS2 (r[FLD_S2]) // ダブルワードの2ワード目 -#define rD2 (r[(FLD_D + 1) & 0x1f]) +#define FLD_D2 ((FLD_D + 1) & 0x1f) +#define rD2 (r[FLD_D2]) +// FP フィールド +#define FP_T1 m88100opf_FP_T1(opX) +#define FP_T2 m88100opf_FP_T2(opX) +#define FP_TD m88100opf_FP_TD(opX) + +// XXX: 暫定 +static float +u2f(uint32 u) +{ + float v; + memcpy(&v, &u, 4); + return v; +} + +static double +u2d(uint64 u) +{ + double v; + memcpy(&v, &u, 8); + return v; +} + +static uint32 +f2u(float v) +{ + uint32 u; + memcpy(&u, &v, 4); + return u; +} + +static uint64 +d2u(double v) +{ + uint64 u; + memcpy(&u, &v, 8); + return u; +} + +#define FP_GET(v, t, n) \ +do { \ + if (t == 0) { \ + v = u2f(r[n]); \ + } else if (t == 1) { \ + if (n == 31) { \ + FPException(M88K_FPEXCEP_FUNIMP); \ + return; \ + } \ + v = u2d(((uint64)r[n] << 32) | r[n + 1]); \ + } else { \ + FPException(M88K_FPEXCEP_FROP); \ + return; \ + } \ +} while (0) + +#define FP_SET(t, n, v) \ +do { \ + if (t == 0) { \ + r[n] = f2u(v); \ + } else if (t == 1) { \ + if (n == 31) { \ + FPException(M88K_FPEXCEP_FUNIMP); \ + return; \ + } \ + uint64 tmp = d2u(v); \ + r[n] = tmp >> 32; \ + r[n + 1] = (uint32)tmp; \ + } else { \ + FPException(M88K_FPEXCEP_FROP); \ + return; \ + } \ +} while (0) // ブランチ命令入り口 inline void @@ -39,7 +113,7 @@ m88kcpu::EnterBranch(uint32 toaddr) { // ブランチヒストリに登録しつつ、 // ブランチヒストリからブランチ状況を取得 - auto e = brhist.AddEntry(xip, toaddr, opX); + auto e = brhist.AddEntry(xip | (IsSuper() ? 1 : 0), toaddr, opX); fip = toaddr; // STOP 検出。 @@ -66,7 +140,8 @@ m88kcpu::EnterBranch(uint32 toaddr) // 新規ブランチ // 初期化 nop_counter = 0; - } else { + } else if (pseudo_stop_enable) { + // 疑似 STOP 状態有効のときに、 // e.count == 2 のときだけ STOP の検証をすれば良い。 // d はブランチ間の命令数 @@ -79,6 +154,14 @@ m88kcpu::EnterBranch(uint32 toaddr) if (nop_counter == d) { atomic_reqflag |= CPU_REQ_STOP; } + + // OpenBSD 6.6 では + // L1: tb1 #1 r0, #0xff + // ld r13, r21, #0x168 + // bcnd.n eq0, r13, L1 + // or r2, r25, #0x5ea0 + // の命令列が使用されている。 + // これについては tb1 で実装してある。 } // STOP ではなかったら、あとは放置していい } @@ -277,12 +360,12 @@ OP_DEF(xmem_bu_imm) addr = rS1 + IMM16; LDST_ALIGN(1); - total_cycle += 4; // Table.7-3 + AddCycle(4); // Table.7-3 lastaddr = addr; - tmp = cmmu[1].xmem_8(addr, rD); + tmp = cmmu[1].xmem_8(addr, rD & 0xff); if ((int64)tmp < 0) { - XmemDataException(addr, rD, DM_BU | DM_LOCK); + XmemDataException(addr, DM_BU | DM_LOCK); return; } if (FLD_D == 0) @@ -299,12 +382,12 @@ OP_DEF(xmem_w_imm) addr = rS1 + IMM16; LDST_ALIGN(4); - total_cycle += 4; // Table.7-3 + AddCycle(4); // Table.7-3 lastaddr = addr; tmp = cmmu[1].xmem_32(addr, rD); if ((int64)tmp < 0) { - XmemDataException(addr, rD, DM_W | DM_LOCK); + XmemDataException(addr, DM_W | DM_LOCK); return; } if (FLD_D == 0) @@ -321,12 +404,12 @@ OP_DEF(ld_hu_imm) addr = rS1 + IMM16; LDST_ALIGN(2); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; data = cmmu[1].load_16(addr); if ((int64)data < 0) { - ReadDataException(addr, DM_HU); + ReadDataException32(addr, DM_HU); return; } if (FLD_D == 0) @@ -343,12 +426,12 @@ OP_DEF(ld_bu_imm) addr = rS1 + IMM16; LDST_ALIGN(1); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; data = cmmu[1].load_8(addr); if ((int64)data < 0) { - ReadDataException(addr, DM_BU); + ReadDataException32(addr, DM_BU); return; } if (FLD_D == 0) @@ -365,18 +448,18 @@ OP_DEF(ld_d_imm) addr = rS1 + IMM16; LDST_ALIGN(8); - total_cycle += 4; // Table.7-3 + AddCycle(4); // Table.7-3 lastaddr = addr; data1 = cmmu[1].load_32(addr); if ((int64)data1 < 0) { - ReadDataException(addr, DM_D1); + ReadDataException64(addr, DM_D1); return; } addr += 4; data2 = cmmu[1].load_32(addr); if ((int64)data2 < 0) { - ReadDataException(addr, DM_D2); + ReadDataException64(addr, DM_D2); return; } @@ -394,12 +477,12 @@ OP_DEF(ld_w_imm) addr = rS1 + IMM16; LDST_ALIGN(4); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; data = cmmu[1].load_32(addr); if ((int64)data < 0) { - ReadDataException(addr, DM_W); + ReadDataException32(addr, DM_W); return; } if (FLD_D == 0) @@ -416,12 +499,12 @@ OP_DEF(ld_h_imm) addr = rS1 + IMM16; LDST_ALIGN(2); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; data = cmmu[1].load_16(addr); if ((int64)data < 0) { - ReadDataException(addr, DM_H); + ReadDataException32(addr, DM_H); return; } if (FLD_D == 0) @@ -438,12 +521,12 @@ OP_DEF(ld_b_imm) addr = rS1 + IMM16; LDST_ALIGN(1); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; data = cmmu[1].load_8(addr); if ((int64)data < 0) { - ReadDataException(addr, DM_B); + ReadDataException32(addr, DM_B); return; } if (FLD_D == 0) @@ -460,18 +543,18 @@ OP_DEF(st_d_imm) addr = rS1 + IMM16; LDST_ALIGN(8); - total_cycle += 1 + 4; // Table.7-3 + AddCycle(1 + 4); // Table.7-3 lastaddr = addr; rv = cmmu[1].store_32(addr, rD); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_D1); + WriteDataException64(addr, DM_D1); return; } addr += 4; rv = cmmu[1].store_32(addr, rD2); if ((int64)rv < 0) { - WriteDataException(addr, rD2, DM_D2); + WriteDataException64(addr, DM_D2); return; } } @@ -485,12 +568,12 @@ OP_DEF(st_w_imm) addr = rS1 + IMM16; LDST_ALIGN(4); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; rv = cmmu[1].store_32(addr, rD); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_W); + WriteDataException32(addr, DM_W); return; } } @@ -504,12 +587,12 @@ OP_DEF(st_h_imm) addr = rS1 + IMM16; LDST_ALIGN(2); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; - rv = cmmu[1].store_16(addr, rD); + rv = cmmu[1].store_16(addr, rD & 0xffff); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_H); + WriteDataException32(addr, DM_H); return; } } @@ -523,12 +606,12 @@ OP_DEF(st_b_imm) addr = rS1 + IMM16; LDST_ALIGN(1); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; - rv = cmmu[1].store_8(addr, rD); + rv = cmmu[1].store_8(addr, rD & 0xff); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_B); + WriteDataException32(addr, DM_B); return; } } @@ -653,7 +736,7 @@ OP_DEF(divu_imm) return; } - total_cycle += 38; // Table.7-6 (ただしざっくり) + AddCycle(38); // Table.7-6 (ただしざっくり) if (IMM16 == 0) { Exception(M88K_EXCEP_INT_DIV); @@ -672,7 +755,7 @@ OP_DEF(mul_imm) return; } - total_cycle += 4; // Table.7-6 (ただしざっくり) + AddCycle(4); // Table.7-6 (ただしざっくり) if (FLD_D == 0) return; @@ -715,7 +798,7 @@ OP_DEF(div_imm) return; } - total_cycle += 38; // Table.7-6 (ただしざっくり) + AddCycle(38); // Table.7-6 (ただしざっくり) if ((int32)rS1 < 0 || IMM16 == 0) { Exception(M88K_EXCEP_INT_DIV); @@ -889,61 +972,167 @@ OP_DEF(fxcr) // 100001_DDDDDSSSSS_00000n_nnnnnsssss OP_DEF(fmul) { - OP_FUNC(unimpl); + // 暫定 + double s1; + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s1, FP_T1, FLD_S1); + FP_GET(s2, FP_T2, FLD_S2); + FP_SET(FP_TD, FLD_D, s1 * s2); } // 100001_DDDDD00000_001000_000nnsssss OP_DEF(flt) { - OP_FUNC(unimpl); + // 暫定 + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_SET(FP_TD, FLD_D, (double)rS2); } + // 100001_DDDDDSSSSS_00101n_nnnnnsssss OP_DEF(fadd) { - OP_FUNC(unimpl); + // 暫定 + double s1; + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s1, FP_T1, FLD_S1); + FP_GET(s2, FP_T2, FLD_S2); + FP_SET(FP_TD, FLD_D, s1 + s2); } // 100001_DDDDDSSSSS_00110n_nnnnnsssss OP_DEF(fsub) { - OP_FUNC(unimpl); + // 暫定 + double s1; + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s1, FP_T1, FLD_S1); + FP_GET(s2, FP_T2, FLD_S2); + FP_SET(FP_TD, FLD_D, s1 - s2); } // 100001_DDDDDSSSSS_00111n_nnnnnsssss OP_DEF(fcmp) { - OP_FUNC(unimpl); + // 暫定 + double s1; + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s1, FP_T1, FLD_S1); + FP_GET(s2, FP_T2, FLD_S2); + rD = acc_fcmp(s1, s2); } // 100001_DDDDD00000_010010_0nn00sssss OP_DEF(int) { - OP_FUNC(unimpl); + // 暫定 + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s2, FP_T2, FLD_S2); + + int mode = (fpcr >> 14) & 3; + switch (mode) { + case 0: + std::fesetround(FE_TONEAREST); + rD = (uint32)(int32)std::nearbyint(s2); + break; + case 1: + rD = (uint32)(int32)std::trunc(s2); + break; + case 2: + rD = (uint32)(int32)std::floor(s2); + break; + case 3: + rD = (uint32)(int32)std::ceil(s2); + break; + } } // 100001_DDDDD00000_010100_0nn00sssss OP_DEF(nint) { - OP_FUNC(unimpl); + // 暫定 + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s2, FP_T2, FLD_S2); + std::fesetround(FE_TONEAREST); + rD = (uint32)(int32)std::nearbyint(s2); } // 100001_DDDDD00000_010110_0nn00sssss OP_DEF(trnc) { - OP_FUNC(unimpl); + // 暫定 + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s2, FP_T2, FLD_S2); + rD = (uint32)(int32)std::trunc(s2); } // 100001_DDDDDSSSSS_01110n_nnnnnsssss OP_DEF(fdiv) { - OP_FUNC(unimpl); + // 暫定 + double s1; + double s2; + + if (FLD_D == 0) { + FPException(M88K_FPEXCEP_FUNIMP); + return; + } + + FP_GET(s1, FP_T1, FLD_S1); + FP_GET(s2, FP_T2, FLD_S2); + FP_SET(FP_TD, FLD_D, s1 / s2); } // 110000_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(br) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(xip + D26); ExitBranch(); } @@ -951,7 +1140,7 @@ OP_DEF(br) // 110001_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(br_n) { - total_cycle += 0; // Table.7-5 + AddCycle(0); // Table.7-5 EnterBranch(xip + D26); ExitDelayBranch(); } @@ -959,7 +1148,7 @@ OP_DEF(br_n) // 110010_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(xip + D26); r[1] = nip; ExitBranch(); @@ -968,7 +1157,7 @@ OP_DEF(bsr) // 110011_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr_n) { - total_cycle += 0; // Table.7-5 + AddCycle(0); // Table.7-5 EnterBranch(xip + D26); r[1] = nip + 4; ExitDelayBranch(); @@ -978,7 +1167,7 @@ OP_DEF(bsr_n) OP_DEF(bb0) { if ((rS1 & (1 << B5)) == 0) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(xip + D16); ExitBranch(); } @@ -997,7 +1186,7 @@ OP_DEF(bb0_n) OP_DEF(bb1) { if ((rS1 & (1 << B5)) != 0) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(xip + D16); ExitBranch(); } @@ -1016,7 +1205,7 @@ OP_DEF(bb1_n) OP_DEF(bcnd) { if (acc_cnd(rS1) & M5) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(xip + D16); ExitBranch(); } @@ -1120,6 +1309,31 @@ OP_DEF(tb1) } if ((rS1 & (1 << B5)) != 0) { ExceptionCore(VEC9, ExceptionKind::TRAP); + } else if (pseudo_stop_enable) { + + // OpenBSD の STOP エミュレーション。 + // OpenBSD 6.6 では + // L1: tb1 #1 r0, #0xff + // ld r13, r21, #0x168 + // bcnd.n eq0, r13, L1 + // or r2, r25, #0x5ea0 + // の命令列が使用されている。 + // tb1 は volatile 変数をアクセスするための同期命令として + // gcc により出力されている。スーパバイザが volatile を + // 観測するために同じアドレスの tb1 に直接ブランチで 3 回飛び込んで + // きたら、それは割り込みか別プロセッサか I/O による変更を待っている + // はずなので STOP と判断してみる。 + // o. 3回、という数字に確たる理由はない。 + // o. 念の為、16バイト(4命令)後方以内からのブランチに限定しておく。 + + if (IsSuper() && VEC9 == 0xff) { + const auto& e = brhist.entry[brhist.top]; + if (e.count == 3 + && e.to == xip + && e.from - e.to < 16) { + atomic_reqflag |= CPU_REQ_STOP; + } + } } } @@ -1144,16 +1358,16 @@ OP_DEF(xmem_bu) LDST_USR_SCALE_ALIGN(1); - total_cycle += 4; // Table.7-3 + AddCycle(4); // Table.7-3 lastaddr = addr; // 例外安全のために都度 S/U ビットを制御 if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].xmem_8(addr, rD); + tmp = cmmu[1].xmem_8(addr, rD & 0xff); if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)tmp < 0) { - XmemDataException(addr, rD, DM_BU | DM_LOCK | usr); + XmemDataException(addr, DM_BU | DM_LOCK | usr); return; } if (FLD_D == 0) @@ -1170,7 +1384,7 @@ OP_DEF(xmem_w) LDST_USR_SCALE_ALIGN(4); - total_cycle += 4; // Table.7-3 + AddCycle(4); // Table.7-3 lastaddr = addr; @@ -1179,7 +1393,7 @@ OP_DEF(xmem_w) tmp = cmmu[1].xmem_32(addr, rD); if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)tmp < 0) { - XmemDataException(addr, rD, DM_W | DM_LOCK | usr); + XmemDataException(addr, DM_W | DM_LOCK | usr); return; } @@ -1197,7 +1411,7 @@ OP_DEF(ld_hu) LDST_USR_SCALE_ALIGN(2); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; @@ -1206,7 +1420,7 @@ OP_DEF(ld_hu) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data < 0) { - ReadDataException(addr, DM_HU | usr); + ReadDataException32(addr, DM_HU | usr); return; } if (FLD_D == 0) @@ -1223,7 +1437,7 @@ OP_DEF(ld_bu) LDST_USR_SCALE_ALIGN(1); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; @@ -1232,7 +1446,7 @@ OP_DEF(ld_bu) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data < 0) { - ReadDataException(addr, DM_BU | usr); + ReadDataException32(addr, DM_BU | usr); return; } if (FLD_D == 0) @@ -1249,7 +1463,7 @@ OP_DEF(ld_d) LDST_USR_SCALE_ALIGN(8); - total_cycle += 4; // Table.7-3 + AddCycle(4); // Table.7-3 lastaddr = addr; @@ -1259,7 +1473,7 @@ OP_DEF(ld_d) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data1 < 0) { - ReadDataException(addr, DM_D1 | usr); + ReadDataException64(addr, DM_D1 | usr); return; } addr += 4; @@ -1269,7 +1483,7 @@ OP_DEF(ld_d) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data2 < 0) { - ReadDataException(addr, DM_D2 | usr); + ReadDataException64(addr, DM_D2 | usr); return; } rD = data1; @@ -1286,7 +1500,7 @@ OP_DEF(ld_w) LDST_USR_SCALE_ALIGN(4); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; @@ -1295,7 +1509,7 @@ OP_DEF(ld_w) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data < 0) { - ReadDataException(addr, DM_W | usr); + ReadDataException32(addr, DM_W | usr); return; } if (FLD_D == 0) @@ -1312,7 +1526,7 @@ OP_DEF(ld_h) LDST_USR_SCALE_ALIGN(2); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; @@ -1321,7 +1535,7 @@ OP_DEF(ld_h) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data < 0) { - ReadDataException(addr, DM_H | usr); + ReadDataException32(addr, DM_H | usr); return; } if (FLD_D == 0) @@ -1338,7 +1552,7 @@ OP_DEF(ld_b) LDST_USR_SCALE_ALIGN(1); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; @@ -1347,7 +1561,7 @@ OP_DEF(ld_b) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)data < 0) { - ReadDataException(addr, DM_B | usr); + ReadDataException32(addr, DM_B | usr); return; } if (FLD_D == 0) @@ -1364,7 +1578,7 @@ OP_DEF(st_d) LDST_USR_SCALE_ALIGN(8); - total_cycle += 1 + 4; // Table.7-3 + AddCycle(1 + 4); // Table.7-3 lastaddr = addr; @@ -1373,7 +1587,7 @@ OP_DEF(st_d) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_D1 | usr); + WriteDataException64(addr, DM_D1 | usr); return; } @@ -1384,7 +1598,7 @@ OP_DEF(st_d) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)rv < 0) { - WriteDataException(addr, rD2, DM_D2 | usr); + WriteDataException64(addr, DM_D2 | usr); return; } } @@ -1398,7 +1612,7 @@ OP_DEF(st_w) LDST_USR_SCALE_ALIGN(4); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; @@ -1407,7 +1621,7 @@ OP_DEF(st_w) if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_W | usr); + WriteDataException32(addr, DM_W | usr); return; } } @@ -1421,16 +1635,16 @@ OP_DEF(st_h) LDST_USR_SCALE_ALIGN(2); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - rv = cmmu[1].store_16(addr, rD); + rv = cmmu[1].store_16(addr, rD & 0xffff); if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_H | usr); + WriteDataException32(addr, DM_H | usr); return; } } @@ -1444,16 +1658,16 @@ OP_DEF(st_b) LDST_USR_SCALE_ALIGN(1); - total_cycle += 3; // Table.7-3 + AddCycle(3); // Table.7-3 lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - rv = cmmu[1].store_8(addr, rD); + rv = cmmu[1].store_8(addr, rD & 0xff); if (__predict_false(usr)) cmmu[1].SetSuper(true); if ((int64)rv < 0) { - WriteDataException(addr, rD, DM_B | usr); + WriteDataException32(addr, DM_B | usr); return; } } @@ -1604,7 +1818,7 @@ OP_DEF(divu) return; } - total_cycle += 38; // Table.7-6 (ただしざっくり) + AddCycle(38); // Table.7-6 (ただしざっくり) if (rS2 == 0) { Exception(M88K_EXCEP_INT_DIV); @@ -1623,7 +1837,7 @@ OP_DEF(mul) return; } - total_cycle += 4; // Table.7-6 (ただしざっくり) + AddCycle(4); // Table.7-6 (ただしざっくり) if (FLD_D == 0) return; @@ -1686,7 +1900,7 @@ OP_DEF(div) return; } - total_cycle += 38; // Table.7-6 (ただしざっくり) + AddCycle(38); // Table.7-6 (ただしざっくり) if ((int32)rS1 < 0 || (int32)rS2 <= 0) { Exception(M88K_EXCEP_INT_DIV); @@ -1779,7 +1993,7 @@ OP_DEF(rot_2) // 111101_zzzzzzzzzz_110000_00000sssss OP_DEF(jmp) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(rS2); ExitBranch(); } @@ -1787,7 +2001,7 @@ OP_DEF(jmp) // 111101_zzzzzzzzzz_110001_00000sssss OP_DEF(jmp_n) { - total_cycle += 0; // Table.7-5 + AddCycle(0); // Table.7-5 EnterBranch(rS2); ExitDelayBranch(); } @@ -1795,7 +2009,7 @@ OP_DEF(jmp_n) // 111101_zzzzzzzzzz_110010_00000sssss OP_DEF(jsr) { - total_cycle += 1; // Table.7-5 + AddCycle(1); // Table.7-5 EnterBranch(rS2); r[1] = nip; ExitBranch(); @@ -1804,7 +2018,7 @@ OP_DEF(jsr) // 111101_zzzzzzzzzz_110011_00000sssss OP_DEF(jsr_n) { - total_cycle += 0; // Table.7-5 + AddCycle(0); // Table.7-5 EnterBranch(rS2); r[1] = nip + 4; ExitDelayBranch(); @@ -1856,7 +2070,7 @@ OP_DEF(ff0) // 111101_zzzzzzzzzz_111111_0000000000 OP_DEF(rte) { - total_cycle += 2; // Table.7-5 + AddCycle(2); // Table.7-5 SetPSR(epsr);