diff options
author | David Schleef <ds@schleef.org> | 2005-04-30 20:10:14 +0000 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2005-04-30 20:10:14 +0000 |
commit | 9652109d3de3a3557c5174c914d83a6b0b8e6c41 (patch) | |
tree | 90ed5b767aead92bf5c0b0021c073770a603bfdc | |
parent | 81e196203fe61e8dedc5f10e03b9ec7c9d2a7eff (diff) | |
download | liboil-9652109d3de3a3557c5174c914d83a6b0b8e6c41.tar.gz |
* examples/uberopt/uberopt.c: Select 100 random sequences instead
of generating all possible.
* examples/uberopt/it.c: Example code
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | examples/uberopt/it.c | 245 | ||||
-rw-r--r-- | examples/uberopt/uberopt.c | 226 |
3 files changed, 408 insertions, 78 deletions
@@ -1,3 +1,18 @@ +2005-04-30 David Schleef <ds@schleef.org> + + * examples/uberopt/uberopt.c: Select 100 random sequences instead + of generating all possible. + * examples/uberopt/it.c: Example code + +2005-04-30 David Schleef <ds@schleef.org> + + * liboil/copy/Makefile.am: + * liboil/copy/trans8x8_c.c: (trans8x8_u16_c1), (trans8x8_u16_c2), + (trans8x8_u16_c3), (trans8x8_u16_c4): Some pretty fast C + implementations. + * liboil/copy/trans8x8_i386.c: (trans8x8_u16_asm1), + (trans8x8_u16_asm2): asm implementations. nearly optimal. + 2005-04-29 David Schleef <ds@schleef.org> * examples/Makefile.am: add oil-test diff --git a/examples/uberopt/it.c b/examples/uberopt/it.c new file mode 100644 index 0000000..73ade2b --- /dev/null +++ b/examples/uberopt/it.c @@ -0,0 +1,245 @@ +/* + * LIBOIL - Library of Optimized Inner Loops + * Copyright (c) 2003,2004 David A. Schleef <ds@schleef.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <liboil/liboilfunction.h> +#include <math.h> + +OIL_DECLARE_CLASS(trans8x8_u16); + +UBER_START +static void +trans8x8_u16_mmx_UBER_INDEX (uint16_t *dest, int dstr, uint16_t *src, int sstr) +{ + asm volatile ( + " leal (%3,%3,2),%%eax \n" // UBER 0: + " movq (%1), %%mm0 \n" // UBER 1: + " movq (%1,%3,2), %%mm2 \n" // UBER 2: + " movq %%mm0, %%mm4 \n" // UBER 3: 1 + " movq %%mm2, %%mm5 \n" // UBER 4: 2 + " punpcklwd (%1,%3), %%mm0 \n" // UBER 5: 1 + " punpcklwd (%1,%%eax), %%mm2 \n" // UBER 6: 0 2 + " punpckhwd (%1,%3), %%mm4 \n" // UBER 7: 3 + " punpckhwd (%1,%%eax), %%mm5 \n" // UBER 8: 0 4 + " movq %%mm0, %%mm1 \n" // UBER 9: 5 + " movq %%mm4, %%mm3 \n" // UBER 10: 7 + " punpckldq %%mm2, %%mm0 \n" // UBER 11: 5 6 + " punpckldq %%mm5, %%mm4 \n" // UBER 12: 7 8 + " punpckhdq %%mm2, %%mm1 \n" // UBER 13: 6 9 + " punpckhdq %%mm5, %%mm3 \n" // UBER 14: 9 10 + " leal (%2,%2,2),%%eax \n" // UBER 15: 6 8 + " movq %%mm0, 0(%0) \n" // UBER 16: 11 + " movq %%mm1, (%0,%2) \n" // UBER 17: 13 + " movq %%mm4, (%0,%2,2) \n" // UBER 18: 12 + " movq %%mm3, (%0,%%eax) \n" // UBER 19: 14 15 + + " leal (%3,%3,2),%%eax \n" + " movq 8(%1), %%mm0 \n" + " movq 8(%1,%3,2), %%mm2 \n" + " movq %%mm0, %%mm4 \n" + " movq %%mm2, %%mm5 \n" + " punpcklwd 8(%1,%3), %%mm0 \n" + " punpcklwd 8(%1,%%eax), %%mm2 \n" + " punpckhwd 8(%1,%3), %%mm4 \n" + " punpckhwd 8(%1,%%eax), %%mm5 \n" + " movq %%mm0, %%mm1 \n" + " movq %%mm4, %%mm3 \n" + " punpckldq %%mm2, %%mm0 \n" + " punpckldq %%mm5, %%mm4 \n" + " punpckhdq %%mm2, %%mm1 \n" + " punpckhdq %%mm5, %%mm3 \n" + " leal (%2,%2,2),%%eax \n" + " leal (%0,%2,4),%0 \n" + " movq %%mm0, 0(%0) \n" + " movq %%mm1, (%0,%2) \n" + " movq %%mm4, (%0,%2,2) \n" + " movq %%mm3, (%0,%%eax) \n" + + " leal (%1,%3,4),%1 \n" + " leal (%3,%3,2),%%eax \n" + " movq 0(%1), %%mm0 \n" + " movq 0(%1,%3,2), %%mm2 \n" + " movq %%mm0, %%mm4 \n" + " movq %%mm2, %%mm5 \n" + " punpcklwd 0(%1,%3), %%mm0 \n" + " punpcklwd 0(%1,%%eax), %%mm2 \n" + " punpckhwd 0(%1,%3), %%mm4 \n" + " punpckhwd 0(%1,%%eax), %%mm5 \n" + " movq %%mm0, %%mm1 \n" + " movq %%mm4, %%mm3 \n" + " punpckldq %%mm2, %%mm0 \n" + " punpckldq %%mm5, %%mm4 \n" + " punpckhdq %%mm2, %%mm1 \n" + " punpckhdq %%mm5, %%mm3 \n" + " leal (%2,%2,2),%%eax \n" + " neg %2 \n" + " leal (%0,%2,4),%0 \n" + " neg %2 \n" + " movq %%mm0, 8(%0) \n" + " movq %%mm1, 8(%0,%2) \n" + " movq %%mm4, 8(%0,%2,2) \n" + " movq %%mm3, 8(%0,%%eax) \n" + + " leal (%3,%3,2),%%eax \n" + " movq 8(%1), %%mm0 \n" + " movq 8(%1,%3,2), %%mm2 \n" + " movq %%mm0, %%mm4 \n" + " movq %%mm2, %%mm5 \n" + " punpcklwd 8(%1,%3), %%mm0 \n" + " punpcklwd 8(%1,%%eax), %%mm2 \n" + " punpckhwd 8(%1,%3), %%mm4 \n" + " punpckhwd 8(%1,%%eax), %%mm5 \n" + " movq %%mm0, %%mm1 \n" + " movq %%mm4, %%mm3 \n" + " punpckldq %%mm2, %%mm0 \n" + " punpckldq %%mm5, %%mm4 \n" + " punpckhdq %%mm2, %%mm1 \n" + " punpckhdq %%mm5, %%mm3 \n" + " leal (%2,%2,2),%%eax \n" + " leal (%0,%2,4),%0 \n" + " movq %%mm0, 8(%0) \n" + " movq %%mm1, 8(%0,%2) \n" + " movq %%mm4, 8(%0,%2,2) \n" + " movq %%mm3, 8(%0,%%eax) \n" + + " emms \n" + : "+r" (dest), "+r" (src), "+r" (dstr), "+r" (sstr) + : + : "eax"); + +} +UBER_END + +void +register_impls(void) +{ + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_0, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_1, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_2, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_3, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_4, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_5, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_6, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_7, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_8, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_9, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_10, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_11, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_12, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_13, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_14, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_15, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_16, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_17, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_18, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_19, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_20, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_21, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_22, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_23, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_24, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_25, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_26, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_27, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_28, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_29, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_30, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_31, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_32, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_33, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_34, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_35, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_36, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_37, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_38, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_39, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_40, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_41, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_42, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_43, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_44, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_45, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_46, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_47, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_48, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_49, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_50, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_51, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_52, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_53, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_54, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_55, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_56, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_57, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_58, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_59, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_60, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_61, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_62, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_63, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_64, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_65, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_66, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_67, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_68, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_69, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_70, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_71, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_72, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_73, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_74, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_75, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_76, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_77, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_78, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_79, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_80, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_81, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_82, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_83, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_84, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_85, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_86, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_87, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_88, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_89, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_90, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_91, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_92, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_93, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_94, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_95, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_96, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_97, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_98, trans8x8_u16, 0); + OIL_REGISTER_IMPL_FULL (trans8x8_u16_mmx_99, trans8x8_u16, 0); +} + + diff --git a/examples/uberopt/uberopt.c b/examples/uberopt/uberopt.c index 9fcbd46..1b65b5b 100644 --- a/examples/uberopt/uberopt.c +++ b/examples/uberopt/uberopt.c @@ -41,78 +41,85 @@ struct _Insn { int index; int n_deps; int deps[10]; + int x; }; Insn insns[100]; int state[100]; -int max_depth = 8; +int max_depth = 1000; int outputting = 1; +int n_lines; +int start_line = -1; +int end_line = -1; +int uber_start_line = -1; +int uber_end_line = -1; +int n_insns = 0; +int depth; +int n_impls = 0; +char **lines; + +void output_sequence (void); +void read_file(void); + int main (int argc, char *argv[]) { - gboolean ret; - char *contents; - gsize length; - char **lines; int i; int j; - int start_line = -1; - int end_line = -1; - int uber_start_line = -1; - int uber_end_line = -1; - int n_insns = 0; - int depth; - int n_impls = 0; + int n; - ret = g_file_get_contents ("it.c", &contents, &length, NULL); + read_file(); - lines = g_strsplit (contents, "\n", 0); - - for(i=0;lines[i];i++){ - char *uber; - - if (strcmp(lines[i],"UBER_START")==0) { - start_line = i; - } - if (strcmp(lines[i],"UBER_END")==0) { - end_line = i; + if (outputting) { + for(i=0;i<start_line;i++){ + g_print("%s\n",lines[i]); } - uber = strstr(lines[i],"UBER "); - if (uber) { - int n_deps = 0; - char *end; + } - if (uber_start_line < 0) uber_start_line = i; - uber_end_line = i; + for(n=0;n<100;n++){ + g_print("/*\n"); + for(i=0;i<n_insns;i++){ + for(j=0;j<n_insns;j++){ + insns[j].x = 0; // 0 means available + } + for(j=0;j<i;j++){ + insns[state[j]].x = 1; // 1 means already used + } + for(j=0;j<n_insns;j++){ + int k; - uber+=5; + if (insns[j].x != 0) continue; - insns[n_insns].line = lines[i]; - insns[n_insns].index = strtol(uber, &end, 10); - uber = end; - uber++; + for(k=0;k<insns[j].n_deps;k++){ + int l; + l = insns[j].deps[k]; + if (insns[l].x != 1) { + insns[j].x = 2; // 2 means deps not satisfied + } + } + } + g_print("list:\n"); + for(j=0;j<n_insns;j++){ + g_print("%d ", insns[j].x); + } + g_print("\n"); while(1) { - while(*uber && *uber == ' ')uber++; - insns[n_insns].deps[n_deps] = strtol(uber, &end, 10); - if (end == uber) break; - uber = end; - n_deps++; + j = g_random_int_range (0, n_insns); + if (insns[j].x == 0) break; } - insns[n_insns].n_deps = n_deps; - - n_insns++; - } - } + g_print("chose %d\n",j); - if (outputting) { - for(i=0;i<start_line;i++){ - g_print("%s\n",lines[i]); + state[i] = j; } + g_print("*/\n"); + output_sequence (); + n_impls++; } +#if 0 depth = 0; while(depth >= 0) { int insn; @@ -156,37 +163,7 @@ main (int argc, char *argv[]) depth++; state[depth]=0; } else { - if (outputting) { - for(i=start_line + 1;i<uber_start_line;i++){ - char *s; - - s = strstr(lines[i],"UBER_INDEX"); - if (s) { - g_print("%.*s%d%s\n", (int)(s-lines[i]), lines[i], n_impls, s+10); - } else { - g_print("%s\n",lines[i]); - } - } - - for(i=0;i<max_depth;i++){ - g_print("%s\n",insns[state[i]].line); - } - for(i=max_depth;i<n_insns;i++) { - g_print("%s\n",insns[i].line); - } - - for(i=uber_end_line + 1;i<end_line;i++){ - char *s; - - s = strstr(lines[i],"UBER_INDEX"); - if (s) { - g_print("%.*s%d%s\n", (int)(s-lines[i]), lines[i], n_impls, s+10); - } else { - g_print("%s\n",lines[i]); - } - } - g_print("\n"); - } + output_sequence (); n_impls++; state[depth]++; @@ -194,6 +171,13 @@ main (int argc, char *argv[]) loop: ; } +#endif + + if (outputting) { + for(i=end_line+1;i<n_lines;i++){ + g_print("%s\n",lines[i]); + } + } if (!outputting) { g_print("n_impls = %d\n", n_impls); @@ -202,3 +186,89 @@ main (int argc, char *argv[]) return 0; } +void read_file(void) +{ + gboolean ret; + char *contents; + gsize length; + int i; + + ret = g_file_get_contents ("it.c", &contents, &length, NULL); + + lines = g_strsplit (contents, "\n", 0); + + for(i=0;lines[i];i++){ + char *uber; + + if (strcmp(lines[i],"UBER_START")==0) { + start_line = i; + } + if (strcmp(lines[i],"UBER_END")==0) { + end_line = i; + } + uber = strstr(lines[i],"UBER "); + if (uber) { + int n_deps = 0; + char *end; + + if (uber_start_line < 0) uber_start_line = i; + uber_end_line = i; + + uber+=5; + + insns[n_insns].line = lines[i]; + insns[n_insns].index = strtol(uber, &end, 10); + uber = end; + uber++; + while(1) { + while(*uber && *uber == ' ')uber++; + insns[n_insns].deps[n_deps] = strtol(uber, &end, 10); + if (end == uber) break; + uber = end; + n_deps++; + } + insns[n_insns].n_deps = n_deps; + + n_insns++; + } + n_lines++; + } +} + +void output_sequence (void) +{ + int i; + + if (outputting) { + for(i=start_line + 1;i<uber_start_line;i++){ + char *s; + + s = strstr(lines[i],"UBER_INDEX"); + if (s) { + g_print("%.*s%d%s\n", (int)(s-lines[i]), lines[i], n_impls, s+10); + } else { + g_print("%s\n",lines[i]); + } + } + + for(i=0;i<max_depth && i<n_insns;i++){ + g_print("%s\n",insns[state[i]].line); + } + for(i=max_depth;i<n_insns;i++) { + g_print("%s\n",insns[i].line); + } + + for(i=uber_end_line + 1;i<end_line;i++){ + char *s; + + s = strstr(lines[i],"UBER_INDEX"); + if (s) { + g_print("%.*s%d%s\n", (int)(s-lines[i]), lines[i], n_impls, s+10); + } else { + g_print("%s\n",lines[i]); + } + } + g_print("\n"); + } +} + |