version 1.5, 2001/06/15 16:09:15
|
version 1.10, 2007/12/31 18:40:25
|
Line 1
|
Line 1
|
/* Peephole optimization routines and tables |
/* Peephole optimization routines and tables |
|
|
Copyright (C) 2001 Free Software Foundation, Inc. |
Copyright (C) 2001,2002,2003 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Gforth is free software; you can redistribute it and/or |
Gforth is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License |
modify it under the terms of the GNU General Public License |
as published by the Free Software Foundation; either version 2 |
as published by the Free Software Foundation, either version 3 |
of the License, or (at your option) any later version. |
of the License, or (at your option) any later version. |
|
|
This program is distributed in the hope that it will be useful, |
This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
GNU General Public License for more details. |
GNU General Public License for more details. |
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
along with this program; if not, see http://www.gnu.org/licenses/. |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
*/ |
*/ |
|
|
#include "config.h" |
#include "config.h" |
Line 33 typedef struct Combination {
|
Line 32 typedef struct Combination {
|
} Combination; |
} Combination; |
|
|
Combination peephole_table[] = { |
Combination peephole_table[] = { |
#include "peephole.i" |
#include PEEPHOLE_I |
}; |
}; |
|
|
|
#ifdef PRINT_SUPER_LENGTHS |
|
char *prim_names[] = { |
|
#include PRIM_NAMES_I |
|
}; |
|
|
|
Combination *find_super(Cell prim) |
|
{ |
|
Cell i; |
|
|
|
for (i=0; i<sizeof(peephole_table)/sizeof(peephole_table[0]); i++) { |
|
if (peephole_table[i].combination_prim == prim) |
|
return &peephole_table[i]; |
|
} |
|
return NULL; |
|
} |
|
|
|
Cell sum_length(Cell prim) |
|
{ |
|
Combination *super=find_super(prim); |
|
|
|
if (super) |
|
return sum_length(super->prefix)+prim_length(super->lastprim); |
|
else |
|
return prim_length(prim); |
|
} |
|
|
|
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); |
|
} |
|
} |
|
|
|
void print_super_lengths() |
|
{ |
|
Cell i; |
|
|
|
for (i=0; i<sizeof(peephole_table)/sizeof(peephole_table[0]); i++) { |
|
Cell super_length = prim_length(peephole_table[i].combination_prim); |
|
Cell sum_super_length = sum_length(peephole_table[i].combination_prim); |
|
|
|
fprintf(stderr, "%6.4f %3d %3d ", ((double)super_length)/sum_super_length, |
|
super_length, sum_super_length); |
|
print_super(peephole_table[i].combination_prim); |
|
fprintf(stderr,"\n"); |
|
} |
|
} |
|
#endif |
|
|
int use_super = 1; |
int use_super = 1; |
|
|
typedef Xt Inst; |
typedef Xt Inst; |