[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