SSE operace se 4 čísly typu float
Z HPM wiki
(Rozdíly mezi verzemi)
(link na IEEE 754 Converter) |
(pokus použít šablonu na intrinsics - funguje, ale je to velmi pomalé) |
||
Řádka 4: | Řádka 4: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! _mm_hadd_ps | + | ! {{intr|_mm_hadd_ps}} |
! HADDPS | ! HADDPS | ||
! a0+a1, a2+a3, b0+b1, b2+b3 | ! a0+a1, a2+a3, b0+b1, b2+b3 | ||
|- | |- | ||
− | ! _mm_hsub_ps | + | ! {{intr|_mm_hsub_ps}} |
! HSUBPS | ! HSUBPS | ||
! a0-a1, a2-a3, b0-b1, b2-b3 | ! a0-a1, a2-a3, b0-b1, b2-b3 |
Aktuální verze z 15. 12. 2015, 15:57
Obsah |
Čistě vertikální operace
Další aritmetické operace
_mm_hadd_ps | HADDPS | a0+a1, a2+a3, b0+b1, b2+b3 |
---|---|---|
_mm_hsub_ps | HSUBPS | a0-a1, a2-a3, b0-b1, b2-b3 |
Přesuny
Operandy i výsledek uvažujeme v pořadí, jako by to byly prvky pole: a0, a1, a2, a3 a b0, b1, b2, b3, i když v registru je to obráceně (a3 je v nejvyšších bitech, kreslených vlevo).
_mm_unpacklo_ps | UNPCKLPS | a0, b0, a1, b1 | |
---|---|---|---|
_mm_unpackhi_ps | UNPCKHPS | a2, b2, a3, b3 | |
_mm_shuffle_ps | SHUFPS | aE, aF, bG, bH | c = HGFE |
Funkci přesunů si lze ověřit třeba takto:
main(){ float x[4] = {0xa0, 0xa1, 0xa2, 0xa3}; /* tricky, hex ints go to floats */ float y[4] = {0xb0, 0xb1, 0xb2, 0xb3}; int i; __m128 a, b; a = *(__m128 *)x; b = *(__m128 *)y; b = _mm_unpacklo_ps( a, b ); /* instruction to test */ *(__m128 *)y = b; for( i=0; i<4; i++ ){ printf("%x ", (int)y[i]); /* here we get: a0 b0 a1 b1 */ } }
Konverze typu
Další drobnosti
Pokud snad tápete v tom, jak jsou čísla typu float vyjádřena pomocí 32 jednotlivých bitů, vřele doporučuji IEEE 754 Converter.