[Liboil-commit] liboil/i386_amd64 liboil/liboilclasses.h liboil/liboilfuncs-04.h liboil/liboilfuncs-doc.h liboil/liboilfuncs.h liboil/liboiltrampolines.c liboil/ref

David Schleef ds at kemper.freedesktop.org
Sun Feb 17 19:03:50 PST 2008


 liboil/i386_amd64/sad8x8.c |   83 +++++++++++++++++++++++++++++++++++++++++++++
 liboil/liboilclasses.h     |    3 +
 liboil/liboilfuncs-04.h    |    3 +
 liboil/liboilfuncs-doc.h   |    3 +
 liboil/liboilfuncs.h       |    9 ++++
 liboil/liboiltrampolines.c |   30 ++++++++++++++++
 liboil/ref/wavelet.c       |   57 ++++++++++++++++++++++++++++++
 7 files changed, 188 insertions(+)

New commits:
commit f06e19392112ec45b4d9d9eaf4524fb31cee5298
Author: David Schleef <ds at ginger.bigkitten.com>
Date:   Sun Feb 17 19:05:42 2008 -0800

    Add oil_avg_*xn_u8() classes

diff --git a/liboil/i386_amd64/sad8x8.c b/liboil/i386_amd64/sad8x8.c
index d724ff4..8fee8dd 100644
--- a/liboil/i386_amd64/sad8x8.c
+++ b/liboil/i386_amd64/sad8x8.c
@@ -741,3 +741,86 @@ combine2_16xn_u8_mmx (uint8_t *d, int ds1,
 }
 OIL_DEFINE_IMPL_FULL (combine2_16xn_u8_mmx, combine2_16xn_u8, OIL_IMPL_FLAG_MMX);
 
+#define AVG2_4(offset) \
+        "  movd " #offset "(%1), %%mm0\n" \
+        "  punpcklbw %%mm7, %%mm0\n" \
+        "  pshufw $0x00, %%mm6, %%mm5\n" \
+        "  pmullw %%mm5, %%mm0\n" \
+        "  movd " #offset "(%2), %%mm1\n" \
+        "  punpcklbw %%mm7, %%mm1\n" \
+        "  pshufw $0x55, %%mm6, %%mm5\n" \
+        "  pmullw %%mm5, %%mm1\n" \
+        "  paddw %%mm1, %%mm0\n" \
+        "  paddw %%mm4, %%mm0\n" \
+        "  psrlw %%mm3, %%mm0\n" \
+        "  packuswb %%mm0, %%mm0\n" \
+        "  movd %%mm0, " #offset "(%0)\n"
+void
+avg2_8xn_u8_mmx (uint8_t *d, int ds1, uint8_t *s1, int ss1,
+    uint8_t *s2, int ss2, int n)
+{
+  int j;
+  for(j=0;j<n;j++){
+    asm volatile ("\n"
+        "  movq 0(%[s1]), %%mm0\n"
+        "  pavgb 0(%[s2]), %%mm0\n"
+        "  movq %%mm0, 0(%[d])\n"
+        :
+        : [d] "r" (d), [s1] "r" (s1), [s2] "r" (s2));
+
+    s1 += ss1;
+    s2 += ss2;
+    d += ds1;
+  }
+  asm volatile ("emms");
+}
+OIL_DEFINE_IMPL_FULL (avg2_8xn_u8_mmx, avg2_8xn_u8, OIL_IMPL_FLAG_MMX);
+
+void
+avg2_12xn_u8_mmx (uint8_t *d, int ds1, uint8_t *s1, int ss1,
+    uint8_t *s2, int ss2, int n)
+{
+  int j;
+  for(j=0;j<n;j++){
+    asm volatile ("\n"
+        "  movq 0(%[s1]), %%mm0\n"
+        "  pavgb 0(%[s2]), %%mm0\n"
+        "  movq %%mm0, 0(%[d])\n"
+        "  movq 4(%[s1]), %%mm0\n"
+        "  pavgb 4(%[s2]), %%mm0\n"
+        "  movq %%mm0, 4(%[d])\n"
+        :
+        : [d] "r" (d), [s1] "r" (s1), [s2] "r" (s2));
+
+    s1 += ss1;
+    s2 += ss2;
+    d += ds1;
+  }
+  asm volatile ("emms");
+}
+OIL_DEFINE_IMPL_FULL (avg2_12xn_u8_mmx, avg2_12xn_u8, OIL_IMPL_FLAG_MMX);
+
+void
+avg2_16xn_u8_mmx (uint8_t *d, int ds1, uint8_t *s1, int ss1,
+    uint8_t *s2, int ss2, int n)
+{
+  int j;
+  for(j=0;j<n;j++){
+    asm volatile ("\n"
+        "  movq 0(%[s1]), %%mm0\n"
+        "  pavgb 0(%[s2]), %%mm0\n"
+        "  movq %%mm0, 0(%[d])\n"
+        "  movq 8(%[s1]), %%mm0\n"
+        "  pavgb 8(%[s2]), %%mm0\n"
+        "  movq %%mm0, 8(%[d])\n"
+        :
+        : [d] "r" (d), [s1] "r" (s1), [s2] "r" (s2));
+
+    s1 += ss1;
+    s2 += ss2;
+    d += ds1;
+  }
+  asm volatile ("emms");
+}
+OIL_DEFINE_IMPL_FULL (avg2_16xn_u8_mmx, avg2_16xn_u8, OIL_IMPL_FLAG_MMX);
+
diff --git a/liboil/liboilclasses.h b/liboil/liboilclasses.h
index d7a6d25..945a318 100644
--- a/liboil/liboilclasses.h
+++ b/liboil/liboilclasses.h
@@ -52,6 +52,9 @@ OIL_DECLARE_CLASS(addc_rshift_s16);
 OIL_DECLARE_CLASS(addc_s16);
 OIL_DECLARE_CLASS(argb_paint_u8);
 OIL_DECLARE_CLASS(average2_u8);
+OIL_DECLARE_CLASS(avg2_12xn_u8);
+OIL_DECLARE_CLASS(avg2_16xn_u8);
+OIL_DECLARE_CLASS(avg2_8xn_u8);
 OIL_DECLARE_CLASS(ayuv2argb_u8);
 OIL_DECLARE_CLASS(ayuv2uyvy);
 OIL_DECLARE_CLASS(ayuv2yuyv);
diff --git a/liboil/liboilfuncs-04.h b/liboil/liboilfuncs-04.h
index effe13a..7b35de1 100644
--- a/liboil/liboilfuncs-04.h
+++ b/liboil/liboilfuncs-04.h
@@ -52,6 +52,9 @@ void oil_addc_rshift_s16 (int16_t * d1, const int16_t * s1, const int16_t * s2_2
 void oil_addc_s16 (int16_t * d1, const int16_t * s1, const int16_t * s2_1, int n);
 void oil_argb_paint_u8 (uint8_t * i_4xn, const uint8_t * s1_4, const uint8_t * s2_n, int n);
 void oil_average2_u8 (uint8_t * d, int dstr, const uint8_t * s1, int sstr1, const uint8_t * s2, int sstr2, int n);
+void oil_avg2_12xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+void oil_avg2_16xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+void oil_avg2_8xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
 void oil_ayuv2argb_u8 (uint8_t * d_4xn, const uint8_t * s_4xn, int n);
 void oil_ayuv2uyvy (uint32_t * d_n, const uint32_t * s_n, int n);
 void oil_ayuv2yuyv (uint32_t * d_n, const uint32_t * s_n, int n);
diff --git a/liboil/liboilfuncs-doc.h b/liboil/liboilfuncs-doc.h
index 7239a32..7237cdb 100644
--- a/liboil/liboilfuncs-doc.h
+++ b/liboil/liboilfuncs-doc.h
@@ -16,6 +16,9 @@ void oil_addc_rshift_s16 (int16_t * d1, const int16_t * s1, const int16_t * s2_2
 void oil_addc_s16 (int16_t * d1, const int16_t * s1, const int16_t * s2_1, int n);
 void oil_argb_paint_u8 (uint8_t * i_4xn, const uint8_t * s1_4, const uint8_t * s2_n, int n);
 void oil_average2_u8 (uint8_t * d, int dstr, const uint8_t * s1, int sstr1, const uint8_t * s2, int sstr2, int n);
+void oil_avg2_12xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+void oil_avg2_16xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+void oil_avg2_8xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
 void oil_ayuv2argb_u8 (uint8_t * d_4xn, const uint8_t * s_4xn, int n);
 void oil_ayuv2uyvy (uint32_t * d_n, const uint32_t * s_n, int n);
 void oil_ayuv2yuyv (uint32_t * d_n, const uint32_t * s_n, int n);
diff --git a/liboil/liboilfuncs.h b/liboil/liboilfuncs.h
index e5335e0..9536ec4 100644
--- a/liboil/liboilfuncs.h
+++ b/liboil/liboilfuncs.h
@@ -84,6 +84,15 @@ typedef void (*_oil_type_argb_paint_u8)(uint8_t * i_4xn, const uint8_t * s1_4, c
 extern OilFunctionClass *oil_function_class_ptr_average2_u8;
 typedef void (*_oil_type_average2_u8)(uint8_t * d, int dstr, const uint8_t * s1, int sstr1, const uint8_t * s2, int sstr2, int n);
 #define oil_average2_u8 ((_oil_type_average2_u8)(*(void **)oil_function_class_ptr_average2_u8))
+extern OilFunctionClass *oil_function_class_ptr_avg2_12xn_u8;
+typedef void (*_oil_type_avg2_12xn_u8)(uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+#define oil_avg2_12xn_u8 ((_oil_type_avg2_12xn_u8)(*(void **)oil_function_class_ptr_avg2_12xn_u8))
+extern OilFunctionClass *oil_function_class_ptr_avg2_16xn_u8;
+typedef void (*_oil_type_avg2_16xn_u8)(uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+#define oil_avg2_16xn_u8 ((_oil_type_avg2_16xn_u8)(*(void **)oil_function_class_ptr_avg2_16xn_u8))
+extern OilFunctionClass *oil_function_class_ptr_avg2_8xn_u8;
+typedef void (*_oil_type_avg2_8xn_u8)(uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n);
+#define oil_avg2_8xn_u8 ((_oil_type_avg2_8xn_u8)(*(void **)oil_function_class_ptr_avg2_8xn_u8))
 extern OilFunctionClass *oil_function_class_ptr_ayuv2argb_u8;
 typedef void (*_oil_type_ayuv2argb_u8)(uint8_t * d_4xn, const uint8_t * s_4xn, int n);
 #define oil_ayuv2argb_u8 ((_oil_type_ayuv2argb_u8)(*(void **)oil_function_class_ptr_ayuv2argb_u8))
diff --git a/liboil/liboiltrampolines.c b/liboil/liboiltrampolines.c
index 72b09dd..bc1b8bf 100644
--- a/liboil/liboiltrampolines.c
+++ b/liboil/liboiltrampolines.c
@@ -191,6 +191,36 @@ oil_average2_u8 (uint8_t * d, int dstr, const uint8_t * s1, int sstr1, const uin
   ((void (*)(uint8_t * d, int dstr, const uint8_t * s1, int sstr1, const uint8_t * s2, int sstr2, int n))(_oil_function_class_average2_u8.func))(d, dstr, s1, sstr1, s2, sstr2, n);
 }
 
+#undef oil_avg2_12xn_u8
+void
+oil_avg2_12xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n)
+{
+  if (_oil_function_class_avg2_12xn_u8.func == NULL) {
+    oil_class_optimize (&_oil_function_class_avg2_12xn_u8);
+  }
+  ((void (*)(uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n))(_oil_function_class_avg2_12xn_u8.func))(d_8xn, ds1, s1_8xn, ss1, s2_8xn, ss2, n);
+}
+
+#undef oil_avg2_16xn_u8
+void
+oil_avg2_16xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n)
+{
+  if (_oil_function_class_avg2_16xn_u8.func == NULL) {
+    oil_class_optimize (&_oil_function_class_avg2_16xn_u8);
+  }
+  ((void (*)(uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n))(_oil_function_class_avg2_16xn_u8.func))(d_8xn, ds1, s1_8xn, ss1, s2_8xn, ss2, n);
+}
+
+#undef oil_avg2_8xn_u8
+void
+oil_avg2_8xn_u8 (uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n)
+{
+  if (_oil_function_class_avg2_8xn_u8.func == NULL) {
+    oil_class_optimize (&_oil_function_class_avg2_8xn_u8);
+  }
+  ((void (*)(uint8_t * d_8xn, int ds1, const uint8_t * s1_8xn, int ss1, const uint8_t * s2_8xn, int ss2, int n))(_oil_function_class_avg2_8xn_u8.func))(d_8xn, ds1, s1_8xn, ss1, s2_8xn, ss2, n);
+}
+
 #undef oil_ayuv2argb_u8
 void
 oil_ayuv2argb_u8 (uint8_t * d_4xn, const uint8_t * s_4xn, int n)
diff --git a/liboil/ref/wavelet.c b/liboil/ref/wavelet.c
index f50772f..77f5e54 100644
--- a/liboil/ref/wavelet.c
+++ b/liboil/ref/wavelet.c
@@ -153,6 +153,12 @@ OIL_DEFINE_CLASS_FULL (add2_rshift_add_s16, "int16_t *d, int16_t *s1, "
     "int16_t *s2, int16_t *s3, int16_t *s4_2, int n", add2_test);
 OIL_DEFINE_CLASS_FULL (add2_rshift_sub_s16, "int16_t *d, int16_t *s1, "
     "int16_t *s2, int16_t *s3, int16_t *s4_2, int n", add2_test);
+OIL_DEFINE_CLASS (avg2_8xn_u8, "uint8_t *d_8xn, int ds1, "
+    "uint8_t *s1_8xn, int ss1, uint8_t *s2_8xn, int ss2, int n");
+OIL_DEFINE_CLASS (avg2_12xn_u8, "uint8_t *d_12xn, int ds1, "
+    "uint8_t *s1_12xn, int ss1, uint8_t *s2_12xn, int ss2, int n");
+OIL_DEFINE_CLASS (avg2_16xn_u8, "uint8_t *d_16xn, int ds1, "
+    "uint8_t *s1_16xn, int ss1, uint8_t *s2_16xn, int ss2, int n");
 
 void
 deinterleave_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
@@ -872,3 +878,54 @@ add2_rshift_sub_s16_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3,
 }
 OIL_DEFINE_IMPL_REF (add2_rshift_sub_s16_ref, add2_rshift_sub_s16);
 
+void
+avg2_8xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
+    uint8_t *s2, int ss2, int n)
+{
+  int i;
+  int j;
+  for(j=0;j<n;j++){
+    for(i=0;i<8;i++){
+      d[i] = (s1[i] + s2[i] + 1)>>1;
+    }
+    s1 += ss1;
+    s2 += ss2;
+    d += ds1;
+  }
+}
+OIL_DEFINE_IMPL_REF (avg2_8xn_u8_ref, avg2_8xn_u8);
+
+void
+avg2_12xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
+    uint8_t *s2, int ss2, int n)
+{
+  int i;
+  int j;
+  for(j=0;j<n;j++){
+    for(i=0;i<12;i++){
+      d[i] = (s1[i] + s2[i] + 1)>>1;
+    }
+    s1 += ss1;
+    s2 += ss2;
+    d += ds1;
+  }
+}
+OIL_DEFINE_IMPL_REF (avg2_12xn_u8_ref, avg2_12xn_u8);
+
+void
+avg2_16xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
+    uint8_t *s2, int ss2, int n)
+{
+  int i;
+  int j;
+  for(j=0;j<n;j++){
+    for(i=0;i<16;i++){
+      d[i] = (s1[i] + s2[i] + 1)>>1;
+    }
+    s1 += ss1;
+    s2 += ss2;
+    d += ds1;
+  }
+}
+OIL_DEFINE_IMPL_REF (avg2_16xn_u8_ref, avg2_16xn_u8);
+


More information about the Liboil-commit mailing list