[...] // Matrix-Vektor-Multiplaktion mit SSE-Intrinsics-Code. // Speicher für Matrix: union { __m128 m128[4]; // spaltenweise float f[4][4]; } matrix; // Speicher für Vektor und Ergebnis: union { __m128 m128; float f[4]; } vektor, ergebnis; // Matrix initialisieren: matrix.m128[3] = _mm_set_ps(2.5, 1.2, 3.1, 7.8); // 1. Spalte matrix.m128[2] = _mm_set_ps(3.4, 7.7, 8.2, 0.4); // 2. Spalte matrix.m128[1] = _mm_set_ps(7.9, 3.7, 7.1, 1.2); // 3. Spalte matrix.m128[0] = _mm_set_ps(1.2, 0.5, 3.6, 5.2); // 4. Spalte // Vektor initialisieren: vektor.m128 = _mm_set_ps(1.0,1.0,1.0,1.0); ergebnis.m128 = _mm_setzero_ps(); // Multiplikation berechnen: __m128 tmp_multiplikator; __m128 tmp_spalte1; __m128 tmp_spalte2; tmp_multiplikator = _mm_set_ps1(vektor.f[0]); tmp_spalte1 = _mm_mul_ps(matrix.m128[0], tmp_multiplikator); tmp_multiplikator = _mm_set_ps1(vektor.f[1]); tmp_spalte2 = _mm_mul_ps(matrix.m128[1], tmp_multiplikator); tmp_spalte1 = _mm_add_ps(tmp_spalte1, tmp_spalte2); tmp_multiplikator = _mm_set_ps1(vektor.f[2]); tmp_spalte2 = _mm_mul_ps(matrix.m128[2], tmp_multiplikator); tmp_spalte1 = _mm_add_ps(tmp_spalte1, tmp_spalte2); tmp_multiplikator = _mm_set_ps1(vektor.f[3]); tmp_spalte2 = _mm_mul_ps(matrix.m128[3], tmp_multiplikator); ergebnis.m128 = _mm_add_ps(tmp_spalte1, tmp_spalte2); ergebnis.m128 = _mm_loadr_ps(ergebnis.f); }