]> git.sesse.net Git - ffmpeg/commitdiff
x86inc: Avoid using eax/rax for storing the stack pointer
authorHenrik Gramner <henrik@gramner.com>
Sun, 25 Dec 2016 19:24:59 +0000 (20:24 +0100)
committerAnton Khirnov <anton@khirnov.net>
Mon, 9 Jan 2017 12:21:12 +0000 (13:21 +0100)
When allocating stack space with an alignment requirement that is larger
than the current stack alignment we need to store a copy of the original
stack pointer in order to be able to restore it later.

If we chose to use another register for this purpose we should not pick
eax/rax since it can be overwritten as a return value.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
libavutil/x86/x86inc.asm

index dca1f78409039d76359d3e42d456e3a660fbee71..7941af304a73d6688d295a849d5dbc2fad9d68ba 100644 (file)
@@ -385,7 +385,14 @@ DECLARE_REG_TMP_SIZE 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
     %ifnum %1
         %if %1 != 0 && required_stack_alignment > STACK_ALIGNMENT
             %if %1 > 0
+                ; Reserve an additional register for storing the original stack pointer, but avoid using
+                ; eax/rax for this purpose since it can potentially get overwritten as a return value.
                 %assign regs_used (regs_used + 1)
+                %if ARCH_X86_64 && regs_used == 7
+                    %assign regs_used 8
+                %elif ARCH_X86_64 == 0 && regs_used == 1
+                    %assign regs_used 2
+                %endif
             %endif
             %if ARCH_X86_64 && regs_used < 5 + UNIX64 * 3
                 ; Ensure that we don't clobber any registers containing arguments. For UNIX64 we also preserve r6 (rax)