--- nono/m88xx0/m88100acc.h 2026/04/29 17:04:34 1.1.1.1 +++ nono/m88xx0/m88100acc.h 2026/04/29 17:04:44 1.1.1.2 @@ -19,6 +19,10 @@ #define m88100opf_O5(x) m88100opf_S2(x) #define m88100opf_IMM16(x) ((x) & 0x0000ffffU) #define m88100opf_VEC9(x) ((x) & 0x000001ffU) +// FP フィールド +#define m88100opf_FP_T1(x) (((x) >> 9) & 3) +#define m88100opf_FP_T2(x) (((x) >> 7) & 3) +#define m88100opf_FP_TD(x) (((x) >> 5) & 3) // cmp のやつ static inline uint32 @@ -37,3 +41,24 @@ acc_cmp(uint32 a, uint32 b) if ((int32)a == (int32)b) rv |= (1 << 2); return rv; } + +// fcmp のやつ +static inline uint32 +acc_fcmp(double a, double b) +{ + uint32 rv = 0; + if (a <= 0 || b <= a) rv |= (1 << 11); // ob + if (0 < a && a < b) rv |= (1 << 10); // in + if (0 <= a && a <= b) rv |= (1 << 9); // ib + if (a < 0 || b < a) rv |= (1 << 8); // ou + + if (a >= b) rv |= (1 << 7); // ge + if (a < b) rv |= (1 << 6); // lt + if (a <= b) rv |= (1 << 5); // le + if (a > b) rv |= (1 << 4); // gt + if (a != b) rv |= (1 << 3); // ne + if (a == b) rv |= (1 << 2); // eq + if (true ) rv |= (1 << 1); // cp + if (false ) rv |= (1 << 0); // nc + return rv; +}