diff options
Diffstat (limited to 'amd64')
-rw-r--r-- | amd64/emit.c | 11 | ||||
-rw-r--r-- | amd64/isel.c | 3 |
2 files changed, 8 insertions, 6 deletions
diff --git a/amd64/emit.c b/amd64/emit.c index db6ead8..cf36ebe 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -166,8 +166,11 @@ emitcon(Con *con, FILE *f) switch (con->type) { case CAddr: l = str(con->label); - p = con->local ? T.asloc : l[0] == '"' ? "" : T.assym; - fprintf(f, "%s%s", p, l); + p = l[0] == '"' ? "" : T.assym; + if (con->rel == RelThr) + fprintf(f, "%%fs:%s%s@tpoff", p, l); + else + fprintf(f, "%s%s", p, l); if (con->bits.i) fprintf(f, "%+"PRId64, con->bits.i); break; @@ -337,7 +340,7 @@ Next: case RCon: off = fn->con[ref.val]; emitcon(&off, f); - if (off.type == CAddr) + if (off.type == CAddr && off.rel != RelThr) fprintf(f, "(%%rip)"); break; case RTmp: @@ -549,7 +552,7 @@ emitfn(Fn *fn, FILE *f) int *r, c, o, n, lbl; uint64_t fs; - emitlnk(fn->name, &fn->lnk, ".text", f); + emitfnlnk(fn->name, &fn->lnk, f); fputs("\tpushq %rbp\n\tmovq %rsp, %rbp\n", f); fs = framesz(fn); if (fs) diff --git a/amd64/isel.c b/amd64/isel.c index 640bf12..a562441 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -78,9 +78,8 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn) vgrow(&fn->mem, ++fn->nmem); memset(&a, 0, sizeof a); a.offset.type = CAddr; - a.offset.local = 1; n = stashbits(&fn->con[r0.val].bits, KWIDE(k) ? 8 : 4); - sprintf(buf, "fp%d", n); + sprintf(buf, "\"%sfp%d\"", T.asloc, n); a.offset.label = intern(buf); fn->mem[fn->nmem-1] = a; } |