aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-08-28 21:14:13 +0200
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2011-09-21 23:49:43 +0200
commitcc0ac0244189cfcda258cad996f468c48eca01ff (patch)
treec246371a6d040149fbf1b1eddef7ed252824a1ef
parent3de5c435707cc815812febb8ac2fc5814216b1d8 (diff)
downloadffmpeg-cc0ac0244189cfcda258cad996f468c48eca01ff.tar.gz
Hack around gcc 4.6 breaking asm using call.
gcc 4.6 no longer decrements esp to account for local variables. Thus using call will end up overwriting some local variable. So add an extra one it can safely clobber. This is a huge hack because it's basically pure chance it works, no idea how this is supposed to be done. Fixes trac ticket #397. Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de> (cherry picked from commit c928e9172928f3cddab949b107dd53b6bf79555e)
-rw-r--r--libswscale/x86/swscale_template.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libswscale/x86/swscale_template.c b/libswscale/x86/swscale_template.c
index 87248e76fa..533a7416e5 100644
--- a/libswscale/x86/swscale_template.c
+++ b/libswscale/x86/swscale_template.c
@@ -2285,6 +2285,10 @@ static void RENAME(hyscale_fast)(SwsContext *c, int16_t *dst,
#if defined(PIC)
DECLARE_ALIGNED(8, uint64_t, ebxsave);
#endif
+ // HACK: gcc 4.6 no longer decrements esp,
+ // use this to make it reserve space for the call
+ // return address
+ void *dummy;
__asm__ volatile(
#if defined(PIC)
@@ -2336,6 +2340,7 @@ static void RENAME(hyscale_fast)(SwsContext *c, int16_t *dst,
#if defined(PIC)
,"m" (ebxsave)
#endif
+ ,"m" (dummy)
: "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_S, "%"REG_D
#if !defined(PIC)
,"%"REG_b
@@ -2357,6 +2362,10 @@ static void RENAME(hcscale_fast)(SwsContext *c, int16_t *dst1, int16_t *dst2,
#if defined(PIC)
DECLARE_ALIGNED(8, uint64_t, ebxsave);
#endif
+ // HACK: gcc 4.6 no longer decrements esp,
+ // use this to make it reserve space for the call
+ // return address
+ void *dummy;
__asm__ volatile(
#if defined(PIC)
@@ -2396,6 +2405,7 @@ static void RENAME(hcscale_fast)(SwsContext *c, int16_t *dst1, int16_t *dst2,
#if defined(PIC)
,"m" (ebxsave)
#endif
+ ,"m" (dummy)
: "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_S, "%"REG_D
#if !defined(PIC)
,"%"REG_b