shithub: mc

Download patch

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)