diff interps/egobf/src/optim2.c @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/egobf/src/optim2.c	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,58 @@
+#include "egobfi.h"
+#include "optim2.h"
+
+void optim2()
+{
+    struct bfi *cur;
+    
+    /* second-level optimization, searches for add-to loops */
+    for (pptr = 0; prog[pptr].cmd != FIN; pptr++) {
+        if (prog[pptr].cmd == LPO) {
+            cur = prog + pptr;
+            /* two types of add-tos:
+               >x +x <x -x
+               -x >x +x <x
+               */
+            if (cur[1].cmd == RHT &&
+                cur[3].cmd == RHT &&
+                cur[1].arg1 == cur[3].arg1 * -1 &&
+                cur[5].cmd == LPC) {
+                if (cur[2].cmd == ADD &&
+                    cur[4].cmd == ADD &&
+                    cur[4].arg1 == -1) {
+                    /* YAY! */
+                    cur->cmd = ADDTO;
+                    cur->arg1 = cur[1].arg1;
+                    cur->arg2 = cur[2].arg1;
+                    
+                    cur[1].cmd = NIL;
+                    cur[2].cmd = NIL;
+                    cur[3].cmd = NIL;
+                    cur[4].cmd = NIL;
+                    cur[5].cmd = NIL;
+                    pptr += 5;
+                }
+            } else if (cur[2].cmd == RHT &&
+                       cur[4].cmd == RHT &&
+                       cur[2].arg1 == cur[4].arg1 * -1 &&
+                       cur[5].cmd == LPC) {
+                if (cur[1].cmd == ADD &&
+                    cur[3].cmd == ADD &&
+                    cur[1].arg1 == -1) {
+                    /* YAY! */
+                    cur->cmd = ADDTO;
+                    cur->arg1 = cur[2].arg1;
+                    cur->arg2 = cur[3].arg1;
+                    
+                    cur[1].cmd = NIL;
+                    cur[2].cmd = NIL;
+                    cur[3].cmd = NIL;
+                    cur[4].cmd = NIL;
+                    cur[5].cmd = NIL;
+                    pptr += 5;
+                }
+            }
+        }
+    }
+    pptr = 0;
+}