[cairo] Problem compiling pixman-sse.c under Win32, blame it on MSVC !!
Frédéric Plourde
frederic.plourde at polymtl.ca
Sun Jul 20 19:03:27 PDT 2008
Hi !
Vlad had emailled me with this problem compiling pixman sith SSE2
stuff enabled.
In fact, here are the errors that we got :
pixman-sse.c
pixman-sse.c(142) : error C2719: 'xmm3': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(195) : error C2719: 'alphaHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(210) : error C2719: 'alphaDstHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(210) : error C2719: 'dstLo': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(210) : error C2719: 'dstHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(210) : error C2719: 'alphaSrcLo': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(210) : error C2719: 'alphaSrcHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(246) : error C2719: 'alphaHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(276) : error C2719: 'alphaHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(276) : error C2719: 'maskLo': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(276) : error C2719: 'maskHi': formal parameter with
__declspec(align('16')) won't be aligned
pixman-sse.c(290) : warning C4133: 'function' : incompatible types -
from '__m128i *' to 'const char *'
pixman-sse.c(296) : warning C4133: 'function' : incompatible types -
from '__m128i *' to 'const char *'
pixman-sse.c(371) : error C2719: 'alphaSrc': formal parameter with
__declspec(align('8')) won't be aligned
pixman-sse.c(398) : error C2719: 'dst': formal parameter with
__declspec(align('8')) won't be aligned
pixman-sse.c(4432) : error C2275: '__m128i' : illegal use of this type
as an expression
D:\msvs8\VC\INCLUDE\emmintrin.h(45) : see declaration of '__m128i'
pixman-sse.c(4432) : error C2146: syntax error : missing ';' before
identifier 'xmm0'
pixman-sse.c(4432) : error C2065: 'xmm0' : undeclared identifier
pixman-sse.c(4432) : error C2065: 'xmm1' : undeclared identifier
pixman-sse.c(4432) : error C2065: 'xmm2' : undeclared identifier
pixman-sse.c(4432) : error C2065: 'xmm3' : undeclared identifier
pixman-sse.c(4434) : error C2440: '=' : cannot convert from '__m128i' to
'int'
pixman-sse.c(4435) : error C2440: '=' : cannot convert from '__m128i' to
'int'
pixman-sse.c(4436) : error C2440: '=' : cannot convert from '__m128i' to
'int'
pixman-sse.c(4437) : error C2440: '=' : cannot convert from '__m128i' to
'int'
pixman-sse.c(4439) : error C2440: 'function' : cannot convert from 'int'
to '__m128i'
pixman-sse.c(4439) : warning C4024: 'save128Aligned' : different types
for formal and actual parameter 2
pixman-sse.c(4440) : error C2440: 'function' : cannot convert from 'int'
to '__m128i'
pixman-sse.c(4440) : warning C4024: 'save128Aligned' : different types
for formal and actual parameter 2
pixman-sse.c(4441) : error C2440: 'function' : cannot convert from 'int'
to '__m128i'
pixman-sse.c(4441) : warning C4024: 'save128Aligned' : different types
for formal and actual parameter 2
pixman-sse.c(4442) : error C2440: 'function' : cannot convert from 'int'
to '__m128i'
pixman-sse.c(4442) : warning C4024: 'save128Aligned' : different types
for formal and actual parameter 2
We found the following :
for every C2719 errors, the solution is to avoid passing __m128i values
directly, because MSVC just doesn't allow function parameters to be of
types declared with the "__declspec(align('#'))" modifier (this is the
case of __m128i). See:
http://msdn.microsoft.com/en-us/library/373ak2y1(VS.80).aspx
More problematic is the behaviour of MSVC under these assumptions... in
fact, try removing ONLY the xmm3 function parameter at line #142 in
pixman-sse.c (and by commenting references to xmm3 inside the function,
of course), it will compile. (!!). I've went through different forums
for developpers and it seems there are still some bugs with those
intrinsics in MSVC8. Very dissapointing!
So my recommandation to misters Tupinamba and Kumpera would be to pass
POINTERS to those function parameters instead...
as :
static inline __m128i
pack565_4x128_128 (__m128i *xmm0, __m128i *xmm1, __m128i *xmm2,
__m128i *xmm3)
{
__m128i lo, hi;
lo = _mm_packus_epi16 (pack565_2x128_128 ( *xmm0, *xmm1 ),
_mm_setzero_si128 ());
hi = _mm_packus_epi16 (_mm_setzero_si128 (), pack565_2x128_128 (
*xmm2, *xmm3 ));
return _mm_or_si128 (lo, hi);
}
compiles perfectly.
However, this would maybe imply significant impacts on performance... it
should be addressed and profiled..
******
Besides, for the C2275 error, it's even more embarassing for
microsoft... it's another case of MSVC being very capricious.
In some cases, with aligned variables, MSVC doesn't allow us to declare
those variable in the middle of the function... We then need to move the
declaration earlier.
see, at line 4432,
__m128i xmm0, xmm1, xmm2, xmm3; needs to be moved up a
little... as :
while (w >= 64)
{
__m128i xmm0, xmm1, xmm2, xmm3;
/* 128 bytes ahead */
cachePrefetch (((__m128i*)s) + 8);
cachePrefetch (((__m128i*)d) + 8);
compiles now...
****************
So here it is... a patch with those changes in pixman-sse.c
I'd like you guys (especcially André) to look that over and tell me what
you think. It's a first draft, but it compiles under all 3 major platforms.
Best,
-fred-
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: pixman_pixman_sse_compilation_under_win32.patch
Url: http://lists.cairographics.org/archives/cairo/attachments/20080720/307653f5/attachment-0001.ksh
More information about the cairo
mailing list