view interps/egobf/src/optim2.c @ 12256:821155c00e34 draft

<fizzie> ` sed -e \'s|wisdom|bin|\' < ../bin/culprits > ../bin/cblprits; chmod a+x ../bin/cblprits
author HackEso <hackeso@esolangs.org>
date Sat, 07 Dec 2019 23:36:22 +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;
}