[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