diff --git a/simgear/math/simd.hxx b/simgear/math/simd.hxx index 004d673e..a0f82800 100644 --- a/simgear/math/simd.hxx +++ b/simgear/math/simd.hxx @@ -679,7 +679,7 @@ inline simd4_t::simd4_t(const simd4_t& v) { } template<> inline simd4_t::simd4_t(const simd4_t& v) { - simd4 = _mm_and_pd(v.v4(), dmask3); + simd4 = _mm256_and_pd(v.v4(), dmask3); } template<> inline simd4_t::simd4_t(const simd4_t& v) { @@ -691,11 +691,11 @@ inline simd4_t::simd4_t(const simd4_t& v) { } template<> inline simd4_t::simd4_t(const simd4_t& v) { - simd4 = _mm_and_pd(v.v4(), dmask2); + simd4 = _mm256_and_pd(v.v4(), dmask2); } template<> inline simd4_t::simd4_t(const simd4_t& v) { - simd4 = _mm_and_pd(v.v4(), dmask2); + simd4 = _mm256_and_pd(v.v4(), dmask2); } template<> inline simd4_t::simd4_t(const simd4_t& v) { diff --git a/simgear/math/simd4x4.hxx b/simgear/math/simd4x4.hxx index 221e09c6..8e8bb549 100644 --- a/simgear/math/simd4x4.hxx +++ b/simgear/math/simd4x4.hxx @@ -1062,23 +1062,25 @@ public: } inline simd4x4_t& operator*=(int v) { - __m128i v4 = _mm_set1_epi32(v); + simd4_t v4(v); for (int i=0; i<4; ++i) { - simd4x4[i] = _mm_mul_epi32(simd4x4[i], v4); + simd4x4[i] *= v4.v4(); } return *this; } simd4x4_t& operator*=(const simd4x4_t& m2) { - __m128i row, col; - for (int i=0; i<4; ++i ) { - col = _mm_set1_epi32(m2.ptr()[i][0]); - row = _mm_mul_epi32(simd4x4[0], col); + simd4x4_t m1 = *this; + simd4_t row, col; + + for (int i=0; i<4; ++i) { + simd4_t col(m2.ptr()[i][0]); + row.v4() = m1.m4x4()[0] * col.v4(); for (int j=1; j<4; ++j) { - col = _mm_set1_epi32(m2.ptr()[i][j]); - row = _mm_add_epi32(row, _mm_mul_epi32(simd4x4[j], col)); + simd4_t col(m2.ptr()[i][j]); + row.v4() += m1.m4x4()[j] * col.v4(); } - simd4x4[i] = row; + simd4x4[i] = row.v4(); } return *this; }