ref: e8e1f8e7721391e03950b24ef64152ad954da214
parent: 5459f323de18b77a80351857af55cdb4181a7c06
author: Ori Bernstein <ori@eigenstate.org>
date: Tue May 8 16:15:51 EDT 2012
Do comparisons correctly.
We had the operands swapped.
--- a/8/isel.c
+++ b/8/isel.c
@@ -82,9 +82,9 @@
[Olnot] = {Itest, Ijz, Isetz}, [Oeq] = {Itest, Ijnz, Isetnz}, [One] = {Itest, Ijz, Isetz},- [Ogt] = {Icmp, Ijgt, Isetgt},+ [Ogt] = {Icmp, Ijg, Isetgt}, [Oge] = {Icmp, Ijge, Isetge},- [Olt] = {Icmp, Ijlt, Isetlt},+ [Olt] = {Icmp, Ijl, Isetlt}, [Ole] = {Icmp, Ijle, Isetle}};
@@ -324,8 +324,8 @@
/* if we have a cond, we're knocking off the redundant test,
* and want to eval the children */
if (cond) {- a = selexpr(s, args[0]->expr.args[0]);
- b = selexpr(s, args[0]->expr.args[1]);
+ a = selexpr(s, args[0]->expr.args[1]);
+ b = selexpr(s, args[0]->expr.args[0]);
b = inr(s, b);
} else {cond = Itest;
@@ -594,6 +594,7 @@
{ struct Isel is = {0,};int i;
+ FILE *fd;
is.locs = fn->locs;
is.ret = fn->ret;
@@ -610,4 +611,12 @@
fprintf(stdout, "%s:\n", fn->name);
for (i = 0; i < is.ni; i++)
iprintf(stdout, is.il[i]);
+
+ fd = fopen("a.s", "w");+ if (fn->isglobl)
+ fprintf(fd, ".globl %s\n", fn->name);
+ fprintf(fd, "%s:\n", fn->name);
+ for (i = 0; i < is.ni; i++)
+ iprintf(fd, is.il[i]);
+ fclose(fd);
}
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -196,3 +196,8 @@
{outnode(n, fd, 0);
}
+
+void o(Node *n)
+{+ dump(n, stdout);
+}
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -523,6 +523,7 @@
;
block : blockbody TEndblk
+ | TEndblk
;
blockbody
@@ -530,7 +531,7 @@
{$$ = mkblock(line, mkstab());if ($1)
lappend(&$$->block.stmts, &$$->block.nstmts, $1);
- if ($1->type == Ndecl)
+ if ($1 && $1->type == Ndecl)
putdcl($$->block.scope, $1->decl.sym);}
| blockbody stmt
{if ($2)--
⑨