ref: e8e1f8e7721391e03950b24ef64152ad954da214
parent: 5459f323de18b77a80351857af55cdb4181a7c06
author: Ori Bernstein <[email protected]>
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)