diff options
author | David Schleef <ds@schleef.org> | 2005-05-02 09:17:35 +0000 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2005-05-02 09:17:35 +0000 |
commit | abe0870feae5d00ae27ee7b671eff5962f59110a (patch) | |
tree | 72e0077a7036e947e5c34a12c2dbd6409ac49b00 | |
parent | 68c2c4e577f39f9a230cd065a34be13a0cd0b72e (diff) | |
download | liboil-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-- | ChangeLog | 7 | ||||
-rw-r--r-- | examples/Makefile.am | 6 | ||||
-rw-r--r-- | examples/report.c | 179 | ||||
-rw-r--r-- | liboil/conv/conv_3dnow.c | 81 |
4 files changed, 228 insertions, 45 deletions
@@ -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); |