Compare commits

..

No commits in common. "e786f06032fefa2e3790d6b1c9e31ed138f475a6" and "fa19d3c974dae37cf335781300d0e4791be0d87c" have entirely different histories.

3 changed files with 22 additions and 23 deletions

View File

@ -292,13 +292,12 @@ loadaddr(Con *c, char *rn, E *e)
"\tadd\tR, R, #:tprel_lo12_nc:SO\n"; "\tadd\tR, R, #:tprel_lo12_nc:SO\n";
break; break;
case SExt: case SExt:
assert(c->bits.i == 0);
if (T.apple) if (T.apple)
s = "\tadrp\tR, S@gotpage\n" s = "\tadrp\tR, S@gotpageO\n"
"\tldr\tR, [R, S@gotpageoff]\n"; "\tldr\tR, [R, S@gotpageoffO]\n";
else else
s = "\tadrp\tR, :got:S\n" s = "\tadrp\tR, :got:SO\n"
"\tldr\tR, [R, #:got_lo12:S]\n"; "\tldr\tR, [R, #:got_lo12:SO]\n";
break; break;
} }

View File

@ -78,8 +78,9 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
switch (rtype(r0)) { switch (rtype(r0)) {
case RCon: case RCon:
c = &fn->con[r0.val]; c = &fn->con[r0.val];
if (c->type == CAddr && ((c->sym.type & SExt) if (T.apple
|| (T.apple && (c->sym.type & SThr)))) { && c->type == CAddr
&& (c->sym.type & SThr)) {
r1 = newtmp("isel", Kl, fn); r1 = newtmp("isel", Kl, fn);
*pr = r1; *pr = r1;
if (c->bits.i) { if (c->bits.i) {
@ -90,19 +91,16 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
emit(Oadd, Kl, r1, r2, r3); emit(Oadd, Kl, r1, r2, r3);
r1 = r2; r1 = r2;
} }
if (T.apple && (c->sym.type & SThr)) { emit(Ocopy, Kl, r1, TMP(R0), R);
emit(Ocopy, Kl, r1, TMP(R0), R); r1 = newtmp("isel", Kl, fn);
r1 = newtmp("isel", Kl, fn); r2 = newtmp("isel", Kl, fn);
r2 = newtmp("isel", Kl, fn); emit(Ocall, 0, R, r1, CALL(33));
emit(Ocall, 0, R, r1, CALL(33)); emit(Ocopy, Kl, TMP(R0), r2, R);
emit(Ocopy, Kl, TMP(R0), r2, R); emit(Oload, Kl, r1, r2, R);
emit(Oload, Kl, r1, r2, R);
r1 = r2;
}
cc = *c; cc = *c;
cc.bits.i = 0; cc.bits.i = 0;
r3 = newcon(&cc, fn); r3 = newcon(&cc, fn);
emit(Ocopy, Kl, r1, r3, R); emit(Ocopy, Kl, r2, r3, R);
break; break;
} }
if (KBASE(k) == 0 && phi) if (KBASE(k) == 0 && phi)

View File

@ -133,12 +133,8 @@ emitaddr(Con *c, FILE *f)
{ {
assert((c->sym.type & ~SExt) == SGlo); assert((c->sym.type & ~SExt) == SGlo);
fputs(str(c->sym.id), f); fputs(str(c->sym.id), f);
if (c->bits.i) { if (c->bits.i)
/* TODO: fix isel to ensure no offset for SGlo */
if (c->sym.type & SExt)
die("extern with offset is not supported");
fprintf(f, "+%"PRIi64, c->bits.i); fprintf(f, "+%"PRIi64, c->bits.i);
}
} }
static void static void
@ -237,8 +233,14 @@ loadaddr(Con *c, char *rn, FILE *f)
switch (c->sym.type) { switch (c->sym.type) {
case SGlo: case SGlo:
fprintf(f, "\tlui %s, %%hi(", rn);
emitaddr(c, f);
fprintf(f, ")\n\taddi %s, %s, %%lo(", rn, rn);
emitaddr(c, f);
fputs(")\n", f);
break;
case SExt: case SExt:
fprintf(f, "\t%s %s, ", c->sym.type == SExt ? "lga" : "lla", rn); fprintf(f, "\tla %s, ", rn);
emitaddr(c, f); emitaddr(c, f);
fputc('\n', f); fputc('\n', f);
break; break;