diff options
| author | 2025-09-16 17:25:20 +0200 | |
|---|---|---|
| committer | 2025-09-16 17:25:20 +0200 | |
| commit | 3d837a07483037b36254aaa8623151086f67c329 (patch) | |
| tree | d094051d75f393dcc5508950acde31b179ee69f0 /amd64 | |
| parent | 75db572e8a7a144b3d6fdc2b148ac3921f77f2b2 (diff) | |
fix some more codegen bugs for symbol constants
Diffstat (limited to 'amd64')
| -rw-r--r-- | amd64/emit.c | 3 | ||||
| -rw-r--r-- | 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: |