2016-11-06 1 views
0

Disons que j'ai un vecteur de 4 flotteurs:Existe-t-il un équivalent de _mm_slli_si128 (__ m128i a, num int) pour les flottants?

__m128 vector = |f0|f1|f2|f3| (pseudocode) 

Mon intention est de transformer cette variable en ceci:

|0.0|f0|f1|f2| 

Faire un changement aurait droit semble être le choix le plus simple, mais je n'ont pas été en mesure de trouver un tel intrinsèque disponible pour les flotteurs.

Quel serait le moyen le plus rapide d'y parvenir?

+1

'' _mm_shuffle_ps' + _mm_and_ps' –

+0

Je l'ai fait et le principe fonctionne. Cependant, je ne suis pas sûr des valeurs que je devrais entrer en tant que paramètres pour conserver les derniers nombres à virgule flottante: vb = _mm_and_ps (vb, _mm_set_ps (?,?,?, 0)). – ismarlowe

+1

Une alternative consiste à utiliser deux conversions: '_mm_castsi128_ps' et' _mm_castps_si128', de sorte que vous puissiez toujours utiliser '_mm_slli_si128'. Ces moules ne génèrent aucune instruction. La seule pénalité est une petite augmentation de latence allant du flottant au domaine entier et vice versa. – wim

Répondre

0

Voici ma solution:

__m128 const mask = _mm_castsi128_ps(_mm_set_epi32(0, -1, -1, -1)); 

vector = _mm_shuffle_ps(vector, vector, _MM_SHUFFLE(0,3,2,1)) 
vector = _mm_and_ps(vector, mask);