mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
ps2 idct bugfix patch by (Leon van Stuivenberg <leonvs at iae dot nl>)
Originally committed as revision 970 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
9e4c69485b
commit
b560f4b656
@ -16,26 +16,11 @@
|
||||
|
||||
#define BITS_INV_ACC 5 // 4 or 5 for IEEE
|
||||
#define SHIFT_INV_ROW (16 - BITS_INV_ACC)
|
||||
#define SHIFT_INV_COL (BITS_INV_ACC) //(1 + BITS_INV_ACC) no, FP15 is used
|
||||
|
||||
#define Rounder_0 0
|
||||
#define Rounder_1 16
|
||||
#define Rounder_2 32
|
||||
#define Rounder_3 48
|
||||
#define Rounder_4 64
|
||||
#define Rounder_5 80
|
||||
#define Rounder_6 96
|
||||
#define Rounder_7 112
|
||||
#define SHIFT_INV_COL (1 + BITS_INV_ACC)
|
||||
|
||||
// assume SHIFT_INV_ROW == 11
|
||||
static int roundertable[8][4] align16 = {
|
||||
{65535, 65535, 65535, 65535},
|
||||
{ 1023, 1023, 1023, 1023},
|
||||
{ 1023, 1023, 1023, 1023},
|
||||
{ 1023, 1023, 1023, 1023},
|
||||
{ 0, 0, 0, 0},
|
||||
{ 1023, 1023, 1023, 1023},
|
||||
{ 1023, 1023, 1023, 1023},
|
||||
{ 0x103ff, 0x103ff, 0x103ff, 0x103ff },
|
||||
{ 1023, 1023, 1023, 1023}
|
||||
};
|
||||
|
||||
@ -97,7 +82,7 @@ static short coltable[7][8] align16 = {
|
||||
#define noprevh(rt, rd)
|
||||
|
||||
|
||||
#define DCT_8_INV_ROW1(rowoff, taboff, rounder, outreg) { \
|
||||
#define DCT_8_INV_ROW1(rowoff, taboff, rnd, outreg) { \
|
||||
\
|
||||
lq($4, rowoff, $16); /* r16 = x7 x6 x5 x4 x3 x2 x1 x0 */ \
|
||||
lq($24, 0+taboff, $17); /* r17 = w19 w17 w3 w1 w18 w16 w2 w0 */ \
|
||||
@ -114,7 +99,6 @@ static short coltable[7][8] align16 = {
|
||||
paddw($18, $21, $18); /* r18 = (--)(--)(b1)(a1) */ \
|
||||
pcpyud($19, $19, $21); \
|
||||
phmadh($20, $16, $20); /* r12 = (b3'')(a3'')(b3')(a3') */ \
|
||||
lq($7, rounder, $22); /* r22 = rounder */ \
|
||||
paddw($19, $21, $19); /* r19 = (--)(--)(b2)(a2) */ \
|
||||
pextlw($19, $17, $16); /* r16 = (b2)(b0)(a2)(a0) */ \
|
||||
pcpyud($20, $20, $21); \
|
||||
@ -122,7 +106,7 @@ static short coltable[7][8] align16 = {
|
||||
pextlw($20, $18, $17); /* r17 = (b3)(b1)(a3)(a1) */ \
|
||||
pextlw($17, $16, $20); /* r20 = (a3)(a2)(a1)(a0)" */ \
|
||||
pextuw($17, $16, $21); /* r21 = (b3)(b2)(b1)(b0) */ \
|
||||
paddw($20, $22, $20); /* r20 = (a3)(a2)(a1)(a0) */\
|
||||
paddw($20, rnd, $20); /* r20 = (a3)(a2)(a1)(a0) */\
|
||||
paddw($20, $21, $17); /* r17 = ()()()(a0+b0) */ \
|
||||
psubw($20, $21, $18); /* r18 = ()()()(a0-b0) */ \
|
||||
psraw($17, SHIFT_INV_ROW, $17); /* r17 = (y3 y2 y1 y0) */ \
|
||||
@ -173,8 +157,8 @@ static short coltable[7][8] align16 = {
|
||||
\
|
||||
paddw($16, $20, $2); /* y0 a0+b0 */ \
|
||||
psubw($16, $20, $16); /* y7 a0-b0 */ \
|
||||
psraw($2, SHIFT_INV_COL+16, $2); \
|
||||
psraw($16, SHIFT_INV_COL+16, $16); \
|
||||
psraw($2, SHIFT_INV_COL+15, $2); \
|
||||
psraw($16, SHIFT_INV_COL+15, $16); \
|
||||
ppach($0, $2, $2); \
|
||||
ppach($0, $16, $16); \
|
||||
revop($2, $2); \
|
||||
@ -184,8 +168,8 @@ static short coltable[7][8] align16 = {
|
||||
\
|
||||
paddw($17, $21, $3); /* y1 a1+b1 */ \
|
||||
psubw($17, $21, $17); /* y6 a1-b1 */ \
|
||||
psraw($3, SHIFT_INV_COL+16, $3); \
|
||||
psraw($17, SHIFT_INV_COL+16, $17); \
|
||||
psraw($3, SHIFT_INV_COL+15, $3); \
|
||||
psraw($17, SHIFT_INV_COL+15, $17); \
|
||||
ppach($0, $3, $3); \
|
||||
ppach($0, $17, $17); \
|
||||
revop($3, $3); \
|
||||
@ -195,8 +179,8 @@ static short coltable[7][8] align16 = {
|
||||
\
|
||||
paddw($18, $22, $2); /* y2 a2+b2 */ \
|
||||
psubw($18, $22, $18); /* y5 a2-b2 */ \
|
||||
psraw($2, SHIFT_INV_COL+16, $2); \
|
||||
psraw($18, SHIFT_INV_COL+16, $18); \
|
||||
psraw($2, SHIFT_INV_COL+15, $2); \
|
||||
psraw($18, SHIFT_INV_COL+15, $18); \
|
||||
ppach($0, $2, $2); \
|
||||
ppach($0, $18, $18); \
|
||||
revop($2, $2); \
|
||||
@ -206,8 +190,8 @@ static short coltable[7][8] align16 = {
|
||||
\
|
||||
paddw($19, $23, $3); /* y3 a3+b3 */ \
|
||||
psubw($19, $23, $19); /* y4 a3-b3 */ \
|
||||
psraw($3, SHIFT_INV_COL+16, $3); \
|
||||
psraw($19, SHIFT_INV_COL+16, $19); \
|
||||
psraw($3, SHIFT_INV_COL+15, $3); \
|
||||
psraw($19, SHIFT_INV_COL+15, $19); \
|
||||
ppach($0, $3, $3); \
|
||||
ppach($0, $19, $19); \
|
||||
revop($3, $3); \
|
||||
@ -220,16 +204,18 @@ static short coltable[7][8] align16 = {
|
||||
void ff_mmi_idct(int16_t * block)
|
||||
{
|
||||
/* $4 = block */
|
||||
__asm__ __volatile__("la $24, %0"::"m"(rowtable[0][0]));
|
||||
__asm__ __volatile__("la $7, %0"::"m"(roundertable[0][0]));
|
||||
DCT_8_INV_ROW1(0, TAB_i_04, Rounder_0, $8);
|
||||
DCT_8_INV_ROW1(16, TAB_i_17, Rounder_1, $9);
|
||||
DCT_8_INV_ROW1(32, TAB_i_26, Rounder_2, $10);
|
||||
DCT_8_INV_ROW1(48, TAB_i_35, Rounder_3, $11);
|
||||
DCT_8_INV_ROW1(64, TAB_i_04, Rounder_4, $12);
|
||||
DCT_8_INV_ROW1(80, TAB_i_35, Rounder_5, $13);
|
||||
DCT_8_INV_ROW1(96, TAB_i_26, Rounder_6, $14);
|
||||
DCT_8_INV_ROW1(112, TAB_i_17, Rounder_7, $15);
|
||||
__asm__ __volatile__("la $24, %0"::"m"(rowtable[0][0]));
|
||||
lq($7, 0, $6);
|
||||
lq($7, 16, $7);
|
||||
DCT_8_INV_ROW1(0, TAB_i_04, $6, $8);
|
||||
DCT_8_INV_ROW1(16, TAB_i_17, $7, $9);
|
||||
DCT_8_INV_ROW1(32, TAB_i_26, $7, $10);
|
||||
DCT_8_INV_ROW1(48, TAB_i_35, $7, $11);
|
||||
DCT_8_INV_ROW1(64, TAB_i_04, $7, $12);
|
||||
DCT_8_INV_ROW1(80, TAB_i_35, $7, $13);
|
||||
DCT_8_INV_ROW1(96, TAB_i_26, $7, $14);
|
||||
DCT_8_INV_ROW1(112, TAB_i_17, $7, $15);
|
||||
|
||||
__asm__ __volatile__("la $24, %0"::"m"(coltable[0][0]));
|
||||
DCT_8_INV_COL4(pextlh, 0, noprevh);
|
||||
@ -237,5 +223,6 @@ void ff_mmi_idct(int16_t * block)
|
||||
|
||||
//let savedtemp regs be saved
|
||||
__asm__ __volatile__(" ":::"$16", "$17", "$18", "$19", "$20", "$21",
|
||||
"$22", "$23");
|
||||
"$22", "$23", "$6", "$7");
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user