pixel.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:65k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * pixel.c: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2008 x264 project
  5.  *
  6.  * Authors: Eric Petit <eric.petit@lapsus.org>
  7.  *          Guillaume Poirier <gpoirier@mplayerhq.hu>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifdef SYS_LINUX
  24. #include <altivec.h>
  25. #endif
  26. #include "common/common.h"
  27. #include "ppccommon.h"
  28. /***********************************************************************
  29.  * SAD routines
  30.  **********************************************************************/
  31. #define PIXEL_SAD_ALTIVEC( name, lx, ly, a, b )        
  32. static int name( uint8_t *pix1, int i_pix1,            
  33.                  uint8_t *pix2, int i_pix2 )           
  34. {                                                      
  35.     int y;                                             
  36.     DECLARE_ALIGNED_16( int sum );                     
  37.                                                        
  38.     LOAD_ZERO;                                         
  39.     PREP_LOAD;                                         
  40.     vec_u8_t  pix1v, pix2v;                            
  41.     vec_s32_t sumv = zero_s32v;                        
  42.     for( y = 0; y < ly; y++ )                          
  43.     {                                                  
  44.         VEC_LOAD( pix1, pix1v, lx, vec_u8_t );         
  45.         VEC_LOAD( pix2, pix2v, lx, vec_u8_t );         
  46.         sumv = (vec_s32_t) vec_sum4s(                  
  47.                    vec_sub( vec_max( pix1v, pix2v ),   
  48.                             vec_min( pix1v, pix2v ) ), 
  49.                    (vec_u32_t) sumv );                 
  50.         pix1 += i_pix1;                                
  51.         pix2 += i_pix2;                                
  52.     }                                                  
  53.     sumv = vec_sum##a( sumv, zero_s32v );              
  54.     sumv = vec_splat( sumv, b );                       
  55.     vec_ste( sumv, 0, &sum );                          
  56.     return sum;                                        
  57. }
  58. PIXEL_SAD_ALTIVEC( pixel_sad_16x16_altivec, 16, 16, s,  3 )
  59. PIXEL_SAD_ALTIVEC( pixel_sad_8x16_altivec,  8,  16, 2s, 1 )
  60. PIXEL_SAD_ALTIVEC( pixel_sad_16x8_altivec,  16, 8,  s,  3 )
  61. PIXEL_SAD_ALTIVEC( pixel_sad_8x8_altivec,   8,  8,  2s, 1 )
  62. /***********************************************************************
  63.  * SATD routines
  64.  **********************************************************************/
  65. /***********************************************************************
  66.  * VEC_HADAMAR
  67.  ***********************************************************************
  68.  * b[0] = a[0] + a[1] + a[2] + a[3]
  69.  * b[1] = a[0] + a[1] - a[2] - a[3]
  70.  * b[2] = a[0] - a[1] - a[2] + a[3]
  71.  * b[3] = a[0] - a[1] + a[2] - a[3]
  72.  **********************************************************************/
  73. #define VEC_HADAMAR(a0,a1,a2,a3,b0,b1,b2,b3) 
  74.     b2 = vec_add( a0, a1 ); 
  75.     b3 = vec_add( a2, a3 ); 
  76.     a0 = vec_sub( a0, a1 ); 
  77.     a2 = vec_sub( a2, a3 ); 
  78.     b0 = vec_add( b2, b3 ); 
  79.     b1 = vec_sub( b2, b3 ); 
  80.     b2 = vec_sub( a0, a2 ); 
  81.     b3 = vec_add( a0, a2 )
  82. /***********************************************************************
  83.  * VEC_ABS
  84.  ***********************************************************************
  85.  * a: s16v
  86.  *
  87.  * a = abs(a)
  88.  * 
  89.  * Call vec_sub()/vec_max() instead of vec_abs() because vec_abs()
  90.  * actually also calls vec_splat(0), but we already have a null vector.
  91.  **********************************************************************/
  92. #define VEC_ABS(a) 
  93.     a     = vec_max( a, vec_sub( zero_s16v, a ) );
  94. /***********************************************************************
  95.  * VEC_ADD_ABS
  96.  ***********************************************************************
  97.  * a:    s16v
  98.  * b, c: s32v
  99.  *
  100.  * c[i] = abs(a[2*i]) + abs(a[2*i+1]) + [bi]
  101.  **********************************************************************/
  102. #define VEC_ADD_ABS(a,b,c) 
  103.     VEC_ABS( a ); 
  104.     c = vec_sum4s( a, b )
  105. /***********************************************************************
  106.  * SATD 4x4
  107.  **********************************************************************/
  108. static int pixel_satd_4x4_altivec( uint8_t *pix1, int i_pix1,
  109.                                    uint8_t *pix2, int i_pix2 )
  110. {
  111.     DECLARE_ALIGNED_16( int i_satd );
  112.     PREP_DIFF;
  113.     vec_s16_t diff0v, diff1v, diff2v, diff3v;
  114.     vec_s16_t temp0v, temp1v, temp2v, temp3v;
  115.     vec_s32_t satdv;
  116.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff0v );
  117.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff1v );
  118.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff2v );
  119.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff3v );
  120.     /* Hadamar H */
  121.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  122.                  temp0v, temp1v, temp2v, temp3v );
  123.     
  124.     VEC_TRANSPOSE_4( temp0v, temp1v, temp2v, temp3v,
  125.                      diff0v, diff1v, diff2v, diff3v );
  126.     /* Hadamar V */
  127.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  128.                  temp0v, temp1v, temp2v, temp3v );
  129.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  130.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  131.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  132.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  133.     satdv = vec_sum2s( satdv, zero_s32v );
  134.     satdv = vec_splat( satdv, 1 );
  135.     vec_ste( satdv, 0, &i_satd );
  136.     return i_satd / 2;
  137. }
  138. /***********************************************************************
  139.  * SATD 4x8
  140.  **********************************************************************/
  141. static int pixel_satd_4x8_altivec( uint8_t *pix1, int i_pix1,
  142.                                    uint8_t *pix2, int i_pix2 )
  143. {
  144.     DECLARE_ALIGNED_16( int i_satd );
  145.     PREP_DIFF;
  146.     vec_s16_t diff0v, diff1v, diff2v, diff3v;
  147.     vec_s16_t temp0v, temp1v, temp2v, temp3v;
  148.     vec_s32_t satdv;
  149.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff0v );
  150.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff1v );
  151.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff2v );
  152.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff3v );
  153.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  154.                  temp0v, temp1v, temp2v, temp3v );
  155.     VEC_TRANSPOSE_4( temp0v, temp1v, temp2v, temp3v,
  156.                      diff0v, diff1v, diff2v, diff3v );
  157.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  158.                  temp0v, temp1v, temp2v, temp3v );
  159.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  160.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  161.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  162.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  163.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff0v );
  164.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff1v );
  165.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff2v );
  166.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 4, diff3v );
  167.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  168.                  temp0v, temp1v, temp2v, temp3v );
  169.     VEC_TRANSPOSE_4( temp0v, temp1v, temp2v, temp3v,
  170.                      diff0v, diff1v, diff2v, diff3v );
  171.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  172.                  temp0v, temp1v, temp2v, temp3v );
  173.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  174.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  175.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  176.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  177.     satdv = vec_sum2s( satdv, zero_s32v );
  178.     satdv = vec_splat( satdv, 1 );
  179.     vec_ste( satdv, 0, &i_satd );
  180.     return i_satd / 2;
  181. }
  182. /***********************************************************************
  183.  * SATD 8x4
  184.  **********************************************************************/
  185. static int pixel_satd_8x4_altivec( uint8_t *pix1, int i_pix1,
  186.                                    uint8_t *pix2, int i_pix2 )
  187. {
  188.     DECLARE_ALIGNED_16( int i_satd );
  189.     PREP_DIFF;
  190.     vec_s16_t diff0v, diff1v, diff2v, diff3v,
  191.               diff4v, diff5v, diff6v, diff7v;
  192.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  193.               temp4v, temp5v, temp6v, temp7v;
  194.     vec_s32_t satdv;
  195.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  196.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  197.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  198.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  199.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  200.                  temp0v, temp1v, temp2v, temp3v );
  201.     /* This causes warnings because temp4v...temp7v haven't be set,
  202.        but we don't care */
  203.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  204.                      temp4v, temp5v, temp6v, temp7v,
  205.                      diff0v, diff1v, diff2v, diff3v,
  206.                      diff4v, diff5v, diff6v, diff7v );
  207.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  208.                  temp0v, temp1v, temp2v, temp3v );
  209.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  210.                  temp4v, temp5v, temp6v, temp7v );
  211.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  212.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  213.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  214.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  215.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  216.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  217.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  218.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  219.     satdv = vec_sum2s( satdv, zero_s32v );
  220.     satdv = vec_splat( satdv, 1 );
  221.     vec_ste( satdv, 0, &i_satd );
  222.     return i_satd / 2;
  223. }
  224. /***********************************************************************
  225.  * SATD 8x8
  226.  **********************************************************************/
  227. static int pixel_satd_8x8_altivec( uint8_t *pix1, int i_pix1,
  228.                                    uint8_t *pix2, int i_pix2 )
  229. {
  230.     DECLARE_ALIGNED_16( int i_satd );
  231.     PREP_DIFF;
  232.     vec_s16_t diff0v, diff1v, diff2v, diff3v,
  233.               diff4v, diff5v, diff6v, diff7v;
  234.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  235.               temp4v, temp5v, temp6v, temp7v;
  236.     vec_s32_t satdv;
  237.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  238.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  239.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  240.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  241.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  242.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  243.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  244.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  245.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  246.                  temp0v, temp1v, temp2v, temp3v );
  247.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  248.                  temp4v, temp5v, temp6v, temp7v );
  249.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  250.                      temp4v, temp5v, temp6v, temp7v,
  251.                      diff0v, diff1v, diff2v, diff3v,
  252.                      diff4v, diff5v, diff6v, diff7v );
  253.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  254.                  temp0v, temp1v, temp2v, temp3v );
  255.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  256.                  temp4v, temp5v, temp6v, temp7v );
  257.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  258.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  259.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  260.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  261.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  262.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  263.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  264.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  265.     satdv = vec_sums( satdv, zero_s32v );
  266.     satdv = vec_splat( satdv, 3 );
  267.     vec_ste( satdv, 0, &i_satd );
  268.     return i_satd / 2;
  269. }
  270. /***********************************************************************
  271.  * SATD 8x16
  272.  **********************************************************************/
  273. static int pixel_satd_8x16_altivec( uint8_t *pix1, int i_pix1,
  274.                                     uint8_t *pix2, int i_pix2 )
  275. {
  276.     DECLARE_ALIGNED_16( int i_satd );
  277.     PREP_DIFF;
  278.     vec_s16_t diff0v, diff1v, diff2v, diff3v,
  279.               diff4v, diff5v, diff6v, diff7v;
  280.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  281.               temp4v, temp5v, temp6v, temp7v;
  282.     vec_s32_t satdv;
  283.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  284.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  285.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  286.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  287.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  288.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  289.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  290.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  291.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  292.                  temp0v, temp1v, temp2v, temp3v );
  293.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  294.                  temp4v, temp5v, temp6v, temp7v );
  295.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  296.                      temp4v, temp5v, temp6v, temp7v,
  297.                      diff0v, diff1v, diff2v, diff3v,
  298.                      diff4v, diff5v, diff6v, diff7v );
  299.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  300.                  temp0v, temp1v, temp2v, temp3v );
  301.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  302.                  temp4v, temp5v, temp6v, temp7v );
  303.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  304.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  305.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  306.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  307.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  308.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  309.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  310.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  311.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  312.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  313.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  314.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  315.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  316.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  317.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  318.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  319.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  320.                  temp0v, temp1v, temp2v, temp3v );
  321.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  322.                  temp4v, temp5v, temp6v, temp7v );
  323.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  324.                      temp4v, temp5v, temp6v, temp7v,
  325.                      diff0v, diff1v, diff2v, diff3v,
  326.                      diff4v, diff5v, diff6v, diff7v );
  327.     VEC_HADAMAR( diff0v, diff1v, diff2v, diff3v,
  328.                  temp0v, temp1v, temp2v, temp3v );
  329.     VEC_HADAMAR( diff4v, diff5v, diff6v, diff7v,
  330.                  temp4v, temp5v, temp6v, temp7v );
  331.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  332.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  333.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  334.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  335.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  336.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  337.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  338.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  339.     satdv = vec_sums( satdv, zero_s32v );
  340.     satdv = vec_splat( satdv, 3 );
  341.     vec_ste( satdv, 0, &i_satd );
  342.     return i_satd / 2;
  343. }
  344. /***********************************************************************
  345.  * SATD 16x8
  346.  **********************************************************************/
  347. static int pixel_satd_16x8_altivec( uint8_t *pix1, int i_pix1,
  348.                                     uint8_t *pix2, int i_pix2 )
  349. {
  350.     DECLARE_ALIGNED_16( int i_satd );
  351.     LOAD_ZERO;
  352.     PREP_LOAD;
  353.     vec_s32_t satdv;
  354.     vec_s16_t pix1v, pix2v;
  355.     vec_s16_t diffh0v, diffh1v, diffh2v, diffh3v,
  356.               diffh4v, diffh5v, diffh6v, diffh7v;
  357.     vec_s16_t diffl0v, diffl1v, diffl2v, diffl3v,
  358.               diffl4v, diffl5v, diffl6v, diffl7v;
  359.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  360.               temp4v, temp5v, temp6v, temp7v;
  361.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );
  362.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );
  363.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );
  364.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );
  365.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );
  366.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );
  367.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );
  368.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );
  369.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  370.                  temp0v, temp1v, temp2v, temp3v );
  371.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  372.                  temp4v, temp5v, temp6v, temp7v );
  373.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  374.                      temp4v, temp5v, temp6v, temp7v,
  375.                      diffh0v, diffh1v, diffh2v, diffh3v,
  376.                      diffh4v, diffh5v, diffh6v, diffh7v );
  377.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  378.                  temp0v, temp1v, temp2v, temp3v );
  379.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  380.                  temp4v, temp5v, temp6v, temp7v );
  381.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  382.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  383.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  384.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  385.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  386.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  387.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  388.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  389.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  390.                  temp0v, temp1v, temp2v, temp3v );
  391.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  392.                  temp4v, temp5v, temp6v, temp7v );
  393.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  394.                      temp4v, temp5v, temp6v, temp7v,
  395.                      diffl0v, diffl1v, diffl2v, diffl3v,
  396.                      diffl4v, diffl5v, diffl6v, diffl7v );
  397.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  398.                  temp0v, temp1v, temp2v, temp3v );
  399.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  400.                  temp4v, temp5v, temp6v, temp7v );
  401.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  402.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  403.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  404.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  405.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  406.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  407.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  408.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  409.     satdv = vec_sums( satdv, zero_s32v );
  410.     satdv = vec_splat( satdv, 3 );
  411.     vec_ste( satdv, 0, &i_satd );
  412.     return i_satd / 2;
  413. }
  414. /***********************************************************************
  415.  * SATD 16x16
  416.  **********************************************************************/
  417. static int pixel_satd_16x16_altivec( uint8_t *pix1, int i_pix1,
  418.                                      uint8_t *pix2, int i_pix2 )
  419. {
  420.     DECLARE_ALIGNED_16( int i_satd );
  421.     LOAD_ZERO;
  422.     PREP_LOAD;
  423.     vec_s32_t satdv;
  424.     vec_s16_t pix1v, pix2v;
  425.     vec_s16_t diffh0v, diffh1v, diffh2v, diffh3v,
  426.               diffh4v, diffh5v, diffh6v, diffh7v;
  427.     vec_s16_t diffl0v, diffl1v, diffl2v, diffl3v,
  428.               diffl4v, diffl5v, diffl6v, diffl7v;
  429.     vec_s16_t temp0v, temp1v, temp2v, temp3v,
  430.               temp4v, temp5v, temp6v, temp7v;
  431.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );
  432.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );
  433.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );
  434.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );
  435.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );
  436.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );
  437.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );
  438.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );
  439.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  440.                  temp0v, temp1v, temp2v, temp3v );
  441.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  442.                  temp4v, temp5v, temp6v, temp7v );
  443.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  444.                      temp4v, temp5v, temp6v, temp7v,
  445.                      diffh0v, diffh1v, diffh2v, diffh3v,
  446.                      diffh4v, diffh5v, diffh6v, diffh7v );
  447.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  448.                  temp0v, temp1v, temp2v, temp3v );
  449.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  450.                  temp4v, temp5v, temp6v, temp7v );
  451.     VEC_ADD_ABS( temp0v, zero_s32v, satdv );
  452.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  453.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  454.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  455.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  456.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  457.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  458.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  459.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  460.                  temp0v, temp1v, temp2v, temp3v );
  461.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  462.                  temp4v, temp5v, temp6v, temp7v );
  463.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  464.                      temp4v, temp5v, temp6v, temp7v,
  465.                      diffl0v, diffl1v, diffl2v, diffl3v,
  466.                      diffl4v, diffl5v, diffl6v, diffl7v );
  467.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  468.                  temp0v, temp1v, temp2v, temp3v );
  469.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  470.                  temp4v, temp5v, temp6v, temp7v );
  471.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  472.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  473.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  474.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  475.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  476.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  477.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  478.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  479.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh0v, diffl0v );
  480.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh1v, diffl1v );
  481.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh2v, diffl2v );
  482.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh3v, diffl3v );
  483.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh4v, diffl4v );
  484.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh5v, diffl5v );
  485.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh6v, diffl6v );
  486.     VEC_DIFF_HL( pix1, i_pix1, pix2, i_pix2, diffh7v, diffl7v );
  487.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  488.                  temp0v, temp1v, temp2v, temp3v );
  489.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  490.                  temp4v, temp5v, temp6v, temp7v );
  491.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  492.                      temp4v, temp5v, temp6v, temp7v,
  493.                      diffh0v, diffh1v, diffh2v, diffh3v,
  494.                      diffh4v, diffh5v, diffh6v, diffh7v );
  495.     VEC_HADAMAR( diffh0v, diffh1v, diffh2v, diffh3v,
  496.                  temp0v, temp1v, temp2v, temp3v );
  497.     VEC_HADAMAR( diffh4v, diffh5v, diffh6v, diffh7v,
  498.                  temp4v, temp5v, temp6v, temp7v );
  499.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  500.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  501.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  502.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  503.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  504.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  505.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  506.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  507.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  508.                  temp0v, temp1v, temp2v, temp3v );
  509.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  510.                  temp4v, temp5v, temp6v, temp7v );
  511.     VEC_TRANSPOSE_8( temp0v, temp1v, temp2v, temp3v,
  512.                      temp4v, temp5v, temp6v, temp7v,
  513.                      diffl0v, diffl1v, diffl2v, diffl3v,
  514.                      diffl4v, diffl5v, diffl6v, diffl7v );
  515.     VEC_HADAMAR( diffl0v, diffl1v, diffl2v, diffl3v,
  516.                  temp0v, temp1v, temp2v, temp3v );
  517.     VEC_HADAMAR( diffl4v, diffl5v, diffl6v, diffl7v,
  518.                  temp4v, temp5v, temp6v, temp7v );
  519.     VEC_ADD_ABS( temp0v, satdv,     satdv );
  520.     VEC_ADD_ABS( temp1v, satdv,     satdv );
  521.     VEC_ADD_ABS( temp2v, satdv,     satdv );
  522.     VEC_ADD_ABS( temp3v, satdv,     satdv );
  523.     VEC_ADD_ABS( temp4v, satdv,     satdv );
  524.     VEC_ADD_ABS( temp5v, satdv,     satdv );
  525.     VEC_ADD_ABS( temp6v, satdv,     satdv );
  526.     VEC_ADD_ABS( temp7v, satdv,     satdv );
  527.     satdv = vec_sums( satdv, zero_s32v );
  528.     satdv = vec_splat( satdv, 3 );
  529.     vec_ste( satdv, 0, &i_satd );
  530.     return i_satd / 2;
  531. }
  532. /***********************************************************************
  533. * Interleaved SAD routines
  534. **********************************************************************/
  535. static void pixel_sad_x4_16x16_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )
  536. {
  537.     DECLARE_ALIGNED_16( int sum0 );
  538.     DECLARE_ALIGNED_16( int sum1 );
  539.     DECLARE_ALIGNED_16( int sum2 );
  540.     DECLARE_ALIGNED_16( int sum3 );
  541.     int y;
  542.     
  543.     LOAD_ZERO;
  544.     vec_u8_t temp_lv, temp_hv;
  545.     vec_u8_t fencv, pix0v, pix1v, pix2v, pix3v;
  546.     //vec_u8_t perm0v, perm1v, perm2v, perm3v;
  547.     vec_u8_t perm0vA, perm1vA, perm2vA, perm3vA, perm0vB, perm1vB, perm2vB, perm3vB;
  548.     
  549.     vec_s32_t sum0v, sum1v, sum2v, sum3v;
  550.     
  551.     sum0v = vec_splat_s32(0);
  552.     sum1v = vec_splat_s32(0);
  553.     sum2v = vec_splat_s32(0);
  554.     sum3v = vec_splat_s32(0);
  555.     
  556.     perm0vA = vec_lvsl(0, pix0);
  557.     perm1vA = vec_lvsl(0, pix1);
  558.     perm2vA = vec_lvsl(0, pix2);
  559.     perm3vA = vec_lvsl(0, pix3);
  560.     
  561.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  562.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  563.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  564.     perm3vB = vec_lvsl(0, pix3 + i_stride);
  565.     
  566.     
  567.     for (y = 0; y < 8; y++)
  568.     {
  569.         temp_lv = vec_ld(0, pix0);
  570.         temp_hv = vec_ld(16, pix0);
  571.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  572.         pix0 += i_stride;
  573.         
  574.         
  575.         temp_lv = vec_ld(0, pix1);
  576.         temp_hv = vec_ld(16, pix1);
  577.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  578.         pix1 += i_stride;
  579.         
  580.         fencv = vec_ld(0, fenc);
  581.         fenc += FENC_STRIDE;
  582.         
  583.         temp_lv = vec_ld(0, pix2);
  584.         temp_hv = vec_ld(16, pix2);
  585.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  586.         pix2 += i_stride;
  587.         
  588.         temp_lv = vec_ld(0, pix3);
  589.         temp_hv = vec_ld(16, pix3);
  590.         pix3v = vec_perm(temp_lv, temp_hv, perm3vA);
  591.         pix3 += i_stride;
  592.         
  593.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  594.         
  595.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  596.         
  597.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  598.         
  599.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  600.         
  601.         temp_lv = vec_ld(0, pix0);
  602.         temp_hv = vec_ld(16, pix0);
  603.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  604.         pix0 += i_stride;
  605.         
  606.         
  607.         temp_lv = vec_ld(0, pix1);
  608.         temp_hv = vec_ld(16, pix1);
  609.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  610.         pix1 += i_stride;
  611.         
  612.         fencv = vec_ld(0, fenc);
  613.         fenc += FENC_STRIDE;
  614.         
  615.         temp_lv = vec_ld(0, pix2);
  616.         temp_hv = vec_ld(16, pix2);
  617.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  618.         pix2 += i_stride;
  619.         
  620.         temp_lv = vec_ld(0, pix3);
  621.         temp_hv = vec_ld(16, pix3);
  622.         pix3v = vec_perm(temp_lv, temp_hv, perm3vB);
  623.         pix3 += i_stride;
  624.         
  625.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  626.         
  627.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  628.         
  629.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  630.         
  631.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  632.         
  633.         
  634.     }
  635.     
  636.     sum0v = vec_sums( sum0v, zero_s32v );
  637.     sum1v = vec_sums( sum1v, zero_s32v );
  638.     sum2v = vec_sums( sum2v, zero_s32v );
  639.     sum3v = vec_sums( sum3v, zero_s32v );
  640.     
  641.     sum0v = vec_splat( sum0v, 3 );
  642.     sum1v = vec_splat( sum1v, 3 );
  643.     sum2v = vec_splat( sum2v, 3 );
  644.     sum3v = vec_splat( sum3v, 3 );
  645.     
  646.     vec_ste( sum0v, 0, &sum0);
  647.     vec_ste( sum1v, 0, &sum1);
  648.     vec_ste( sum2v, 0, &sum2);
  649.     vec_ste( sum3v, 0, &sum3);
  650.     
  651.     scores[0] = sum0;
  652.     scores[1] = sum1;
  653.     scores[2] = sum2;
  654.     scores[3] = sum3;
  655.     
  656.     
  657.     
  658. }
  659. static void pixel_sad_x3_16x16_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )
  660. {
  661.     
  662.     DECLARE_ALIGNED_16( int sum0 );
  663.     DECLARE_ALIGNED_16( int sum1 );
  664.     DECLARE_ALIGNED_16( int sum2 );
  665.     int y;
  666.     
  667.     LOAD_ZERO;
  668.     vec_u8_t temp_lv, temp_hv; // temporary load vectors
  669.     vec_u8_t fencv, pix0v, pix1v, pix2v;
  670.     vec_u8_t perm0vA, perm1vA, perm2vA, perm0vB, perm1vB, perm2vB;
  671.     
  672.     vec_s32_t sum0v, sum1v, sum2v;
  673.     
  674.     sum0v = vec_splat_s32(0);
  675.     sum1v = vec_splat_s32(0);
  676.     sum2v = vec_splat_s32(0);
  677.     
  678.     perm0vA = vec_lvsl(0, pix0);
  679.     perm1vA = vec_lvsl(0, pix1);
  680.     perm2vA = vec_lvsl(0, pix2);
  681.     
  682.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  683.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  684.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  685.     
  686.     for (y = 0; y < 8; y++)
  687.     {
  688.         temp_lv = vec_ld(0, pix0);
  689.         temp_hv = vec_ld(16, pix0);
  690.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  691.         pix0 += i_stride;
  692.         
  693.         
  694.         temp_lv = vec_ld(0, pix1);
  695.         temp_hv = vec_ld(16, pix1);
  696.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  697.         pix1 += i_stride;
  698.         
  699.         fencv = vec_ld(0, fenc);
  700.         fenc += FENC_STRIDE;
  701.         
  702.         temp_lv = vec_ld(0, pix2);
  703.         temp_hv = vec_ld(16, pix2);
  704.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  705.         pix2 += i_stride;
  706.         
  707.         
  708.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  709.         
  710.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  711.         
  712.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  713.         
  714.         temp_lv = vec_ld(0, pix0);
  715.         temp_hv = vec_ld(16, pix0);
  716.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  717.         pix0 += i_stride;
  718.         
  719.         
  720.         temp_lv = vec_ld(0, pix1);
  721.         temp_hv = vec_ld(16, pix1);
  722.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  723.         pix1 += i_stride;
  724.         
  725.         fencv = vec_ld(0, fenc);
  726.         fenc += FENC_STRIDE;
  727.         
  728.         temp_lv = vec_ld(0, pix2);
  729.         temp_hv = vec_ld(16, pix2);
  730.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  731.         pix2 += i_stride;
  732.         
  733.         
  734.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  735.         
  736.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  737.         
  738.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  739.         
  740.         
  741.         
  742.     }
  743.     
  744.     sum0v = vec_sums( sum0v, zero_s32v );
  745.     sum1v = vec_sums( sum1v, zero_s32v );
  746.     sum2v = vec_sums( sum2v, zero_s32v );
  747.     
  748.     sum0v = vec_splat( sum0v, 3 );
  749.     sum1v = vec_splat( sum1v, 3 );
  750.     sum2v = vec_splat( sum2v, 3 );
  751.     
  752.     vec_ste( sum0v, 0, &sum0);
  753.     vec_ste( sum1v, 0, &sum1);
  754.     vec_ste( sum2v, 0, &sum2);
  755.     
  756.     scores[0] = sum0;
  757.     scores[1] = sum1;
  758.     scores[2] = sum2;
  759.     
  760. static void pixel_sad_x4_16x8_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )
  761. {
  762.     DECLARE_ALIGNED_16( int sum0 );
  763.     DECLARE_ALIGNED_16( int sum1 );
  764.     DECLARE_ALIGNED_16( int sum2 );
  765.     DECLARE_ALIGNED_16( int sum3 );
  766.     int y;
  767.     
  768.     LOAD_ZERO;
  769.     vec_u8_t temp_lv, temp_hv; 
  770.     vec_u8_t fencv, pix0v, pix1v, pix2v, pix3v;
  771.     vec_u8_t perm0vA, perm1vA, perm2vA, perm3vA, perm0vB, perm1vB, perm2vB, perm3vB;
  772.     
  773.     vec_s32_t sum0v, sum1v, sum2v, sum3v;
  774.     
  775.     sum0v = vec_splat_s32(0);
  776.     sum1v = vec_splat_s32(0);
  777.     sum2v = vec_splat_s32(0);
  778.     sum3v = vec_splat_s32(0);
  779.     
  780.     perm0vA = vec_lvsl(0, pix0);
  781.     perm1vA = vec_lvsl(0, pix1);
  782.     perm2vA = vec_lvsl(0, pix2);
  783.     perm3vA = vec_lvsl(0, pix3);
  784.     
  785.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  786.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  787.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  788.     perm3vB = vec_lvsl(0, pix3 + i_stride);
  789.     
  790.     
  791.     
  792.     for (y = 0; y < 4; y++)
  793.     {
  794.         temp_lv = vec_ld(0, pix0);
  795.         temp_hv = vec_ld(16, pix0);
  796.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  797.         pix0 += i_stride;
  798.         
  799.         
  800.         temp_lv = vec_ld(0, pix1);
  801.         temp_hv = vec_ld(16, pix1);
  802.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  803.         pix1 += i_stride;
  804.         
  805.         fencv = vec_ld(0, fenc);
  806.         fenc += FENC_STRIDE;
  807.         
  808.         temp_lv = vec_ld(0, pix2);
  809.         temp_hv = vec_ld(16, pix2);
  810.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  811.         pix2 += i_stride;
  812.         
  813.         temp_lv = vec_ld(0, pix3);
  814.         temp_hv = vec_ld(16, pix3);
  815.         pix3v = vec_perm(temp_lv, temp_hv, perm3vA);
  816.         pix3 += i_stride;
  817.         
  818.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  819.         
  820.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  821.         
  822.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  823.         
  824.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  825.         
  826.         temp_lv = vec_ld(0, pix0);
  827.         temp_hv = vec_ld(16, pix0);
  828.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  829.         pix0 += i_stride;
  830.         
  831.         
  832.         temp_lv = vec_ld(0, pix1);
  833.         temp_hv = vec_ld(16, pix1);
  834.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  835.         pix1 += i_stride;
  836.         
  837.         fencv = vec_ld(0, fenc);
  838.         fenc += FENC_STRIDE;
  839.         
  840.         temp_lv = vec_ld(0, pix2);
  841.         temp_hv = vec_ld(16, pix2);
  842.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  843.         pix2 += i_stride;
  844.         
  845.         temp_lv = vec_ld(0, pix3);
  846.         temp_hv = vec_ld(16, pix3);
  847.         pix3v = vec_perm(temp_lv, temp_hv, perm3vB);
  848.         pix3 += i_stride;
  849.         
  850.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  851.         
  852.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  853.         
  854.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  855.         
  856.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v );
  857.         
  858.         
  859.     }
  860.     
  861.     sum0v = vec_sums( sum0v, zero_s32v );
  862.     sum1v = vec_sums( sum1v, zero_s32v );
  863.     sum2v = vec_sums( sum2v, zero_s32v );
  864.     sum3v = vec_sums( sum3v, zero_s32v );
  865.     
  866.     sum0v = vec_splat( sum0v, 3 );
  867.     sum1v = vec_splat( sum1v, 3 );
  868.     sum2v = vec_splat( sum2v, 3 );
  869.     sum3v = vec_splat( sum3v, 3 );
  870.     
  871.     vec_ste( sum0v, 0, &sum0);
  872.     vec_ste( sum1v, 0, &sum1);
  873.     vec_ste( sum2v, 0, &sum2);
  874.     vec_ste( sum3v, 0, &sum3);
  875.     
  876.     scores[0] = sum0;
  877.     scores[1] = sum1;
  878.     scores[2] = sum2;
  879.     scores[3] = sum3;
  880.     
  881.     
  882.     
  883. }
  884. static void pixel_sad_x3_16x8_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )
  885. {
  886.     
  887.     DECLARE_ALIGNED_16( int sum0 );
  888.     DECLARE_ALIGNED_16( int sum1 );
  889.     DECLARE_ALIGNED_16( int sum2 );
  890.     int y;
  891.     
  892.     LOAD_ZERO;
  893.     vec_u8_t temp_lv, temp_hv; 
  894.     vec_u8_t fencv, pix0v, pix1v, pix2v;
  895.     vec_u8_t perm0vA, perm1vA, perm2vA, perm0vB, perm1vB, perm2vB;
  896.     
  897.     vec_s32_t sum0v, sum1v, sum2v;
  898.     
  899.     sum0v = vec_splat_s32(0);
  900.     sum1v = vec_splat_s32(0);
  901.     sum2v = vec_splat_s32(0);
  902.     
  903.     perm0vA = vec_lvsl(0, pix0);
  904.     perm1vA = vec_lvsl(0, pix1);
  905.     perm2vA = vec_lvsl(0, pix2);
  906.     
  907.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  908.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  909.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  910.     
  911.     for (y = 0; y < 4; y++)
  912.     {
  913.         temp_lv = vec_ld(0, pix0);
  914.         temp_hv = vec_ld(16, pix0);
  915.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  916.         pix0 += i_stride;
  917.         
  918.         
  919.         temp_lv = vec_ld(0, pix1);
  920.         temp_hv = vec_ld(16, pix1);
  921.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  922.         pix1 += i_stride;
  923.         
  924.         fencv = vec_ld(0, fenc);
  925.         fenc += FENC_STRIDE;
  926.         
  927.         temp_lv = vec_ld(0, pix2);
  928.         temp_hv = vec_ld(16, pix2);
  929.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  930.         pix2 += i_stride;
  931.         
  932.         
  933.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  934.         
  935.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  936.         
  937.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  938.         
  939.         temp_lv = vec_ld(0, pix0);
  940.         temp_hv = vec_ld(16, pix0);
  941.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  942.         pix0 += i_stride;
  943.         
  944.         
  945.         temp_lv = vec_ld(0, pix1);
  946.         temp_hv = vec_ld(16, pix1);
  947.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  948.         pix1 += i_stride;
  949.         
  950.         fencv = vec_ld(0, fenc);
  951.         fenc += FENC_STRIDE;
  952.         
  953.         temp_lv = vec_ld(0, pix2);
  954.         temp_hv = vec_ld(16, pix2);
  955.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  956.         pix2 += i_stride;
  957.         
  958.         
  959.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  960.         
  961.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  962.         
  963.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v );
  964.         
  965.         
  966.     }
  967.     
  968.     sum0v = vec_sums( sum0v, zero_s32v );
  969.     sum1v = vec_sums( sum1v, zero_s32v );
  970.     sum2v = vec_sums( sum2v, zero_s32v );
  971.     
  972.     sum0v = vec_splat( sum0v, 3 );
  973.     sum1v = vec_splat( sum1v, 3 );
  974.     sum2v = vec_splat( sum2v, 3 );
  975.     
  976.     vec_ste( sum0v, 0, &sum0);
  977.     vec_ste( sum1v, 0, &sum1);
  978.     vec_ste( sum2v, 0, &sum2);
  979.     
  980.     scores[0] = sum0;
  981.     scores[1] = sum1;
  982.     scores[2] = sum2;
  983.     
  984. static void pixel_sad_x4_8x16_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )
  985. {
  986.     DECLARE_ALIGNED_16( int sum0 );
  987.     DECLARE_ALIGNED_16( int sum1 );
  988.     DECLARE_ALIGNED_16( int sum2 );
  989.     DECLARE_ALIGNED_16( int sum3 );
  990.     int y;
  991.     
  992.     LOAD_ZERO;
  993.     vec_u8_t temp_lv, temp_hv; 
  994.     vec_u8_t fencv, pix0v, pix1v, pix2v, pix3v;
  995.     vec_u8_t perm0vA, perm1vA, perm2vA, perm3vA, perm0vB, perm1vB, perm2vB, perm3vB, permEncv;
  996.     
  997.     vec_s32_t sum0v, sum1v, sum2v, sum3v;
  998.     
  999.     sum0v = vec_splat_s32(0);
  1000.     sum1v = vec_splat_s32(0);
  1001.     sum2v = vec_splat_s32(0);
  1002.     sum3v = vec_splat_s32(0);
  1003.     
  1004.     permEncv = vec_lvsl(0, fenc);
  1005.     perm0vA = vec_lvsl(0, pix0);
  1006.     perm1vA = vec_lvsl(0, pix1);
  1007.     perm2vA = vec_lvsl(0, pix2);
  1008.     perm3vA = vec_lvsl(0, pix3);
  1009.     
  1010.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  1011.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  1012.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  1013.     perm3vB = vec_lvsl(0, pix3 + i_stride);
  1014.     
  1015.     
  1016.     for (y = 0; y < 8; y++)
  1017.     {
  1018.         temp_lv = vec_ld(0, pix0);
  1019.         temp_hv = vec_ld(16, pix0);
  1020.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  1021.         pix0 += i_stride;
  1022.         
  1023.         
  1024.         temp_lv = vec_ld(0, pix1);
  1025.         temp_hv = vec_ld(16, pix1);
  1026.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  1027.         pix1 += i_stride;
  1028.         
  1029.         temp_lv = vec_ld(0, fenc);
  1030.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1031.         fenc += FENC_STRIDE;
  1032.         
  1033.         temp_lv = vec_ld(0, pix2);
  1034.         temp_hv = vec_ld(16, pix2);
  1035.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  1036.         pix2 += i_stride;
  1037.         
  1038.         temp_lv = vec_ld(0, pix3);
  1039.         temp_hv = vec_ld(16, pix3);
  1040.         pix3v = vec_perm(temp_lv, temp_hv, perm3vA);
  1041.         pix3 += i_stride;
  1042.         
  1043.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1044.         
  1045.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1046.         
  1047.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1048.         
  1049.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  1050.         
  1051.         temp_lv = vec_ld(0, pix0);
  1052.         temp_hv = vec_ld(16, pix0);
  1053.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  1054.         pix0 += i_stride;
  1055.         
  1056.         
  1057.         temp_lv = vec_ld(0, pix1);
  1058.         temp_hv = vec_ld(16, pix1);
  1059.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  1060.         pix1 += i_stride;
  1061.         
  1062.         temp_lv = vec_ld(0, fenc);
  1063.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1064.         fenc += FENC_STRIDE;
  1065.         
  1066.         temp_lv = vec_ld(0, pix2);
  1067.         temp_hv = vec_ld(16, pix2);
  1068.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  1069.         pix2 += i_stride;
  1070.         
  1071.         temp_lv = vec_ld(0, pix3);
  1072.         temp_hv = vec_ld(16, pix3);
  1073.         pix3v = vec_perm(temp_lv, temp_hv, perm3vB);
  1074.         pix3 += i_stride;
  1075.         
  1076.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1077.         
  1078.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1079.         
  1080.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1081.         
  1082.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  1083.     }
  1084.     
  1085.     sum0v = vec_sum2s( sum0v, zero_s32v );
  1086.     sum1v = vec_sum2s( sum1v, zero_s32v );
  1087.     sum2v = vec_sum2s( sum2v, zero_s32v );
  1088.     sum3v = vec_sum2s( sum3v, zero_s32v );
  1089.     
  1090.     sum0v = vec_splat( sum0v, 1 );
  1091.     sum1v = vec_splat( sum1v, 1 );
  1092.     sum2v = vec_splat( sum2v, 1 );
  1093.     sum3v = vec_splat( sum3v, 1 );
  1094.     
  1095.     vec_ste( sum0v, 0, &sum0);
  1096.     vec_ste( sum1v, 0, &sum1);
  1097.     vec_ste( sum2v, 0, &sum2);
  1098.     vec_ste( sum3v, 0, &sum3);
  1099.     
  1100.     scores[0] = sum0;
  1101.     scores[1] = sum1;
  1102.     scores[2] = sum2;
  1103.     scores[3] = sum3; 
  1104.         
  1105. }
  1106. static void pixel_sad_x3_8x16_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )
  1107. {
  1108.     DECLARE_ALIGNED_16( int sum0 );
  1109.     DECLARE_ALIGNED_16( int sum1 );
  1110.     DECLARE_ALIGNED_16( int sum2 );
  1111.     int y;
  1112.     
  1113.     LOAD_ZERO;
  1114.     vec_u8_t temp_lv, temp_hv; 
  1115.     vec_u8_t fencv, pix0v, pix1v, pix2v;
  1116.     vec_u8_t perm0vA, perm1vA, perm2vA, perm0vB, perm1vB, perm2vB,permEncv;
  1117.     
  1118.     vec_s32_t sum0v, sum1v, sum2v;
  1119.     
  1120.     sum0v = vec_splat_s32(0);
  1121.     sum1v = vec_splat_s32(0);
  1122.     sum2v = vec_splat_s32(0);
  1123.     
  1124.     permEncv = vec_lvsl(0, fenc);
  1125.     perm0vA = vec_lvsl(0, pix0);
  1126.     perm1vA = vec_lvsl(0, pix1);
  1127.     perm2vA = vec_lvsl(0, pix2);
  1128.     
  1129.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  1130.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  1131.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  1132.     
  1133.     for (y = 0; y < 8; y++)
  1134.     {
  1135.         temp_lv = vec_ld(0, pix0);
  1136.         temp_hv = vec_ld(16, pix0);
  1137.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  1138.         pix0 += i_stride;
  1139.         
  1140.         
  1141.         temp_lv = vec_ld(0, pix1);
  1142.         temp_hv = vec_ld(16, pix1);
  1143.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  1144.         pix1 += i_stride;
  1145.         
  1146.         temp_lv = vec_ld(0, fenc);
  1147.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1148.         fenc += FENC_STRIDE;
  1149.         
  1150.         temp_lv = vec_ld(0, pix2);
  1151.         temp_hv = vec_ld(16, pix2);
  1152.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  1153.         pix2 += i_stride;
  1154.         
  1155.         
  1156.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1157.         
  1158.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1159.         
  1160.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1161.         
  1162.         
  1163.         temp_lv = vec_ld(0, pix0);
  1164.         temp_hv = vec_ld(16, pix0);
  1165.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  1166.         pix0 += i_stride;
  1167.         
  1168.         
  1169.         temp_lv = vec_ld(0, pix1);
  1170.         temp_hv = vec_ld(16, pix1);
  1171.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  1172.         pix1 += i_stride;
  1173.         
  1174.         temp_lv = vec_ld(0, fenc);
  1175.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1176.         fenc += FENC_STRIDE;
  1177.         
  1178.         temp_lv = vec_ld(0, pix2);
  1179.         temp_hv = vec_ld(16, pix2);
  1180.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  1181.         pix2 += i_stride;
  1182.         
  1183.         
  1184.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1185.         
  1186.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1187.         
  1188.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1189.         
  1190.     }
  1191.     
  1192.     
  1193.     sum0v = vec_sum2s( sum0v, zero_s32v );
  1194.     sum1v = vec_sum2s( sum1v, zero_s32v );
  1195.     sum2v = vec_sum2s( sum2v, zero_s32v );
  1196.     
  1197.     sum0v = vec_splat( sum0v, 1 );
  1198.     sum1v = vec_splat( sum1v, 1 );
  1199.     sum2v = vec_splat( sum2v, 1 );
  1200.     
  1201.     vec_ste( sum0v, 0, &sum0);
  1202.     vec_ste( sum1v, 0, &sum1);
  1203.     vec_ste( sum2v, 0, &sum2);
  1204.     
  1205.     scores[0] = sum0;
  1206.     scores[1] = sum1;
  1207.     scores[2] = sum2;
  1208.     
  1209. }
  1210. static void pixel_sad_x4_8x8_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, uint8_t *pix3, int i_stride, int scores[4] )
  1211. {
  1212.     DECLARE_ALIGNED_16( int sum0 );
  1213.     DECLARE_ALIGNED_16( int sum1 );
  1214.     DECLARE_ALIGNED_16( int sum2 );
  1215.     DECLARE_ALIGNED_16( int sum3 );
  1216.     int y;
  1217.     
  1218.     LOAD_ZERO;
  1219.     vec_u8_t temp_lv, temp_hv; 
  1220.     vec_u8_t fencv, pix0v, pix1v, pix2v, pix3v;
  1221.     vec_u8_t perm0vA, perm1vA, perm2vA, perm3vA, perm0vB, perm1vB, perm2vB, perm3vB, permEncv;
  1222.     
  1223.     vec_s32_t sum0v, sum1v, sum2v, sum3v;
  1224.     
  1225.     sum0v = vec_splat_s32(0);
  1226.     sum1v = vec_splat_s32(0);
  1227.     sum2v = vec_splat_s32(0);
  1228.     sum3v = vec_splat_s32(0);
  1229.     
  1230.     permEncv = vec_lvsl(0, fenc);
  1231.     perm0vA = vec_lvsl(0, pix0);
  1232.     perm1vA = vec_lvsl(0, pix1);
  1233.     perm2vA = vec_lvsl(0, pix2);
  1234.     perm3vA = vec_lvsl(0, pix3);
  1235.     
  1236.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  1237.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  1238.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  1239.     perm3vB = vec_lvsl(0, pix3 + i_stride);
  1240.     
  1241.     
  1242.     for (y = 0; y < 4; y++)
  1243.     {
  1244.         temp_lv = vec_ld(0, pix0);
  1245.         temp_hv = vec_ld(16, pix0);
  1246.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  1247.         pix0 += i_stride;
  1248.         
  1249.         
  1250.         temp_lv = vec_ld(0, pix1);
  1251.         temp_hv = vec_ld(16, pix1);
  1252.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  1253.         pix1 += i_stride;
  1254.         
  1255.         temp_lv = vec_ld(0, fenc);
  1256.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1257.         fenc += FENC_STRIDE;
  1258.         
  1259.         temp_lv = vec_ld(0, pix2);
  1260.         temp_hv = vec_ld(16, pix2);
  1261.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  1262.         pix2 += i_stride;
  1263.         
  1264.         temp_lv = vec_ld(0, pix3);
  1265.         temp_hv = vec_ld(16, pix3);
  1266.         pix3v = vec_perm(temp_lv, temp_hv, perm3vA);
  1267.         pix3 += i_stride;
  1268.         
  1269.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1270.         
  1271.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1272.         
  1273.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1274.         
  1275.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  1276.         
  1277.         temp_lv = vec_ld(0, pix0);
  1278.         temp_hv = vec_ld(16, pix0);
  1279.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  1280.         pix0 += i_stride;
  1281.         
  1282.         
  1283.         temp_lv = vec_ld(0, pix1);
  1284.         temp_hv = vec_ld(16, pix1);
  1285.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  1286.         pix1 += i_stride;
  1287.         
  1288.         temp_lv = vec_ld(0, fenc);
  1289.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1290.         fenc += FENC_STRIDE;
  1291.         
  1292.         temp_lv = vec_ld(0, pix2);
  1293.         temp_hv = vec_ld(16, pix2);
  1294.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  1295.         pix2 += i_stride;
  1296.         
  1297.         temp_lv = vec_ld(0, pix3);
  1298.         temp_hv = vec_ld(16, pix3);
  1299.         pix3v = vec_perm(temp_lv, temp_hv, perm3vB);
  1300.         pix3 += i_stride;
  1301.         
  1302.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1303.         
  1304.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1305.         
  1306.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1307.         
  1308.         sum3v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix3v ), vec_min( fencv, pix3v ) ), (vec_u32_t) sum3v ); 
  1309.     }
  1310.     
  1311.     
  1312.     sum0v = vec_sum2s( sum0v, zero_s32v );
  1313.     sum1v = vec_sum2s( sum1v, zero_s32v );
  1314.     sum2v = vec_sum2s( sum2v, zero_s32v );
  1315.     sum3v = vec_sum2s( sum3v, zero_s32v );
  1316.     
  1317.     sum0v = vec_splat( sum0v, 1 );
  1318.     sum1v = vec_splat( sum1v, 1 );
  1319.     sum2v = vec_splat( sum2v, 1 );
  1320.     sum3v = vec_splat( sum3v, 1 );
  1321.     
  1322.     vec_ste( sum0v, 0, &sum0);
  1323.     vec_ste( sum1v, 0, &sum1);
  1324.     vec_ste( sum2v, 0, &sum2);
  1325.     vec_ste( sum3v, 0, &sum3);
  1326.     
  1327.     scores[0] = sum0;
  1328.     scores[1] = sum1;
  1329.     scores[2] = sum2;
  1330.     scores[3] = sum3; 
  1331.     
  1332.     
  1333. }
  1334. static void pixel_sad_x3_8x8_altivec( uint8_t *fenc, uint8_t *pix0, uint8_t *pix1, uint8_t *pix2, int i_stride, int scores[3] )
  1335. {
  1336.     DECLARE_ALIGNED_16( int sum0 );
  1337.     DECLARE_ALIGNED_16( int sum1 );
  1338.     DECLARE_ALIGNED_16( int sum2 );
  1339.     int y;
  1340.     
  1341.     LOAD_ZERO;
  1342.     vec_u8_t temp_lv, temp_hv; 
  1343.     vec_u8_t fencv, pix0v, pix1v, pix2v;
  1344.     vec_u8_t perm0vA, perm1vA, perm2vA, perm0vB, perm1vB, perm2vB,  permEncv;
  1345.     
  1346.     vec_s32_t sum0v, sum1v, sum2v;
  1347.     
  1348.     sum0v = vec_splat_s32(0);
  1349.     sum1v = vec_splat_s32(0);
  1350.     sum2v = vec_splat_s32(0);
  1351.     
  1352.     permEncv = vec_lvsl(0, fenc);
  1353.     perm0vA = vec_lvsl(0, pix0);
  1354.     perm1vA = vec_lvsl(0, pix1);
  1355.     perm2vA = vec_lvsl(0, pix2);
  1356.     
  1357.     perm0vB = vec_lvsl(0, pix0 + i_stride);
  1358.     perm1vB = vec_lvsl(0, pix1 + i_stride);
  1359.     perm2vB = vec_lvsl(0, pix2 + i_stride);
  1360.     
  1361.     for (y = 0; y < 4; y++)
  1362.     {
  1363.         temp_lv = vec_ld(0, pix0);
  1364.         temp_hv = vec_ld(16, pix0);
  1365.         pix0v = vec_perm(temp_lv, temp_hv, perm0vA);
  1366.         pix0 += i_stride;
  1367.         
  1368.         
  1369.         temp_lv = vec_ld(0, pix1);
  1370.         temp_hv = vec_ld(16, pix1);
  1371.         pix1v = vec_perm(temp_lv, temp_hv, perm1vA);
  1372.         pix1 += i_stride;
  1373.         
  1374.         temp_lv = vec_ld(0, fenc);
  1375.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1376.         fenc += FENC_STRIDE;
  1377.         
  1378.         temp_lv = vec_ld(0, pix2);
  1379.         temp_hv = vec_ld(16, pix2);
  1380.         pix2v = vec_perm(temp_lv, temp_hv, perm2vA);
  1381.         pix2 += i_stride;
  1382.         
  1383.         
  1384.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1385.         
  1386.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1387.         
  1388.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1389.         
  1390.         
  1391.         temp_lv = vec_ld(0, pix0);
  1392.         temp_hv = vec_ld(16, pix0);
  1393.         pix0v = vec_perm(temp_lv, temp_hv, perm0vB);
  1394.         pix0 += i_stride;
  1395.         
  1396.         
  1397.         temp_lv = vec_ld(0, pix1);
  1398.         temp_hv = vec_ld(16, pix1);
  1399.         pix1v = vec_perm(temp_lv, temp_hv, perm1vB);
  1400.         pix1 += i_stride;
  1401.         
  1402.         temp_lv = vec_ld(0, fenc);
  1403.         fencv = vec_perm(temp_lv, temp_hv, permEncv);
  1404.         fenc += FENC_STRIDE;
  1405.         
  1406.         temp_lv = vec_ld(0, pix2);
  1407.         temp_hv = vec_ld(16, pix2);
  1408.         pix2v = vec_perm(temp_lv, temp_hv, perm2vB);
  1409.         pix2 += i_stride;
  1410.         
  1411.         
  1412.         sum0v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix0v ), vec_min( fencv, pix0v ) ), (vec_u32_t) sum0v ); 
  1413.         
  1414.         sum1v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix1v ), vec_min( fencv, pix1v ) ), (vec_u32_t) sum1v ); 
  1415.         
  1416.         sum2v = (vec_s32_t) vec_sum4s( vec_sub( vec_max( fencv, pix2v ), vec_min( fencv, pix2v ) ), (vec_u32_t) sum2v ); 
  1417.         
  1418.     }
  1419.     
  1420.     
  1421.     sum0v = vec_sum2s( sum0v, zero_s32v );
  1422.     sum1v = vec_sum2s( sum1v, zero_s32v );
  1423.     sum2v = vec_sum2s( sum2v, zero_s32v );
  1424.     
  1425.     sum0v = vec_splat( sum0v, 1 );
  1426.     sum1v = vec_splat( sum1v, 1 );
  1427.     sum2v = vec_splat( sum2v, 1 );
  1428.     
  1429.     vec_ste( sum0v, 0, &sum0);
  1430.     vec_ste( sum1v, 0, &sum1);
  1431.     vec_ste( sum2v, 0, &sum2);
  1432.     
  1433.     scores[0] = sum0;
  1434.     scores[1] = sum1;
  1435.     scores[2] = sum2;
  1436. }
  1437. /***********************************************************************
  1438. * SSD routines
  1439. **********************************************************************/
  1440. static int pixel_ssd_16x16_altivec ( uint8_t *pix1, int i_stride_pix1,
  1441.                                      uint8_t *pix2, int i_stride_pix2)
  1442. {
  1443.     DECLARE_ALIGNED_16( int sum );
  1444.     
  1445.     int y;
  1446.     LOAD_ZERO;
  1447.     vec_u8_t  pix1vA, pix2vA, pix1vB, pix2vB;
  1448.     vec_u32_t sumv;
  1449.     vec_u8_t maxA, minA, diffA, maxB, minB, diffB;
  1450.     vec_u8_t temp_lv, temp_hv;
  1451.     vec_u8_t permA, permB;
  1452.     
  1453.     sumv = vec_splat_u32(0);
  1454.     
  1455.     permA = vec_lvsl(0, pix2);
  1456.     permB = vec_lvsl(0, pix2 + i_stride_pix2);
  1457.     
  1458.     temp_lv = vec_ld(0, pix2);
  1459.     temp_hv = vec_ld(16, pix2);
  1460.     pix2vA = vec_perm(temp_lv, temp_hv, permA);
  1461.     pix1vA = vec_ld(0, pix1);
  1462.     
  1463.     for (y=0; y < 7; y++)
  1464.     {
  1465.         pix1 += i_stride_pix1;
  1466.         pix2 += i_stride_pix2;
  1467.         
  1468.         
  1469.         maxA = vec_max(pix1vA, pix2vA);
  1470.         minA = vec_min(pix1vA, pix2vA);
  1471.     
  1472.         
  1473.         temp_lv = vec_ld(0, pix2);
  1474.         temp_hv = vec_ld(16, pix2);
  1475.         pix2vB = vec_perm(temp_lv, temp_hv, permB);
  1476.         pix1vB = vec_ld(0, pix1);
  1477.     
  1478.         
  1479.         diffA = vec_sub(maxA, minA);
  1480.         sumv = vec_msum(diffA, diffA, sumv);
  1481.         
  1482.         pix1 += i_stride_pix1;
  1483.         pix2 += i_stride_pix2;
  1484.         
  1485.         maxB = vec_max(pix1vB, pix2vB);
  1486.         minB = vec_min(pix1vB, pix2vB);
  1487.         
  1488.         temp_lv = vec_ld(0, pix2);
  1489.         temp_hv = vec_ld(16, pix2);
  1490.         pix2vA = vec_perm(temp_lv, temp_hv, permA);
  1491.         pix1vA = vec_ld(0, pix1);
  1492.         
  1493.         diffB = vec_sub(maxB, minB);
  1494.         sumv = vec_msum(diffB, diffB, sumv);
  1495.         
  1496.     }
  1497.     
  1498.     pix1 += i_stride_pix1;
  1499.     pix2 += i_stride_pix2;
  1500.     
  1501.     temp_lv = vec_ld(0, pix2);
  1502.     temp_hv = vec_ld(16, pix2);
  1503.     pix2vB = vec_perm(temp_lv, temp_hv, permB);
  1504.     pix1vB = vec_ld(0, pix1);
  1505.     
  1506.     maxA = vec_max(pix1vA, pix2vA);
  1507.     minA = vec_min(pix1vA, pix2vA);
  1508.     
  1509.     maxB = vec_max(pix1vB, pix2vB); 
  1510.     minB = vec_min(pix1vB, pix2vB); 
  1511.     
  1512.     diffA = vec_sub(maxA, minA);
  1513.     sumv = vec_msum(diffA, diffA, sumv);
  1514.     
  1515.     diffB = vec_sub(maxB, minB);
  1516.     sumv = vec_msum(diffB, diffB, sumv);
  1517.     
  1518.     sumv = (vec_u32_t) vec_sums((vec_s32_t) sumv, zero_s32v);
  1519.     sumv = vec_splat(sumv, 3);
  1520.     vec_ste((vec_s32_t) sumv, 0, &sum);
  1521.     return sum;
  1522. static int pixel_ssd_8x8_altivec ( uint8_t *pix1, int i_stride_pix1,
  1523.                                    uint8_t *pix2, int i_stride_pix2)
  1524. {
  1525.     DECLARE_ALIGNED_16( int sum );
  1526.     
  1527.     int y;
  1528.     LOAD_ZERO;
  1529.     vec_u8_t  pix1v, pix2v;
  1530.     vec_u32_t sumv;
  1531.     vec_u8_t maxv, minv, diffv;
  1532.     vec_u8_t temp_lv, temp_hv;
  1533.     vec_u8_t perm1v, perm2v;
  1534.     const vec_u32_t sel = (vec_u32_t)CV(-1,-1,0,0);
  1535.     sumv = vec_splat_u32(0);
  1536.     
  1537.     perm1v = vec_lvsl(0, pix1);
  1538.     perm2v = vec_lvsl(0, pix2);
  1539.     
  1540.     for (y=0; y < 8; y++)
  1541.     {
  1542.         temp_hv = vec_ld(0, pix1);
  1543.         temp_lv = vec_ld(7, pix1);
  1544.         pix1v = vec_perm(temp_hv, temp_lv, perm1v);
  1545.         temp_hv = vec_ld(0, pix2);
  1546.         temp_lv = vec_ld(7, pix2);
  1547.         pix2v = vec_perm(temp_hv, temp_lv, perm2v);
  1548.         maxv = vec_max(pix1v, pix2v);
  1549.         minv = vec_min(pix1v, pix2v);
  1550.     
  1551.         diffv = vec_sub(maxv, minv);
  1552.         sumv = vec_msum(diffv, diffv, sumv);
  1553.         pix1 += i_stride_pix1;
  1554.         pix2 += i_stride_pix2;
  1555.     }
  1556.     sumv = vec_sel( zero_u32v, sumv, sel );
  1557.     sumv = (vec_u32_t) vec_sums((vec_s32_t) sumv, zero_s32v);
  1558.     sumv = vec_splat(sumv, 3);
  1559.     vec_ste((vec_s32_t) sumv, 0, &sum);
  1560.     return sum;
  1561. /**********************************************************************
  1562.  * SA8D routines: sum of 8x8 Hadamard transformed differences
  1563.  **********************************************************************/
  1564. /* SA8D_1D unrolled by 8 in Altivec */
  1565. #define SA8D_1D_ALTIVEC( sa8d0v, sa8d1v, sa8d2v, sa8d3v, sa8d4v, sa8d5v, sa8d6v, sa8d7v )
  1566. {
  1567.     /* int    a0  =        SRC(0) + SRC(4) */
  1568.     vec_s16_t a0v = vec_add(sa8d0v, sa8d4v); 
  1569.     /* int    a4  =        SRC(0) - SRC(4) */
  1570.     vec_s16_t a4v = vec_sub(sa8d0v, sa8d4v); 
  1571.     /* int    a1  =        SRC(1) + SRC(5) */
  1572.     vec_s16_t a1v = vec_add(sa8d1v, sa8d5v); 
  1573.     /* int    a5  =        SRC(1) - SRC(5) */
  1574.     vec_s16_t a5v = vec_sub(sa8d1v, sa8d5v); 
  1575.     /* int    a2  =        SRC(2) + SRC(6) */
  1576.     vec_s16_t a2v = vec_add(sa8d2v, sa8d6v); 
  1577.     /* int    a6  =        SRC(2) - SRC(6) */
  1578.     vec_s16_t a6v = vec_sub(sa8d2v, sa8d6v); 
  1579.     /* int    a3  =        SRC(3) + SRC(7) */
  1580.     vec_s16_t a3v = vec_add(sa8d3v, sa8d7v); 
  1581.     /* int    a7  =        SRC(3) - SRC(7) */
  1582.     vec_s16_t a7v = vec_sub(sa8d3v, sa8d7v); 
  1583.     /* int    b0  =         a0 + a2  */
  1584.     vec_s16_t b0v = vec_add(a0v, a2v); 
  1585.     /* int    b2  =         a0 - a2; */
  1586.     vec_s16_t  b2v = vec_sub(a0v, a2v);
  1587.     /* int    b1  =         a1 + a3; */
  1588.     vec_s16_t b1v = vec_add(a1v, a3v); 
  1589.     /* int    b3  =         a1 - a3; */
  1590.     vec_s16_t b3v = vec_sub(a1v, a3v); 
  1591.     /* int    b4  =         a4 + a6; */
  1592.     vec_s16_t b4v = vec_add(a4v, a6v); 
  1593.     /* int    b6  =         a4 - a6; */
  1594.     vec_s16_t b6v = vec_sub(a4v, a6v); 
  1595.     /* int    b5  =         a5 + a7; */
  1596.     vec_s16_t b5v = vec_add(a5v, a7v); 
  1597.     /* int    b7  =         a5 - a7; */
  1598.     vec_s16_t b7v = vec_sub(a5v, a7v); 
  1599.     /* DST(0,        b0 + b1) */
  1600.     sa8d0v = vec_add(b0v, b1v); 
  1601.     /* DST(1,        b0 - b1) */
  1602.     sa8d1v = vec_sub(b0v, b1v); 
  1603.     /* DST(2,        b2 + b3) */
  1604.     sa8d2v = vec_add(b2v, b3v); 
  1605.     /* DST(3,        b2 - b3) */
  1606.     sa8d3v = vec_sub(b2v, b3v); 
  1607.     /* DST(4,        b4 + b5) */
  1608.     sa8d4v = vec_add(b4v, b5v); 
  1609.     /* DST(5,        b4 - b5) */
  1610.     sa8d5v = vec_sub(b4v, b5v); 
  1611.     /* DST(6,        b6 + b7) */
  1612.     sa8d6v = vec_add(b6v, b7v); 
  1613.     /* DST(7,        b6 - b7) */
  1614.     sa8d7v = vec_sub(b6v, b7v); 
  1615. }
  1616. static int pixel_sa8d_8x8_core_altivec( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  1617. {
  1618.     int32_t i_satd=0;
  1619.     PREP_DIFF;
  1620.     vec_s16_t diff0v, diff1v, diff2v, diff3v, diff4v, diff5v, diff6v, diff7v;
  1621.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff0v );
  1622.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff1v );
  1623.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff2v );
  1624.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff3v );
  1625.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff4v );
  1626.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff5v );
  1627.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff6v );
  1628.     VEC_DIFF_H( pix1, i_pix1, pix2, i_pix2, 8, diff7v );
  1629.     vec_s16_t sa8d0v, sa8d1v, sa8d2v, sa8d3v, sa8d4v, sa8d5v, sa8d6v, sa8d7v;
  1630.     SA8D_1D_ALTIVEC(diff0v, diff1v, diff2v, diff3v,
  1631.                     diff4v, diff5v, diff6v, diff7v);
  1632.     VEC_TRANSPOSE_8(diff0v, diff1v, diff2v, diff3v,
  1633.                     diff4v, diff5v, diff6v, diff7v,
  1634.                     sa8d0v, sa8d1v, sa8d2v, sa8d3v,
  1635.                     sa8d4v, sa8d5v, sa8d6v, sa8d7v );
  1636.     SA8D_1D_ALTIVEC(sa8d0v, sa8d1v, sa8d2v, sa8d3v,
  1637.                     sa8d4v, sa8d5v, sa8d6v, sa8d7v );
  1638.     /* accumulation of the absolute value of all elements of the resulting bloc */
  1639.     vec_s16_t abs0v = VEC_ABS(sa8d0v);
  1640.     vec_s16_t abs1v = VEC_ABS(sa8d1v);
  1641.     vec_s16_t sum01v = vec_add(abs0v, abs1v);
  1642.     vec_s16_t abs2v = VEC_ABS(sa8d2v);
  1643.     vec_s16_t abs3v = VEC_ABS(sa8d3v);
  1644.     vec_s16_t sum23v = vec_add(abs2v, abs3v);
  1645.     vec_s16_t abs4v = VEC_ABS(sa8d4v);
  1646.     vec_s16_t abs5v = VEC_ABS(sa8d5v);
  1647.     vec_s16_t sum45v = vec_add(abs4v, abs5v);
  1648.     vec_s16_t abs6v = VEC_ABS(sa8d6v);
  1649.     vec_s16_t abs7v = VEC_ABS(sa8d7v);
  1650.     vec_s16_t sum67v = vec_add(abs6v, abs7v);
  1651.     vec_s16_t sum0123v = vec_add(sum01v, sum23v);
  1652.     vec_s16_t sum4567v = vec_add(sum45v, sum67v);
  1653.     vec_s32_t sumblocv;
  1654.     sumblocv = vec_sum4s(sum0123v, (vec_s32_t)zerov );
  1655.     sumblocv = vec_sum4s(sum4567v, sumblocv );
  1656.     sumblocv = vec_sums(sumblocv, (vec_s32_t)zerov );
  1657.     sumblocv = vec_splat(sumblocv, 3);
  1658.     vec_ste(sumblocv, 0, &i_satd);
  1659.     return i_satd;
  1660. }
  1661. static int pixel_sa8d_8x8_altivec( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  1662. {
  1663.     int32_t i_satd;
  1664.     i_satd = (pixel_sa8d_8x8_core_altivec( pix1, i_pix1, pix2, i_pix2 )+2)>>2;
  1665.     return i_satd;
  1666. }
  1667. static int pixel_sa8d_16x16_altivec( uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  1668. {
  1669.     int32_t i_satd;
  1670.     
  1671.     i_satd = (pixel_sa8d_8x8_core_altivec( &pix1[0],     i_pix1, &pix2[0],     i_pix2 )
  1672.             + pixel_sa8d_8x8_core_altivec( &pix1[8],     i_pix1, &pix2[8],     i_pix2 )
  1673.             + pixel_sa8d_8x8_core_altivec( &pix1[8*i_pix1],   i_pix1, &pix2[8*i_pix2],   i_pix2 )
  1674.             + pixel_sa8d_8x8_core_altivec( &pix1[8*i_pix1+8], i_pix1, &pix2[8*i_pix2+8], i_pix2 ) +2)>>2;
  1675.     return i_satd;
  1676. }
  1677. /****************************************************************************
  1678.  * structural similarity metric
  1679.  ****************************************************************************/
  1680. static void ssim_4x4x2_core_altivec( const uint8_t *pix1, int stride1,
  1681.                                      const uint8_t *pix2, int stride2,
  1682.                                      int sums[2][4] )
  1683. {
  1684.     DECLARE_ALIGNED_16( int temp[4] );
  1685.     int y;
  1686.     vec_u8_t pix1v, pix2v;
  1687.     vec_u32_t s1v, s2v, ssv, s12v;
  1688.     PREP_LOAD;
  1689.     LOAD_ZERO;
  1690.     s1v = s2v = ssv = s12v = zero_u32v;
  1691.     for(y=0; y<4; y++)
  1692.     {
  1693.         VEC_LOAD( &pix1[y*stride1], pix1v, 16, vec_u8_t );
  1694.         VEC_LOAD( &pix2[y*stride2], pix2v, 16, vec_u8_t );
  1695.         s1v = vec_sum4s( pix1v, s1v );
  1696.         s2v = vec_sum4s( pix2v, s2v );
  1697.         ssv = vec_msum( pix1v, pix1v, ssv );
  1698.         ssv = vec_msum( pix2v, pix2v, ssv );
  1699.         s12v = vec_msum( pix1v, pix2v, s12v );
  1700.     }
  1701.     vec_st( (vec_s32_t)s1v, 0, temp );
  1702.     sums[0][0] = temp[0];
  1703.     sums[1][0] = temp[1];
  1704.     vec_st( (vec_s32_t)s2v, 0, temp );
  1705.     sums[0][1] = temp[0];
  1706.     sums[1][1] = temp[1];
  1707.     vec_st( (vec_s32_t)ssv, 0, temp );
  1708.     sums[0][2] = temp[0];
  1709.     sums[1][2] = temp[1];
  1710.     vec_st( (vec_s32_t)s12v, 0, temp );
  1711.     sums[0][3] = temp[0];
  1712.     sums[1][3] = temp[1];
  1713. }
  1714. /****************************************************************************
  1715.  * x264_pixel_init:
  1716.  ****************************************************************************/
  1717. void x264_pixel_altivec_init( x264_pixel_function_t *pixf )
  1718. {
  1719.     pixf->sad[PIXEL_16x16]  = pixel_sad_16x16_altivec;
  1720.     pixf->sad[PIXEL_8x16]   = pixel_sad_8x16_altivec;
  1721.     pixf->sad[PIXEL_16x8]   = pixel_sad_16x8_altivec;
  1722.     pixf->sad[PIXEL_8x8]    = pixel_sad_8x8_altivec;
  1723.     pixf->sad_x3[PIXEL_16x16] = pixel_sad_x3_16x16_altivec;
  1724.     pixf->sad_x3[PIXEL_8x16]  = pixel_sad_x3_8x16_altivec;
  1725.     pixf->sad_x3[PIXEL_16x8]  = pixel_sad_x3_16x8_altivec;
  1726.     pixf->sad_x3[PIXEL_8x8]   = pixel_sad_x3_8x8_altivec;
  1727.     pixf->sad_x4[PIXEL_16x16] = pixel_sad_x4_16x16_altivec;
  1728.     pixf->sad_x4[PIXEL_8x16]  = pixel_sad_x4_8x16_altivec;
  1729.     pixf->sad_x4[PIXEL_16x8]  = pixel_sad_x4_16x8_altivec;
  1730.     pixf->sad_x4[PIXEL_8x8]   = pixel_sad_x4_8x8_altivec;
  1731.     pixf->satd[PIXEL_16x16] = pixel_satd_16x16_altivec;
  1732.     pixf->satd[PIXEL_8x16]  = pixel_satd_8x16_altivec;
  1733.     pixf->satd[PIXEL_16x8]  = pixel_satd_16x8_altivec;
  1734.     pixf->satd[PIXEL_8x8]   = pixel_satd_8x8_altivec;
  1735.     pixf->satd[PIXEL_8x4]   = pixel_satd_8x4_altivec;
  1736.     pixf->satd[PIXEL_4x8]   = pixel_satd_4x8_altivec;
  1737.     pixf->satd[PIXEL_4x4]   = pixel_satd_4x4_altivec;
  1738.     
  1739.     pixf->ssd[PIXEL_16x16] = pixel_ssd_16x16_altivec;
  1740.     pixf->ssd[PIXEL_8x8]   = pixel_ssd_8x8_altivec;
  1741.     pixf->sa8d[PIXEL_16x16] = pixel_sa8d_16x16_altivec;
  1742.     pixf->sa8d[PIXEL_8x8]   = pixel_sa8d_8x8_altivec;
  1743.     pixf->ssim_4x4x2_core = ssim_4x4x2_core_altivec;
  1744. }