--- gforth/engine/peephole.c 2001/02/27 21:17:11 1.2 +++ gforth/engine/peephole.c 2003/03/09 15:17:03 1.7 @@ -1,6 +1,6 @@ /* Peephole optimization routines and tables - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001,2002 Free Software Foundation, Inc. This file is part of Gforth. @@ -22,6 +22,8 @@ #include "config.h" #include "forth.h" #include +#include +#include /* the numbers in this struct are primitive indices */ typedef struct Combination { @@ -34,37 +36,110 @@ Combination peephole_table[] = { #include "peephole.i" }; -Xt *primtable(Label symbols[], Cell size) +#ifdef PRINT_SUPER_LENGTHS +char *prim_names[] = { +#include "prim_names.i" +}; + +Combination *find_super(Cell prim) { -#ifdef DIRECT_THREADED - return symbols; -#else /* !defined(DIRECT_THREADED) */ - Xt *xts = (Xt *)malloc(size*sizeof(Xt)); Cell i; - for (i=0; iprefix)+prim_length(super->lastprim); + else + return prim_length(prim); } -/* we are currently using a simple linear search; we can refine this - once the interface has settled and this works */ +void print_prim(Cell prim) +{ + fprintf(stderr, "%s", prim_names[prim]); +} + +void print_super(Cell prim) +{ + Combination *super=find_super(prim); + + if (super) { + print_super(super->prefix); + fprintf(stderr, " "); + print_prim(super->lastprim); + } else { + print_prim(prim); + } +} -Cell prepare_peephole_table(Xt xts[]) +void print_super_lengths() { - return (Cell)xts; + Cell i; + + for (i=0; i>4)&(HASH_SIZE-1)) + +Cell peeptable; + +Cell prepare_peephole_table(Inst insts[]) { - Xt *xts = (Xt *)peeptable; Cell i; + Peeptable_entry **pt = (Peeptable_entry **)calloc(HASH_SIZE,sizeof(Peeptable_entry *)); - for (i=0; i<(sizeof(peephole_table)/sizeof(Combination)); i++) { + for (i=0; iprefix] && xt2 == xts[c->lastprim]) - return xts[c->combination_prim]; + Peeptable_entry *p = (Peeptable_entry *)malloc(sizeof(Peeptable_entry)); + Cell h; + p->prefix = insts[c->prefix]; + p->lastprim = insts[c->lastprim]; + p->combination_prim = insts[c->combination_prim]; + h = hash(p->prefix,p->lastprim); + p->next = pt[h]; + pt[h] = p; } - return 0; + return (Cell)pt; +} + +Inst peephole_opt(Inst inst1, Inst inst2, Cell peeptable) +{ + Peeptable_entry **pt = (Peeptable_entry **)peeptable; + Peeptable_entry *p; + + if (use_super == 0) + return 0; + for (p = pt[hash(inst1,inst2)]; p != NULL; p = p->next) + if (inst1 == p->prefix && inst2 == p->lastprim) + return p->combination_prim; + return NULL; }