diff options
author | Quentin Carbonneaux <quentin@c9x.me> | 2019-04-25 15:27:25 +0200 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2019-04-25 15:27:25 +0200 |
commit | b4a98c3fa8b880f58b04f5d632ab89ad15725bd4 (patch) | |
tree | 16d37727a7f810e0357436e533d60557c15f3547 /amd64/emit.c | |
parent | 636568dcba071e212a61c35ce994012b9cb83ec5 (diff) | |
download | roux-b4a98c3fa8b880f58b04f5d632ab89ad15725bd4.tar.gz |
cleanup amd64 constant addressing
We now emit correct code when the user refers to a specific constant address. I also made some comments clearer in the instruction selection pass and got rid of some apparently useless code.
Diffstat (limited to 'amd64/emit.c')
-rw-r--r-- | amd64/emit.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/amd64/emit.c b/amd64/emit.c index 1fe141f..91223bd 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -292,10 +292,10 @@ Next: if (m->offset.type != CUndef) emitcon(&m->offset, f); fputc('(', f); - if (req(m->base, R)) - fprintf(f, "%%rip"); - else + if (!req(m->base, R)) fprintf(f, "%%%s", regtoa(m->base.val, SLong)); + else if (m->offset.type == CAddr) + fprintf(f, "%%rip"); if (!req(m->index, R)) fprintf(f, ", %%%s, %d", regtoa(m->index.val, SLong), @@ -333,8 +333,10 @@ Next: fprintf(f, "%d(%%rbp)", slot(ref.val, fn)); break; case RCon: - emitcon(&fn->con[ref.val], f); - fprintf(f, "(%%rip)"); + off = fn->con[ref.val]; + emitcon(&off, f); + if (off.type == CAddr) + fprintf(f, "(%%rip)"); break; case RTmp: assert(isreg(ref)); |