> -----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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev