00001 #include "../dsputil.h"
00002 #include "../mpegvideo.h"
00003 #include "../avcodec.h"
00004
00005 static void dct_unquantize_h263_intra_iwmmxt(MpegEncContext *s,
00006 DCTELEM *block, int n, int qscale)
00007 {
00008 int level, qmul, qadd;
00009 int nCoeffs;
00010 DCTELEM *block_orig = block;
00011
00012 assert(s->block_last_index[n]>=0);
00013
00014 qmul = qscale << 1;
00015
00016 if (!s->h263_aic) {
00017 if (n < 4)
00018 level = block[0] * s->y_dc_scale;
00019 else
00020 level = block[0] * s->c_dc_scale;
00021 qadd = (qscale - 1) | 1;
00022 }else{
00023 qadd = 0;
00024 level = block[0];
00025 }
00026 if(s->ac_pred)
00027 nCoeffs=63;
00028 else
00029 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
00030
00031 __asm__ __volatile__ (
00032
00033
00034
00035 "tbcsth wr6, %[qmul] \n\t"
00036
00037
00038
00039 "tbcsth wr5, %[qadd] \n\t"
00040 "wzero wr7 \n\t"
00041 "wzero wr4 \n\t"
00042 "wsubh wr7, wr5, wr7 \n\t"
00043 "1: \n\t"
00044 "wldrd wr2, [%[block]] \n\t"
00045 "wldrd wr3, [%[block], #8] \n\t"
00046 "wmulsl wr0, wr6, wr2 \n\t"
00047 "wmulsl wr1, wr6, wr3 \n\t"
00048
00049
00050 "wcmpgtsh wr2, wr4, wr2 \n\t"
00051 "wcmpgtsh wr3, wr4, wr2 \n\t"
00052 "wxor wr0, wr2, wr0 \n\t"
00053 "wxor wr1, wr3, wr1 \n\t"
00054 "waddh wr0, wr7, wr0 \n\t"
00055 "waddh wr1, wr7, wr1 \n\t"
00056 "wxor wr2, wr0, wr2 \n\t"
00057 "wxor wr3, wr1, wr3 \n\t"
00058 "wcmpeqh wr0, wr7, wr0 \n\t"
00059 "wcmpeqh wr1, wr7, wr1 \n\t"
00060 "wandn wr0, wr2, wr0 \n\t"
00061 "wandn wr1, wr3, wr1 \n\t"
00062 "wstrd wr0, [%[block]] \n\t"
00063 "wstrd wr1, [%[block], #8] \n\t"
00064 "add %[block], %[block], #16 \n\t"
00065 "subs %[i], %[i], #1 \n\t"
00066 "bne 1b \n\t"
00067 :[block]"+r"(block)
00068 :[i]"r"((nCoeffs + 8) / 8), [qmul]"r"(qmul), [qadd]"r"(qadd)
00069 :"memory");
00070
00071 block_orig[0] = level;
00072 }
00073
00074 #if 0
00075 static void dct_unquantize_h263_inter_iwmmxt(MpegEncContext *s,
00076 DCTELEM *block, int n, int qscale)
00077 {
00078 int nCoeffs;
00079
00080 assert(s->block_last_index[n]>=0);
00081
00082 if(s->ac_pred)
00083 nCoeffs=63;
00084 else
00085 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
00086
00087 ippiQuantInvInter_Compact_H263_16s_I(block, nCoeffs+1, qscale);
00088 }
00089 #endif
00090
00091 void MPV_common_init_iwmmxt(MpegEncContext *s)
00092 {
00093 if (!(mm_flags & MM_IWMMXT)) return;
00094
00095 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_iwmmxt;
00096 #if 0
00097 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_iwmmxt;
00098 #endif
00099 }