From 28fdb0f046184e567e85b9bb40dc942ca1739d9f Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Thu, 10 Feb 2022 15:35:56 -0800 Subject: qbe: Switch to unary negation This fixes bugs involving floating point negative zero. --- ops.h | 1 + qbe.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ops.h b/ops.h index b8b461a..9b2d48b 100644 --- a/ops.h +++ b/ops.h @@ -1,6 +1,7 @@ /* arithmetic and bits */ OP(IADD, "add") OP(ISUB, "sub") +OP(INEG, "neg") OP(IDIV, "div") OP(IMUL, "mul") OP(IUDIV, "udiv") diff --git a/qbe.c b/qbe.c index 81ed566..41a38da 100644 --- a/qbe.c +++ b/qbe.c @@ -803,7 +803,7 @@ funcexpr(struct func *f, struct expr *e) return funcload(f, e->type, (struct lvalue){r}); case TSUB: r = funcexpr(f, e->base); - return funcinst(f, ISUB, qbetype(e->type).base, mkintconst(0), r); + return funcinst(f, INEG, qbetype(e->type).base, r, NULL); } fatal("internal error; unknown unary expression"); break; -- cgit v1.2.3