36 static void *ptr[
NPtr];
37 static void **pool = ptr;
53 die_(
char *file,
char *s, ...)
57 fprintf(stderr,
"%s: dying: ", file);
59 vfprintf(stderr, s, ap);
72 die(
"emalloc, out of memory");
89 return pool[nptr++] =
emalloc(n);
98 for (pp = &pool[1]; pp < &pool[nptr]; pp++)
117 for (cap=
VMin; cap<
len; cap*=2)
120 v = f(cap * esz +
sizeof(
Vec));
152 memcpy(v1, v+1, v->
cap * v->
esz);
169 if (strcmp(s, b->
str[i]) == 0)
170 return h + (i<<
IBits);
172 if (n == 1<<(32-
IBits))
173 die(
"interning table overflow");
176 else if ((n & (n-1)) == 0)
181 strcpy(b->
str[n], s);
182 return h + (n<<
IBits);
232 die(
"emit, too many instructions");
235 .to = to, .arg = {arg0, arg1}
249 memcpy(*pd, s, n *
sizeof(
Ins));
255 memcpy(d, s, n *
sizeof(
Ins));
259 static int cmptab[][2] ={
284 assert(0 <= c && c <
NCmp);
291 assert(0 <= c && c <
NCmp);
305 if ((k1 ==
Kw && k ==
Kl) || (k1 ==
Kl && k ==
Kw)) {
333 memset(&fn->
tmp[t], 0,
sizeof(
Tmp));
335 sprintf(fn->
tmp[t].
name,
"%s.%d", prfx, ++n);
346 if (rtype(r) ==
RTmp)
355 for (c=0; c<fn->
ncon; c++)
366 if (c0->
type == CUndef)
369 if (c1->
type == CAddr) {
370 assert(c0->
type != CAddr &&
"adding two addresses");
381 struct {
int st, ld,
cls, size; } *p, tbl[] = {
390 for (boff=0, p=tbl; sz; p++)
391 for (s=p->size; sz>=s; sz-=s, doff+=s, boff+=s) {
394 emit(p->st, 0,
R, r, r1);
397 emit(p->ld, p->cls, r, r1,
R);
407 bs->
t =
alloc(n *
sizeof bs->
t[0]);
414 b = (b & 0x5555555555555555) + ((b>>1) & 0x5555555555555555);
415 b = (b & 0x3333333333333333) + ((b>>2) & 0x3333333333333333);
416 b = (b & 0x0f0f0f0f0f0f0f0f) + ((b>>4) & 0x0f0f0f0f0f0f0f0f);
429 if (!(b & 0xffffffff)) {
445 n += (
char[16]){4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0}[b & 0xf];
455 for (i=0; i<bs->
nt; i++)
456 n += popcnt(bs->
t[i]);
469 assert(elt < bsmax(bs));
476 assert(elt < bsmax(bs));
480 #define BSOP(f, op) \ 482 f(BSet *a, BSet *b) \ 486 assert(a->nt == b->nt); \ 487 for (i=0; i<a->nt; i++) \ 488 a->t[i] op b->t[i]; \ 501 assert(a->nt == b->nt);
502 for (i=0; i<a->nt; i++)
503 if (a->t[i] != b->t[i])
511 memset(bs->
t, 0, bs->
nt *
sizeof bs->
t[0]);
538 *elt =
NBit*t + firstbit(b);
549 fprintf(f,
" %s", tmp[t].name);
Ins * icpy(Ins *d, Ins *s, ulong n)
void die_(char *file, char *s,...)
int bsequal(BSet *a, BSet *b)
int ncon
Размер массива con.
int bsiter(BSet *bs, int *elt)
Структура, хранящая информацию об инструкциях.
Op optab[NOp]
Массив всех операций.
void bsclr(BSet *bs, uint elt)
int clsmerge(short *pk, short k)
void bsinit(BSet *bs, uint n)
void * vnew(ulong len, size_t esz, Pool pool)
uint ndef
Количество блоков, в которых есть объявление переменной
Con * con
Массив используемых функцией констант
int phicls(int t, Tmp *tmp)
Структура, хранящая описание переменных (более подробное описание переменной ищите в Tmp)...
void vgrow(void *vp, ulong len)
Содержит информацию о переменной
Tmp * tmp
Массив используемых функцией переменных
void addcon(Con *c0, Con *c1)
int ntmp
Размер массива tmp.
int iscmp(int op, int *pk, int *pc)
char name[NString]
Имя переменной
int argcls(Ins *i, int n)
void bsinter(BSet *a, BSet *b)
void bsset(BSet *bs, uint elt)
void bscopy(BSet *a, BSet *b)
void bsunion(BSet *a, BSet *b)
Номер (в массиве Fn->tmp) первой не регистровой переменной
void emit(int op, int k, Ref to, Ref arg0, Ref arg1)
void idup(Ins **pd, Ins *s, ulong n)
Ref getcon(int64_t val, Fn *fn)
void dumpts(BSet *bs, Tmp *tmp, FILE *f)
Ref newtmp(char *prfx, int k, Fn *fn)
void blit(Ref rdst, uint doff, Ref rsrc, uint sz, Fn *fn)
Структура, хранящая в себе информацию о функции
uint nuse
Количество блоков, в которых переменная используется
#define MAKESURE(what, x)
void bsdiff(BSet *a, BSet *b)
void chuse(Ref r, int du, Fn *fn)