[cairo] Problem compiling pixman-sse.c under Win32, blame it on MSVC !!

Antoine Azar cairo at antoineazar.com
Mon Jul 21 02:19:34 PDT 2008


Yep, I've tried everything on my side (playing with compiler switches,
setting the function parameters as const references, wrapping in structs,
changing stack size, etc) and didn't have more luck than Fred.

VC++ always borks starting the fourth __m128i parameter only. The three
first ones are always ok. It seems this is a limitation of VC++, that it'll
only handle a "pass by register" of up to three SSE intrinsics, and not one
more.

I don't think sending pointers would be much of an issue: this is already
done at many other places in the code, and it'll avoid the overhead of
passing by value 16 byte data structures.
Otherwise, we can try rewriting functions so they always use at most 3 SSE
intrinsics that are passed by value, but that might be a pain.

I'd be curious to see how the Intel Compiler handles this.

Antoine
 

> -----Original Message-----
> From: cairo-bounces at cairographics.org 
> [mailto:cairo-bounces at cairographics.org] On Behalf Of Frédéric Plourde
> Sent: Sunday, July 20, 2008 10:03 PM
> To: cairo at cairographics.org
> Subject: [cairo] Problem compiling pixman-sse.c under 
> Win32,blame it on MSVC !!
> 
> 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-
> 



More information about the cairo mailing list