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?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage