[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