SSE operace se 4 čísly typu float

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

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