summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisc/lisc.h21
-rw-r--r--lisc/parse.c31
-rw-r--r--lisc/ssa.c2
3 files changed, 44 insertions, 10 deletions
diff --git a/lisc/lisc.h b/lisc/lisc.h
index 66f12ad..bc22a41 100644
--- a/lisc/lisc.h
+++ b/lisc/lisc.h
@@ -16,6 +16,25 @@ typedef struct Sym Sym;
typedef struct Fn Fn;
enum {
+ RAX = 1,
+ RCX,
+ RDX,
+ RBX,
+ RSP,
+ RBP,
+ RSI,
+ RDI,
+ R8,
+ R9,
+ R10,
+ R11,
+ R12,
+ R13,
+ R14,
+ R15,
+};
+
+enum {
NReg = 32,
Tmp0 = NReg+1,
@@ -65,6 +84,7 @@ enum {
ORem,
/* reserved instructions */
OCopy,
+ OXCltd,
OXDiv,
OLast
};
@@ -136,6 +156,7 @@ struct Fn {
/* parse.c */
extern OpDesc opdesc[];
+void diag(char *);
void *alloc(size_t);
Fn *parsefn(FILE *);
void printfn(Fn *, FILE *);
diff --git a/lisc/parse.c b/lisc/parse.c
index 6f5a030..168da6d 100644
--- a/lisc/parse.c
+++ b/lisc/parse.c
@@ -9,6 +9,8 @@ enum {
NSym = 256,
};
+Ins insb[NIns];
+
OpDesc opdesc[OLast] = {
[OAdd] = { 2, 1, "add" },
[OSub] = { 2, 0, "sub" },
@@ -59,8 +61,8 @@ static int lnum;
static Sym sym[NSym];
static int ntmp;
-static Ins ins[NIns], *curi;
static Phi **plink;
+static Ins *curi;
static Blk *bmap[NBlk+1];
static Blk *curb;
static Blk **blink;
@@ -72,18 +74,29 @@ alloc(size_t n)
{
void *p;
+ /* todo, export in util.c */
p = calloc(1, n);
if (!p)
abort();
return p;
}
+void
+diag(char *s)
+{
+ /* todo, export in util.c */
+ fputs(s, stderr);
+ fputc('\n', stderr);
+ abort();
+}
+
static void
err(char *s)
{
- /* todo, export the error handling in util.c */
- fprintf(stderr, "parse error: %s (line %d)\n", s, lnum);
- exit(1);
+ char buf[100];
+
+ snprintf(buf, sizeof buf, "parse: %s (line %d)", s, lnum);
+ diag(buf);
}
static Token
@@ -287,11 +300,11 @@ expect(Token t)
static void
closeblk()
{
- curb->nins = curi - ins;
+ curb->nins = curi - insb;
curb->ins = alloc(curb->nins * sizeof(Ins));
- memcpy(curb->ins, ins, curb->nins * sizeof(Ins));
+ memcpy(curb->ins, insb, curb->nins * sizeof(Ins));
blink = &curb->link;
- curi = ins;
+ curi = insb;
}
static PState
@@ -407,7 +420,7 @@ parseline(PState ps)
if (op != -1 && i != opdesc[op].arity)
err("invalid arity");
if (op != -1) {
- if (curi - ins >= NIns)
+ if (curi - insb >= NIns)
err("too many instructions in block");
curi->op = op;
curi->to = r;
@@ -440,7 +453,7 @@ parsefn(FILE *f)
for (i=Tmp0; i<NSym; i++)
sym[i] = (Sym){.type = SUndef};
ntmp = Tmp0;
- curi = ins;
+ curi = insb;
curb = 0;
lnum = 1;
nblk = 0;
diff --git a/lisc/ssa.c b/lisc/ssa.c
index 2ad1755..5546190 100644
--- a/lisc/ssa.c
+++ b/lisc/ssa.c
@@ -189,7 +189,7 @@ ssafix(Fn *f, int t)
/* add new symbols */
f->sym = realloc(f->sym, f->ntmp * sizeof f->sym[0]);
if (!f->sym)
- abort();
+ diag("ssafix: out of memory");
for (t1=t0; t0<f->ntmp; t0++) {
f->sym[t0].type = STmp;
snprintf(f->sym[t0].name, NString, "%s%d",