How does _mm_mul_ps() add two __m128?
<p>I´m doing a program that takes two matrix 4x4 and multiply them using Intrinsics.
What I understand until now:</p>

<ul>
<li>MMX/SSE instructions set allow you to accelerate computing. In particular it uses a 4 bytes elements vector.</li>
<li><code>__m128</code> represents a 16 bytes vector (4 elements of 4 bytes). Furthermore, <code>__m128</code> data needs to be aligned in order to work.</li>
</ul>

<p>Where I get lost is here:</p>

<ul>
<li>Function <code>_mm_mul_ps(_m128, _m128)</code> that (as I have read) takes two vectors of 16 bytes of 4 flotats of 4 bytes. It multiply "one to one" the two vectors and returns a <code>_m128</code>. But, what does that <code>_m128</code> vector contains exactly (the result of <em>what</em>)?</li>
<li>Function <code>_mm_hadd_ps(_m128, _m128)</code> adds two 16 bytes vectors (each one of 4 bytes floats). It "adds horizontaly" this way: <br/> <code>vectorA(a1, a2, a3,a4) + vectorB(b1, b2, b3, b4) = vectorResult(a1 + a2, a3 + a4, b1 + b2, b3 + b4)</code></li>
</ul>

<p>What I´m trying to do:</p>

<pre><code>// Stores the result of multiply on row of A by one column of B
    _declspec (align(16)) __m128 aux; 

        // Horizontal add
        for(int i = 0; i &lt; 4; i++){
            for (int j = 0; j &lt; 4; j++){
                aux= _mm_mul_ps(vectorA[i], vectorB[j]);
                // Add results
                aux = _mm_hadd_ps(aux, aux);
                aux = _mm_hadd_ps(aux,aux);
            }
        }
</code></pre>

<p>I can´t <em>see</em> how the functions work (I don´t have a "mental image").</p>