On Sun, Oct 11, 2009 at 3:59 PM, Matthew Fluet <span dir="ltr">&lt;<a href="mailto:mtf@cs.rit.edu">mtf@cs.rit.edu</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On Sat, 10 Oct 2009, Wesley W. Terpstra wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Sat, Oct 10, 2009 at 10:27 PM, Wesley W. Terpstra &lt;<a href="mailto:wesley@terpstra.ca" target="_blank">wesley@terpstra.ca</a>&gt;wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I&#39;ve tried compiling with -align 8 and then it works... I&#39;m not sure this<br>
is a solution, though; it may have just masked the problem.<br>
</blockquote>
<br>
Found the smoking gun! Debian builds gmp with -O3 whereas I used -O2 for<br>
MinGW32. If you look at the assembler output of mpz/mul_exp.c with the two<br>
options you will notice a difference... the introduction of a &#39;movdqa&#39;<br>
instruction, which is an SSE2 instruction that expects 16-byte alignment.<br>
</blockquote></div>
...<div class="im"><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
What&#39;s the plan going forward? align(AMD64) == 8?<br>
</blockquote>
<br></div>However, from what you have described, it doesn&#39;t seem as though defaulting to &#39;-align 8&#39; on amd64{-linux?} is sufficient.</blockquote><div><br>No, 8 alignment is sufficient. That assembler from gcc assumes it was 8 byte aligned and then promotes it to 16-byte alignment by testing the 3rd bit and optionally doing a single 8-byte operation before moving on to 16-byte operations.<br>
<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> ... it won&#39;t guarantee that IntInf arrays are aligned on 16-byte boundaries</blockquote>
<div><br>Unnecessary.<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">On the other hand, I don&#39;t see how the gmp.h header guarantees that a mp_limb_t* is 16-byte aligned. </blockquote>
<div><br>It doesn&#39;t.<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">It is simply a pointer to a 64-bit integer, so it seems that gcc can only assume that the allocated object pointed to by a mp_limb_t* is 8-byte aligned.</blockquote>
<div><br>That&#39;s exactly what it assumes.<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> Am I misunderstanding the assembly?  Is it dynamically checking the alignment and using the SSE2 instructions only if it happens to be 16-byte aligned? <br>
</blockquote><div><br>It dynamically checks the alignment and does a single 8-byte operation if necessary to move forward onto 16-byte aligned values.<br> <br></div></div><br>