diff options
| author | 2025-10-30 09:34:16 +0100 | |
|---|---|---|
| committer | 2025-10-30 09:34:16 +0100 | |
| commit | 81fbfad02904f941535ee968944eefd436d623c8 (patch) | |
| tree | bb730c5920ec8ece637e248ae2c00a9124f9989c /amd64 | |
| parent | 6bbec6e6b2a1417f0f6816d9b0e4097695c060f6 (diff) | |
isel fixes
Diffstat (limited to 'amd64')
| -rw-r--r-- | amd64/emit.c | 1 | ||||
| -rw-r--r-- | amd64/isel.c | 14 |
2 files changed, 11 insertions, 4 deletions
diff --git a/amd64/emit.c b/amd64/emit.c index 585a71c..f8a0010 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -1108,7 +1108,6 @@ emitbranch(uchar **pcode, struct block *blk) struct instr *ins; assert(arg.t == RTMP); ins = &instrtab[arg.i]; - /* TODO handle float cmps */ if ((oiscmp(ins->op) || ins->op == Oand || ins->op == Osub)) { if (ins->r.bits != ZEROREF.bits) { /* for CMP instr */ diff --git a/amd64/isel.c b/amd64/isel.c index 1a0e688..49efce8 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -74,7 +74,7 @@ fixarg(union ref *r, struct instr *ins, struct block *blk, int *curi) } else if (con->cls >= KI8) { /* float immediates & 64bit immediates are loaded from memory */ uchar data[8]; - uint siz = cls2siz[con->cls]; + uint ksiz = cls2siz[con->cls]; if (con->cls <= KPTR && in_range(ins->op, Ocopy, Omove)) /* in this case we can use movabs */ return; if (con->cls != KF4) wr64le(data, con->i); @@ -82,11 +82,13 @@ fixarg(union ref *r, struct instr *ins, struct block *blk, int *curi) union { float f; int i; } pun = { con->f }; wr32le(data, pun.i); } - *r = mkdatref(NULL, siz, /*align*/siz, data, siz, /*deref*/1); + *r = mkdatref(NULL, ksiz, /*align*/ksiz, data, ksiz, /*deref*/1); if (&ins->l != r && ins->l.t == RADDR) { /* can't use memory arg in rhs if lhs is memory */ *r = insertinstr(blk, (*curi)++, mkinstr(Ocopy, con->cls, *r)); } + } else if (ins->op != Omove && con->issym && r == &ins->r) { + *r = insertinstr(blk, (*curi)++, mkinstr(Ocopy, KPTR, mkaddr((struct addr){*r}))); } 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)) { @@ -467,8 +469,14 @@ seljmp(struct function *fn, struct block *blk) instrtab[c.i].keep = 1; } else { if (!(opflags[instrtab[c.i].op] & ZF) || blk->ins.n == 0 || c.i != blk->ins.p[blk->ins.n - 1]) { + struct instr *ins; + int curi = blk->ins.n; blk->jmp.arg[0] = insertinstr(blk, blk->ins.n, mkinstr(Oneq, instrtab[c.i].cls, c, ZEROREF)); - instrtab[blk->jmp.arg[0].i].keep = 1; + ins = &instrtab[blk->jmp.arg[0].i]; + if (kisflt(ins->cls)) { + ins->r = insertinstr(blk, curi, mkinstr(Ocopy, ins->cls, ZEROREF)); + } + ins->keep = 1; } } } else if (blk->jmp.t == Jret) { |