b'\n_START_ARTICLE_\nStreaming SIMD Extensions\n_START_SECTION_\nDzia\xc5\x82ania zmiennoprzecinkowe\n_START_PARAGRAPH_\nSSE jest zgodne ze standardem IEEE-754. Mo\xc5\xbcliwe jest jednak w\xc5\x82\xc4\x85czenie pewnych niestandardowych cech, kt\xc3\xb3re w niekt\xc3\xb3rych przypadkach przyspieszaj\xc4\x85 obliczenia.\n_START_SECTION_\nRozmieszczenie element\xc3\xb3w w wektorze\n_START_PARAGRAPH_\nRozkazy SHUFPS, UNPCKLPS, UNPCKHPS umo\xc5\xbcliwiaj\xc4\x85 r\xc3\xb3\xc5\xbcnorakie rozmieszczenie (\xe2\x80\x9ewymieszanie\xe2\x80\x9d) element\xc3\xb3w, np. odwr\xc3\xb3cenie kolejno\xc5\x9bci element\xc3\xb3w w wektorze.\n_START_SECTION_\nUNPCKLPS, UNPCKHPS\n_START_PARAGRAPH_\nRozkazy ustawia na przemian 2 elementy z obu wektor\xc3\xb3w. UNPCKLPS bierze dwa m\xc5\x82odsze elementy (tj. o indeksach 0 i 1), natomiast UNPCKHPS dwa starsze (indeksy 2 i 3). Rozkaz UNPCKLPS xmm1, xmm2 wykonuje:_NEWLINE_temp[0]\xc2\xa0:= xmm1[0]_NEWLINE_temp[1]\xc2\xa0:= xmm2[0]_NEWLINE_temp[2]\xc2\xa0:= xmm1[1]_NEWLINE_temp[3]\xc2\xa0:= xmm2[1]_NEWLINE_xmm1\xc2\xa0:= temp_NEWLINE_za\xc5\x9b UNPCKHPS xmm1, xmm2_NEWLINE_temp[0]\xc2\xa0:= xmm1[2]_NEWLINE_temp[1]\xc2\xa0:= xmm2[2]_NEWLINE_temp[2]\xc2\xa0:= xmm1[3]_NEWLINE_temp[3]\xc2\xa0:= xmm2[3]_NEWLINE_xmm1\xc2\xa0:= temp_NEWLINE_Np._NEWLINE_           3     2     1     0_NEWLINE_        +-----+-----+-----+-----+_NEWLINE_ xmm1 = |  d  |  c  |  b  |  a  |_NEWLINE_        +-----+-----+-----+-----+_NEWLINE_        _NEWLINE_        +-----+-----+-----+-----+_NEWLINE_ xmm2 = |  h  |  g  |  f  |  e  |_NEWLINE_        +-----+-----+-----+-----+_NEWLINE_Wynik UNPCKLPS:_NEWLINE_        +-----+-----+-----+-----+_NEWLINE_ xmm1 = |  f  |  b  |  e  |  a  |_NEWLINE_        +-----+-----+-----+-----+_NEWLINE_Wynik UNPCKHPS:_NEWLINE_        +-----+-----+-----+-----+_NEWLINE_ xmm1 = |  h  |  d  |  g  |  c  |_NEWLINE_        +-----+-----+-----+-----+\n_START_SECTION_\nSHUFPS\n_START_PARAGRAPH_\nRozkaz bardziej og\xc3\xb3lny ni\xc5\xbc UNPCKxPS, umo\xc5\xbcliwia wskazanie dowolnych indeks\xc3\xb3w z wektor\xc3\xb3w \xc5\xbar\xc3\xb3d\xc5\x82owych za pomoc\xc4\x85 trzeciego argumentu (sta\xc5\x82ej natychmiastowej), w kt\xc3\xb3rym na ka\xc5\xbcdych kolejnych dw\xc3\xb3ch bitach zapisane s\xc4\x85 4 indeksy. Rozkazowi SHUFPS xmm1, xmm2, imm8 odpowiada:_NEWLINE_{ pobranie indeks\xc3\xb3w }_NEWLINE_index1_0\xc2\xa0:= (imm8 AND 00000011b)_NEWLINE_index1_1\xc2\xa0:= (imm8 AND 00001100b) SHR 2_NEWLINE_index2_0\xc2\xa0:= (imm8 AND 00110000b) SHR 4_NEWLINE_index2_1\xc2\xa0:= (imm8 AND 11000000b) SHR 6_NEWLINE__NEWLINE_{ rozmieszczenie element\xc3\xb3w }_NEWLINE_temp[0]\xc2\xa0:= xmm1[index1_0]_NEWLINE_temp[1]\xc2\xa0:= xmm1[index1_1]_NEWLINE_temp[2]\xc2\xa0:= xmm2[index2_0]_NEWLINE_temp[3]\xc2\xa0:= xmm2[index2_1]_NEWLINE_xmm1\xc2\xa0:= temp\n_START_SECTION_\nPrzes\xc5\x82ania liczb zmiennoprzecinkowych mi\xc4\x99dzy rejestrami i pami\xc4\x99ci\xc4\x85\n_START_PARAGRAPH_\nRozkazy dzia\xc5\x82aj\xc4\x85 na wektorach liczb zmiennoprzecinkowych (4 elementy).\n_START_SECTION_\nMOVSS\n_START_PARAGRAPH_\nPrzes\xc5\x82anie jednej liczby zmiennoprzecinkowej pomi\xc4\x99dzy rejestrem XMM a pami\xc4\x99ci\xc4\x85 lub innym rejestrem XMM. Rozkaz dzia\xc5\x82a na elemencie 0 rejestr\xc3\xb3w XMM: przy przes\xc5\x82aniach z rejestru do rejestru tylko on jest zmieniany, przy przes\xc5\x82aniu z pami\xc4\x99ci do rejestru zerowane s\xc4\x85 pozosta\xc5\x82e elementy.\n_START_SECTION_\nMOVLPS, MOVHPS\n_START_PARAGRAPH_\nPrzes\xc5\x82anie 2 liczb zmiennoprzecinkowych pomi\xc4\x99dzy rejestrem XMM i pami\xc4\x99ci\xc4\x85. Rozkaz MOVLPS dzia\xc5\x82a na elementach 0 i 1 rejestru XMM, natomiast MOVHPS na elementach 2 i 3.\n_START_SECTION_\nMOVMSKPS\n_START_PARAGRAPH_\nUtworzenie 4-bitowej maski z najstarszych bit\xc3\xb3w ka\xc5\xbcdej z liczb (tj. z bit\xc3\xb3w znaku) i zapisanie jej do rejestru og\xc3\xb3lnego przeznaczenia x86 (EAX, EBX itd.).\n_START_SECTION_\nPami\xc4\x99\xc4\x87 podr\xc4\x99czna\n_START_PARAGRAPH_\nW SSE dost\xc4\x99pne s\xc4\x85 trzy grupy rozkaz\xc3\xb3w odnosz\xc4\x85ce si\xc4\x99 do pami\xc4\x99ci podr\xc4\x99cznej.\n_START_SECTION_\nPobranie danych \xe2\x80\x9ebli\xc5\xbcej\xe2\x80\x9d procesora\n_START_PARAGRAPH_\nRozkazy PREFETCH (PREFETCHT0, PREFETCHT1, PREFETCHT2, PREFETCHNTA) s\xc4\x85 rodzajami podpowiedzi (ang. hint) dla procesora, wskazuj\xc4\x85cymi, \xc5\xbce obszar pami\xc4\x99ci powinien znale\xc5\xba\xc4\x87 si\xc4\x99 wy\xc5\xbcej w hierarchii pami\xc4\x99ci podr\xc4\x99cznej: poziom 1 znajduje si\xc4\x99 najbli\xc5\xbcej procesora, poziom 2 dalej itd. Im \xe2\x80\x9ebli\xc5\xbcej\xe2\x80\x9d procesora znajduj\xc4\x85 si\xc4\x99 dane, tym mniejszy jest czas oczekiwania na nie; np. je\xc5\x9bli dane s\xc4\x85 ju\xc5\xbc w pami\xc4\x99ci podr\xc4\x99cznej pierwszego poziomu, prawie w og\xc3\xb3le nie trzeba czeka\xc4\x87, w przeciwnym razie czas oczekiwania mo\xc5\xbce wynie\xc5\x9b\xc4\x87 kilkana\xc5\x9bcie, a nawet kilkadziesi\xc4\x85t lub kilkaset cykli maszynowych._NEWLINE_Programista czy kompilator wie lepiej kiedy i kt\xc3\xb3re dane wykorzystuje \xe2\x80\x93 za pomoc\xc4\x85 rozkaz\xc3\xb3w PREFETCH mo\xc5\xbce odpowiednio wcze\xc5\x9bniej powiadomi\xc4\x87 procesor o zapotrzebowaniu i unikn\xc4\x85\xc4\x87 tym samym oczekiwania, kiedy dane b\xc4\x99d\xc4\x85 ju\xc5\xbc potrzebne._NEWLINE_Nale\xc5\xbcy zauwa\xc5\xbcy\xc4\x87, \xc5\xbce procesor mo\xc5\xbce owych \xe2\x80\x9epodpowiedzi\xe2\x80\x9d w og\xc3\xb3le nie uwzgl\xc4\x99dni\xc4\x87.'