Wie werden Daten aus den AVX-Registern abgerufen?
Mit MSVC 2013 und AVX 1 habe ich 8 Floats in einem Register:
__m256 foo = mm256_fmadd_ps(a,b,c);
etzt möchte ich @ anrufinline void print(float) {...}
für alle 8 Schwimmer. Es sieht aus wie das Intel AVX Intrisics würden dies ziemlich kompliziert machen:
print(_castu32_f32(_mm256_extract_epi32(foo, 0)));
print(_castu32_f32(_mm256_extract_epi32(foo, 1)));
print(_castu32_f32(_mm256_extract_epi32(foo, 2)));
// ...
Aber MSVC hat nicht einmal eine dieser beiden Eigenschaften. Sicher, ich könnte die Werte in den Speicher zurückschreiben und von dort laden, aber ich vermute, dass es auf Assembly-Ebene nicht erforderlich ist, ein Register zu verschütten.
Bonus F: Ich würde natürlich gerne schreiben
for(int i = 0; i !=8; ++i)
print(_castu32_f32(_mm256_extract_epi32(foo, i)))
aber MSVC versteht nicht so viele Eigenheitenbenötige Schleife abrollen. Wie schreibe ich eine Schleife über die 8x32-Floats in__m256 foo
?