はじめに
YMMレジスタに対して,256ビットの論理演算(and, or, xor, andnot)を行います.
整数だけでなく,浮動小数点のfloat/doubleに対しても論理演算が用意されています.
not演算は用意されておらず,否定が必要な場合には,andnot演算が代わりにあります.
一見,見間違えますが,andnotはnandのことではありません.
以下に,対応するC言語(C++)のコードを示します.
ope | c-code |
---|---|
and | a&b |
or | a|b |
xor | a^b |
andnot | (~a)&b |
-------- | -------- |
not | ~a |
nand | ~(a&b) |
また,not演算は,比較演算とxorを使って作ることもできます.
しかしながら,比較の条件を入れ替えるなどをすれば,notがそもそも必要なくなる場合も多く,この4つの論理演算だけで計算が閉じるようにコードを最適化することも重要です.
なお,AVX512からvpternlogd命令で任意の論理演算が可能です.
_mm256_and|or|xor|andnot_ps|pd (AVX/AVX2)
__m256i _mm256_and_ps (__m256 a, __m256 b)
asm: vandps ymm, ymm, ymm //and
__m256i _mm256_and_pd (__m256d a, __m256d b)
asm: vandpd ymm, ymm, ymm //and
__m256 _mm256_or_ps (__m256 a, __m256 b)
asm: vorps ymm, ymm, ymm //or
__m256 _mm256_or_pd (__m256d a, __m256d b)
asm: vorpd ymm, ymm, ymm //or
__m256 _mm256_xor_ps (__m256 a, __m256 b)
asm: vxorps ymm, ymm, ymm //xor
__m256 _mm256_xor_pd (__m256d a, __m256d b)
asm: vxorpd ymm, ymm, ymm //xor
__m256i _mm256_andnot_ps (__m256 a, __m256 b)
asm: vandnps ymm, ymm, ymm //andnot
__m256i _mm256_andnot_pd (__m256d a, __m256d b)
asm: vandnpd ymm, ymm, ymm //andnot
動作
作成中
CPI, Uops
Architecture | Latency | Throughput | Uops |
---|---|---|---|
Alderlake | 1 | 0.33 | - |
Icelake | 1 | 0.33 | 1 |
Skylake | 1 | 0.33 | 1 |
Broadwell | 1 | 1 | 1 |
Haswell | 1 | 1 | 1 |
Ivy Bridge | 1 | 1 | 1 |
Sandy Bridge | 1 | 1 | 1 |
Zen3 | 1 | 0.25 | 1 |
Zen2 | 1 | 0.25 | 1 |
Zen | 1 | 0.5 | 2 |
説明
浮動小数点に対する256ビット演算を行います.
_mm256_and|or|xor|andnot_si256 (AVX2)
__m256i _mm256_and_si256 (__m256i a, __m256i b)
asm: vpand ymm, ymm, ymm //and
__m256i _mm256_or_si256 (__m256i a, __m256i b)
asm: vpor ymm, ymm, ymm //or
__m256i _mm256_xor_si256 (__m256i a, __m256i b)
asm: vpxor ymm, ymm, ymm //xor
__m256i _mm256_andnot_si256 (__m256i a, __m256i b)
asm: vpandn ymm, ymm, ymm //andnot
動作
作成中
CPI, Uops
Architecture | Latency | Throughput | Uops |
---|---|---|---|
Alderlake | 1 | 0.33 | - |
Icelake | 1 | 0.33 | 1 |
Skylake | 1 | 0.33 | 1 |
Broadwell | 1 | 0.33 | 1 |
Haswell | 1 | 0.33 | 1 |
Zen3 | 1 | 0.25 | 1 |
Zen2 | 1 | 0.25 | 1 |
Zen | 1 | 0.5 | 2 |
- Haswell, Broadwellは浮動小数点のビット演算よりもスループットが高いです.
説明
整数に対するビット演算を行います.
どのサイズに対する命令であっても1ビット単位の処理であるため型によらず共通です.