From ec5042148e6b9ac9d01130c93a95cbbd0d34b1c1 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Tue, 11 Aug 2015 13:40:54 -0400 Subject: fix my sloppy understanding of x86 assembly! --- lisc/emit.c | 47 +++++++++++++++++++++++++++++------------------ lisc/isel.c | 21 +-------------------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/lisc/emit.c b/lisc/emit.c index ce1ba8c..2e37d64 100644 --- a/lisc/emit.c +++ b/lisc/emit.c @@ -80,10 +80,25 @@ cneg(int cmp) } static void -eref(Ref r, Fn *fn, FILE *f) +econ(Con *c, FILE *f) { - Con *c; + switch (c->type) { + case CAddr: + fprintf(f, "%s", c->label); + if (c->val) + fprintf(f, "%+"PRId64, c->val); + break; + case CNum: + fprintf(f, "%"PRId64, c->val); + break; + default: + diag("econ: invalid constant"); + } +} +static void +eref(Ref r, Fn *fn, FILE *f) +{ switch (rtype(r)) { case RReg: fprintf(f, "%%%s", rtoa[r.val]); @@ -92,19 +107,8 @@ eref(Ref r, Fn *fn, FILE *f) fprintf(f, "-%d(%%rbp)", 8 * r.val); break; case RCon: - c = &fn->con[r.val]; - switch (c->type) { - case CAddr: - fprintf(f, "$%s", c->label); - if (c->val) - fprintf(f, "%+"PRId64, c->val); - break; - case CNum: - fprintf(f, "$%"PRId64, c->val); - break; - default: - diag("emitref: invalid constant"); - } + fprintf(f, "$"); + econ(&fn->con[r.val], f); break; default: diag("emitref: invalid reference"); @@ -114,10 +118,17 @@ eref(Ref r, Fn *fn, FILE *f) static void emem(Ref r, Fn *fn, FILE *f) { - if (rtype(r) == RSlot) + switch (rtype(r)) { + default: + diag("emem: invalid memory reference"); + case RSlot: eref(r, fn, f); - else { - assert(rtype(r)!=RReg || BASE(r.val)==r.val); + break; + case RCon: + econ(&fn->con[r.val], f); + break; + case RReg: + assert(BASE(r.val) == r.val); fprintf(f, "("); eref(r, fn, f); fprintf(f, ")"); diff --git a/lisc/isel.c b/lisc/isel.c index 30c9b1f..05f5f6e 100644 --- a/lisc/isel.c +++ b/lisc/isel.c @@ -115,34 +115,15 @@ sel(Ins i, Fn *fn) case OAdd: case OSub: case OCopy: - emit(i.op, i.to, i.arg[0], i.arg[1]); - break; case OStore: case OStoreb: case OStores: - r0 = i.arg[0]; - goto Load; case OLoad: case OLoadss: case OLoadus: case OLoadsb: case OLoadub: - r0 = i.arg[0]; - if (rtype(r0) == RCon) { - t = newtmp(TLong, fn); - r0 = TMP(t); - } - Load: - r1 = i.arg[1]; - if (rtype(r1) == RCon) { - t = newtmp(TLong, fn); - r1 = TMP(t); - } - emit(i.op, i.to, r0, r1); - if (!req(r0, i.arg[0])) - emit(OCopy, r0, i.arg[0], R); - if (!req(r1, i.arg[1])) - emit(OCopy, r1, i.arg[1], R); + emit(i.op, i.to, i.arg[0], i.arg[1]); break; case ONop: break; -- cgit 1.4.1