From d841f35cbd4be919411d6b7dcf8711a6d0a648e7 Mon Sep 17 00:00:00 2001 From: Ivan Egorov Date: Sat, 26 Sep 2026 08:26:36 +0100 Subject: [PATCH] Add FUCOMPP (DA E9) FUCOMPP compares st(0) with st(1) unordered and pops both, the way FCOMPP does with an ordered compare. tcc emits it for == and != on long doubles, so any such program raised SIGILL under blink. Verified with a freestanding program that runs the instruction on three pairs of long doubles and prints C0 and C3, which now match the host, and with a tcc built inside an emulated bootstrap that stopped faulting on its first long double comparison. --- blink/fpu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blink/fpu.c b/blink/fpu.c index 489db5397..a58d472fc 100644 --- a/blink/fpu.c +++ b/blink/fpu.c @@ -876,6 +876,11 @@ static void OpFucomp(struct Machine *m, u64 rde) { FpuPop(m); } +static void OpFucompp(struct Machine *m, u64 rde) { + OpFucomp(m, rde); + FpuPop(m); +} + static void OpFcomip(struct Machine *m, u64 rde) { OpFcomi(m, rde); FpuPop(m); @@ -1067,6 +1072,7 @@ void OpFpu(P) { CASE(DISP(0xDA, FPUREG, 1), OpFcmove(m, rde)); CASE(DISP(0xDA, FPUREG, 2), OpFcmovbe(m, rde)); CASE(DISP(0xDA, FPUREG, 3), OpFcmovu(m, rde)); + CASE(DISP(0xDA, FPUREG, 5), OpFucompp(m, rde)); CASE(DISP(0xDA, MEMORY, 0), OpFiaddl(m)); CASE(DISP(0xDA, MEMORY, 1), OpFimull(m)); CASE(DISP(0xDA, MEMORY, 2), OpFicoml(m));