mirror of
git://c9x.me/qbe.git
synced 2026-08-02 15:44:39 +00:00
Compare commits
2 Commits
fa19d3c974
...
e786f06032
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e786f06032 | ||
|
|
80d745c842 |
@ -292,12 +292,13 @@ loadaddr(Con *c, char *rn, E *e)
|
||||
"\tadd\tR, R, #:tprel_lo12_nc:SO\n";
|
||||
break;
|
||||
case SExt:
|
||||
assert(c->bits.i == 0);
|
||||
if (T.apple)
|
||||
s = "\tadrp\tR, S@gotpageO\n"
|
||||
"\tldr\tR, [R, S@gotpageoffO]\n";
|
||||
s = "\tadrp\tR, S@gotpage\n"
|
||||
"\tldr\tR, [R, S@gotpageoff]\n";
|
||||
else
|
||||
s = "\tadrp\tR, :got:SO\n"
|
||||
"\tldr\tR, [R, #:got_lo12:SO]\n";
|
||||
s = "\tadrp\tR, :got:S\n"
|
||||
"\tldr\tR, [R, #:got_lo12:S]\n";
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
10
arm64/isel.c
10
arm64/isel.c
@ -78,9 +78,8 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
|
||||
switch (rtype(r0)) {
|
||||
case RCon:
|
||||
c = &fn->con[r0.val];
|
||||
if (T.apple
|
||||
&& c->type == CAddr
|
||||
&& (c->sym.type & SThr)) {
|
||||
if (c->type == CAddr && ((c->sym.type & SExt)
|
||||
|| (T.apple && (c->sym.type & SThr)))) {
|
||||
r1 = newtmp("isel", Kl, fn);
|
||||
*pr = r1;
|
||||
if (c->bits.i) {
|
||||
@ -91,16 +90,19 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
|
||||
emit(Oadd, Kl, r1, r2, r3);
|
||||
r1 = r2;
|
||||
}
|
||||
if (T.apple && (c->sym.type & SThr)) {
|
||||
emit(Ocopy, Kl, r1, TMP(R0), R);
|
||||
r1 = newtmp("isel", Kl, fn);
|
||||
r2 = newtmp("isel", Kl, fn);
|
||||
emit(Ocall, 0, R, r1, CALL(33));
|
||||
emit(Ocopy, Kl, TMP(R0), r2, R);
|
||||
emit(Oload, Kl, r1, r2, R);
|
||||
r1 = r2;
|
||||
}
|
||||
cc = *c;
|
||||
cc.bits.i = 0;
|
||||
r3 = newcon(&cc, fn);
|
||||
emit(Ocopy, Kl, r2, r3, R);
|
||||
emit(Ocopy, Kl, r1, r3, R);
|
||||
break;
|
||||
}
|
||||
if (KBASE(k) == 0 && phi)
|
||||
|
||||
14
rv64/emit.c
14
rv64/emit.c
@ -133,9 +133,13 @@ emitaddr(Con *c, FILE *f)
|
||||
{
|
||||
assert((c->sym.type & ~SExt) == SGlo);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
emitf(char *s, Ins *i, Fn *fn, FILE *f)
|
||||
@ -233,14 +237,8 @@ loadaddr(Con *c, char *rn, FILE *f)
|
||||
|
||||
switch (c->sym.type) {
|
||||
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:
|
||||
fprintf(f, "\tla %s, ", rn);
|
||||
fprintf(f, "\t%s %s, ", c->sym.type == SExt ? "lga" : "lla", rn);
|
||||
emitaddr(c, f);
|
||||
fputc('\n', f);
|
||||
break;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user