How can I exchange the low 128 bits and high 128 bits in a 256 bit AVX (YMM) register
Using VPERM2F128, one can swap the low 128 and high 128 bits ( as well as other permutations). The instrinsic function usage looks like
x = _mm256_permute2f128_ps( x , x , 1)
The third argument is a control word which gives the user a lot of flexibility. See the Intel Instrinsic Guide for details.
The only way that I know of doing this is with _mm256_extractf128_si256
and _mm256_set_m128i
. E.g. to swap the two halves of a 256 bit vector:
__m128i v0h = _mm256_extractf128_si256(v0, 0);
__m128i v0l = _mm256_extractf128_si256(v0, 1);
__m256i v1 = _mm256_set_m128i(v0h, v0l);