summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2005-05-06 23:16:59 +0000
committerDavid Schleef <ds@schleef.org>2005-05-06 23:16:59 +0000
commit780ba4be951d4a1d075dde750900fca414d78bfe (patch)
treebb7f06c29d45b687afec7f227d58ad85899cc6ed
parentabe0870feae5d00ae27ee7b671eff5962f59110a (diff)
downloadliboil-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--ChangeLog17
-rw-r--r--doc/xml/liboilfunction.xml4
-rw-r--r--examples/report.c6
-rw-r--r--liboil/copy/splat_ref.c64
-rw-r--r--liboil/copy/trans8x8_c.c8
-rw-r--r--liboil/copy/trans8x8_i386.c4
-rw-r--r--liboil/liboilcpu.c26
-rw-r--r--liboil/liboilfunction.c2
-rw-r--r--liboil/utf8/utf8_fast.c8
9 files changed, 116 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ce826f..652880d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>&nbsp;:</term>
-<listitem><simpara>
+<listitem><simpara> the name of the class
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>impl</parameter>&nbsp;:</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;