2016-05-07 4 views

Répondre

3

Vous utilisez toujours _MM_SHUFFLE() pour les shuffles qui prennent l'entrée de contrôle en tant que 8bit immédiat. par exemple. _mm256_shuffle_epi32 (vpshufd) fait le même mélange sur les deux voies.

_MM_SHUFFLE(dd,cc,bb,aa) emballe juste les 2 bits bas de chaque arg dans un 0bddccbbaa.

Vous pouvez écrire _MM_SHUFFLE(1,1,1,1) (élément de diffusion 1) en tant que 0b01010101, c'est-à-dire 0x55.

Vous pouvez utiliser des séparateurs C++ 14 (ou quel que soit leur nom) pour l'écrire en tant que 0b01'01'01'01 pour une meilleure lisibilité, en particulier. dans les cas où chaque élément est différent.

+0

Je pense que la base-4 est meilleure dans ce cas que binaire. Deux chiffres de base-4 est un chiffre de base-16 (hex). Par exemple si vous voulez mélanger 3,1,1,2 ce serait 3 * 4 + 1, 1 * 4 + 2 = 0xda. D'autre part _MM_SHUFFLE est fondamentalement base-4 et plus lisible. –

+0

@Zboson: pouvez-vous utiliser base-4 en C? J'utilise _MM_SHUFFLE en C, mais '0baabbccdd' en asm. Je suppose que dans un fichier '.S' que gcc va exécuter via CPP avant de l'assembler, vous pouvez copier la définition d'une macro pour _MM_SHUFFLE. –

+0

Non, je le fais dans ma tête et écris la valeur hexadécimale ou j'écris un commentaire. Mais '_MM_SHUFFLE' est essentiellement une macro base-4. –