SSE operace se 4 čísly typu float

Z HPM wiki
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(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.

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