From 3d837a07483037b36254aaa8623151086f67c329 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 16 Sep 2025 17:25:20 +0200 Subject: fix some more codegen bugs for symbol constants --- amd64/emit.c | 3 +-- amd64/isel.c | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/amd64/emit.c b/amd64/emit.c index 238aea6..739e89d 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -952,8 +952,7 @@ emitinstr(uchar **pcode, struct function *fn, struct block *blk, int curi, struc case Olth: case Ogth: case Olte: case Ogte: case Oulth: case Ougth: case Oulte: case Ougte: dst = mkregoper(ins->l); - /* TODO handle float cmps */ - src = mkimmdatregoper(ins->r); + src = ref2oper(ins->r); regzeroed = 0; if (ins->reg && dst.reg != ins->reg-1 && (src.t != OREG || src.reg != ins->reg-1)) { /* can zero output reg before test instruction (differs from both inputs) */ diff --git a/amd64/isel.c b/amd64/isel.c index 5cd5526..450d8fd 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -82,7 +82,6 @@ fixarg(union ref *r, struct instr *ins, struct block *blk, int *curi) wr32le(data, pun.i); } *r = mkdatref(NULL, siz, /*align*/siz, data, siz, /*deref*/1); - picfixsym(r, blk, curi); } else if (in_range(op, Odiv, Ourem) && kisint(ins->cls)) goto DivImm; } else if (r->t == RICON && in_range(op, Odiv, Ourem) && kisint(ins->cls)) { @@ -93,6 +92,7 @@ fixarg(union ref *r, struct instr *ins, struct block *blk, int *curi) ShiftImm: /* shift immediate is always 8bit */ *r = mkref(RICON, sh & 255); } + picfixsym(r, blk, curi); } static void @@ -395,7 +395,10 @@ sel(struct function *fn, struct instr *ins, struct block *blk, int *curi) if (!fuseaddr(&ins->l, blk, curi) && ins->l.t != RTMP && ins->l.t != RREG) ins->l = insertinstr(blk, (*curi)++, mkinstr(Ocopy, KPTR, ins->l)); picfixsym(&ins->l, blk, curi); - fixarg(&ins->r, ins, blk, curi); + if (isaddrcon(ins->r)) + ins->r = insertinstr(blk, (*curi)++, mkinstr(Ocopy, KPTR, ins->r)); + else + fixarg(&ins->r, ins, blk, curi); break; case Ocvtf4f8: case Ocvtf8f4: case Ocvtf4s: case Ocvtf8s: case Oexts1: case Oextu1: case Oexts2: case Oextu2: case Oexts4: case Oextu4: -- cgit v1.2.3