汎用レジスタにuint8_t
が存在すると仮定すると、アプローチがある:
- 使用
PDEP
YMMの低い部分に4バイト(最上位ビット)
- 転送32ビットGPRから4バイトに4ビットを変換する
- レジスタ(代わりに値を入れビット63、127、191、255)
だから私は2つのバージョンを思い付いた - メモリとせずに、他の1と1:メモリと
アプローチ:
.data
; Always use the highest bytes of a QWORD as target/128 means 'set ZERO'
ddqValuesDistribution: .byte 3,128,128,128,128,128,128,128, 2,128,128,128,128,128,128,128, 1,128,128,128,128,128,128,128, 0,128,128,128,128,128,128,128
.code
; Input value in lower 4 bits of EAX
mov edx, 0b10000000100000001000000010000000
pdep eax, eax, edx
vmovd xmm0, eax
vpshufb ymm0, ymm0, ymmword ptr [ddqValuesDistribution]
これはHaswellとSkylakeで5μOpsで出ます。メモリ変数なし
アプローチ(@Peterコルドへの改善されたおかげで):(!)
mov edx, 0b10000000100000001000000010000000
pdep eax, eax, edx
vmovd xmm0, eax
vpmovsxbq ymm0, xmm0
この1つはハスウェルとSkylakeマイクロアーキテクチャ上の4つのuopで出てくると、さらに移動することによって改善することができます変数へのEDXのマスク。
出力は最初のバージョンとは異なります(すべてのビットが最上位ビットと比較されます)。
63,127,191,255は2の累乗ではないため、ビット位置を示すマスクにすることはできません。ビットベクトルへのインデックスであれば、少なくとも255ビットの対処が必要です。 'unit8_t'には8ビット(したがって '8')が含まれているので、255ビットを8ビットで表現できるかどうか尋ねていますか?それはそう思わない。あなたは意味のある答えを得る前に質問を修正する必要があります。 –
オフ、バイナリ、64,128、および256 AREの2のべき乗なので、ビットマスクかもしれませんが、192はパターンに適合しません(それは64 + 128ですが、それは2ビットです)。 –
@DaleWilson、これは256ビットのベクトルを処理するAVX(2)テクノロジに関する質問です。最初は 'uint8_t'に4ビットがあります。私は256ビットのAVXレジスタに対して、指定した位置(63,127,191,255はマスクではなく0ベースのビット位置)を指定位置に移動したいと考えています。 –