J'essaie d'implémenter un assembleur en ligne (en code C/C++) pour tirer parti de SSE. J'aimerais copier et dupliquer des valeurs (à partir d'un registre XMM ou de la mémoire) vers un autre registre XMM. Par exemple, supposons que j'ai des valeurs {1, 2, 3, 4} en mémoire. Je voudrais copier ces valeurs de sorte que xmm1 soit rempli avec {1, 1, 1, 1}, xmm2 avec {2, 2, 2, 2} et ainsi de suite.Comment peupler un registre XMM x86 avec 4 flottants identiques provenant d'une autre entrée de registre XMM?
En parcourant les manuels de référence Intel, je n'ai pas trouvé d'instruction pour cela. Dois-je juste utiliser une combinaison de MOVSS répété et de rotation (via PSHUFD?)?
C'est un très bon point sur la portabilité. Je n'y avais pas vraiment pensé puisque c'est surtout un exercice d'apprentissage pour moi. Votre article semble également très intéressant à première vue. Je suis impatient de passer plus de temps avec ça. – jbl
La méthode intrinsèque montrée dans cette réponse est meilleure que inline asm car les intrinsèques permettent au compilateur de faire beaucoup plus d'optimisations qui ne sont pas effectuées sur asm: assignation de registre, déroulement de boucle, entrelacement d'instruction, levage d'invariants de boucles, etc. était ASM parce que c'est ce que la question initiale demandait, mais si j'allais utiliser le code moi-même, je l'écrirais avec Intrinsics pour PERFORMANCE _AND_ PORTABILITY. – Adisak
Adisak: ce que vous avez dit est vrai pour tout sauf MSVC - il gère très mal les intrinsèques (voir mon article). dans MSVC, l'assemblage écrit à la main est meilleur si les performances viennent avant la portabilité et la maintenabilité (rarement).Je voudrais juste suggérer de changer de compilateur si :). – LiraNuna