[Mesa-dev] [PATCH] rtasm/translate_sse: support Win64

Vinson Lee vlee at vmware.com
Sun Aug 15 12:36:37 PDT 2010


> -----Original Message-----
> 
> I just discovered that Microsoft wisely decided to use their own
> calling convention on Win64...
>
> This hasn't actually been tested on Win64 though.

The 64-bit predefined macro is _WIN64.


> ---
>  src/gallium/auxiliary/rtasm/rtasm_x86sse.c      |   15 +++++++++++++++
>  src/gallium/auxiliary/translate/translate_sse.c |   21 +++++++++---------
> ---
>  2 files changed, 24 insertions(+), 12 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
> b/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
> index 6d6b76a..a076e17 100644
> --- a/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
> +++ b/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
> @@ -2090,6 +2090,20 @@ struct x86_reg x86_fn_arg( struct x86_function *p,
>  {
>     switch(arg)
>     {
> +/* Microsoft uses a different calling convention than the rest of the
> world */
> +#ifdef WIN64
> +   case 1:
> +      return x86_make_reg(file_REG32, reg_CX);
> +   case 2:
> +      return x86_make_reg(file_REG32, reg_DX);
> +   case 3:
> +      return x86_make_reg(file_REG32, reg_R8);
> +   case 4:
> +      return x86_make_reg(file_REG32, reg_R9);
> +   default:
> +      return x86_make_disp(x86_make_reg(file_REG32, reg_SP),
> +                           p->stack_offset + (arg - 4) * 8);     /* ???
> */
> +#else
>     case 1:
>        return x86_make_reg(file_REG32, reg_DI);
>     case 2:
> @@ -2105,6 +2119,7 @@ struct x86_reg x86_fn_arg( struct x86_function *p,
>     default:
>        return x86_make_disp(x86_make_reg(file_REG32, reg_SP),
>                             p->stack_offset + (arg - 6) * 8);     /* ???
> */
> +#endif
>     }
>  }
>  #else
> diff --git a/src/gallium/auxiliary/translate/translate_sse.c
> b/src/gallium/auxiliary/translate/translate_sse.c
> index e2d8d53..5dfb186 100644
> --- a/src/gallium/auxiliary/translate/translate_sse.c
> +++ b/src/gallium/auxiliary/translate/translate_sse.c
> @@ -1234,26 +1234,23 @@ static boolean build_vertex_emit( struct
> translate_sse *p,
> 
>     x86_init_func(p->func);
> 
> -#ifdef PIPE_ARCH_X86_64
>     x86_push(p->func, p->outbuf_EBX);
>     x86_push(p->func, p->count_EBP);
> 
> -   /* Load arguments into regs; the first two are already there */
> -   x86_mov(p->func, p->count_EBP, x86_fn_arg(p->func, 3));
> -   x64_mov64(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 5));
> -#else
> -   /* Push a few regs?
> -    */
> -   x86_push(p->func, p->outbuf_EBX);
> -   x86_push(p->func, p->count_EBP);
> +/* on non-Win64 x86-64, these are already in the right registers */
> +#if defined(PIPE_ARCH_X86) || defined(WIN64)
>     x86_push(p->func, p->machine_EDI);
>     x86_push(p->func, p->idx_ESI);
> 
> -   /* Load arguments into regs:
> -    */
>     x86_mov(p->func, p->machine_EDI, x86_fn_arg(p->func, 1));
>     x86_mov(p->func, p->idx_ESI, x86_fn_arg(p->func, 2));
> +#endif
> +
>     x86_mov(p->func, p->count_EBP, x86_fn_arg(p->func, 3));
> +
> +#ifdef PIPE_ARCH_X86_64
> +   x64_mov64(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 5));
> +#else
>     x86_mov(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 5));
>  #endif
> 
> @@ -1333,7 +1330,7 @@ static boolean build_vertex_emit( struct
> translate_sse *p,
>     /* Pop regs and return
>      */
> 
> -#ifndef PIPE_ARCH_X86_64
> +#if defined(PIPE_ARCH_X86) || defined(WIN64)
>     x86_pop(p->func, p->idx_ESI);
>     x86_pop(p->func, p->machine_EDI);
>  #endif
> --
> 1.7.0.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list