--- nono/m88xx0/m88100ops.cpp 2026/04/29 17:04:38 1.1.1.3 +++ nono/m88xx0/m88100ops.cpp 2026/04/29 17:04:41 1.1.1.4 @@ -29,17 +29,13 @@ #define rD (r[FLD_D]) #define rS1 (r[FLD_S1]) #define rS2 (r[FLD_S2]) +// ダブルワードの2ワード目 +#define rD2 (r[(FLD_D + 1) & 0x1f]) // ブランチ命令入り口 inline void -m88kcpu::EnterBranch() -{ -} - -// ブランチ本体 -inline void -m88kcpu::DoBranch(uint32 toaddr) +m88kcpu::EnterBranch(uint32 toaddr) { // ブランチヒストリに登録しつつ、 // ブランチヒストリからブランチ状況を取得 @@ -97,10 +93,12 @@ m88kcpu::ExitBranch() } // 遅延ブランチ出口 +// 速度を稼ぐため、ビット反転だけでこれを区別しているので、 +// 同じ op 中で複数回呼び出さないこと。 inline void m88kcpu::ExitDelayBranch() { - opF = OpSetDelay(opF); + opF ^= DELAYSLOT; } // ロードストアユニットの usr の処理。 @@ -279,6 +277,8 @@ OP_DEF(xmem_bu_imm) addr = rS1 + IMM16; LDST_ALIGN(1); + total_cycle += 4; // Table.7-3 + lastaddr = addr; tmp = cmmu[1].xmem_8(addr, rD); if ((int64)tmp < 0) { @@ -299,6 +299,8 @@ OP_DEF(xmem_w_imm) addr = rS1 + IMM16; LDST_ALIGN(4); + total_cycle += 4; // Table.7-3 + lastaddr = addr; tmp = cmmu[1].xmem_32(addr, rD); if ((int64)tmp < 0) { @@ -314,66 +316,72 @@ OP_DEF(xmem_w_imm) OP_DEF(ld_hu_imm) { uint32 addr; - uint64 tmp; + uint64 data; addr = rS1 + IMM16; LDST_ALIGN(2); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - tmp = cmmu[1].load_16(addr); - if ((int64)tmp < 0) { + data = cmmu[1].load_16(addr); + if ((int64)data < 0) { ReadDataException(addr, DM_HU); return; } if (FLD_D == 0) return; - rD = tmp; + rD = data; } // 000011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_bu_imm) { uint32 addr; - uint64 tmp; + uint64 data; addr = rS1 + IMM16; LDST_ALIGN(1); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - tmp = cmmu[1].load_8(addr); - if ((int64)tmp < 0) { + data = cmmu[1].load_8(addr); + if ((int64)data < 0) { ReadDataException(addr, DM_BU); return; } if (FLD_D == 0) return; - rD = tmp; + rD = data; } // 000100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_d_imm) { uint32 addr; - uint64 tmp, tmp2; + uint64 data1, data2; addr = rS1 + IMM16; LDST_ALIGN(8); + total_cycle += 4; // Table.7-3 + lastaddr = addr; - tmp = cmmu[1].load_32(addr); - if ((int64)tmp < 0) { + data1 = cmmu[1].load_32(addr); + if ((int64)data1 < 0) { ReadDataException(addr, DM_D1); return; } addr += 4; - tmp2 = cmmu[1].load_32(addr); - if ((int64)tmp2 < 0) { + data2 = cmmu[1].load_32(addr); + if ((int64)data2 < 0) { ReadDataException(addr, DM_D2); return; } - rD = tmp; - r[(FLD_D + 1) & 0x1f] = tmp2; + rD = data1; + rD2 = data2; r[0] = 0; } @@ -381,78 +389,89 @@ OP_DEF(ld_d_imm) OP_DEF(ld_w_imm) { uint32 addr; - uint64 tmp; + uint64 data; addr = rS1 + IMM16; LDST_ALIGN(4); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - tmp = cmmu[1].load_32(addr); - if ((int64)tmp < 0) { + data = cmmu[1].load_32(addr); + if ((int64)data < 0) { ReadDataException(addr, DM_W); return; } if (FLD_D == 0) return; - rD = tmp; + rD = data; } // 000110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_h_imm) { uint32 addr; - uint64 tmp; + uint64 data; addr = rS1 + IMM16; LDST_ALIGN(2); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - tmp = cmmu[1].load_16(addr); - if ((int64)tmp < 0) { + data = cmmu[1].load_16(addr); + if ((int64)data < 0) { ReadDataException(addr, DM_H); return; } if (FLD_D == 0) return; - rD = (uint32)(int32)(int16)tmp; + rD = (uint32)(int32)(int16)data; } // 000111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_b_imm) { uint32 addr; - uint64 tmp; + uint64 data; addr = rS1 + IMM16; LDST_ALIGN(1); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - tmp = cmmu[1].load_8(addr); - if ((int64)tmp < 0) { + data = cmmu[1].load_8(addr); + if ((int64)data < 0) { ReadDataException(addr, DM_B); return; } if (FLD_D == 0) return; - rD = (uint32)(int32)(int8)tmp; + rD = (uint32)(int32)(int8)data; } // 001000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_d_imm) { uint32 addr; + uint64 rv; addr = rS1 + IMM16; LDST_ALIGN(8); + total_cycle += 1 + 4; // Table.7-3 + lastaddr = addr; - if ((int64)cmmu[1].store_32(addr, rD) < 0) { + rv = cmmu[1].store_32(addr, rD); + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_D1); return; } addr += 4; - if ((int64)cmmu[1].store_32(addr, r[(FLD_D + 1) & 0x1f]) < 0) { - WriteDataException(addr, r[(FLD_D + 1) & 0x1f], DM_D2); + rv = cmmu[1].store_32(addr, rD2); + if ((int64)rv < 0) { + WriteDataException(addr, rD2, DM_D2); return; } } @@ -461,12 +480,16 @@ OP_DEF(st_d_imm) OP_DEF(st_w_imm) { uint32 addr; + uint64 rv; addr = rS1 + IMM16; LDST_ALIGN(4); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - if ((int64)cmmu[1].store_32(addr, rD) < 0) { + rv = cmmu[1].store_32(addr, rD); + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_W); return; } @@ -476,12 +499,16 @@ OP_DEF(st_w_imm) OP_DEF(st_h_imm) { uint32 addr; + uint64 rv; addr = rS1 + IMM16; LDST_ALIGN(2); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - if ((int64)cmmu[1].store_16(addr, rD) < 0) { + rv = cmmu[1].store_16(addr, rD); + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_H); return; } @@ -491,12 +518,16 @@ OP_DEF(st_h_imm) OP_DEF(st_b_imm) { uint32 addr; + uint64 rv; addr = rS1 + IMM16; LDST_ALIGN(1); + total_cycle += 3; // Table.7-3 + lastaddr = addr; - if ((int64)cmmu[1].store_8(addr, rD) < 0) { + rv = cmmu[1].store_8(addr, rD); + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_B); return; } @@ -621,6 +652,9 @@ OP_DEF(divu_imm) fpu_unimpl(); return; } + + total_cycle += 38; // Table.7-6 (ただしざっくり) + if (IMM16 == 0) { Exception(M88K_EXCEP_INT_DIV); return; @@ -637,6 +671,9 @@ OP_DEF(mul_imm) fpu_unimpl(); return; } + + total_cycle += 4; // Table.7-6 (ただしざっくり) + if (FLD_D == 0) return; rD = rS1 * IMM16; @@ -677,6 +714,9 @@ OP_DEF(div_imm) fpu_unimpl(); return; } + + total_cycle += 38; // Table.7-6 (ただしざっくり) + if ((int32)rS1 < 0 || IMM16 == 0) { Exception(M88K_EXCEP_INT_DIV); return; @@ -758,7 +798,7 @@ OP_DEF(stcr) } cr[FLD_CR] = rS1; if (FLD_CR == 1) { - SetPSR(psr); + SetPSR(); } } @@ -809,7 +849,7 @@ OP_DEF(xcr) rD = cr[FLD_CR]; cr[FLD_CR] = tmp; if (FLD_CR == 1) { - SetPSR(psr); + SetPSR(); } r[0] = 0; } @@ -903,24 +943,24 @@ OP_DEF(fdiv) // 110000_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(br) { - EnterBranch(); - DoBranch(xip + D26); + total_cycle += 1; // Table.7-5 + EnterBranch(xip + D26); ExitBranch(); } // 110001_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(br_n) { - EnterBranch(); - DoBranch(xip + D26); + total_cycle += 0; // Table.7-5 + EnterBranch(xip + D26); ExitDelayBranch(); } // 110010_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr) { - EnterBranch(); - DoBranch(xip + D26); + total_cycle += 1; // Table.7-5 + EnterBranch(xip + D26); r[1] = nip; ExitBranch(); } @@ -928,8 +968,8 @@ OP_DEF(bsr) // 110011_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr_n) { - EnterBranch(); - DoBranch(xip + D26); + total_cycle += 0; // Table.7-5 + EnterBranch(xip + D26); r[1] = nip + 4; ExitDelayBranch(); } @@ -938,8 +978,8 @@ OP_DEF(bsr_n) OP_DEF(bb0) { if ((rS1 & (1 << B5)) == 0) { - EnterBranch(); - DoBranch(xip + D16); + total_cycle += 1; // Table.7-5 + EnterBranch(xip + D16); ExitBranch(); } } @@ -948,8 +988,7 @@ OP_DEF(bb0) OP_DEF(bb0_n) { if ((rS1 & (1 << B5)) == 0) { - EnterBranch(); - DoBranch(xip + D16); + EnterBranch(xip + D16); ExitDelayBranch(); } } @@ -958,8 +997,8 @@ OP_DEF(bb0_n) OP_DEF(bb1) { if ((rS1 & (1 << B5)) != 0) { - EnterBranch(); - DoBranch(xip + D16); + total_cycle += 1; // Table.7-5 + EnterBranch(xip + D16); ExitBranch(); } } @@ -968,8 +1007,7 @@ OP_DEF(bb1) OP_DEF(bb1_n) { if ((rS1 & (1 << B5)) != 0) { - EnterBranch(); - DoBranch(xip + D16); + EnterBranch(xip + D16); ExitDelayBranch(); } } @@ -978,8 +1016,8 @@ OP_DEF(bb1_n) OP_DEF(bcnd) { if (acc_cnd(rS1) & M5) { - EnterBranch(); - DoBranch(xip + D16); + total_cycle += 1; // Table.7-5 + EnterBranch(xip + D16); ExitBranch(); } } @@ -988,8 +1026,7 @@ OP_DEF(bcnd) OP_DEF(bcnd_n) { if (acc_cnd(rS1) & M5) { - EnterBranch(); - DoBranch(xip + D16); + EnterBranch(xip + D16); ExitDelayBranch(); } } @@ -1107,6 +1144,8 @@ OP_DEF(xmem_bu) LDST_USR_SCALE_ALIGN(1); + total_cycle += 4; // Table.7-3 + lastaddr = addr; // 例外安全のために都度 S/U ビットを制御 @@ -1131,6 +1170,8 @@ OP_DEF(xmem_w) LDST_USR_SCALE_ALIGN(4); + total_cycle += 4; // Table.7-3 + lastaddr = addr; // 例外安全のために都度 S/U ビットを制御 @@ -1150,174 +1191,188 @@ OP_DEF(xmem_w) // 111101_DDDDDSSSSS_000010_xU000sssss OP_DEF(ld_hu) { - uint64 tmp; + uint64 data; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(2); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].load_16(addr); + data = cmmu[1].load_16(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data < 0) { ReadDataException(addr, DM_HU | usr); return; } if (FLD_D == 0) return; - rD = tmp; + rD = data; } // 111101_DDDDDSSSSS_000011_xU000sssss OP_DEF(ld_bu) { - uint64 tmp; + uint64 data; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(1); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].load_8(addr); + data = cmmu[1].load_8(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data < 0) { ReadDataException(addr, DM_BU | usr); return; } if (FLD_D == 0) return; - rD = tmp; + rD = data; } // 111101_DDDDDSSSSS_000100_xU000sssss OP_DEF(ld_d) { - uint64 tmp, tmp2; + uint64 data1, data2; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(8); + total_cycle += 4; // Table.7-3 + lastaddr = addr; // 例外安全のために都度 S/U ビットを制御 if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].load_32(addr); + data1 = cmmu[1].load_32(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data1 < 0) { ReadDataException(addr, DM_D1 | usr); return; } addr += 4; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp2 = cmmu[1].load_32(addr); + data2 = cmmu[1].load_32(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data2 < 0) { ReadDataException(addr, DM_D2 | usr); return; } - rD = tmp; - r[(FLD_D + 1) & 0x1f] = tmp2; + rD = data1; + rD2 = data2; r[0] = 0; } // 111101_DDDDDSSSSS_000101_xU000sssss OP_DEF(ld_w) { - uint64 tmp; + uint64 data; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(4); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].load_32(addr); + data = cmmu[1].load_32(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data < 0) { ReadDataException(addr, DM_W | usr); return; } if (FLD_D == 0) return; - rD = tmp; + rD = data; } // 111101_DDDDDSSSSS_000110_xU000sssss OP_DEF(ld_h) { - uint64 tmp; + uint64 data; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(2); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].load_16(addr); + data = cmmu[1].load_16(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data < 0) { ReadDataException(addr, DM_H | usr); return; } if (FLD_D == 0) return; - rD = (uint32)(int32)(int16)tmp; + rD = (uint32)(int32)(int16)data; } // 111101_DDDDDSSSSS_000111_xU000sssss OP_DEF(ld_b) { - uint64 tmp; + uint64 data; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(1); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp = cmmu[1].load_8(addr); + data = cmmu[1].load_8(addr); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp < 0) { + if ((int64)data < 0) { ReadDataException(addr, DM_B | usr); return; } if (FLD_D == 0) return; - rD = (uint32)(int32)(int8)tmp; + rD = (uint32)(int32)(int8)data; } // 111101_DDDDDSSSSS_001000_xU000sssss OP_DEF(st_d) { - uint64 tmp2; + uint64 rv; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(8); + total_cycle += 1 + 4; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp2 = cmmu[1].store_32(addr, rD); + rv = cmmu[1].store_32(addr, rD); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp2 < 0) { + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_D1 | usr); return; } @@ -1325,11 +1380,11 @@ OP_DEF(st_d) addr += 4; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp2 = cmmu[1].store_32(addr, r[(FLD_D + 1) & 0x1f]); + rv = cmmu[1].store_32(addr, rD2); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp2 < 0) { - WriteDataException(addr, r[(FLD_D + 1) & 0x1f], DM_D2 | usr); + if ((int64)rv < 0) { + WriteDataException(addr, rD2, DM_D2 | usr); return; } } @@ -1337,19 +1392,21 @@ OP_DEF(st_d) // 111101_DDDDDSSSSS_001001_xU000sssss OP_DEF(st_w) { - uint64 tmp2; + uint64 rv; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(4); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp2 = cmmu[1].store_32(addr, rD); + rv = cmmu[1].store_32(addr, rD); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp2 < 0) { + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_W | usr); return; } @@ -1358,19 +1415,21 @@ OP_DEF(st_w) // 111101_DDDDDSSSSS_001010_xU000sssss OP_DEF(st_h) { - uint64 tmp2; + uint64 rv; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(2); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp2 = cmmu[1].store_16(addr, rD); + rv = cmmu[1].store_16(addr, rD); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp2 < 0) { + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_H | usr); return; } @@ -1379,19 +1438,21 @@ OP_DEF(st_h) // 111101_DDDDDSSSSS_001011_xU000sssss OP_DEF(st_b) { - uint64 tmp2; + uint64 rv; uint32 addr; uint32 usr; LDST_USR_SCALE_ALIGN(1); + total_cycle += 3; // Table.7-3 + lastaddr = addr; if (__predict_false(usr)) cmmu[1].SetSuper(false); - tmp2 = cmmu[1].store_8(addr, rD); + rv = cmmu[1].store_8(addr, rD); if (__predict_false(usr)) cmmu[1].SetSuper(true); - if ((int64)tmp2 < 0) { + if ((int64)rv < 0) { WriteDataException(addr, rD, DM_B | usr); return; } @@ -1507,7 +1568,7 @@ OP_DEF(addu) res += GetCY(); } if (IsCO) { - SetCY((res >> 32) & 1); + SetCY(res >> 32); } if (FLD_D == 0) return; @@ -1528,7 +1589,7 @@ OP_DEF(subu) res += 1; } if (IsCO) { - SetCY((res >> 32) & 1); + SetCY(res >> 32); } if (FLD_D == 0) return; @@ -1542,6 +1603,9 @@ OP_DEF(divu) fpu_unimpl(); return; } + + total_cycle += 38; // Table.7-6 (ただしざっくり) + if (rS2 == 0) { Exception(M88K_EXCEP_INT_DIV); return; @@ -1558,6 +1622,9 @@ OP_DEF(mul) fpu_unimpl(); return; } + + total_cycle += 4; // Table.7-6 (ただしざっくり) + if (FLD_D == 0) return; rD = rS1 * rS2; @@ -1573,7 +1640,7 @@ OP_DEF(add) // XXX: オーバーフローが起きたときにキャリーが更新されるかどうか // ドキュメントされてない気がする if (IsCO) { - SetCY((res >> 32) & 1); + SetCY(res >> 32); } if (isovf_add(rS1, rS2, res)) { Exception(M88K_EXCEP_INT_OVF); @@ -1600,7 +1667,7 @@ OP_DEF(sub) // XXX: オーバーフローが起きたときにキャリーが更新されるかどうか // ドキュメントされてない気がする if (IsCO) { - SetCY((res >> 32) & 1); + SetCY(res >> 32); } if (isovf_sub(rS1, rS2, res)) { Exception(M88K_EXCEP_INT_OVF); @@ -1618,6 +1685,9 @@ OP_DEF(div) fpu_unimpl(); return; } + + total_cycle += 38; // Table.7-6 (ただしざっくり) + if ((int32)rS1 < 0 || (int32)rS2 <= 0) { Exception(M88K_EXCEP_INT_DIV); return; @@ -1709,24 +1779,24 @@ OP_DEF(rot_2) // 111101_zzzzzzzzzz_110000_00000sssss OP_DEF(jmp) { - EnterBranch(); - DoBranch(rS2); + total_cycle += 1; // Table.7-5 + EnterBranch(rS2); ExitBranch(); } // 111101_zzzzzzzzzz_110001_00000sssss OP_DEF(jmp_n) { - EnterBranch(); - DoBranch(rS2); + total_cycle += 0; // Table.7-5 + EnterBranch(rS2); ExitDelayBranch(); } // 111101_zzzzzzzzzz_110010_00000sssss OP_DEF(jsr) { - EnterBranch(); - DoBranch(rS2); + total_cycle += 1; // Table.7-5 + EnterBranch(rS2); r[1] = nip; ExitBranch(); } @@ -1734,8 +1804,8 @@ OP_DEF(jsr) // 111101_zzzzzzzzzz_110011_00000sssss OP_DEF(jsr_n) { - EnterBranch(); - DoBranch(rS2); + total_cycle += 0; // Table.7-5 + EnterBranch(rS2); r[1] = nip + 4; ExitDelayBranch(); } @@ -1786,6 +1856,8 @@ OP_DEF(ff0) // 111101_zzzzzzzzzz_111111_0000000000 OP_DEF(rte) { + total_cycle += 2; // Table.7-5 + SetPSR(epsr); // LUNA88K の ROM1.2 は sxip, snip, sfip を制御してくる。 @@ -1798,19 +1870,19 @@ OP_DEF(rte) // (実際はクロックが消費されるかも?) // sfip が VALID なので、そこから実行を再開する。 if (snip & SIP_V) { - DoBranch(snip & SIP_MASK); - fetch(); + EnterBranch(snip & SIP_MASK); + ExitBranch(); fip = sfip & SIP_MASK; } else { - DoBranch(sfip & SIP_MASK); - fetch(); + EnterBranch(sfip & SIP_MASK); + ExitBranch(); } // ディレイスロットにいた命令かどうかをやんわり復元する。 // 88110 ではこの情報が E?IP に保持されているが // 88100 にはない。 if (nip + 4 != fip) { - opF = OpSetDelay(opF); + ExitDelayBranch(); } }