aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMåns Rullgård <mans@mansr.com>2008-11-20 22:57:57 +0000
committerMåns Rullgård <mans@mansr.com>2008-11-20 22:57:57 +0000
commit516566a8ec3e16fb803f2d8851672c1c40df0f4b (patch)
tree472bd16c6f8e5825b54c1087fbc33074bb95f01a
parent4d382e20764989b7d4a935b8b39d0c969d0be05c (diff)
downloadffmpeg-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.c25
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)