@ -29,326 +29,322 @@
void ff_put_h264_chroma_mc8_mmi ( uint8_t * dst , uint8_t * src , ptrdiff_t stride ,
int h , int x , int y )
{
const int A = ( 8 - x ) * ( 8 - y ) ;
const int B = x * ( 8 - y ) ;
const int C = ( 8 - x ) * y ;
const int D = x * y ;
const int E = B + C ;
int A = 64 , B , C , D , E ;
double ftmp [ 10 ] ;
uint64_t tmp [ 1 ] ;
mips_reg addr [ 1 ] ;
DECLARE_VAR_ALL64 ;
if ( D ) {
if ( ! ( x | | y ) ) {
/* x=0, y=0, A=64 */
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[B], %[B], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp9] \n \t "
" pshufh %[C], %[C], %[ftmp0] \n \t "
" pshufh %[D], %[D], %[ftmp0] \n \t "
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" mtc1 %[tmp0], %[ftmp4] \n \t "
" 1: \n \t "
PTR_ADDU " %[addr0], %[src], %[stride] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
MMI_ULDC1 ( % [ ftmp3 ] , % [ addr0 ] , 0x00 )
MMI_ULDC1 ( % [ ftmp4 ] , % [ addr0 ] , 0x01 )
" punpcklbh %[ftmp5], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[A] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[B] \n \t "
" paddh %[ftmp1], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[A] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[B] \n \t "
" paddh %[ftmp2], %[ftmp6], %[ftmp8] \n \t "
" punpcklbh %[ftmp5], %[ftmp3], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp3], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp4], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp4], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[C] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[D] \n \t "
" paddh %[ftmp3], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[C] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[D] \n \t "
" paddh %[ftmp4], %[ftmp6], %[ftmp8] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ftmp3] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp9] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp9] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
" addi %[h], %[h], -0x01 \n \t "
" addi %[h], %[h], -0x04 \n \t "
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp5 ] , % [ src ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp6 ] , % [ src ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp7 ] , % [ src ] , 0x00 )
" punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" psllh %[ftmp1], %[ftmp2], %[ftmp4] \n \t "
" psllh %[ftmp2], %[ftmp3], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp4] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
RESTRICT_ASM_ALL64
[ addr0 ] " =&r " ( addr [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ B ] " f " ( B ) ,
[ C ] " f " ( C ) , [ D ] " f " ( D )
: " memory "
) ;
} else if ( E ) {
const int step = C ? stride : 1 ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[E], %[E], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp7] \n \t "
" 1: \n \t "
PTR_ADDU " %[addr0], %[src], %[step] \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ addr0 ] , 0x00 )
" punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp3], %[ftmp3], %[A] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[E] \n \t "
" paddh %[ftmp1], %[ftmp3], %[ftmp5] \n \t "
" pmullh %[ftmp4], %[ftmp4], %[A] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[E] \n \t "
" paddh %[ftmp2], %[ftmp4], %[ftmp6] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp7] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp7] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
" addi %[h], %[h], -0x01 \n \t "
" punpcklbh %[ftmp2], %[ftmp5], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp5], %[ftmp0] \n \t "
" psllh %[ftmp1], %[ftmp2], %[ftmp4] \n \t "
" psllh %[ftmp2], %[ftmp3], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp4] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
RESTRICT_ASM_ALL64
[ addr0 ] " =&r " ( addr [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ step ] " r " ( ( mips_reg ) step ) ,
[ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ E ] " f " ( E )
: " memory "
) ;
} else {
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp4] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
" punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" pmullh %[ftmp1], %[ftmp2], %[A] \n \t "
" pmullh %[ftmp2], %[ftmp3], %[A] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp4] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
PTR_ADDU " %[src], %[src], %[stride] \n \t "
" punpcklbh %[ftmp2], %[ftmp6], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp6], %[ftmp0] \n \t "
" psllh %[ftmp1], %[ftmp2], %[ftmp4] \n \t "
" psllh %[ftmp2], %[ftmp3], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp4] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
" punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" pmullh %[ftmp1], %[ftmp2], %[A] \n \t "
" pmullh %[ftmp2], %[ftmp3], %[A] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp4] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
" addi %[h], %[h], -0x02 \n \t "
" punpcklbh %[ftmp2], %[ftmp7], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp7], %[ftmp0] \n \t "
" psllh %[ftmp1], %[ftmp2], %[ftmp4] \n \t "
" psllh %[ftmp2], %[ftmp3], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp4] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 1b \n \t "
PTR_ADDU " %[src], %[src], %[stride] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 1b \n \t "
: [ ftmp0 ] " =&f " ( ftmp [ 0 ] ) , [ ftmp1 ] " =&f " ( ftmp [ 1 ] ) ,
[ ftmp2 ] " =&f " ( ftmp [ 2 ] ) , [ ftmp3 ] " =&f " ( ftmp [ 3 ] ) ,
[ ftmp4 ] " =&f " ( ftmp [ 4 ] ) ,
[ ftmp4 ] " =&f " ( ftmp [ 4 ] ) , [ ftmp5 ] " =&f " ( ftmp [ 5 ] ) ,
[ ftmp6 ] " =&f " ( ftmp [ 6 ] ) , [ ftmp7 ] " =&f " ( ftmp [ 7 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
RESTRICT_ASM_ALL64
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 )
: " memory "
) ;
} else {
if ( x & & y ) {
/* x!=0, y!=0 */
D = x * y ;
B = ( x < < 3 ) - D ;
C = ( y < < 3 ) - D ;
A = 64 - D - B - C ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[B], %[B], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp9] \n \t "
" pshufh %[C], %[C], %[ftmp0] \n \t "
" pshufh %[D], %[D], %[ftmp0] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp3 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp4 ] , % [ src ] , 0x01 )
" addi %[h], %[h], -0x02 \n \t "
" punpcklbh %[ftmp5], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[A] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[B] \n \t "
" paddh %[ftmp1], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[A] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[B] \n \t "
" paddh %[ftmp2], %[ftmp6], %[ftmp8] \n \t "
" punpcklbh %[ftmp5], %[ftmp3], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp3], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp4], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp4], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[C] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[D] \n \t "
" paddh %[ftmp3], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[C] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[D] \n \t "
" paddh %[ftmp4], %[ftmp6], %[ftmp8] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ftmp3] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp9] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp9] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp3 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp4 ] , % [ src ] , 0x01 )
" punpcklbh %[ftmp5], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[A] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[B] \n \t "
" paddh %[ftmp1], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[A] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[B] \n \t "
" paddh %[ftmp2], %[ftmp6], %[ftmp8] \n \t "
" punpcklbh %[ftmp5], %[ftmp3], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp3], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp4], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp4], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[C] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[D] \n \t "
" paddh %[ftmp3], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[C] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[D] \n \t "
" paddh %[ftmp4], %[ftmp6], %[ftmp8] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ftmp3] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp9] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp9] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ B ] " f " ( B ) ,
[ C ] " f " ( C ) , [ D ] " f " ( D )
: " memory "
) ;
} else {
if ( x ) {
/* x!=0, y==0 */
E = x < < 3 ;
A = 64 - E ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[E], %[E], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp7] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
" addi %[h], %[h], -0x01 \n \t "
PTR_ADDU " %[src], %[src], %[stride] \n \t "
" punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp3], %[ftmp3], %[A] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[E] \n \t "
" paddh %[ftmp1], %[ftmp3], %[ftmp5] \n \t "
" pmullh %[ftmp4], %[ftmp4], %[A] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[E] \n \t "
" paddh %[ftmp2], %[ftmp4], %[ftmp6] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp7] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp7] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) ,
[ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ E ] " f " ( E )
: " memory "
) ;
} else {
/* x==0, y!=0 */
E = y < < 3 ;
A = 64 - E ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[E], %[E], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp7] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x00 )
" addi %[h], %[h], -0x01 \n \t "
" punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp3], %[ftmp3], %[A] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[E] \n \t "
" paddh %[ftmp1], %[ftmp3], %[ftmp5] \n \t "
" pmullh %[ftmp4], %[ftmp4], %[A] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[E] \n \t "
" paddh %[ftmp2], %[ftmp4], %[ftmp6] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp7] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp7] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) ,
[ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ E ] " f " ( E )
: " memory "
) ;
}
}
}
}
void ff_avg_h264_chroma_mc8_mmi ( uint8_t * dst , uint8_t * src , ptrdiff_t stride ,
int h , int x , int y )
{
const int A = ( 8 - x ) * ( 8 - y ) ;
const int B = x * ( 8 - y ) ;
const int C = ( 8 - x ) * y ;
const int D = x * y ;
const int E = B + C ;
int A = 64 , B , C , D , E ;
double ftmp [ 10 ] ;
uint64_t tmp [ 1 ] ;
mips_reg addr [ 1 ] ;
DECLARE_VAR_ALL64 ;
if ( D ) {
if ( ! ( x | | y ) ) {
/* x=0, y=0, A=64 */
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[B], %[B], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp9] \n \t "
" pshufh %[C], %[C], %[ftmp0] \n \t "
" pshufh %[D], %[D], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp4] \n \t "
" 1: \n \t "
PTR_ADDU " %[addr0], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
MMI_ULDC1 ( % [ ftmp3 ] , % [ addr0 ] , 0x00 )
MMI_ULDC1 ( % [ ftmp4 ] , % [ addr0 ] , 0x01 )
" punpcklbh %[ftmp5], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[A] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[B] \n \t "
" paddh %[ftmp1], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[A] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[B] \n \t "
" paddh %[ftmp2], %[ftmp6], %[ftmp8] \n \t "
" punpcklbh %[ftmp5], %[ftmp3], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp3], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp4], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp4], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[C] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[D] \n \t "
" paddh %[ftmp3], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[C] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[D] \n \t "
" paddh %[ftmp4], %[ftmp6], %[ftmp8] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ftmp3] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp9] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp9] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
" addi %[h], %[h], -0x01 \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
PTR_ADDU " %[src], %[src], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
RESTRICT_ASM_ALL64
[ addr0 ] " =&r " ( addr [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ B ] " f " ( B ) ,
[ C ] " f " ( C ) , [ D ] " f " ( D )
: " memory "
) ;
} else if ( E ) {
const int step = C ? stride : 1 ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[E], %[E], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp7] \n \t "
" 1: \n \t "
PTR_ADDU " %[addr0], %[src], %[step] \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ addr0 ] , 0x00 )
" punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp3], %[ftmp3], %[A] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[E] \n \t "
" paddh %[ftmp1], %[ftmp3], %[ftmp5] \n \t "
" pmullh %[ftmp4], %[ftmp4], %[A] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[E] \n \t "
" paddh %[ftmp2], %[ftmp4], %[ftmp6] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp7] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp7] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
" addi %[h], %[h], -0x01 \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
MMI_ULDC1 ( % [ ftmp5 ] , % [ src ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
RESTRICT_ASM_ALL64
[ addr0 ] " =&r " ( addr [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ step ] " r " ( ( mips_reg ) step ) ,
[ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ E ] " f " ( E )
: " memory "
) ;
} else {
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp4] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
" punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" pmullh %[ftmp1], %[ftmp2], %[A] \n \t "
@ -360,13 +356,11 @@ void ff_avg_h264_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
" punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp2], %[ftmp5], %[ftmp0] \n \t "
" punpckhbh %[ftmp3], %[ftmp5], %[ftmp0] \n \t "
" pmullh %[ftmp1], %[ftmp2], %[A] \n \t "
" pmullh %[ftmp2], %[ftmp3], %[A] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
@ -376,23 +370,195 @@ void ff_avg_h264_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, ptrdiff_t stride,
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
" addi %[h], %[h], -0x02 \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" addi %[h], %[h], -0x02 \n \t "
" bnez %[h], 1b \n \t "
: [ ftmp0 ] " =&f " ( ftmp [ 0 ] ) , [ ftmp1 ] " =&f " ( ftmp [ 1 ] ) ,
[ ftmp2 ] " =&f " ( ftmp [ 2 ] ) , [ ftmp3 ] " =&f " ( ftmp [ 3 ] ) ,
[ ftmp4 ] " =&f " ( ftmp [ 4 ] ) ,
[ ftmp4 ] " =&f " ( ftmp [ 4 ] ) , [ ftmp5 ] " =&f " ( ftmp [ 5 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
RESTRICT_ASM_ALL64
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A )
: " memory "
) ;
} else {
if ( x & & y ) {
/* x!=0, y!=0 */
D = x * y ;
B = ( x < < 3 ) - D ;
C = ( y < < 3 ) - D ;
A = 64 - D - B - C ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[B], %[B], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp9] \n \t "
" pshufh %[C], %[C], %[ftmp0] \n \t "
" pshufh %[D], %[D], %[ftmp0] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp3 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp4 ] , % [ src ] , 0x01 )
" addi %[h], %[h], -0x01 \n \t "
" punpcklbh %[ftmp5], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[A] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[B] \n \t "
" paddh %[ftmp1], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[A] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[B] \n \t "
" paddh %[ftmp2], %[ftmp6], %[ftmp8] \n \t "
" punpcklbh %[ftmp5], %[ftmp3], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp3], %[ftmp0] \n \t "
" punpcklbh %[ftmp7], %[ftmp4], %[ftmp0] \n \t "
" punpckhbh %[ftmp8], %[ftmp4], %[ftmp0] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[C] \n \t "
" pmullh %[ftmp7], %[ftmp7], %[D] \n \t "
" paddh %[ftmp3], %[ftmp5], %[ftmp7] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[C] \n \t "
" pmullh %[ftmp8], %[ftmp8], %[D] \n \t "
" paddh %[ftmp4], %[ftmp6], %[ftmp8] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ftmp3] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ftmp4] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp9] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp9] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) , [ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ B ] " f " ( B ) ,
[ C ] " f " ( C ) , [ D ] " f " ( D )
: " memory "
) ;
} else {
if ( x ) {
/* x!=0, y==0 */
E = x < < 3 ;
A = 64 - E ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[E], %[E], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp7] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x01 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
" addi %[h], %[h], -0x01 \n \t "
" punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp3], %[ftmp3], %[A] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[E] \n \t "
" paddh %[ftmp1], %[ftmp3], %[ftmp5] \n \t "
" pmullh %[ftmp4], %[ftmp4], %[A] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[E] \n \t "
" paddh %[ftmp2], %[ftmp4], %[ftmp6] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp7] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp7] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) ,
[ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ E ] " f " ( E )
: " memory "
) ;
} else {
/* x==0, y!=0 */
E = y < < 3 ;
A = 64 - E ;
__asm__ volatile (
" xor %[ftmp0], %[ftmp0], %[ftmp0] \n \t "
" dli %[tmp0], 0x06 \n \t "
" pshufh %[A], %[A], %[ftmp0] \n \t "
" pshufh %[E], %[E], %[ftmp0] \n \t "
" mtc1 %[tmp0], %[ftmp7] \n \t "
" 1: \n \t "
MMI_ULDC1 ( % [ ftmp1 ] , % [ src ] , 0x00 )
PTR_ADDU " %[src], %[src], %[stride] \n \t "
MMI_ULDC1 ( % [ ftmp2 ] , % [ src ] , 0x00 )
" addi %[h], %[h], -0x01 \n \t "
" punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n \t "
" punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n \t "
" punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n \t "
" punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n \t "
" pmullh %[ftmp3], %[ftmp3], %[A] \n \t "
" pmullh %[ftmp5], %[ftmp5], %[E] \n \t "
" paddh %[ftmp1], %[ftmp3], %[ftmp5] \n \t "
" pmullh %[ftmp4], %[ftmp4], %[A] \n \t "
" pmullh %[ftmp6], %[ftmp6], %[E] \n \t "
" paddh %[ftmp2], %[ftmp4], %[ftmp6] \n \t "
" paddh %[ftmp1], %[ftmp1], %[ff_pw_32] \n \t "
" paddh %[ftmp2], %[ftmp2], %[ff_pw_32] \n \t "
" psrlh %[ftmp1], %[ftmp1], %[ftmp7] \n \t "
" psrlh %[ftmp2], %[ftmp2], %[ftmp7] \n \t "
" packushb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_LDC1 ( % [ ftmp2 ] , % [ dst ] , 0x00 )
" pavgb %[ftmp1], %[ftmp1], %[ftmp2] \n \t "
MMI_SDC1 ( % [ ftmp1 ] , % [ dst ] , 0x00 )
PTR_ADDU " %[dst], %[dst], %[stride] \n \t "
" bnez %[h], 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 ] ) ,
[ tmp0 ] " =&r " ( tmp [ 0 ] ) ,
[ dst ] " +&r " ( dst ) , [ src ] " +&r " ( src ) ,
[ h ] " +&r " ( h )
: [ stride ] " r " ( ( mips_reg ) stride ) ,
[ ff_pw_32 ] " f " ( ff_pw_32 ) ,
[ A ] " f " ( A ) , [ E ] " f " ( E )
: " memory "
) ;
}
}
}
}