mirror of
git://c9x.me/qbe.git
synced 2026-05-26 23:44:40 +00:00
Compare commits
No commits in common. "fbe3cea2011653434d272fa6643158eeef37a997" and "adab20908f4f5b922b23a045b99520b2a4e65dee" have entirely different histories.
fbe3cea201
...
adab20908f
11
all.h
11
all.h
@ -34,6 +34,7 @@ typedef struct Lnk Lnk;
|
|||||||
typedef struct Target Target;
|
typedef struct Target Target;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
NString = 80,
|
||||||
NIns = 1 << 20,
|
NIns = 1 << 20,
|
||||||
NAlign = 3,
|
NAlign = 3,
|
||||||
NField = 32,
|
NField = 32,
|
||||||
@ -273,7 +274,7 @@ struct Blk {
|
|||||||
BSet in[1], out[1], gen[1];
|
BSet in[1], out[1], gen[1];
|
||||||
int nlive[2];
|
int nlive[2];
|
||||||
int loop;
|
int loop;
|
||||||
char *name;
|
char name[NString];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Use {
|
struct Use {
|
||||||
@ -335,7 +336,7 @@ struct Alias {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Tmp {
|
struct Tmp {
|
||||||
char *name;
|
char name[NString];
|
||||||
Ins *def;
|
Ins *def;
|
||||||
Use *use;
|
Use *use;
|
||||||
uint ndef, nuse;
|
uint ndef, nuse;
|
||||||
@ -414,12 +415,12 @@ struct Fn {
|
|||||||
char vararg;
|
char vararg;
|
||||||
char dynalloc;
|
char dynalloc;
|
||||||
char leaf;
|
char leaf;
|
||||||
char *name;
|
char name[NString];
|
||||||
Lnk lnk;
|
Lnk lnk;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Typ {
|
struct Typ {
|
||||||
char *name;
|
char name[NString];
|
||||||
char isdark;
|
char isdark;
|
||||||
char isunion;
|
char isunion;
|
||||||
int align;
|
int align;
|
||||||
@ -489,7 +490,7 @@ void vfree(void *);
|
|||||||
void vgrow(void *, ulong);
|
void vgrow(void *, ulong);
|
||||||
void addins(Ins **, uint *, Ins *);
|
void addins(Ins **, uint *, Ins *);
|
||||||
void addbins(Ins **, uint *, Blk *);
|
void addbins(Ins **, uint *, Blk *);
|
||||||
char *strf(char *, ...);
|
void strf(char[NString], char *, ...);
|
||||||
uint32_t intern(char *);
|
uint32_t intern(char *);
|
||||||
char *str(uint32_t);
|
char *str(uint32_t);
|
||||||
int argcls(Ins *, int);
|
int argcls(Ins *, int);
|
||||||
|
|||||||
@ -511,7 +511,7 @@ split(Fn *fn, Blk *b)
|
|||||||
idup(bn, curi, &insb[NIns]-curi);
|
idup(bn, curi, &insb[NIns]-curi);
|
||||||
curi = &insb[NIns];
|
curi = &insb[NIns];
|
||||||
bn->visit = ++b->visit;
|
bn->visit = ++b->visit;
|
||||||
bn->name = strf("%s.%d", b->name, b->visit);
|
strf(bn->name, "%s.%d", b->name, b->visit);
|
||||||
bn->loop = b->loop;
|
bn->loop = b->loop;
|
||||||
bn->link = b->link;
|
bn->link = b->link;
|
||||||
b->link = bn;
|
b->link = bn;
|
||||||
|
|||||||
@ -548,7 +548,7 @@ split(Fn *fn, Blk *b)
|
|||||||
idup(bn, curi, &insb[NIns]-curi);
|
idup(bn, curi, &insb[NIns]-curi);
|
||||||
curi = &insb[NIns];
|
curi = &insb[NIns];
|
||||||
bn->visit = ++b->visit;
|
bn->visit = ++b->visit;
|
||||||
bn->name = strf("%s.%d", b->name, b->visit);
|
strf(bn->name, "%s.%d", b->name, b->visit);
|
||||||
bn->loop = b->loop;
|
bn->loop = b->loop;
|
||||||
bn->link = b->link;
|
bn->link = b->link;
|
||||||
b->link = bn;
|
b->link = bn;
|
||||||
|
|||||||
14
copy.c
14
copy.c
@ -388,20 +388,14 @@ phicopyref(Fn *fn, Blk *b, Phi *p)
|
|||||||
{
|
{
|
||||||
Blk *d, **s;
|
Blk *d, **s;
|
||||||
Phi *p1;
|
Phi *p1;
|
||||||
Ref r;
|
|
||||||
uint n, c;
|
uint n, c;
|
||||||
|
|
||||||
/* identical args */
|
/* identical args */
|
||||||
r = R;
|
for (n=0; n<p->narg-1; n++)
|
||||||
for (n=0; n<p->narg; n++)
|
if (!req(p->arg[n], p->arg[n+1]))
|
||||||
if (!req(p->arg[n], p->to)) {
|
|
||||||
if (req(r, R))
|
|
||||||
r = p->arg[n];
|
|
||||||
else if (!req(p->arg[n], r))
|
|
||||||
break;
|
break;
|
||||||
}
|
if (n == p->narg-1)
|
||||||
if (n == p->narg)
|
return p->arg[n];
|
||||||
return r;
|
|
||||||
|
|
||||||
/* same as a previous phi */
|
/* same as a previous phi */
|
||||||
for (p1=b->phi; p1!=p; p1=p1->link) {
|
for (p1=b->phi; p1!=p; p1=p1->link) {
|
||||||
|
|||||||
18
load.c
18
load.c
@ -166,23 +166,6 @@ load(Slice sl, bits msk, Loc *l)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
rebase(Slice *sl)
|
|
||||||
{
|
|
||||||
Alias *a;
|
|
||||||
|
|
||||||
if (rtype(sl->ref) != RTmp)
|
|
||||||
return;
|
|
||||||
a = &curf->tmp[sl->ref.val].alias;
|
|
||||||
if (a->offset == (short)a->offset)
|
|
||||||
if (a->type == ALoc
|
|
||||||
|| a->type == AEsc
|
|
||||||
|| a->type == AUnk) {
|
|
||||||
sl->ref = TMP(a->base);
|
|
||||||
sl->off = a->offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
killsl(Ref r, Slice sl)
|
killsl(Ref r, Slice sl)
|
||||||
{
|
{
|
||||||
@ -448,7 +431,6 @@ loadopt(Fn *fn)
|
|||||||
sz = loadsz(i);
|
sz = loadsz(i);
|
||||||
sl = (Slice){i->arg[0], 0, sz, i->cls};
|
sl = (Slice){i->arg[0], 0, sz, i->cls};
|
||||||
l = (Loc){LRoot, i-b->ins, b};
|
l = (Loc){LRoot, i-b->ins, b};
|
||||||
rebase(&sl);
|
|
||||||
i->arg[1] = def(sl, MASK(sz), b, i, &l);
|
i->arg[1] = def(sl, MASK(sz), b, i, &l);
|
||||||
}
|
}
|
||||||
qsort(ilog, nlog, sizeof ilog[0], icmp);
|
qsort(ilog, nlog, sizeof ilog[0], icmp);
|
||||||
|
|||||||
21
parse.c
21
parse.c
@ -235,7 +235,7 @@ getint()
|
|||||||
static int
|
static int
|
||||||
lex()
|
lex()
|
||||||
{
|
{
|
||||||
char *tok;
|
static char tok[NString];
|
||||||
int c, i, esc;
|
int c, i, esc;
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
@ -321,10 +321,10 @@ lex()
|
|||||||
Alpha:
|
Alpha:
|
||||||
if (!isalpha(c) && c != '.' && c != '_')
|
if (!isalpha(c) && c != '.' && c != '_')
|
||||||
err("invalid character %c (%d)", c, c);
|
err("invalid character %c (%d)", c, c);
|
||||||
tok = vnew(2, 1, PFn);
|
|
||||||
i = 0;
|
i = 0;
|
||||||
do {
|
do {
|
||||||
vgrow(&tok, i+2);
|
if (i >= NString-1)
|
||||||
|
err("identifier too long");
|
||||||
tok[i++] = c;
|
tok[i++] = c;
|
||||||
c = fgetc(inf);
|
c = fgetc(inf);
|
||||||
} while (isalpha(c) || c == '$' || c == '.' || c == '_' || isdigit(c));
|
} while (isalpha(c) || c == '$' || c == '.' || c == '_' || isdigit(c));
|
||||||
@ -421,7 +421,7 @@ tmpref(char *v)
|
|||||||
t = curf->ntmp;
|
t = curf->ntmp;
|
||||||
tmph[i] = t;
|
tmph[i] = t;
|
||||||
newtmp(0, Kx, curf);
|
newtmp(0, Kx, curf);
|
||||||
curf->tmp[t].name = v;
|
strcpy(curf->tmp[t].name, v);
|
||||||
return TMP(t);
|
return TMP(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -594,7 +594,7 @@ findblk(char *name)
|
|||||||
return b;
|
return b;
|
||||||
b = newblk();
|
b = newblk();
|
||||||
b->id = nblk++;
|
b->id = nblk++;
|
||||||
b->name = name;
|
strcpy(b->name, name);
|
||||||
b->dlink = blkh[h];
|
b->dlink = blkh[h];
|
||||||
blkh[h] = b;
|
blkh[h] = b;
|
||||||
return b;
|
return b;
|
||||||
@ -940,7 +940,7 @@ parsefn(Lnk *lnk)
|
|||||||
rcls = K0;
|
rcls = K0;
|
||||||
if (next() != Tglo)
|
if (next() != Tglo)
|
||||||
err("function name expected");
|
err("function name expected");
|
||||||
curf->name = tokval.str;
|
strncpy(curf->name, tokval.str, NString-1);
|
||||||
curf->vararg = parserefl(0);
|
curf->vararg = parserefl(0);
|
||||||
if (nextnl() != Tlbrace)
|
if (nextnl() != Tlbrace)
|
||||||
err("function body must start with {");
|
err("function body must start with {");
|
||||||
@ -1050,7 +1050,6 @@ parsetyp()
|
|||||||
ty->size = 0;
|
ty->size = 0;
|
||||||
if (nextnl() != Ttyp || nextnl() != Teq)
|
if (nextnl() != Ttyp || nextnl() != Teq)
|
||||||
err("type name and then = expected");
|
err("type name and then = expected");
|
||||||
ty->name = emalloc(strlen(tokval.str)+1);
|
|
||||||
strcpy(ty->name, tokval.str);
|
strcpy(ty->name, tokval.str);
|
||||||
t = nextnl();
|
t = nextnl();
|
||||||
if (t == Talign) {
|
if (t == Talign) {
|
||||||
@ -1116,13 +1115,13 @@ parsedatstr(Dat *d)
|
|||||||
static void
|
static void
|
||||||
parsedat(void cb(Dat *), Lnk *lnk)
|
parsedat(void cb(Dat *), Lnk *lnk)
|
||||||
{
|
{
|
||||||
char *name;
|
char name[NString] = {0};
|
||||||
int t;
|
int t;
|
||||||
Dat d;
|
Dat d;
|
||||||
|
|
||||||
if (nextnl() != Tglo || nextnl() != Teq)
|
if (nextnl() != Tglo || nextnl() != Teq)
|
||||||
err("data name, then = expected");
|
err("data name, then = expected");
|
||||||
name = tokval.str;
|
strncpy(name, tokval.str, NString-1);
|
||||||
t = nextnl();
|
t = nextnl();
|
||||||
lnk->align = 8;
|
lnk->align = 8;
|
||||||
if (t == Talign) {
|
if (t == Talign) {
|
||||||
@ -1252,11 +1251,9 @@ parse(FILE *f, char *path, void dbgfile(char *), void data(Dat *), void func(Fn
|
|||||||
parsetyp();
|
parsetyp();
|
||||||
break;
|
break;
|
||||||
case Teof:
|
case Teof:
|
||||||
for (n=0; n<ntyp; n++) {
|
for (n=0; n<ntyp; n++)
|
||||||
free(typ[n].name);
|
|
||||||
if (typ[n].nunion)
|
if (typ[n].nunion)
|
||||||
vfree(typ[n].fields);
|
vfree(typ[n].fields);
|
||||||
}
|
|
||||||
vfree(typ);
|
vfree(typ);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
4
rega.c
4
rega.c
@ -16,7 +16,7 @@ struct RMap {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NPm = 64, /* max copies in a parallel move */
|
NPm = 128, /* max copies in a parallel move */
|
||||||
};
|
};
|
||||||
|
|
||||||
static bits regu; /* registers used */
|
static bits regu; /* registers used */
|
||||||
@ -673,7 +673,7 @@ rega(Fn *fn)
|
|||||||
b1->link = blist;
|
b1->link = blist;
|
||||||
blist = b1;
|
blist = b1;
|
||||||
fn->nblk++;
|
fn->nblk++;
|
||||||
b1->name = strf("%s_%s", b->name, s->name);
|
strf(b1->name, "%s_%s", b->name, s->name);
|
||||||
stmov += &insb[NIns]-curi;
|
stmov += &insb[NIns]-curi;
|
||||||
stblk += 1;
|
stblk += 1;
|
||||||
idup(b1, curi, &insb[NIns]-curi);
|
idup(b1, curi, &insb[NIns]-curi);
|
||||||
|
|||||||
15
util.c
15
util.c
@ -172,21 +172,14 @@ addbins(Ins **pvins, uint *pnins, Blk *b)
|
|||||||
addins(pvins, pnins, i);
|
addins(pvins, pnins, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
void
|
||||||
strf(char *s, ...)
|
strf(char str[NString], char *s, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
int n;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
va_start(ap, s);
|
va_start(ap, s);
|
||||||
n = vsnprintf(NULL, 0, s, ap);
|
vsnprintf(str, NString, s, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
p = alloc(n + 1);
|
|
||||||
va_start(ap, s);
|
|
||||||
vsnprintf(p, n + 1, s, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
@ -450,7 +443,7 @@ newtmp(char *prfx, int k, Fn *fn)
|
|||||||
vgrow(&fn->tmp, fn->ntmp);
|
vgrow(&fn->tmp, fn->ntmp);
|
||||||
memset(&fn->tmp[t], 0, sizeof(Tmp));
|
memset(&fn->tmp[t], 0, sizeof(Tmp));
|
||||||
if (prfx)
|
if (prfx)
|
||||||
fn->tmp[t].name = strf("%s.%d", prfx, ++n);
|
strf(fn->tmp[t].name, "%s.%d", prfx, ++n);
|
||||||
fn->tmp[t].cls = k;
|
fn->tmp[t].cls = k;
|
||||||
fn->tmp[t].slot = -1;
|
fn->tmp[t].slot = -1;
|
||||||
fn->tmp[t].nuse = +1;
|
fn->tmp[t].nuse = +1;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user