[x264-devel] Windows x64 support

Loren Merritt lorenm at u.washington.edu
Thu Dec 18 01:34:51 CET 2008


On Thu, 18 Dec 2008, BugMaster wrote:

what's the _ doing in _WIN64 ?

> @@ -189,6 +197,9 @@ cglobal x264_add8x8_idct_sse2, 2,2
>  %macro SUB_NxN_DCT 6
>  cglobal %1, 3,3
>  .skip_prologue:
> +%ifdef _WIN64
> +    sub  rsp, 8
> +%endif
>      call %2
>      add  r0, %3
>      add  r1, %4-%5-%6*FENC_STRIDE
> @@ -201,7 +212,13 @@ cglobal %1, 3,3
>      add  r0, %3
>      add  r1, %4-%5-%6*FENC_STRIDE
>      add  r2, %4-%5-%6*FDEC_STRIDE
> +%ifdef _WIN64
> +    call %2
> +    add  rsp, 8
> +    RET
> +%else
>      jmp  %2
> +%endif
>  %endmacro

can't you keep the jmp here? there's no epilogue.

> --- a/common/x86/mc-a.asm
> +++ b/common/x86/mc-a.asm
> @@ -49,9 +49,15 @@ SECTION .text
>      %define t5 r5
>      %define t6d r10d
>      %define t7d r11d
> -    %macro AVG_START 0
> -        PROLOGUE 6,7
> -        .height_loop:
> +    %macro AVG_START 0-1
> +        %if %0 > 0
> +            PROLOGUE 6,7,%1
> +        %else
> +            PROLOGUE 6,7
> +        %endif

%macro AVG_START 0-1 0
     PROLOGUE 6,7,%1

> @@ -719,8 +758,8 @@ cglobal x264_prefetch_ref_mmxext, 3,3
>  ;                             int dx, int dy,
>  ;                             int width, int height )
>  ;-----------------------------------------------------------------------------
> -%macro MC_CHROMA 1
> -cglobal x264_mc_chroma_%1, 0,6
> +%macro MC_CHROMA 2
> +cglobal x264_mc_chroma_%1, 0,6,%2
>  %if mmsize == 16
>      cmp dword r6m, 4
>      jle x264_mc_chroma_mmxext %+ .skip_prologue
> @@ -877,12 +916,12 @@ cglobal x264_mc_chroma_%1, 0,6
>  %endmacro ; MC_CHROMA
>
>  INIT_MMX
> -MC_CHROMA mmxext
> +MC_CHROMA mmxext, 8

0

> +x264_dequant_%2x%2_%1.skip_prologue:
> [...]
> +    jl x264_dequant_%2x%2_%1.skip_prologue

.skip_prologue:
[...]
     jl x264_dequant_%2x%2_%1 %+ .skip_prologue

> @@ -539,9 +539,16 @@ INTRA_SAD16 ssse3
>
>  %macro SAD_X3_END 0
>  %ifdef ARCH_X86_64
> +%ifdef _WIN64
> +    mov     r0, r5m
> +    movd    [r0+0], mm0
> +    movd    [r0+4], mm1
> +    movd    [r0+8], mm2
> +%else
>      movd    [r5+0], mm0
>      movd    [r5+4], mm1
>      movd    [r5+8], mm2
> +%endif
>  %else
>      mov     r0, r5m
>      movd    [r0+0], mm0

%ifdef WIN64
%elifdef ARCH_X86_64
%else

> +%ifdef _WIN64
> +    movsxd r5, r5d
> +    sub  rsp, 24
> +    mov  [rsp],    r2
> +    mov  [rsp+8],  r3
> +    mov  [rsp+16], r4
> +%else
>      push r4
>      push r3
>      push r2
> +%endif

what's the difference?

> +++ b/common/x86/x86inc.asm

consistent 4 space indent, please

> +    %if %0 > 2
> +      %assign xmm_regs_used %3
> +    %else
> +      %assign xmm_regs_used 0
> +    %endif

yasm has a syntax for default args.

> @@ -253,6 +253,8 @@ case $host_cpu in
>        ASFLAGS="-f macho64 -m amd64 -DPIC -DPREFIX"
>        CFLAGS="$CFLAGS -arch x86_64"
>        LDFLAGS="$LDFLAGS -arch x86_64"
> +    elif [ "$SYS" = MINGW ]; then
> +      ASFLAGS="-f win64 -m amd64 -DPREFIX -D_WIN64"
>      else
>        ASFLAGS="-f elf -m amd64"
>      fi

I prefer ffmpeg's version, which is
ASFLAGS="-f win32 -m amd64 -DPREFIX"
[...]
%ifdef ARCH_X86_64
%ifidn __OUTPUT_FORMAT__,win32
%define WIN64



I would fix these myself, except that I'm not about to apply a patch 
without someone testing the final version.

--Loren Merritt


More information about the x264-devel mailing list