Gibt es eine inverse Anweisung zur Movemask-Anweisung in Intel Avx2?

Die Movemask-Anweisung (en) nehmen ein __m256i und geben ein int32 zurück, wobei jedes Bit (entweder die ersten 4, 8 oder alle 32 Bits, abhängig vom Typ des Eingangsvektorelements) das höchstwertige Bit des entsprechenden Vektorelements ist.

Ich möchte die Umkehrung machen: Nehmen Sie 32 (wobei nur die 4, 8 oder 32 niedrigstwertigen Bits von Bedeutung sind) und erhalten Sie ein __m256i, bei dem das höchstwertige Bit jedes Blocks der Größe int8, int32 oder int64 auf den Wert gesetzt ist Originalbit.

Grundsätzlich möchte ich von einer komprimierten Bitmaske zu einer wechseln, die von anderen AVX2-Anweisungen als Maske verwendet werden kann (z. B. maskstore, maskload, mask_gather).

Ich konnte nicht schnell eine Anweisung finden, die es tut, also frage ich hier. Wenn es keinen Befehl mit dieser Funktionalität gibt, gibt es einen cleveren Hack, der dies in sehr wenigen Befehlen erreicht?

ei meiner aktuellen Methode wird eine 256-Element-Nachschlagetabelle verwendet. Ich möchte diese Operation in einer Schleife verwenden, in der sonst nicht viel passiert, um sie zu beschleunigen. Beachten Sie, dass mich lange Multibefehlsfolgen oder kleine Schleifen, die diese Operation implementieren, nicht sonderlich interessieren.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage