x264的堆栈对齐 x264_stack_align

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


转载于:https://my.oschina.net/ljbiss/blog/167264

你可能感兴趣的:(x264的堆栈对齐 x264_stack_align)