From d313c6e49bfb32ae24745e90eebe833da20efa1a Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 22 Jun 2023 21:54:08 +0200 Subject: change RMORE -> RADDR; use RXXX (RNONE) for special args,also undef --- amd64/emit.c | 28 ++++++++++++++-------------- amd64/isel.c | 24 ++++++++++++------------ 2 files changed, 26 insertions(+), 26 deletions(-) (limited to 'amd64') diff --git a/amd64/emit.c b/amd64/emit.c index d3dad9c..f354262 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -38,7 +38,7 @@ ref2oper(union ref r) else if (!conht[r.i].cls) return mkoper(OCONR, .con = r.i); assert(0); - case RMORE: return mkmemoper(r); + case RADDR: return mkmemoper(r); default: assert(0); } } @@ -108,19 +108,19 @@ mkmemoper(union ref r) if (wop.t == OMEM) return wop; assert(wop.t == OREG); return mkoper(OMEM, .base = wop.reg, .index = NOINDEX); - } else if (r.t == RMORE) { + } else if (r.t == RADDR) { const struct addr *addr = &addrht[r.i]; struct oper mem; if (addr->base.t == RTMP && ioper[addr->base.i].t == OMEM) { mem = ioper[addr->base.i]; - if (addr->index.t) addmemoper(&mem, mkregoper(addr->index)); + if (addr->index.bits) addmemoper(&mem, mkregoper(addr->index)); assert(!mem.shift); mem.shift = addr->shift; addmemoper(&mem, mkoper(OIMM, .imm = addr->disp)); return mem; } - return mkoper(OMEM, .base = addr->base.t ? mkregoper(addr->base).reg : NOBASE, - .index = addr->index.t ? mkregoper(addr->index).reg : NOINDEX, + return mkoper(OMEM, .base = addr->base.bits ? mkregoper(addr->base).reg : NOBASE, + .index = addr->index.bits ? mkregoper(addr->index).reg : NOINDEX, .disp = addr->disp, .shift = addr->shift); } else if (r.t == RXCON) { @@ -565,7 +565,7 @@ flagslivep(struct block *blk, int curi) { int cmpi; /* conditional branch that references a previous comparison instruction? */ - if (blk->jmp.t != Jb || !blk->jmp.arg[0].t) + if (blk->jmp.t != Jb || !blk->jmp.arg[0].bits) return 0; assert(blk->jmp.arg[0].t == RTMP); cmpi = blk->jmp.arg[1].i; @@ -583,29 +583,29 @@ static void gencopy(uchar **pcode, enum irclass cls, struct block *blk, int curi, struct oper dst, union ref val) { assert(dst.t == OREG); - if (val.t == RMORE) { + if (val.t == RADDR) { /* this is a LEA, but maybe it can be lowered to a 2-address instruction, * which may clobber flags */ const struct addr *addr = &addrht[val.i]; if (flagslivep(blk, curi)) goto Lea; - if (addr->base.t && dst.reg == mkregoper(addr->base).reg) { /* base = dst */ - if (addr->index.t && !addr->disp && !addr->shift){ + if (addr->base.bits && dst.reg == mkregoper(addr->base).reg) { /* base = dst */ + if (addr->index.bits && !addr->disp && !addr->shift){ /* lea Rx, [Rx + Ry] -> add Rx, Ry */ Xadd(pcode, cls, dst, mkregoper(addr->index)); return; - } else if (!addr->index.t) { + } else if (!addr->index.bits) { if (!addr->disp) /* lea Rx, [Rx] -> mov Rx, Rx */ Xmov(pcode, cls, dst, dst); else /* lea Rx, [Rx + Imm] -> add Rx, Imm */ Xadd(pcode, cls, dst, mkoper(OIMM, .imm = addr->disp)); return; } - } else if (addr->index.t && dst.reg == mkregoper(addr->index).reg) { /* index = dst */ - if (addr->base.t && !addr->disp && !addr->shift) { + } else if (addr->index.bits && dst.reg == mkregoper(addr->index).reg) { /* index = dst */ + if (addr->base.bits && !addr->disp && !addr->shift) { /* lea Rx, [Ry + Rx] -> add Rx, Ry */ Xadd(pcode, cls, dst, mkregoper(addr->base)); return; - } else if (!addr->base.t) { + } else if (!addr->base.bits) { if (!addr->disp && !addr->shift) /* lea Rx, [Rx] -> mov Rx, Rx */ Xmov(pcode, cls, dst, dst); else if (!addr->shift) /* lea Rx, [Rx + Imm] -> add Rx, Imm */ @@ -789,7 +789,7 @@ emitbranch(uchar **pcode, struct block *blk) /* conditional branch.. */ union ref arg = blk->jmp.arg[0]; - if (!arg.t) /* implicit by ZF */ + if (!arg.bits) /* implicit by ZF */ cc = CCNZ; else { struct instr *ins; diff --git a/amd64/isel.c b/amd64/isel.c index 3f83312..cb87b7d 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -146,7 +146,7 @@ static bool ascale(struct addr *addr, union ref a, union ref b) { if (b.t != RICON) return 0; - if (addr->index.t) return 0; + if (addr->index.bits) return 0; if (a.t != RTMP && a.t != RREG) return 0; if ((unsigned)b.i > 3) return 0; addr->shift = b.i; @@ -167,11 +167,11 @@ aadd(struct addr *addr, union ref r) } else if (ins->op == Oshl) { if (!ascale(addr, ins->l, ins->r)) goto Ref; ins->skip = 1; - } else if (ins->op == Ocopy && ins->l.t == RMORE) { + } else if (ins->op == Ocopy && ins->l.t == RADDR) { struct addr save = *addr, *addr2 = &addrht[ins->l.i]; - if ((!addr2->base.t || aadd(addr, addr2->base)) + if ((!addr2->base.bits || aadd(addr, addr2->base)) && acon(addr, mkintcon(KI4, addr2->disp)) - && (!addr2->index.t || ascale(addr, addr2->index, mkref(RICON, addr2->shift)))) + && (!addr2->index.bits || ascale(addr, addr2->index, mkref(RICON, addr2->shift)))) { ins->skip = 1; } else { @@ -189,8 +189,8 @@ aadd(struct addr *addr, union ref r) * safely hoisted into an address value, unless they have global lifetime */ if (!bstest(mctarg->rglob, r.i)) return 0; Ref: - if (!addr->base.t) addr->base = r; - else if (!addr->index.t) addr->index = r; + if (!addr->base.bits) addr->base = r; + else if (!addr->index.bits) addr->index = r; else return 0; } else return 0; return 1; @@ -201,7 +201,7 @@ fuseaddr(union ref *r) { struct addr addr = { 0 }; - if (r->t == RMORE) return 1; + if (r->t == RADDR) return 1; if (r->t == RXCON && (!conht[r->i].cls && !conht[r->i].deref)) return 1; if (r->t != RTMP) return 0; if (!aadd(&addr, *r)) return 0; @@ -216,7 +216,7 @@ addarg4addrp(union ref r) { struct instr *ins = &instrtab[r.i]; if (r.t != RTMP) return 0; - return ins->op == Oshl || (ins->op == Ocopy && ins->l.t == RMORE) || ins->op == Oadd; + return ins->op == Oshl || (ins->op == Ocopy && ins->l.t == RADDR) || ins->op == Oadd; } static void @@ -344,7 +344,7 @@ sel(struct function *fn, struct instr *ins, struct block *blk, int *curi) ins->inplace = 1; if (ins->l.t != RTMP && ins->l.t != RREG) ins->l = insertinstr(blk, (*curi)++, mkinstr(Ocopy, ins->cls, ins->l)); - if (ins->r.t) + if (ins->r.bits) case Omove: fixarg(&ins->r, ins, blk, curi); break; @@ -367,7 +367,7 @@ sel(struct function *fn, struct instr *ins, struct block *blk, int *curi) static void seljmp(struct function *fn, struct block *blk) { - if (blk->jmp.t == Jb && blk->jmp.arg[0].t) { + if (blk->jmp.t == Jb && blk->jmp.arg[0].bits) { union ref c = blk->jmp.arg[0]; if (c.t != RTMP) { enum irclass cls = c.t == RICON ? KI4 : c.t == RXCON && conht[c.i].cls ? conht[c.i].cls : KPTR; @@ -385,14 +385,14 @@ seljmp(struct function *fn, struct block *blk) } } } else if (blk->jmp.t == Jret) { - if (blk->jmp.arg[0].t) { + if (blk->jmp.arg[0].bits) { int curi; union ref r = mkref(RREG, fn->abiret[0].reg); struct instr *ins = &instrtab[insertinstr(blk, blk->ins.n, mkinstr(Omove, fn->abiret[0].ty.cls, r , blk->jmp.arg[0])).i]; curi = blk->ins.n; fixarg(&ins->r, ins, blk, &curi); blk->jmp.arg[0] = r; - if (blk->jmp.arg[1].t) { + if (blk->jmp.arg[1].bits) { r = mkref(RREG, fn->abiret[1].reg); ins = &instrtab[insertinstr(blk, blk->ins.n, mkinstr(Omove, fn->abiret[1].ty.cls, r, blk->jmp.arg[1])).i]; curi = blk->ins.n; -- cgit v1.2.3