diff --git a/Android.mk b/Android.mk index 72f17564..8dd606f4 100644 --- a/Android.mk +++ b/Android.mk @@ -39,6 +39,7 @@ LOCAL_SRC_FILES := \ src/dsp/dec.c \ src/dsp/dec_clip_tables.c \ src/dsp/dec_mips32.c \ + src/dsp/dec_mips_dsp_r2.c \ src/dsp/dec_neon.$(NEON) \ src/dsp/dec_sse2.c \ src/dsp/enc.c \ diff --git a/Makefile.vc b/Makefile.vc index 8c73ef6c..e86ac791 100644 --- a/Makefile.vc +++ b/Makefile.vc @@ -178,6 +178,7 @@ DSP_DEC_OBJS = \ $(DIROBJ)\dsp\dec.obj \ $(DIROBJ)\dsp\dec_clip_tables.obj \ $(DIROBJ)\dsp\dec_mips32.obj \ + $(DIROBJ)\dsp\dec_mips_dsp_r2.obj \ $(DIROBJ)\dsp\dec_neon.obj \ $(DIROBJ)\dsp\dec_sse2.obj \ $(DIROBJ)\dsp\filters_mips_dsp_r2.obj \ diff --git a/makefile.unix b/makefile.unix index 771c2559..5cc38000 100644 --- a/makefile.unix +++ b/makefile.unix @@ -114,6 +114,7 @@ DSP_DEC_OBJS = \ src/dsp/dec.o \ src/dsp/dec_clip_tables.o \ src/dsp/dec_mips32.o \ + src/dsp/dec_mips_dsp_r2.o \ src/dsp/dec_neon.o \ src/dsp/dec_sse2.o \ src/dsp/filters_mips_dsp_r2.o \ diff --git a/src/dsp/Makefile.am b/src/dsp/Makefile.am index 651f923d..43b4632b 100644 --- a/src/dsp/Makefile.am +++ b/src/dsp/Makefile.am @@ -15,6 +15,7 @@ COMMON_SOURCES += cpu.c COMMON_SOURCES += dec.c COMMON_SOURCES += dec_clip_tables.c COMMON_SOURCES += dec_mips32.c +COMMON_SOURCES += dec_mips_dsp_r2.c COMMON_SOURCES += dec_neon.c COMMON_SOURCES += dsp.h COMMON_SOURCES += filters_mips_dsp_r2.c diff --git a/src/dsp/dec.c b/src/dsp/dec.c index 65a2a885..dabc0c25 100644 --- a/src/dsp/dec.c +++ b/src/dsp/dec.c @@ -687,6 +687,7 @@ VP8SimpleFilterFunc VP8SimpleHFilter16i; extern void VP8DspInitSSE2(void); extern void VP8DspInitNEON(void); extern void VP8DspInitMIPS32(void); +extern void VP8DspInitMIPSdspR2(void); void VP8DspInit(void) { VP8InitClipTables(); @@ -717,14 +718,21 @@ void VP8DspInit(void) { if (VP8GetCPUInfo(kSSE2)) { VP8DspInitSSE2(); } -#elif defined(WEBP_USE_NEON) +#endif +#if defined(WEBP_USE_NEON) if (VP8GetCPUInfo(kNEON)) { VP8DspInitNEON(); } -#elif defined(WEBP_USE_MIPS32) +#endif +#if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { VP8DspInitMIPS32(); } +#endif +#if defined(WEBP_USE_MIPS_DSP_R2) + if (VP8GetCPUInfo(kMIPSdspR2)) { + VP8DspInitMIPSdspR2(); + } #endif } } diff --git a/src/dsp/dec_mips_dsp_r2.c b/src/dsp/dec_mips_dsp_r2.c new file mode 100644 index 00000000..c6dd138a --- /dev/null +++ b/src/dsp/dec_mips_dsp_r2.c @@ -0,0 +1,83 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +// MIPS version of dsp functions +// +// Author(s): Djordje Pesut (djordje.pesut@imgtec.com) +// Jovan Zelincevic (jovan.zelincevic@imgtec.com) + +#include "./dsp.h" + +#if defined(WEBP_USE_MIPS_DSP_R2) + +static void TransformDC(const int16_t* in, uint8_t* dst) { + int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10; + + __asm__ volatile ( + "ulw %[temp1], 0(%[dst]) \n\t" + "ulw %[temp2], 32(%[dst]) \n\t" + "ulw %[temp3], 64(%[dst]) \n\t" + "ulw %[temp4], 96(%[dst]) \n\t" + "lh %[temp5], 0(%[in]) \n\t" + "addiu %[temp5], %[temp5], 4 \n\t" + "ins %[temp5], %[temp5], 16, 16 \n\t" + "shra.ph %[temp5], %[temp5], 3 \n\t" + "preceu.ph.qbr %[temp6], %[temp1] \n\t" + "preceu.ph.qbl %[temp7], %[temp1] \n\t" + "preceu.ph.qbr %[temp8], %[temp2] \n\t" + "preceu.ph.qbl %[temp9], %[temp2] \n\t" + "preceu.ph.qbr %[temp10], %[temp3] \n\t" + "preceu.ph.qbl %[temp1], %[temp3] \n\t" + "preceu.ph.qbr %[temp2], %[temp4] \n\t" + "preceu.ph.qbl %[temp3], %[temp4] \n\t" + "addq.ph %[temp6], %[temp6], %[temp5] \n\t" + "addq.ph %[temp7], %[temp7], %[temp5] \n\t" + "addq.ph %[temp8], %[temp8], %[temp5] \n\t" + "addq.ph %[temp9], %[temp9], %[temp5] \n\t" + "addq.ph %[temp10], %[temp10], %[temp5] \n\t" + "addq.ph %[temp1], %[temp1], %[temp5] \n\t" + "addq.ph %[temp2], %[temp2], %[temp5] \n\t" + "addq.ph %[temp3], %[temp3], %[temp5] \n\t" + "shll_s.ph %[temp6], %[temp6], 7 \n\t" + "shll_s.ph %[temp7], %[temp7], 7 \n\t" + "shll_s.ph %[temp8], %[temp8], 7 \n\t" + "shll_s.ph %[temp9], %[temp9], 7 \n\t" + "shll_s.ph %[temp10], %[temp10], 7 \n\t" + "shll_s.ph %[temp1], %[temp1], 7 \n\t" + "shll_s.ph %[temp2], %[temp2], 7 \n\t" + "shll_s.ph %[temp3], %[temp3], 7 \n\t" + "precrqu_s.qb.ph %[temp6], %[temp7], %[temp6] \n\t" + "precrqu_s.qb.ph %[temp8], %[temp9], %[temp8] \n\t" + "precrqu_s.qb.ph %[temp10], %[temp1], %[temp10] \n\t" + "precrqu_s.qb.ph %[temp2], %[temp3], %[temp2] \n\t" + "usw %[temp6], 0(%[dst]) \n\t" + "usw %[temp8], 32(%[dst]) \n\t" + "usw %[temp10], 64(%[dst]) \n\t" + "usw %[temp2], 96(%[dst]) \n\t" + : [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), + [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), + [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), + [temp10]"=&r"(temp10) + : [in]"r"(in), [dst]"r"(dst) + : "memory" + ); +} + +#endif // WEBP_USE_MIPS_DSP_R2 + +//------------------------------------------------------------------------------ +// Entry point + +extern void VP8DspInitMIPSdspR2(void); + +void VP8DspInitMIPSdspR2(void) { +#if defined(WEBP_USE_MIPS_DSP_R2) + VP8TransformDC = TransformDC; +#endif +}