diff options
author | Måns Rullgård <mans@mansr.com> | 2008-11-20 22:57:57 +0000 |
---|---|---|
committer | Måns Rullgård <mans@mansr.com> | 2008-11-20 22:57:57 +0000 |
commit | 516566a8ec3e16fb803f2d8851672c1c40df0f4b (patch) | |
tree | 472bd16c6f8e5825b54c1087fbc33074bb95f01a | |
parent | 4d382e20764989b7d4a935b8b39d0c969d0be05c (diff) | |
download | ffmpeg-516566a8ec3e16fb803f2d8851672c1c40df0f4b.tar.gz |
SH4: fix IDCT
Originally committed as revision 15897 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/sh4/idct_sh4.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/libavcodec/sh4/idct_sh4.c b/libavcodec/sh4/idct_sh4.c index 3a524360a0..5c461e7917 100644 --- a/libavcodec/sh4/idct_sh4.c +++ b/libavcodec/sh4/idct_sh4.c @@ -21,6 +21,8 @@ */ #include "libavcodec/dsputil.h" +#include "sh4.h" + #define c1 1.38703984532214752434 /* sqrt(2)*cos(1*pi/16) */ #define c2 1.30656296487637657577 /* sqrt(2)*cos(2*pi/16) */ #define c3 1.17587560241935884520 /* sqrt(2)*cos(3*pi/16) */ @@ -51,9 +53,11 @@ static const float odd_table[] __attribute__ ((aligned(8))) = { #undef c6 #undef c7 -#if defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) +#if 1 #define load_matrix(table) \ + do { \ + const float *t = table; \ __asm__ volatile( \ " fschg\n" \ " fmov @%0+,xd0\n" \ @@ -65,15 +69,13 @@ static const float odd_table[] __attribute__ ((aligned(8))) = { " fmov @%0+,xd12\n" \ " fmov @%0+,xd14\n" \ " fschg\n" \ - :\ - : "r"(table)\ - : "0" \ - ) + : "+r"(t) \ + ); \ + } while (0) #define ftrv() \ __asm__ volatile("ftrv xmtrx,fv0" \ - : "=f"(fr0),"=f"(fr1),"=f"(fr2),"=f"(fr3) \ - : "0"(fr0), "1"(fr1), "2"(fr2), "3"(fr3) ); + : "+f"(fr0),"+f"(fr1),"+f"(fr2),"+f"(fr3)); #define DEFREG \ register float fr0 __asm__("fr0"); \ @@ -136,10 +138,9 @@ void idct_sh4(DCTELEM *block) int i; float tblock[8*8],*fblock; int ofs1,ofs2,ofs3; + int fpscr; -#if defined(__SH4__) - __asm__ ("fschg"); -#endif + fp_single_enter(fpscr); /* row */ @@ -248,9 +249,7 @@ void idct_sh4(DCTELEM *block) block++; } while(--i); -#if defined(__SH4__) - __asm__ ("fschg"); -#endif + fp_single_leave(fpscr); } #else void idct_sh4(DCTELEM *block) |