Portable effiziente Alternative zu PDEP ohne Verwendung von BMI2?

Die Dokumentation zumparallele Einzahlungsanweisung (PDEP) in Intels Bit Manipulation Instruction Set 2 (BMI2) beschreibt die folgende serielle Implementierung für den Befehl (C-ähnlicher Pseudocode):

U64 _pdep_u64(U64 val, U64 mask) {
  U64 res = 0;
  for (U64 bb = 1; mask; bb += bb) {
    if (val & bb)
      res |= mask & -mask;
    mask &= mask - 1;
  }
  return res;
}

Siehe auch Intelspdep insn ref manuelle Eingabe.

Dieser Algorithmus ist O (n), wobei n die Anzahl der gesetzten Bits in @ ismask, was offensichtlich den schlimmsten Fall von O (k) hat, wobei k die Gesamtzahl der Bits in @ imask.

Ist ein effizienterer Worst-Case-Algorithmus möglich?

Ist es möglich, eine schnellere Version zu erstellen, die davon ausgeht, dassval hat höchstens ein Bit gesetzt, dh entweder gleich 0 oder gleich1<<r für einen Wert vonr von 0 bis 63?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage