view interps/egobf/src/optim2.c @ 3904:49ab5b2e2ebf

<boily> echo -e "#!/usr/bin/env python\\n# -*- encoding: utf-8 -*-\\nimport sys\\nimport unicodedata\\ntry:\\n print u\'\'.join(map(unicodedata.lookup, sys.argv[1:])).encode(\'utf-8\')\\nexcept KeyError:\\n print u\'Unknown character.\'" >bin/unicode
author HackBot
date Fri, 11 Oct 2013 15:25:39 +0000
parents 859f9b4339e6
children
line wrap: on
line source

#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;
}