ref: 346f1489576c42a2ca2ac7d05958d59f09569b66
dir: /cc2/cgen.c/
#include <stdint.h>
#include <stdlib.h>
#include <cc.h>
#include "cc2.h"
#include <stdio.h>
void
genstack(Symbol *fun)
{
Symbol *p;
short siz;
for (siz = 0, p = fun->u.f.vars; p; p = p->next)
siz += p->u.v.type->size;
fun->u.f.stack = siz;
}
static void
emit(char what, void *data)
{
Symbol *sym, *p;
switch (what) {
case FUN:
sym = data;
printf("%s:\n"
"\tPUSH\tIX\n"
"\tLD\tIX,SP\n"
"\tLD\tHL,%d\n"
"\tADD\tHL,SP\n"
"\tLD\tSP,HL\n", sym->u.f.name, -sym->u.f.stack);
return;
case EFUN:
printf("\tLD\tSP,IX\n"
"\tRET\n");
return;
default:
fputs("internal error: incorrect emit\n", stderr);
abort();
}
}
void
cgen(Symbol *sym, Node *list[])
{
emit(FUN, sym);
emit(EFUN, NULL);
}
/*
* calculate addresability as follows
* AUTO => 11
* REGISTER => 13
* STATIC => 12
* CONST => 20
*/
static void
xaddable(Node *np)
{
Node *lp, *rp;
if (!np)
return;
np->complex = 0;
np->addable = 0;
lp = np->left;
rp = np->right;
switch (np->op) {
case AUTO:
np->addable = 11;
break;
case REG:
np->addable = 13;
break;
case MEM:
np->addable = 12;
break;
case CONST:
np->addable = 20;
break;
case OADD:
case OSUB:
xaddable(lp);
xaddable(rp);
}
}
void
genaddable(Node *list[])
{
Node *np;
while ((np = *list++) != NULL)
xaddable(np);
}