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