¿Cómo obtener datos de los registros AVX?
Usando MSVC 2013 y AVX 1, tengo 8 flotantes en un registro:
__m256 foo = mm256_fmadd_ps(a,b,c);
Ahora quiero llamarinline void print(float) {...}
para las 8 carrozas. Parece que elIntel Lo intrínseco de AVX haría esto bastante complicado:
print(_castu32_f32(_mm256_extract_epi32(foo, 0)));
print(_castu32_f32(_mm256_extract_epi32(foo, 1)));
print(_castu32_f32(_mm256_extract_epi32(foo, 2)));
// ...
pero MSVC ni siquiera tiene ninguno de estos dos intrínsecos. Claro, podría volver a escribir los valores en la memoria y cargar desde allí, pero sospecho que a nivel de ensamblaje no hay necesidad de derramar un registro.
Bonus Q: Por supuesto, me gustaría escribir
for(int i = 0; i !=8; ++i)
print(_castu32_f32(_mm256_extract_epi32(foo, i)))
pero MSVC no entiende que muchos intrínsecosexigir bucle desenrollado. ¿Cómo escribo un bucle sobre los flotadores de 8x32 en__m256 foo
?