<div dir="ltr">Since most of these functions force inlining, argument passing by pointer or by value<br>should not matter, modulo compiler inability to do the right thing.<br><br>I think that there are no issues from changing some args from values to regs<br>
as long as GCC still manages to generate decent code. From what I recall, this is not<br>the case and some reasonable recent version of it should do the trick.<br><br>Frédéric, do you mind testing that for gcc? <br><br>Thanks,<br>
Rodrigo<br><br><div class="gmail_quote">On Mon, Jul 21, 2008 at 6:19 AM, Antoine Azar &lt;<a href="mailto:cairo@antoineazar.com">cairo@antoineazar.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Yep, I&#39;ve tried everything on my side (playing with compiler switches,<br>
setting the function parameters as const references, wrapping in structs,<br>
changing stack size, etc) and didn&#39;t have more luck than Fred.<br>
<br>
VC++ always borks starting the fourth __m128i parameter only. The three<br>
first ones are always ok. It seems this is a limitation of VC++, that it&#39;ll<br>
only handle a &quot;pass by register&quot; of up to three SSE intrinsics, and not one<br>
more.<br>
<br>
I don&#39;t think sending pointers would be much of an issue: this is already<br>
done at many other places in the code, and it&#39;ll avoid the overhead of<br>
passing by value 16 byte data structures.<br>
Otherwise, we can try rewriting functions so they always use at most 3 SSE<br>
intrinsics that are passed by value, but that might be a pain.<br>
<br>
I&#39;d be curious to see how the Intel Compiler handles this.<br>
<br>
Antoine<br>
<div><div></div><div class="Wj3C7c"><br>
<br>
&gt; -----Original Message-----<br>
&gt; From: <a href="mailto:cairo-bounces@cairographics.org">cairo-bounces@cairographics.org</a><br>
&gt; [mailto:<a href="mailto:cairo-bounces@cairographics.org">cairo-bounces@cairographics.org</a>] On Behalf Of Frédéric Plourde<br>
&gt; Sent: Sunday, July 20, 2008 10:03 PM<br>
&gt; To: <a href="mailto:cairo@cairographics.org">cairo@cairographics.org</a><br>
&gt; Subject: [cairo] Problem compiling pixman-sse.c under<br>
&gt; Win32,blame it on MSVC !!<br>
&gt;<br>
&gt; Hi !<br>
&gt;<br>
&gt; &nbsp; Vlad had emailled me with this problem compiling pixman<br>
&gt; sith SSE2 stuff enabled.<br>
&gt; In fact, here are the errors that we got :<br>
&gt;<br>
&gt; pixman-sse.c<br>
&gt; pixman-sse.c(142) : error C2719: &#39;xmm3&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(195) : error C2719: &#39;alphaHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(210) : error C2719: &#39;alphaDstHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(210) : error C2719: &#39;dstLo&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(210) : error C2719: &#39;dstHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(210) : error C2719: &#39;alphaSrcLo&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(210) : error C2719: &#39;alphaSrcHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(246) : error C2719: &#39;alphaHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(276) : error C2719: &#39;alphaHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(276) : error C2719: &#39;maskLo&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(276) : error C2719: &#39;maskHi&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;16&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(290) : warning C4133: &#39;function&#39; : incompatible<br>
&gt; types - from &#39;__m128i *&#39; to &#39;const char *&#39;<br>
&gt; pixman-sse.c(296) : warning C4133: &#39;function&#39; : incompatible<br>
&gt; types - from &#39;__m128i *&#39; to &#39;const char *&#39;<br>
&gt; pixman-sse.c(371) : error C2719: &#39;alphaSrc&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;8&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(398) : error C2719: &#39;dst&#39;: formal parameter with<br>
&gt; __declspec(align(&#39;8&#39;)) won&#39;t be aligned<br>
&gt; pixman-sse.c(4432) : error C2275: &#39;__m128i&#39; : illegal use of<br>
&gt; this type as an expression<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; D:\msvs8\VC\INCLUDE\emmintrin.h(45) : see declaration<br>
&gt; of &#39;__m128i&#39;<br>
&gt; pixman-sse.c(4432) : error C2146: syntax error : missing &#39;;&#39;<br>
&gt; before identifier &#39;xmm0&#39;<br>
&gt; pixman-sse.c(4432) : error C2065: &#39;xmm0&#39; : undeclared identifier<br>
&gt; pixman-sse.c(4432) : error C2065: &#39;xmm1&#39; : undeclared identifier<br>
&gt; pixman-sse.c(4432) : error C2065: &#39;xmm2&#39; : undeclared identifier<br>
&gt; pixman-sse.c(4432) : error C2065: &#39;xmm3&#39; : undeclared identifier<br>
&gt; pixman-sse.c(4434) : error C2440: &#39;=&#39; : cannot convert from<br>
&gt; &#39;__m128i&#39; to &#39;int&#39;<br>
&gt; pixman-sse.c(4435) : error C2440: &#39;=&#39; : cannot convert from<br>
&gt; &#39;__m128i&#39; to &#39;int&#39;<br>
&gt; pixman-sse.c(4436) : error C2440: &#39;=&#39; : cannot convert from<br>
&gt; &#39;__m128i&#39; to &#39;int&#39;<br>
&gt; pixman-sse.c(4437) : error C2440: &#39;=&#39; : cannot convert from<br>
&gt; &#39;__m128i&#39; to &#39;int&#39;<br>
&gt; pixman-sse.c(4439) : error C2440: &#39;function&#39; : cannot convert<br>
&gt; from &#39;int&#39;<br>
&gt; to &#39;__m128i&#39;<br>
&gt; pixman-sse.c(4439) : warning C4024: &#39;save128Aligned&#39; :<br>
&gt; different types for formal and actual parameter 2<br>
&gt; pixman-sse.c(4440) : error C2440: &#39;function&#39; : cannot convert<br>
&gt; from &#39;int&#39;<br>
&gt; to &#39;__m128i&#39;<br>
&gt; pixman-sse.c(4440) : warning C4024: &#39;save128Aligned&#39; :<br>
&gt; different types for formal and actual parameter 2<br>
&gt; pixman-sse.c(4441) : error C2440: &#39;function&#39; : cannot convert<br>
&gt; from &#39;int&#39;<br>
&gt; to &#39;__m128i&#39;<br>
&gt; pixman-sse.c(4441) : warning C4024: &#39;save128Aligned&#39; :<br>
&gt; different types for formal and actual parameter 2<br>
&gt; pixman-sse.c(4442) : error C2440: &#39;function&#39; : cannot convert<br>
&gt; from &#39;int&#39;<br>
&gt; to &#39;__m128i&#39;<br>
&gt; pixman-sse.c(4442) : warning C4024: &#39;save128Aligned&#39; :<br>
&gt; different types for formal and actual parameter 2<br>
&gt;<br>
&gt;<br>
&gt; We found the following :<br>
&gt;<br>
&gt;<br>
&gt; for every C2719 errors, the solution is to avoid passing<br>
&gt; __m128i values directly, because MSVC just doesn&#39;t allow<br>
&gt; function parameters to be of types declared with the<br>
&gt; &quot;__declspec(align(&#39;#&#39;))&quot; modifier (this is the case of<br>
&gt; __m128i). See:<br>
&gt; <a href="http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.80%29.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/373ak2y1(VS.80).aspx</a><br>
&gt;<br>
&gt; More problematic is the behaviour of MSVC under these<br>
&gt; assumptions... in fact, try removing ONLY the xmm3 function<br>
&gt; parameter at line #142 in pixman-sse.c &nbsp;(and by commenting<br>
&gt; references to xmm3 inside the function, of course), it will<br>
&gt; compile. (!!). &nbsp;I&#39;ve went through different forums for<br>
&gt; developpers and it seems there are still some bugs with those<br>
&gt; intrinsics in MSVC8. Very dissapointing!<br>
&gt;<br>
&gt; So my recommandation to misters Tupinamba and Kumpera would<br>
&gt; be to pass POINTERS to those function parameters instead...<br>
&gt; as :<br>
&gt;<br>
&gt; static inline __m128i<br>
&gt; pack565_4x128_128 (__m128i *xmm0, &nbsp;__m128i *xmm1, &nbsp;__m128i<br>
&gt; *xmm2, __m128i *xmm3) {<br>
&gt; &nbsp; &nbsp;__m128i lo, hi;<br>
&gt;<br>
&gt; &nbsp; &nbsp;lo = _mm_packus_epi16 (pack565_2x128_128 ( *xmm0, *xmm1 ),<br>
&gt; _mm_setzero_si128 ());<br>
&gt; &nbsp; &nbsp;hi = _mm_packus_epi16 (_mm_setzero_si128 (),<br>
&gt; pack565_2x128_128 ( *xmm2, *xmm3 ));<br>
&gt;<br>
&gt; &nbsp; &nbsp;return _mm_or_si128 (lo, hi);<br>
&gt; }<br>
&gt;<br>
&gt; compiles perfectly.<br>
&gt; However, this would maybe imply significant impacts on<br>
&gt; performance... it should be addressed and profiled..<br>
&gt;<br>
&gt;<br>
&gt; ******<br>
&gt; Besides, for the C2275 error, it&#39;s even more embarassing for<br>
&gt; microsoft... it&#39;s another case of MSVC being very capricious.<br>
&gt; In some cases, with aligned variables, MSVC doesn&#39;t allow us<br>
&gt; to declare<br>
&gt; those variable in the middle of the function... We then need<br>
&gt; to move the<br>
&gt; declaration earlier.<br>
&gt; see, at line 4432,<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__m128i xmm0, xmm1, xmm2, xmm3; needs to be moved up a<br>
&gt; little... as :<br>
&gt;<br>
&gt; while (w &gt;= 64)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;{<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;__m128i xmm0, xmm1, xmm2, xmm3;<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* 128 bytes ahead */<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cachePrefetch (((__m128i*)s) + 8);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cachePrefetch (((__m128i*)d) + 8);<br>
&gt;<br>
&gt; compiles now...<br>
&gt; ****************<br>
&gt;<br>
&gt; So here it is... a patch with those changes in pixman-sse.c<br>
&gt; I&#39;d like you guys (especcially André) to look that over and<br>
&gt; tell me what<br>
&gt; you think. &nbsp;It&#39;s a first draft, but it compiles under all 3<br>
&gt; major platforms.<br>
&gt;<br>
&gt; Best,<br>
&gt; -fred-<br>
&gt;<br>
<br>
</div></div>_______________________________________________<br>
cairo mailing list<br>
<a href="mailto:cairo@cairographics.org">cairo@cairographics.org</a><br>
<a href="http://lists.cairographics.org/mailman/listinfo/cairo" target="_blank">http://lists.cairographics.org/mailman/listinfo/cairo</a><br>
</blockquote></div><br></div>