Hi,

the makro defines for amd64 can't work this way as it include the
parameter types in the function call (see buildd log).

To fix this it is simplest if on amd64 the original functions are
called and on i386 the wrapper. To do this the OIL_DEFINE_IMPL_FULL
makro has to be replaced by an extended version incorporating the
wrapper code from the old patch like this:

#if defined(__i386__)
#define OIL_DEFINE_IMPL_FULL_WRAPPER(sse_name, name, flags, ret, ...)   \
    ret sse_name(__VA_ARGS__) __attribute__((used));                    \
    ret sse_name ## _wrap (__VA_ARGS__) {                               \
        OIL_SSE_WRAPPER_CALL(sse_name);                                 \
    }                                                                   \
    OIL_DEFINE_IMPL_FULL(sse_name ## _wrap, name, flags);

#define OIL_SSE_WRAPPER_CALL(name)                                      \
    asm volatile(                                                       \
            "\n\t"                                                      \
            "subl $0x10,%%esp\n\t"                                      \
            "andl $0xfffffff0,%%esp\n\t"                                \
                                                                        \
            "movdqu 8(%%ebp),%%xmm0\n\t"                                \
            "movdqa %%xmm0,(%%esp)\n\t"                                 \
                                                                        \
            "call " #name "\n\t"                                        \
            "movl %%ebp,%%esp\n\t"                                      \
            : :                                                         \
            : "eax","ecx","edx","xmm0")

#elif defined(__amd64__)

/* Needed because we call *_wrap. Should get optimized away anyway */ 

#define OIL_DEFINE_IMPL_FULL_WRAPPER(sse_name, name, flags, ret, ...)   \
    OIL_DEFINE_IMPL_FULL(sse_name, name, flags);

#else
#error Can't use sse on !i386 and !amd64
#endif



The usage then change as the the makros get compined into a signle
call. This mean

OIL_SSE_WRAPPER(composite_over_argb_const_src_sse, static void, 
    uint32_t *dest, const uint32_t *src, int n)

OIL_DEFINE_IMPL_FULL (composite_over_argb_const_src_sse_wrap,
    composite_over_argb_const_src, OIL_IMPL_FLAG_SSE2);


becomes

OIL_DEFINE_IMPL_FULL (composite_over_argb_const_src_sse,
    composite_over_argb_const_src, OIL_IMPL_FLAG_SSE2,
    static void, 
    uint32_t *dest, const uint32_t *src, int n);



Is that enough for you to fix this?

MfG
        Goswin


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to