ty AND instrukce navic mozna ani nestaly tolik tranzistoru, pokud je dekoder instrukci hodne "pravidelny". Vypada to tak, ze proste do te spravne mezery (AND ma vsude stejny zakladni kod) tu instrukci dali a jak prefix, tak i posledni bajt s indexy pracovnich registru (aspon predpokladam) je stejnej jako u jinych instrukci. Zase na druhou stranu Intel je Intel a drzi se zasady, ze x86 musi byt chaoticka :)
Já si pamatuju penalizaci 1 cyklus za to, že se kombinují FP operace a INT operace, proto asi Intel navrhnul ty instrukce takto (varianty pro INT a FP). V AVX-512 to je navíc rozdělené i pro D a Q datové typy kvůli maskování (ale pro logické operace z nějakého důvodu chybí B a W).
Nedokážu ale říct, jestli je to pořád problém, ale řekl bych, že jo.
Na druhou stranu třeba u MOV ten problém nikdy nebyl a kompilery vesele používají MOVAPS/MOVUPS, protože to jsou nejkratší v legacy kódování. Potom u AVX a AVX-512 to je už jedno.
K těm "dvojitým" instrukcím: zarazila mě neexistence instrukce _mm_blend_epi32, místo ní používám _mm_blend_epi16 (SSE4.1), neexistence instrukce _mm256_blend_epi64, místo ní používám _mm256_blend_epi32 (AVX2). Používám je v hašovacích algoritmech SHA-2 (SHA-256 a SHA-512). Když jsem teď nakousnul kryptografii, bude se seriál věnovat i instrukcím kolem AES, SHA a pclmulqdq, případně CRC? Hlavně u šifrování by největší výhodou (kromě rychlosti) měl být konstantní čas výpočtu, tedy bez ohledu na hodnotu plain textu, cipher textu nebo klíče. Tím se zamezí útokům na časovací postranní kanál. Ono totiž napsat AES v céčku v konstantním čase není totiž úplně triviální, DJB má o tom článek.
Neexistence instrukcí v X86 je naproso normální - je to od pravěku nevybalancovaná ISA, takže třeba saturated ADD/SUB pro 8-16-bit typy jo, ale 32/64-bit typy už ne. Normální blending je zadrátovaný až v AVX-512. Dřív ještě bez SSE4.1 se blending dal udělat jen pomocí AND/ANDN/OR.
Pro CRC32 spíš PCLMULQDQ nebo VPCLMULQDQ. CRC32 se dá kombinovat - paralelně počítat víc regionů a pak to sloučit (opět nejlépe pomocí PCLMULQDQ). Popř. bych se podíval na GFNI (velmi užitečné instrukce).