@ -18,10 +18,205 @@
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include "libavcodec/hevcdec.h"
# include "libavcodec/bit_depth_template.c"
# include "libavcodec/mips/hevcdsp_mips.h"
# include "libavutil/mips/mmiutils.h"
# define PUT_HEVC_QPEL_HV(w, x_step, src_step, dst_step) \
void ff_hevc_put_hevc_qpel_hv # # w # # _8_mmi ( int16_t * dst , uint8_t * _src , \
ptrdiff_t _srcstride , \
int height , intptr_t mx , \
intptr_t my , int width ) \
{ \
int x , y ; \
const int8_t * filter ; \
pixel * src = ( pixel * ) _src ; \
ptrdiff_t srcstride = _srcstride / sizeof ( pixel ) ; \
int16_t tmp_array [ ( MAX_PB_SIZE + QPEL_EXTRA ) * MAX_PB_SIZE ] ; \
int16_t * tmp = tmp_array ; \
uint64_t ftmp [ 15 ] ; \
uint64_t rtmp [ 1 ] ; \
\
src - = ( QPEL_EXTRA_BEFORE * srcstride + 3 ) ; \
filter = ff_hevc_qpel_filters [ mx - 1 ] ; \
x = x_step ; \
y = height + QPEL_EXTRA ; \
__asm__ volatile ( \
MMI_LDC1 ( % [ ftmp1 ] , % [ filter ] , 0x00 ) \
" li %[rtmp0], 0x08 \n \t " \
" dmtc1 %[rtmp0], %[ftmp0] \n \t " \
" punpckhbh %[ftmp2], %[ftmp0], %[ftmp1] \n \t " \
" punpcklbh %[ftmp1], %[ftmp0], %[ftmp1] \n \t " \
" psrah %[ftmp1], %[ftmp1], %[ftmp0] \n \t " \
" psrah %[ftmp2], %[ftmp2], %[ftmp0] \n \t " \
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t " \
\
" 1: \n \t " \
" 2: \n \t " \
" gsldlc1 %[ftmp3], 0x07(%[src]) \n \t " \
" gsldrc1 %[ftmp3], 0x00(%[src]) \n \t " \
" gsldlc1 %[ftmp4], 0x08(%[src]) \n \t " \
" gsldrc1 %[ftmp4], 0x01(%[src]) \n \t " \
" gsldlc1 %[ftmp5], 0x09(%[src]) \n \t " \
" gsldrc1 %[ftmp5], 0x02(%[src]) \n \t " \
" gsldlc1 %[ftmp6], 0x0a(%[src]) \n \t " \
" gsldrc1 %[ftmp6], 0x03(%[src]) \n \t " \
" punpcklbh %[ftmp7], %[ftmp3], %[ftmp0] \n \t " \
" punpckhbh %[ftmp8], %[ftmp3], %[ftmp0] \n \t " \
" pmullh %[ftmp7], %[ftmp7], %[ftmp1] \n \t " \
" pmullh %[ftmp8], %[ftmp8], %[ftmp2] \n \t " \
" paddh %[ftmp3], %[ftmp7], %[ftmp8] \n \t " \
" punpcklbh %[ftmp7], %[ftmp4], %[ftmp0] \n \t " \
" punpckhbh %[ftmp8], %[ftmp4], %[ftmp0] \n \t " \
" pmullh %[ftmp7], %[ftmp7], %[ftmp1] \n \t " \
" pmullh %[ftmp8], %[ftmp8], %[ftmp2] \n \t " \
" paddh %[ftmp4], %[ftmp7], %[ftmp8] \n \t " \
" punpcklbh %[ftmp7], %[ftmp5], %[ftmp0] \n \t " \
" punpckhbh %[ftmp8], %[ftmp5], %[ftmp0] \n \t " \
" pmullh %[ftmp7], %[ftmp7], %[ftmp1] \n \t " \
" pmullh %[ftmp8], %[ftmp8], %[ftmp2] \n \t " \
" paddh %[ftmp5], %[ftmp7], %[ftmp8] \n \t " \
" punpcklbh %[ftmp7], %[ftmp6], %[ftmp0] \n \t " \
" punpckhbh %[ftmp8], %[ftmp6], %[ftmp0] \n \t " \
" pmullh %[ftmp7], %[ftmp7], %[ftmp1] \n \t " \
" pmullh %[ftmp8], %[ftmp8], %[ftmp2] \n \t " \
" paddh %[ftmp6], %[ftmp7], %[ftmp8] \n \t " \
TRANSPOSE_4H ( % [ ftmp3 ] , % [ ftmp4 ] , % [ ftmp5 ] , % [ ftmp6 ] , \
% [ ftmp7 ] , % [ ftmp8 ] , % [ ftmp9 ] , % [ ftmp10 ] ) \
" paddh %[ftmp3], %[ftmp3], %[ftmp4] \n \t " \
" paddh %[ftmp5], %[ftmp5], %[ftmp6] \n \t " \
" paddh %[ftmp3], %[ftmp3], %[ftmp5] \n \t " \
" gssdlc1 %[ftmp3], 0x07(%[tmp]) \n \t " \
" gssdrc1 %[ftmp3], 0x00(%[tmp]) \n \t " \
\
" daddi %[x], %[x], -0x01 \n \t " \
PTR_ADDIU " %[src], %[src], 0x04 \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x08 \n \t " \
" bnez %[x], 2b \n \t " \
\
" daddi %[y], %[y], -0x01 \n \t " \
" li %[x], " # x_step " \n \t " \
PTR_ADDIU " %[src], %[src], " # src_step " \n \t " \
PTR_ADDIU " %[tmp], %[tmp], " # dst_step " \n \t " \
PTR_ADDU " %[src], %[src], %[stride] \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" bnez %[y], 1b \n \t " \
: [ ftmp0 ] " =&f " ( ftmp [ 0 ] ) , [ ftmp1 ] " =&f " ( ftmp [ 1 ] ) , \
[ ftmp2 ] " =&f " ( ftmp [ 2 ] ) , [ ftmp3 ] " =&f " ( ftmp [ 3 ] ) , \
[ ftmp4 ] " =&f " ( ftmp [ 4 ] ) , [ ftmp5 ] " =&f " ( ftmp [ 5 ] ) , \
[ ftmp6 ] " =&f " ( ftmp [ 6 ] ) , [ ftmp7 ] " =&f " ( ftmp [ 7 ] ) , \
[ ftmp8 ] " =&f " ( ftmp [ 8 ] ) , [ ftmp9 ] " =&f " ( ftmp [ 9 ] ) , \
[ ftmp10 ] " =&f " ( ftmp [ 10 ] ) , [ rtmp0 ] " =&r " ( rtmp [ 0 ] ) , \
[ src ] " +&r " ( src ) , [ tmp ] " +&r " ( tmp ) , [ y ] " +&r " ( y ) , \
[ x ] " +&r " ( x ) \
: [ filter ] " r " ( filter ) , [ stride ] " r " ( srcstride ) \
: " memory " \
) ; \
\
tmp = tmp_array + QPEL_EXTRA_BEFORE * 4 - 12 ; \
filter = ff_hevc_qpel_filters [ my - 1 ] ; \
x = x_step ; \
y = height ; \
__asm__ volatile ( \
MMI_LDC1 ( % [ ftmp1 ] , % [ filter ] , 0x00 ) \
" li %[rtmp0], 0x08 \n \t " \
" dmtc1 %[rtmp0], %[ftmp0] \n \t " \
" punpckhbh %[ftmp2], %[ftmp0], %[ftmp1] \n \t " \
" punpcklbh %[ftmp1], %[ftmp0], %[ftmp1] \n \t " \
" psrah %[ftmp1], %[ftmp1], %[ftmp0] \n \t " \
" psrah %[ftmp2], %[ftmp2], %[ftmp0] \n \t " \
" li %[rtmp0], 0x06 \n \t " \
" dmtc1 %[rtmp0], %[ftmp0] \n \t " \
\
" 1: \n \t " \
" 2: \n \t " \
" gsldlc1 %[ftmp3], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp3], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp4], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp4], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp5], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp5], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp6], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp6], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp7], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp7], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp8], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp8], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp9], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp9], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" gsldlc1 %[ftmp10], 0x07(%[tmp]) \n \t " \
" gsldrc1 %[ftmp10], 0x00(%[tmp]) \n \t " \
PTR_ADDIU " %[tmp], %[tmp], -0x380 \n \t " \
TRANSPOSE_4H ( % [ ftmp3 ] , % [ ftmp4 ] , % [ ftmp5 ] , % [ ftmp6 ] , \
% [ ftmp11 ] , % [ ftmp12 ] , % [ ftmp13 ] , % [ ftmp14 ] ) \
TRANSPOSE_4H ( % [ ftmp7 ] , % [ ftmp8 ] , % [ ftmp9 ] , % [ ftmp10 ] , \
% [ ftmp11 ] , % [ ftmp12 ] , % [ ftmp13 ] , % [ ftmp14 ] ) \
" pmaddhw %[ftmp11], %[ftmp3], %[ftmp1] \n \t " \
" pmaddhw %[ftmp12], %[ftmp7], %[ftmp2] \n \t " \
" pmaddhw %[ftmp13], %[ftmp4], %[ftmp1] \n \t " \
" pmaddhw %[ftmp14], %[ftmp8], %[ftmp2] \n \t " \
" paddw %[ftmp11], %[ftmp11], %[ftmp12] \n \t " \
" paddw %[ftmp13], %[ftmp13], %[ftmp14] \n \t " \
TRANSPOSE_2W ( % [ ftmp11 ] , % [ ftmp13 ] , % [ ftmp3 ] , % [ ftmp4 ] ) \
" paddw %[ftmp3], %[ftmp3], %[ftmp4] \n \t " \
" psraw %[ftmp3], %[ftmp3], %[ftmp0] \n \t " \
" pmaddhw %[ftmp11], %[ftmp5], %[ftmp1] \n \t " \
" pmaddhw %[ftmp12], %[ftmp9], %[ftmp2] \n \t " \
" pmaddhw %[ftmp13], %[ftmp6], %[ftmp1] \n \t " \
" pmaddhw %[ftmp14], %[ftmp10], %[ftmp2] \n \t " \
" paddw %[ftmp11], %[ftmp11], %[ftmp12] \n \t " \
" paddw %[ftmp13], %[ftmp13], %[ftmp14] \n \t " \
TRANSPOSE_2W ( % [ ftmp11 ] , % [ ftmp13 ] , % [ ftmp5 ] , % [ ftmp6 ] ) \
" paddw %[ftmp5], %[ftmp5], %[ftmp6] \n \t " \
" psraw %[ftmp5], %[ftmp5], %[ftmp0] \n \t " \
" packsswh %[ftmp3], %[ftmp3], %[ftmp5] \n \t " \
" gssdlc1 %[ftmp3], 0x07(%[dst]) \n \t " \
" gssdrc1 %[ftmp3], 0x00(%[dst]) \n \t " \
\
" daddi %[x], %[x], -0x01 \n \t " \
PTR_ADDIU " %[dst], %[dst], 0x08 \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x08 \n \t " \
" bnez %[x], 2b \n \t " \
\
" daddi %[y], %[y], -0x01 \n \t " \
" li %[x], " # x_step " \n \t " \
PTR_ADDIU " %[dst], %[dst], " # dst_step " \n \t " \
PTR_ADDIU " %[tmp], %[tmp], " # dst_step " \n \t " \
PTR_ADDIU " %[dst], %[dst], 0x80 \n \t " \
PTR_ADDIU " %[tmp], %[tmp], 0x80 \n \t " \
" bnez %[y], 1b \n \t " \
: [ ftmp0 ] " =&f " ( ftmp [ 0 ] ) , [ ftmp1 ] " =&f " ( ftmp [ 1 ] ) , \
[ ftmp2 ] " =&f " ( ftmp [ 2 ] ) , [ ftmp3 ] " =&f " ( ftmp [ 3 ] ) , \
[ ftmp4 ] " =&f " ( ftmp [ 4 ] ) , [ ftmp5 ] " =&f " ( ftmp [ 5 ] ) , \
[ ftmp6 ] " =&f " ( ftmp [ 6 ] ) , [ ftmp7 ] " =&f " ( ftmp [ 7 ] ) , \
[ ftmp8 ] " =&f " ( ftmp [ 8 ] ) , [ ftmp9 ] " =&f " ( ftmp [ 9 ] ) , \
[ ftmp10 ] " =&f " ( ftmp [ 10 ] ) , [ ftmp11 ] " =&f " ( ftmp [ 11 ] ) , \
[ ftmp12 ] " =&f " ( ftmp [ 12 ] ) , [ ftmp13 ] " =&f " ( ftmp [ 13 ] ) , \
[ ftmp14 ] " =&f " ( ftmp [ 14 ] ) , [ rtmp0 ] " =&r " ( rtmp [ 0 ] ) , \
[ dst ] " +&r " ( dst ) , [ tmp ] " +&r " ( tmp ) , [ y ] " +&r " ( y ) , \
[ x ] " +&r " ( x ) \
: [ filter ] " r " ( filter ) , [ stride ] " r " ( srcstride ) \
: " memory " \
) ; \
}
PUT_HEVC_QPEL_HV ( 4 , 1 , - 4 , - 8 ) ;
PUT_HEVC_QPEL_HV ( 8 , 2 , - 8 , - 16 ) ;
PUT_HEVC_QPEL_HV ( 12 , 3 , - 12 , - 24 ) ;
PUT_HEVC_QPEL_HV ( 16 , 4 , - 16 , - 32 ) ;
PUT_HEVC_QPEL_HV ( 24 , 6 , - 24 , - 48 ) ;
PUT_HEVC_QPEL_HV ( 32 , 8 , - 32 , - 64 ) ;
PUT_HEVC_QPEL_HV ( 48 , 12 , - 48 , - 96 ) ;
PUT_HEVC_QPEL_HV ( 64 , 16 , - 64 , - 128 ) ;
# define PUT_HEVC_PEL_BI_PIXELS(w, x_step, src_step, dst_step, src2_step) \
void ff_hevc_put_hevc_pel_bi_pixels # # w # # _8_mmi ( uint8_t * _dst , \
ptrdiff_t _dststride , \