summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2005-04-30 20:10:14 +0000
committerDavid Schleef <ds@schleef.org>2005-04-30 20:10:14 +0000
commit9652109d3de3a3557c5174c914d83a6b0b8e6c41 (patch)
tree90ed5b767aead92bf5c0b0021c073770a603bfdc
parent81e196203fe61e8dedc5f10e03b9ec7c9d2a7eff (diff)
downloadliboil-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--ChangeLog15
-rw-r--r--examples/uberopt/it.c245
-rw-r--r--examples/uberopt/uberopt.c226
3 files changed, 408 insertions, 78 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b23927..a48cc49 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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");
+ }
+}
+