--- nono/m88xx0/m88100ops.cpp 2026/04/29 17:04:44 1.1.1.5 +++ nono/m88xx0/m88100ops.cpp 2026/04/29 17:04:49 1.1.1.7 @@ -41,7 +41,38 @@ #define FP_TD m88100opf_FP_TD(opX) // XXX: 暫定 -#include "fp.h" +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) { \ @@ -323,7 +354,7 @@ OP_DEF(xmem_bu_imm) 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, DM_BU | DM_LOCK); return; @@ -1069,7 +1100,6 @@ OP_DEF(trnc) } FP_GET(s2, FP_T2, FLD_S2); -printf("trunc(%f) => %f\n", s2, std::trunc(s2)); rD = (uint32)(int32)std::trunc(s2); } @@ -1300,7 +1330,7 @@ OP_DEF(xmem_bu) // 例外安全のために都度 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, DM_BU | DM_LOCK | usr);