Os índices de bytes diferentes de zero de um registro SSE / AVX

Se o valor de um registro SSE / AVX for tal que todos os seus bytes sejam 0 ou 1, existe alguma maneira de obter com eficiência os índices de todos os elementos diferentes de zero?

Por exemplo, se o valor xmm for | r0 = 0 | r1 = 1 | r2 = 0 | r3 = 1 | r4 = 0 | r5 = 1 | r6 = 0 | ... | r14 = 0 | r15 = 1 | o resultado deve ser algo como (1, 3, 5, ..., 15). O resultado deve ser colocado em outra variável _m128i ou matriz char [16].

Se ajudar, podemos assumir que o valor do registro é tal que todos os bytes são 0 ou algum valor diferente de zero constante (não é necessário 1).

Estou muito querendo saber se existe uma instrução para isso ou, de preferência, C / C ++ intrínseco. Em qualquer conjunto de instruções SSE ou AVX.

EDIT 1:

Estava corretamenteobservado por @ zx485 essa pergunta original não era clara o suficiente. Eu estava procurando por uma solução "consecutiva".

O exemplo0 1 0 1 0 1 0 1... acima deve resultar em um dos seguintes:

Se assumirmos que os índices começam em 1, então0 seria um byte de terminação e o resultado pode ser

002 004 006 008 010 012 014 016 000 000 000 000 000 000 000 000

Se assumirmos que byte negativo é um byte de terminação, o resultado pode ser

001 003 005 007 009 011 013 015 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

Qualquer coisa que dê como bytes consecutivos que possamos interpretar como índices de elementos diferentes de zero no valor original

EDIT 2:

De fato, como@harold e@Peter Cordes sugerir nos comentários da postagem original, uma das soluções possíveis é criar uma máscara primeiro (por exemplo, compmovmskb) e verifique índices diferentes de zero lá. Mas isso levará a um loop.

questionAnswers(2)

yourAnswerToTheQuestion