Mercurial > repo
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; +}