comparison simple_idct.c @ 215:1fe6b64feefb libavcodec

Small simple idct improvement for Alpha by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
author nickols_k
date Mon, 21 Jan 2002 17:46:42 +0000
parents 73df666cacc7
children 5a8eb5cf9f92
comparison
equal deleted inserted replaced
214:73df666cacc7 215:1fe6b64feefb
102 102
103 return 1; 103 return 1;
104 } 104 }
105 105
106 #ifdef ARCH_ALPHA 106 #ifdef ARCH_ALPHA
107 /* 0: all entries 0, 1: only first entry nonzero, 2: otherwise */
107 static int inline idctRowCondDC(int16_t *row) 108 static int inline idctRowCondDC(int16_t *row)
108 { 109 {
109 int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3; 110 int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3;
110 uint64_t *lrow = (uint64_t *) row; 111 uint64_t *lrow = (uint64_t *) row;
111 112
199 row[4] = (a3 - b3) >> ROW_SHIFT; 200 row[4] = (a3 - b3) >> ROW_SHIFT;
200 row[5] = (a2 - b2) >> ROW_SHIFT; 201 row[5] = (a2 - b2) >> ROW_SHIFT;
201 row[6] = (a1 - b1) >> ROW_SHIFT; 202 row[6] = (a1 - b1) >> ROW_SHIFT;
202 row[7] = (a0 - b0) >> ROW_SHIFT; 203 row[7] = (a0 - b0) >> ROW_SHIFT;
203 204
204 return 1; 205 return 2;
205 } 206 }
206 #else /* not ARCH_ALPHA */ 207 #else /* not ARCH_ALPHA */
207 static int inline idctRowCondDC (int16_t * row) 208 static int inline idctRowCondDC (int16_t * row)
208 { 209 {
209 int a0, a1, a2, a3, b0, b1, b2, b3; 210 int a0, a1, a2, a3, b0, b1, b2, b3;
545 { 546 {
546 for(i=0; i<8; i++) 547 for(i=0; i<8; i++)
547 idctSparse2Col(block + i); 548 idctSparse2Col(block + i);
548 } 549 }
549 #elif defined(ARCH_ALPHA) 550 #elif defined(ARCH_ALPHA)
550 int shortcut = 1; 551 int rowsZero = 1; /* all rows except row 0 zero */
552 int rowsConstant = 1; /* all rows consist of a constant value */
551 553
552 for (i = 0; i < 8; i++) { 554 for (i = 0; i < 8; i++) {
553 int anynonzero = idctRowCondDC(block + 8 * i); 555 int sparseness = idctRowCondDC(block + 8 * i);
554 if (i > 0 && anynonzero) 556
555 shortcut = 0; 557 if (i > 0 && sparseness > 0)
556 } 558 rowsZero = 0;
557 559 if (sparseness == 2)
558 if (shortcut) { 560 rowsConstant = 0;
559 idctCol2(block); 561 }
562
563 if (rowsZero) {
564 idctCol2(block);
565 } else if (rowsConstant) {
566 uint64_t *lblock = (uint64_t *) block;
567
568 idctSparseCol(block);
569 for (i = 0; i < 8; i++) {
570 uint64_t v = (uint16_t) block[i * 8];
571
572 v += v << 16;
573 v += v << 32;
574 lblock[0] = v;
575 lblock[1] = v;
576 lblock += 2;
577 }
560 } else { 578 } else {
561 for (i = 0; i < 8; i++) 579 for (i = 0; i < 8; i++)
562 idctSparseCol(block + i); 580 idctSparseCol(block + i);
563 } 581 }
564 #else 582 #else