diff options
author | David Schleef <ds@schleef.org> | 2005-05-06 23:16:59 +0000 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2005-05-06 23:16:59 +0000 |
commit | 780ba4be951d4a1d075dde750900fca414d78bfe (patch) | |
tree | bb7f06c29d45b687afec7f227d58ad85899cc6ed | |
parent | abe0870feae5d00ae27ee7b671eff5962f59110a (diff) | |
download | liboil-780ba4be951d4a1d075dde750900fca414d78bfe.tar.gz |
* doc/xml/liboilfunction.xml: update
* examples/report.c: (oil_print_class): print whether fastest
implementation is due to alternate optimization flags
* liboil/copy/splat_ref.c: (splat_u8_ns_ref), (splat_u32_ns_ref),
(splat_u32_ns_unroll2), (splat_u8_ns_memset), (splat_u8_ns_int):
Add new splat classes
* liboil/copy/trans8x8_c.c: make static
* liboil/copy/trans8x8_i386.c: make functions static
* liboil/utf8/utf8_fast.c: make functions static
* liboil/liboilcpu.c: (oil_cpu_i386_getflags_cpuid),
(oil_cpu_fault_check_enable), (oil_cpu_fault_check_disable):
fix up signal() fallback. Allow nested calls to check_enable().
* liboil/liboilfunction.c: (oil_optimize_all): wrap in fault
check
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | doc/xml/liboilfunction.xml | 4 | ||||
-rw-r--r-- | examples/report.c | 6 | ||||
-rw-r--r-- | liboil/copy/splat_ref.c | 64 | ||||
-rw-r--r-- | liboil/copy/trans8x8_c.c | 8 | ||||
-rw-r--r-- | liboil/copy/trans8x8_i386.c | 4 | ||||
-rw-r--r-- | liboil/liboilcpu.c | 26 | ||||
-rw-r--r-- | liboil/liboilfunction.c | 2 | ||||
-rw-r--r-- | liboil/utf8/utf8_fast.c | 8 |
9 files changed, 116 insertions, 23 deletions
@@ -1,3 +1,20 @@ +2005-05-06 David Schleef <ds@schleef.org> + + * doc/xml/liboilfunction.xml: update + * examples/report.c: (oil_print_class): print whether fastest + implementation is due to alternate optimization flags + * liboil/copy/splat_ref.c: (splat_u8_ns_ref), (splat_u32_ns_ref), + (splat_u32_ns_unroll2), (splat_u8_ns_memset), (splat_u8_ns_int): + Add new splat classes + * liboil/copy/trans8x8_c.c: make static + * liboil/copy/trans8x8_i386.c: make functions static + * liboil/utf8/utf8_fast.c: make functions static + * liboil/liboilcpu.c: (oil_cpu_i386_getflags_cpuid), + (oil_cpu_fault_check_enable), (oil_cpu_fault_check_disable): + fix up signal() fallback. Allow nested calls to check_enable(). + * liboil/liboilfunction.c: (oil_optimize_all): wrap in fault + check + 2005-05-02 David Schleef <ds@schleef.org> * examples/Makefile.am: add report diff --git a/doc/xml/liboilfunction.xml b/doc/xml/liboilfunction.xml index 7a7b026..96aa676 100644 --- a/doc/xml/liboilfunction.xml +++ b/doc/xml/liboilfunction.xml @@ -544,12 +544,12 @@ not changed.</para> <link linkend="OilFunctionImpl">OilFunctionImpl</link> *impl);</programlisting> <para> Adds <parameter>impl</parameter> to the list of implementations associated with -the function class given by <parameter>klass</parameter>.</para> +the function class given by <parameter>klass_name</parameter>.</para> <para> </para><variablelist role="params"> <varlistentry><term><parameter>klass_name</parameter> :</term> -<listitem><simpara> +<listitem><simpara> the name of the class </simpara></listitem></varlistentry> <varlistentry><term><parameter>impl</parameter> :</term> <listitem><simpara> an implementation diff --git a/examples/report.c b/examples/report.c index 14baca3..51eb6b8 100644 --- a/examples/report.c +++ b/examples/report.c @@ -147,10 +147,12 @@ static void oil_print_class (OilFunctionClass *klass, int verbose) { - printf ("%-20s %-10g %-10g %-10.3g\n", klass->name, + printf ("%-20s %-10g %-10g %-10.3g %s\n", klass->name, klass->reference_impl->profile_ave, klass->chosen_impl->profile_ave, - klass->reference_impl->profile_ave/klass->chosen_impl->profile_ave); + klass->reference_impl->profile_ave/klass->chosen_impl->profile_ave, + (klass->chosen_impl->flags & OIL_IMPL_FLAG_OPT)?"*":" " + ); } diff --git a/liboil/copy/splat_ref.c b/liboil/copy/splat_ref.c index 9f40461..0f5b7a5 100644 --- a/liboil/copy/splat_ref.c +++ b/liboil/copy/splat_ref.c @@ -29,9 +29,12 @@ #include "config.h" #endif #include <liboil/liboilfunction.h> +#include <string.h> OIL_DEFINE_CLASS(splat_u8,"uint8_t *dest, int dstr, uint8_t *s1_1, int n"); OIL_DEFINE_CLASS(splat_u32,"uint32_t *dest, int dstr, uint32_t *s1_1, int n"); +OIL_DEFINE_CLASS(splat_u8_ns,"uint8_t *dest, uint8_t *s1_1, int n"); +OIL_DEFINE_CLASS(splat_u32_ns,"uint32_t *dest, uint32_t *s1_1, int n"); static void splat_u8_ref (uint8_t *dest, int dstr, uint8_t *param, int n) @@ -53,6 +56,26 @@ static void splat_u32_ref (uint32_t *dest, int dstr, uint32_t *param, int n) OIL_DEFINE_IMPL_REF(splat_u32_ref, splat_u32); +static void splat_u8_ns_ref (uint8_t *dest, uint8_t *param, int n) +{ + int i; + for(i=0;i<n;i++){ + dest[i] = *param; + } +} +OIL_DEFINE_IMPL_REF(splat_u8_ns_ref, splat_u8_ns); + +static void splat_u32_ns_ref (uint32_t *dest, uint32_t *param, int n) +{ + int i; + for(i=0;i<n;i++){ + dest[i] = *param; + } +} +OIL_DEFINE_IMPL_REF(splat_u32_ns_ref, splat_u32_ns); + + + static void splat_u32_unroll2 (uint32_t *dest, int dstr, uint32_t *param, int n) { @@ -71,3 +94,44 @@ static void splat_u32_unroll2 (uint32_t *dest, int dstr, uint32_t *param, int n) } OIL_DEFINE_IMPL(splat_u32_unroll2, splat_u32); +static void splat_u32_ns_unroll2 (uint32_t *dest, uint32_t *param, int n) +{ + int i; + if (n&1) { + *dest = *param; + dest++; + } + n >>= 1; + for(i=0;i<n;i++){ + *dest = *param; + dest++; + *dest = *param; + dest++; + } +} +OIL_DEFINE_IMPL(splat_u32_ns_unroll2, splat_u32_ns); + +static void splat_u8_ns_memset (uint8_t *dest, uint8_t *param, int n) +{ + memset (dest, *param, n); +} +OIL_DEFINE_IMPL(splat_u8_ns_memset, splat_u8_ns); + +static void splat_u8_ns_int (uint8_t *dest, uint8_t *param, int n) +{ + int p; + while(n&3) { + *dest = *param; + dest++; + n--; + } + n >>= 4; + p = (*param<<24) | (*param<<16) | (*param<<8) | (*param); + while(n>0){ + *(uint32_t *)param = p; + n--; + } +} +OIL_DEFINE_IMPL(splat_u8_ns_int, splat_u8_ns); + + diff --git a/liboil/copy/trans8x8_c.c b/liboil/copy/trans8x8_c.c index 76b90d0..a358d3f 100644 --- a/liboil/copy/trans8x8_c.c +++ b/liboil/copy/trans8x8_c.c @@ -34,7 +34,7 @@ OIL_DECLARE_CLASS (trans8x8_u16); -void +static void trans8x8_u16_c1 (uint16_t *dest, int dstr, uint16_t *src, int sstr) { int i; @@ -51,7 +51,7 @@ trans8x8_u16_c1 (uint16_t *dest, int dstr, uint16_t *src, int sstr) } OIL_DEFINE_IMPL (trans8x8_u16_c1, trans8x8_u16); -void +static void trans8x8_u16_c2 (uint16_t *dest, int dstr, uint16_t *src, int sstr) { int i; @@ -72,7 +72,7 @@ trans8x8_u16_c2 (uint16_t *dest, int dstr, uint16_t *src, int sstr) } OIL_DEFINE_IMPL (trans8x8_u16_c2, trans8x8_u16); -void +static void trans8x8_u16_c3 (uint16_t *dest, int dstr, uint16_t *src, int sstr) { int i; @@ -93,7 +93,7 @@ trans8x8_u16_c3 (uint16_t *dest, int dstr, uint16_t *src, int sstr) } OIL_DEFINE_IMPL (trans8x8_u16_c3, trans8x8_u16); -void +static void trans8x8_u16_c4 (uint16_t *dest, int dstr, uint16_t *src, int sstr) { int i; diff --git a/liboil/copy/trans8x8_i386.c b/liboil/copy/trans8x8_i386.c index 2a9a76c..caa91d2 100644 --- a/liboil/copy/trans8x8_i386.c +++ b/liboil/copy/trans8x8_i386.c @@ -136,7 +136,7 @@ trans8x8_u16_mmx (uint16_t *dest, int dstr, uint16_t *src, int sstr) } OIL_DEFINE_IMPL (trans8x8_u16_mmx, trans8x8_u16); -void +static void trans8x8_u16_asm1 (uint16_t *dest, int dstr, uint16_t *src, int sstr) { int saved_ebx = 0; @@ -184,7 +184,7 @@ trans8x8_u16_asm1 (uint16_t *dest, int dstr, uint16_t *src, int sstr) } OIL_DEFINE_IMPL (trans8x8_u16_asm1, trans8x8_u16); -void +static void trans8x8_u16_asm2 (uint16_t *dest, int dstr, uint16_t *src, int sstr) { int i; diff --git a/liboil/liboilcpu.c b/liboil/liboilcpu.c index 95d3303..69d6f3e 100644 --- a/liboil/liboilcpu.c +++ b/liboil/liboilcpu.c @@ -145,8 +145,8 @@ static void oil_cpu_i386_getflags_cpuid (void) { uint32_t eax, ebx, ecx, edx; - int level; - char vendor[13]; + uint32_t level; + char vendor[13] = { 0 }; int ret; oil_cpu_fault_check_enable (); @@ -340,6 +340,7 @@ static struct sigaction oldaction; static void * oldhandler; #endif static int in_try_block; +static int enable_level; static void illegal_instruction_handler (int num) @@ -354,13 +355,17 @@ illegal_instruction_handler (int num) void oil_cpu_fault_check_enable (void) { + if (enable_level == 0) { #ifdef HAVE_SIGACTION - memset (&action, 0, sizeof(action)); - action.sa_handler = &illegal_instruction_handler; - sigaction (SIGILL, &action, &oldaction); + memset (&action, 0, sizeof(action)); + action.sa_handler = &illegal_instruction_handler; + sigaction (SIGILL, &action, &oldaction); +#else + signal (SIGILL, illegal_instruction_handler); #endif - signal (SIGILL, illegal_instruction_handler); - in_try_block = 0; + in_try_block = 0; + } + enable_level++; } int @@ -381,10 +386,13 @@ oil_cpu_fault_check_try (void (*func) (void *), void *priv) void oil_cpu_fault_check_disable (void) { + enable_level--; + if (enable_level == 0) { #ifdef HAVE_SIGACTION - sigaction (SIGILL, &oldaction, NULL); + sigaction (SIGILL, &oldaction, NULL); #else - signal (SIGILL, oldhandler); + signal (SIGILL, oldhandler); #endif + } } diff --git a/liboil/liboilfunction.c b/liboil/liboilfunction.c index 2999b99..92b38cd 100644 --- a/liboil/liboilfunction.c +++ b/liboil/liboilfunction.c @@ -89,11 +89,13 @@ oil_optimize_all (void) OilFunctionClass *klass; int i; + oil_cpu_fault_check_enable (); for (i = 0; i < _oil_n_function_classes; i++) { klass = oil_class_get_by_index (i); oil_class_optimize (klass); } + oil_cpu_fault_check_disable (); } /** diff --git a/liboil/utf8/utf8_fast.c b/liboil/utf8/utf8_fast.c index 7f70837..607c107 100644 --- a/liboil/utf8/utf8_fast.c +++ b/liboil/utf8/utf8_fast.c @@ -33,7 +33,7 @@ #include "liboil/utf8/utf8.h" -void +static void utf8_validate_fast (int32_t *d_1, uint8_t *s, int n) { int i; @@ -75,7 +75,7 @@ error: } OIL_DEFINE_IMPL (utf8_validate_fast, utf8_validate); -void +static void utf8_validate_fast2 (int32_t *d_1, uint8_t *s, int n) { int i; @@ -124,7 +124,7 @@ error: OIL_DEFINE_IMPL (utf8_validate_fast2, utf8_validate); #if 0 -void +static void utf8_validate_asm1 (int32_t *d_1, uint8_t *s, int n) { uint8_t *tmp = s; @@ -148,7 +148,7 @@ utf8_validate_asm1 (int32_t *d_1, uint8_t *s, int n) } OIL_DEFINE_IMPL (utf8_validate_asm1, utf8_validate); -void +static void utf8_validate_asm2 (int32_t *d_1, uint8_t *s, int n) { uint8_t *tmp = s; |