[svn] / trunk / xvidcore / src / motion / ppc_asm / sad_altivec.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/motion/ppc_asm/sad_altivec.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 98, Wed Apr 3 14:17:05 2002 UTC revision 195, Wed Jun 12 20:38:41 2002 UTC
# Line 17  Line 17 
17      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18    
19    
20      $Id: sad_altivec.c,v 1.1 2002-04-03 14:17:05 canard Exp $      $Id: sad_altivec.c,v 1.3 2002-06-12 20:38:40 edgomez Exp $
21      $Source: /home/xvid/cvs_copy/cvs-server-root/xvid/xvidcore/src/motion/ppc_asm/sad_altivec.c,v $      $Source: /home/xvid/cvs_copy/cvs-server-root/xvid/xvidcore/src/motion/ppc_asm/sad_altivec.c,v $
22      $Date: 2002-04-03 14:17:05 $      $Date: 2002-06-12 20:38:40 $
23      $Author: canard $      $Author: edgomez $
24    
25  */  */
26    
27    #define G_REG
28    
29    #ifdef G_REG
30    register vector unsigned char perm0 asm("%v29");
31    register vector unsigned char perm1 asm("%v30");
32    register vector unsigned int zerovec asm("%v31");
33    #endif
34    
35  #include <stdio.h>  #include <stdio.h>
36    
37  #undef DEBUG  #undef DEBUG
38    
39    static const vector unsigned char perms[2] = {
40            (vector unsigned char) (        /* Used when cur is aligned */
41                                                               0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
42                                                               0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17),
43            (vector unsigned char) (        /* Used when cur is unaligned */
44                                                               0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
45                                                               0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f),
46    };
47    
48    #ifdef G_REG
49    void
50    sadInit_altivec(void)
51    {
52            perm0 = perms[0];
53            perm1 = perms[1];
54            zerovec = (vector unsigned int) (0);
55    }
56    static inline const vector unsigned char
57    get_perm(unsigned long i)
58    {
59            return i ? perm1 : perm0;
60    }
61    
62    #define ZERODEF
63    #define ZEROVEC zerovec
64    #else
65    void
66    sadInit_altivec(void)
67    {
68    }
69    static inline const vector unsigned char
70    get_perm(unsigned long i)
71    {
72            return perms[i];
73    }
74    
75    #define ZERODEF vector unsigned int zerovec = (vector unsigned int)(0)
76    #define ZEROVEC zerovec
77    #endif
78    
79    
80  #define SAD16() \  #define SAD16() \
81  t1  = vec_perm(ref[0], ref[1], perm);  /* align current vector  */ \  t1  = vec_perm(ref[0], ref[1], perm);  /* align current vector  */ \
82  t2  = vec_max(t1, *cur);         /* find largest of two           */ \  t2  = vec_max(t1, *cur);         /* find largest of two           */ \
# Line 47  Line 96 
96  {  {
97    vector unsigned char perm;    vector unsigned char perm;
98    vector unsigned char t1, t2, t3, t4 ;    vector unsigned char t1, t2, t3, t4 ;
99    vector unsigned int sad, zero;          vector unsigned int sad;
100    vector signed int sumdiffs, best_vec;    vector signed int sumdiffs, best_vec;
101    unsigned long result;    unsigned long result;
102    
103            ZERODEF;
104    
105  #ifdef DEBUG  #ifdef DEBUG
106    if (((unsigned long)cur) & 0xf)    if (((unsigned long)cur) & 0xf)
107          fprintf(stderr, "sad16_altivec:incorrect align, cur: %x\n", cur);          fprintf(stderr, "sad16_altivec:incorrect align, cur: %x\n", cur);
# Line 60  Line 111 
111          fprintf(stderr, "sad16_altivec:incorrect align, stride: %x\n", stride);          fprintf(stderr, "sad16_altivec:incorrect align, stride: %x\n", stride);
112  #endif  #endif
113    /* initialization */    /* initialization */
114    zero = (vector unsigned int)(0);          sad = (vector unsigned int) (ZEROVEC);
   sad  = (vector unsigned int)(0);  
115    stride >>= 4;    stride >>= 4;
116    perm = vec_lvsl(0, (unsigned char *)ref);    perm = vec_lvsl(0, (unsigned char *)ref);
117    *((unsigned long *)&best_vec) = best_sad;    *((unsigned long *)&best_vec) = best_sad;
# Line 73  Line 123 
123    SAD16();    SAD16();
124    SAD16();    SAD16();
125    /* Temp sum for exit */    /* Temp sum for exit */
126    sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);          sumdiffs = vec_sums((vector signed int) sad, (vector signed int) ZEROVEC);
127    if (vec_all_ge(sumdiffs, best_vec))    if (vec_all_ge(sumdiffs, best_vec))
128          goto bail;          goto bail;
129    SAD16();    SAD16();
130    SAD16();    SAD16();
131    SAD16();    SAD16();
132    SAD16();    SAD16();
133    sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);          sumdiffs = vec_sums((vector signed int) sad, (vector signed int) ZEROVEC);
134    if (vec_all_ge(sumdiffs, best_vec))    if (vec_all_ge(sumdiffs, best_vec))
135          goto bail;          goto bail;
136    SAD16();    SAD16();
# Line 93  Line 143 
143    SAD16();    SAD16();
144    
145    /* sum all parts of difference into one 32 bit quantity */    /* sum all parts of difference into one 32 bit quantity */
146    sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);          sumdiffs = vec_sums((vector signed int) sad, (vector signed int) ZEROVEC);
147  bail:  bail:
148    /* copy vector sum into unaligned result */    /* copy vector sum into unaligned result */
149    sumdiffs = vec_splat( sumdiffs, 3 );    sumdiffs = vec_splat( sumdiffs, 3 );
# Line 112  Line 162 
162  sad = vec_sum4s(t5, sad);                /* accumulate sum of differences */ \  sad = vec_sum4s(t5, sad);                /* accumulate sum of differences */ \
163  cur += stride<<1; ref += stride<<1;  cur += stride<<1; ref += stride<<1;
164    
 static const vector unsigned char perms[2] = {  
         (vector unsigned char)( /* Used when cur is aligned */  
                 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  
                 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17  
         ),  
         (vector unsigned char)( /* Used when cur is unaligned */  
                 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,  
                 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f  
         ),  
 };  
   
165  /*  /*
166   * This function assumes cur is 8 bytes aligned, stride is 16 bytes   * This function assumes cur is 8 bytes aligned, stride is 16 bytes
167   * aligned and ref is unaligned   * aligned and ref is unaligned
# Line 133  Line 172 
172                  unsigned long stride)                  unsigned long stride)
173  {  {
174    vector unsigned char t1, t2, t3, t4, t5, tp ;    vector unsigned char t1, t2, t3, t4, t5, tp ;
175    vector unsigned int sad, zero;          vector unsigned int sad;
176    vector signed int sumdiffs;    vector signed int sumdiffs;
177    vector unsigned char perm_cur;    vector unsigned char perm_cur;
178    vector unsigned char perm_ref1, perm_ref2;    vector unsigned char perm_ref1, perm_ref2;
179    unsigned long result;    unsigned long result;
180    
181            ZERODEF;
182    
183  #ifdef DEBUG  #ifdef DEBUG
184    if (((unsigned long)cur) & 0x7)    if (((unsigned long)cur) & 0x7)
185          fprintf(stderr, "sad8_altivec:incorrect align, cur: %x\n", cur);          fprintf(stderr, "sad8_altivec:incorrect align, cur: %x\n", cur);
# Line 148  Line 189 
189          fprintf(stderr, "sad8_altivec:incorrect align, stride: %x\n", stride);          fprintf(stderr, "sad8_altivec:incorrect align, stride: %x\n", stride);
190  #endif  #endif
191    
192    perm_cur = perms[(((unsigned long)cur)>>3) & 0x01];          perm_cur = get_perm((((unsigned long) cur) >> 3) & 0x01);
193    perm_ref1 = vec_lvsl(0, (unsigned char *)ref);    perm_ref1 = vec_lvsl(0, (unsigned char *)ref);
194    perm_ref2 = perms[0];          perm_ref2 = get_perm(0);
195    
196    /* initialization */    /* initialization */
197    zero = (vector unsigned int)(0);          sad = (vector unsigned int) (ZEROVEC);
   sad  = (vector unsigned int)(0);  
198    stride >>= 4;    stride >>= 4;
199    
200    /* perform sum of differences between current and previous */    /* perform sum of differences between current and previous */
# Line 164  Line 204 
204    SAD8();    SAD8();
205    
206    /* sum all parts of difference into one 32 bit quantity */    /* sum all parts of difference into one 32 bit quantity */
207    sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);          sumdiffs = vec_sums((vector signed int) sad, (vector signed int) ZEROVEC);
208    
209    /* copy vector sum into unaligned result */    /* copy vector sum into unaligned result */
210    sumdiffs = vec_splat( sumdiffs, 3 );    sumdiffs = vec_splat( sumdiffs, 3 );
# Line 188  Line 228 
228                  unsigned long stride)                  unsigned long stride)
229  {  {
230    vector unsigned char t2,t3,t4, mn;    vector unsigned char t2,t3,t4, mn;
231    vector unsigned int mean, dev, zero;          vector unsigned int mean, dev;
232    vector signed int sumdiffs;    vector signed int sumdiffs;
233    vector unsigned char c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15;          vector unsigned char c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12,
234                    c13, c14, c15;
235    unsigned long result;    unsigned long result;
236    
237    zero = (vector unsigned int)(0);          ZERODEF;
238    mean = (vector unsigned int)(0);  
239    dev = (vector unsigned int)(0);          mean = (vector unsigned int) (ZEROVEC);
240            dev = (vector unsigned int) (ZEROVEC);
241    stride >>= 4;    stride >>= 4;
242    
243    MEAN16(0);    MEAN16(0);
# Line 215  Line 257 
257    MEAN16(14);    MEAN16(14);
258    MEAN16(15);    MEAN16(15);
259    
260    sumdiffs = vec_sums((vector signed int) mean, (vector signed int) zero);          sumdiffs = vec_sums((vector signed int) mean, (vector signed int) ZEROVEC);
261    mn = vec_perm((vector unsigned char)sumdiffs, (vector unsigned char)sumdiffs,          mn = vec_perm((vector unsigned char) sumdiffs,
262          (vector unsigned char)(14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14));                                    (vector unsigned char) sumdiffs, (vector unsigned char) (14,
263                                                                                                                                                       14,
264                                                                                                                                                       14,
265                                                                                                                                                       14,
266                                                                                                                                                       14,
267                                                                                                                                                       14,
268                                                                                                                                                       14,
269                                                                                                                                                       14,
270                                                                                                                                                       14,
271                                                                                                                                                       14,
272                                                                                                                                                       14,
273                                                                                                                                                       14,
274                                                                                                                                                       14,
275                                                                                                                                                       14,
276                                                                                                                                                       14,
277                                                                                                                                                       14));
278    DEV16(0);    DEV16(0);
279    DEV16(1);    DEV16(1);
280    DEV16(2);    DEV16(2);
# Line 236  Line 293 
293    DEV16(15);    DEV16(15);
294    
295    /* sum all parts of difference into one 32 bit quantity */    /* sum all parts of difference into one 32 bit quantity */
296    sumdiffs = vec_sums((vector signed int) dev, (vector signed int) zero);          sumdiffs = vec_sums((vector signed int) dev, (vector signed int) ZEROVEC);
297    
298    /* copy vector sum into unaligned result */    /* copy vector sum into unaligned result */
299    sumdiffs = vec_splat( sumdiffs, 3 );    sumdiffs = vec_splat( sumdiffs, 3 );

Legend:
Removed from v.98  
changed lines
  Added in v.195

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4