summaryrefslogtreecommitdiff
path: root/libswscale
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-08-28 21:14:13 +0200
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-09-20 19:05:51 +0200
commitc928e9172928f3cddab949b107dd53b6bf79555e (patch)
tree9677a9a52599fb40b5cce285be6edbe1994be9ea /libswscale
parentcadbe4ecd19a8bba01f51342dc3d8c157737167e (diff)
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>
Diffstat (limited to 'libswscale')
-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 35839bed03..6a143f7481 100644
--- a/libswscale/x86/swscale_template.c
+++ b/libswscale/x86/swscale_template.c
@@ -1963,6 +1963,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)
@@ -2014,6 +2018,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
@@ -2035,6 +2040,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)
@@ -2074,6 +2083,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