summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2005-05-02 09:17:35 +0000
committerDavid Schleef <ds@schleef.org>2005-05-02 09:17:35 +0000
commitabe0870feae5d00ae27ee7b671eff5962f59110a (patch)
tree72e0077a7036e947e5c34a12c2dbd6409ac49b00
parent68c2c4e577f39f9a230cd065a34be13a0cd0b72e (diff)
downloadliboil-abe0870feae5d00ae27ee7b671eff5962f59110a.tar.gz
* examples/Makefile.am: add report
* examples/report.c: Create report of classes and speedups. * liboil/conv/conv_3dnow.c: (conv_f32_s16_3dnow), (conv_s32_f32_3dnow): reindent
-rw-r--r--ChangeLog7
-rw-r--r--examples/Makefile.am6
-rw-r--r--examples/report.c179
-rw-r--r--liboil/conv/conv_3dnow.c81
4 files changed, 228 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index 8f8c85a..4ce826f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2005-05-02 David Schleef <ds@schleef.org>
+ * examples/Makefile.am: add report
+ * examples/report.c: Create report of classes and speedups.
+ * liboil/conv/conv_3dnow.c: (conv_f32_s16_3dnow),
+ (conv_s32_f32_3dnow): reindent
+
+2005-05-02 David Schleef <ds@schleef.org>
+
* liboil/utf8/Makefile.am:
* liboil/utf8/utf8_fast.c: Some implementations.
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 9a1bda7..d648f68 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -1,7 +1,7 @@
SUBDIRS = jpeg md5 uberopt work huffman
-noinst_PROGRAMS = example1 oil-inspect oil-test
+noinst_PROGRAMS = example1 oil-inspect oil-test report
example1_SOURCES = example1.c
@@ -16,3 +16,7 @@ oil_test_SOURCES = oil-test.c
oil_test_CFLAGS = $(LIBOIL_CFLAGS)
oil_test_LDADD = $(LIBOIL_LIBS)
+report_SOURCES = report.c
+report_CFLAGS = $(LIBOIL_CFLAGS)
+report_LDADD = $(LIBOIL_LIBS)
+
diff --git a/examples/report.c b/examples/report.c
new file mode 100644
index 0000000..14baca3
--- /dev/null
+++ b/examples/report.c
@@ -0,0 +1,179 @@
+/*
+ * LIBOIL - Library of Optimized Inner Loops
+ * Copyright (c) 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/liboil.h>
+#include <liboil/liboilfunction.h>
+#include <liboil/liboilcpu.h>
+#include <liboil/liboiltest.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#if 0
+int retval = EXIT_SUCCESS;
+static void
+printerr (char *format, ...)
+{
+ va_list var_args;
+
+ va_start (var_args, format);
+ vfprintf (stderr, format, var_args);
+ va_end (var_args);
+ retval = EXIT_FAILURE;
+}
+
+static char *
+string_append (char *str, const char *append)
+{
+ char *ret;
+ if (str) {
+ size_t size = strlen (str) + 2 + strlen (append) + 1;
+ ret = malloc (size);
+ snprintf (ret, size, "%s, %s", str, append);
+ free (str);
+ } else {
+ ret = strdup (append);
+ }
+ return ret;
+}
+static char *
+oil_flags_to_string (unsigned int flags)
+{
+ char *ret = NULL;
+
+ if (flags & OIL_IMPL_FLAG_REF)
+ ret = string_append (ret, "REF");
+ if (flags & OIL_IMPL_FLAG_OPT)
+ ret = string_append (ret, "altopt");
+ if (flags & OIL_IMPL_FLAG_ASM)
+ ret = string_append (ret, "asm");
+#ifdef HAVE_CPU_I386
+ if (flags & OIL_IMPL_FLAG_CMOV)
+ ret = string_append (ret, "cmov");
+ if (flags & OIL_IMPL_FLAG_MMX)
+ ret = string_append (ret, "mmx");
+ if (flags & OIL_IMPL_FLAG_SSE)
+ ret = string_append (ret, "sse");
+ if (flags & OIL_IMPL_FLAG_MMXEXT)
+ ret = string_append (ret, "mmxext");
+ if (flags & OIL_IMPL_FLAG_SSE2)
+ ret = string_append (ret, "sse2");
+ if (flags & OIL_IMPL_FLAG_3DNOW)
+ ret = string_append (ret, "3dnow");
+ if (flags & OIL_IMPL_FLAG_3DNOWEXT)
+ ret = string_append (ret, "3dnowext");
+#endif
+#ifdef HAVE_CPU_PPC
+ if (flags & OIL_IMPL_FLAG_ALTIVEC)
+ ret = string_append (ret, "altivec");
+#endif
+ return ret;
+}
+#endif
+
+#if 0
+static void
+oil_print_impl (OilFunctionImpl *impl, OilTest *test, char* prefix)
+{
+ char *c;
+ unsigned int cpu_flags = oil_cpu_get_flags();
+
+ oil_test_check_impl (test, impl);
+
+ printf ("%s%s\n", prefix, impl->name);
+ c = oil_flags_to_string (impl->flags);
+ if (c) {
+ printf ("%s flags: %s\n", prefix, c);
+ free (c);
+ }
+ if (impl->profile_ave) {
+ printf ("%s profile: %g ticks (std.dev. %g)\n", prefix, impl->profile_ave,
+ impl->profile_std);
+ }
+ if (test && !(impl->flags & OIL_IMPL_FLAG_REF)) {
+ printf ("%s sum abs difference: %g (n=%d)\n", prefix,
+ test->sum_abs_diff, test->n_points);
+ }
+ if ((impl->flags & OIL_CPU_FLAG_MASK) & (~cpu_flags)) {
+ printf ("%s disabled\n", prefix);
+ }
+}
+#endif
+
+#if 0
+static int
+impl_compare (const void *a, const void *b)
+{
+ const OilFunctionImpl *ia = *(OilFunctionImpl **)a;
+ const OilFunctionImpl *ib = *(OilFunctionImpl **)b;
+
+ if (ia->profile_ave < ib->profile_ave) return -1;
+ if (ia->profile_ave > ib->profile_ave) return 1;
+ return 0;
+}
+#endif
+
+static void
+oil_print_class (OilFunctionClass *klass, int verbose)
+{
+
+ printf ("%-20s %-10g %-10g %-10.3g\n", klass->name,
+ klass->reference_impl->profile_ave,
+ klass->chosen_impl->profile_ave,
+ klass->reference_impl->profile_ave/klass->chosen_impl->profile_ave);
+
+}
+
+static void
+oil_print_all (void)
+{
+ int i;
+ int n;
+
+ n = oil_class_get_n_classes ();
+ for (i = 0; i < n; i++){
+ OilFunctionClass *klass = oil_class_get_by_index (i);
+ oil_print_class (klass, 0);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ oil_init();
+
+ oil_print_all ();
+
+ return 0;
+}
+
diff --git a/liboil/conv/conv_3dnow.c b/liboil/conv/conv_3dnow.c
index 1e1d884..01efd23 100644
--- a/liboil/conv/conv_3dnow.c
+++ b/liboil/conv/conv_3dnow.c
@@ -32,61 +32,54 @@
#include <conv.h>
-#ifdef __GNUC__
/* suboptimal */
static void
-conv_f32_s16_3dnow(float *dst, int dst_stride, int16_t *src, int src_stride,
+conv_f32_s16_3dnow (float *dst, int dst_stride, int16_t * src, int src_stride,
int n)
{
- int i;
+ int i;
- for(i=0;i<n;i++){
- asm volatile(
- " movswl 0(%0), %%eax \n"
- " movd %%eax, %%mm0 \n"
- " pi2fd %%mm0, %%mm0 \n"
- " movd %%mm0, 0(%1) \n"
- :
- : "r" (src), "r" (dst)
- : "eax", "mm0"
- );
- dst = OIL_OFFSET(dst, dst_stride);
- src = OIL_OFFSET(src, src_stride);
- }
- asm volatile ("emms");
+ for (i = 0; i < n; i++) {
+ asm volatile (" movswl 0(%0), %%eax \n"
+ " movd %%eax, %%mm0 \n"
+ " pi2fd %%mm0, %%mm0 \n" " movd %%mm0, 0(%1) \n"::"r" (src), "r" (dst)
+ :"eax", "mm0");
+
+ dst = OIL_OFFSET (dst, dst_stride);
+ src = OIL_OFFSET (src, src_stride);
+ }
+ asm volatile ("emms");
}
-OIL_DEFINE_IMPL_FULL(conv_f32_s16_3dnow, conv_f32_s16,
- OIL_IMPL_FLAG_3DNOW);
+
+OIL_DEFINE_IMPL_FULL (conv_f32_s16_3dnow, conv_f32_s16, OIL_IMPL_FLAG_3DNOW);
/* suboptimal */
static void
-conv_s32_f32_3dnow (int32_t *dst, int dst_stride, float *src, int src_stride,
+conv_s32_f32_3dnow (int32_t * dst, int dst_stride, float *src, int src_stride,
int n)
{
- int i;
- const float constants[][2] = {
- { -0.5, -0.5 },
- { -1.0, -1.0 }
- };
+ int i;
+ const float constants[][2] = {
+ {-0.5, -0.5},
+ {-1.0, -1.0}
+ };
- for(i=0;i<n;i++){
- asm volatile(
- " movq 0(%0), %%mm0 \n"
- " pfadd 0(%2), %%mm0 \n"
- " pf2id %%mm0, %%mm1 \n"
- " pfcmpgt 0(%2), %%mm0 \n"
- " psubd %%mm0, %%mm1 \n"
- " movd %%mm1, 0(%1) \n"
- :
- : "r" (src), "r" (dst), "r" (constants)
- : "mm0"
- );
- dst = OIL_OFFSET(dst, dst_stride);
- src = OIL_OFFSET(src, src_stride);
- }
- asm volatile ("emms");
+ for (i = 0; i < n; i++) {
+ asm volatile (
+ " movq 0(%0), %%mm0 \n"
+ " pfadd 0(%2), %%mm0 \n"
+ " pf2id %%mm0, %%mm1 \n"
+ " pfcmpgt 0(%2), %%mm0 \n"
+ " psubd %%mm0, %%mm1 \n"
+ " movd %%mm1, 0(%1) \n"
+ :
+ :"r" (src), "r" (dst), "r" (constants)
+ :"mm0");
+
+ dst = OIL_OFFSET (dst, dst_stride);
+ src = OIL_OFFSET (src, src_stride);
+ }
+ asm volatile ("emms");
}
-OIL_DEFINE_IMPL_FULL(conv_s32_f32_3dnow, conv_s32_f32,
- OIL_IMPL_FLAG_3DNOW);
-#endif
+OIL_DEFINE_IMPL_FULL (conv_s32_f32_3dnow, conv_s32_f32, OIL_IMPL_FLAG_3DNOW);