您的位置:首页 > 其它

x264的堆栈对齐 x264_stack_align

2013-11-13 16:58 176 查看
x264_stack_align

为什么要对齐,因为AVX2指令需要32字节对齐。

怎么对齐,在common/x86/cpu-a.asm

一句话,就是模拟一个空调用,这个调用只是对齐堆栈和转调真实的函数

%if ARCH_X86_64

;-----------------------------------------------------------------------------

; void stack_align( void (*func)(void*), void *arg );

;-----------------------------------------------------------------------------

cglobal stack_align

    push rbp            ;保存帧寄存器

    mov  rbp, rsp     ;保存rsp

%if WIN64

    sub  rsp, 32 ; shadow space  win64的调用惯例规定,请参看http://wiki.lazarus.freepascal.org/Win64/AMD64_API#Shadow_space

%endif

    and  rsp, ~31    ;保证32byte对齐。其实一句话,上面是模拟一个函调调用,并把堆栈指针32byte对齐,注意和下面的leave呼应。

    mov  rax, r0     ;把真实函数指针付给rax

    mov   r0, r1     ;把参数移到真实函数的参数中,真实函数应该不会使用多余三个的参数 :)        

    mov   r1, r2

    mov   r2, r3

    call rax           ;呼叫真实函数

    leave              ;恢复rsp,rbp,也就是模拟的函数调用返回,

    ret

%else

cglobal stack_align

    push ebp

    mov  ebp, esp

    sub  esp, 12    ;预留堆栈空间,保存至少三个参数

    and  esp, ~31  ;对齐堆栈

    mov  ecx, [ebp+8]  ;把第一个参数,真实的函数赋值给ECX, +8跳过old EIP和old EBP ,参考 http://www.unixwiz.net/techtips/win32-callconv-asm.html
    mov  edx, [ebp+12] ; 把后续的三个参数放在堆栈上

    mov  [esp], edx

    mov  edx, [ebp+16]

    mov  [esp+4], edx

    mov  edx, [ebp+20]

    mov  [esp+8], edx

    call ecx                ;呼叫真实的函数

    leave                   ;退出当前虚拟的函数调用

    ret

%endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codec x264 汇编 优化 avx