mirror of
git://c9x.me/qbe.git
synced 2026-08-02 15:44:39 +00:00
Compare commits
No commits in common. "e786f06032fefa2e3790d6b1c9e31ed138f475a6" and "fa19d3c974dae37cf335781300d0e4791be0d87c" have entirely different histories.
e786f06032
...
fa19d3c974
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
22
arm64/isel.c
22
arm64/isel.c
@ -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)
|
||||||
|
|||||||
14
rv64/emit.c
14
rv64/emit.c
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user