SSE operace s 16 byty

Z HPM wiki
Přejít na: navigace, hledání

Čistě vertikální operace

Tyto operace používají SSE registry délky 128 bitů jako 16 zcela nezávislých čísel délky 8 bitů. Operace se provede se stejnolehlými byty - provede se 16 operací, které se vzájemně nijak neovlivňují.

_mm_add_epi8 PADDB a + b
_mm_adds_epi8 PADDSB ssat(a + b)
_mm_adds_epu8 PADDUSB usat(a + b)
_mm_avg_epu8 PAVGB (a + b) / 2
_mm_max_epu8 PMAXUB max(a, b)
_mm_min_epu8 PMINUB min(a, b)
_mm_sub_epi8 PSUBB a - b
_mm_subs_epi8 PSUBSB ssat(a - b)
_mm_subs_epu8 PSUBUSB usat(a - b)
_mm_cmpeq_epi8 PCMPEQB a==b ? 0xff : 0
_mm_cmpgt_epi8 PCMPGTB a>b ? 0xff : 0
_mm_abs_epi8 PABSB abs( a )
_mm_sign_epi8 PSIGNB a < 0 ? -b : b

(a + b) / 2 není zcela přesný popis, přesněji řečeno PAVGB počítá (a + b + 1) >> 1, tedy po dělení zaokrouhluje nahoru.


Dále takto můžeme použít logické operace, které fungují nezávisle na tom, pracujeme-li s byty či s jinou šířkou dat:

_mm_and_si128 PAND a & b
_mm_andnot_si128 PANDN (~a) & b
_mm_or_si128 POR b
_mm_xor_si128 PXOR a ^ b


SSE4_1 navíc přidává tyto vertikální operace (výše uvedené min a max je pro čísla bez znaménka, zde se znaménkem):

_mm_blendv_epi8 PBLENDVB c < 0 ? a : b
_mm_max_epi8 PMAXSB max(a, b)
_mm_min_epi8 PMINSB min(a, b)

Další operace s 16 byty

Tyto instrukce také pracují se 128 bitovými XMM registry jako s šestnácticemi bytů, ale byte výsledku už nezávisí jen na stejnolehlých bytech operandů.

Osobní nástroje
Jmenné prostory
Varianty
Akce
Navigace
Nástroje