Andps–Bitowe logiczne and wykonywane na spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji



Pobieranie 134,95 Kb.
Data25.04.2018
Rozmiar134,95 Kb.

Jakub Adamczak


Kadm@ether.zsk.p.lodz.pl


ANDPS–Bitowe logiczne AND wykonywane na spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji




Kod Instrukcja Opis


0F 54 /r ANDPS xmm1,xmm2/m128 Bitowe logiczne AND między argumentami xmm2/m128   i xmm1.



Opis

Wykonuje bitowe logiczne AND na spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji, pochodzących z argumentu źródła (drugi z argumentów) i na zawartości argumentu celu (pierwszy z argument), oraz umieszcza wynik w argumencie celu. Argumentem źródła może być rejestr XMM lub 128-bitowy obszar pamięci. Argumentem celu musi być rejestr XMM.



Działanie

DEST[127-0]  DEST[127-0] BitwiseAND SRC[127-0];



Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

ANDPS __m128_mm_and_ps(__m128 a,__m128 b)


Wyjątki zmiennoprzecinkowe SIMD
Brak.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.
#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.

#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.

ANDPS–Bitowe logiczne AND wykonywane na spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)




Wyjątki trybu rzeczywistego

#GP(0) Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.


Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.

ANDNPS–Bitowe logiczne AND NOT wykonywane na spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji




Kod Instrukcja Opis


0F 55 /r ANDNPS xmm1,xmm2/m128 Bitowe logiczne AND NOT między argumentami

xmm2/m128 xmm1.

Opis

Odwraca bity zmiennoprzecinkowych wartości pojedynczej precyzji, znajdujących się w argumencie celu (pierwszy z argumentów), następnie wykonuje bitowe logiczne AND na spakowanych wartościach zmienno przecinkowych pojedynczej precyzji, pochodzących z argumentu źródła (drugi z argumentów) i na tymczasowo odwróconej zawartości pierwszego argumentu. Wynik umieszczony zostaje w argumencie celu. Argumentem źródła może być rejestr XMM lub 128-bitowy obszar pamięci. Argumentem celu musi być rejestr XMM.



Działanie

DEST[127-0]  (NOT(DEST[127-0])) BitwiseAND SRC[127-0];



Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

ANDNPS __m128_mm_andnot_ps(__m128 a,__m128 b)


Wyjątki zmiennoprzecinkowe SIMD
Brak.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.
#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


Kadm@ether.zsk.p.lodz.pl



ANDNPS–Bitowe logiczne AND NOT wykonywane na spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)




Wyjątki trybu rzeczywistego

#GP(0) Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.


Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.

CMPPS–Porównanie spakowanych wartości zmiennoprzecinkowych pojedynczej precyzji




Kod Instrukcja Opis


0F C2 /r ib CMPPS xmm1,xmm2/m128,imm8 Porównuje spakowane wartości zmiennoprzecinkowe

pojedynczej precyzji z argumentów xmm2/mem i xmm1

w zależności od typu porównania zawartego w imm8.




Opis

Wykonuje porównanie SIMD na czterech spakowanych wartościach zmiennoprzecinkowych pojedynczej precyzji, pochodzących z argumentu źródła (drugi z argumentów) i na zawartości argumentu celu (pierwszy z argument), oraz zwraca wynik porównania do argumentu celu. Argument trzeci określa typ porównania wykonywanego na każdej z wartości obu spakowanych argumentów. Wynikiem porównania jest 32-bitowa maska składająca się z samych jedynek (gdy argumenty są jednakowe) lub z samych zer (gdy argumenty są różne). Argumentem źródła może być rejestr XMM lub 128-bitowy obszar pamięci. Argumentem celu musi być rejestr XMM. Argument trzeci musi mieć długość 8 bitów, gdzie 3 pierwsze definiują typ wykonywanego porównania (patrz tabela 3-5), a bity od 4 do 7 pozostają zarezerwowane.


Nieuporządkowana zależność zachodzi, gdy co najmniej jeden z dwóch porównywanych argumentów źródła jest wartości NaN lub jest nieokreślonego formatu. Uporządkowana zależność zachodzi, gdy żaden z argumentów źródła nie jest wartością NaN i nie jest nieokreślonego formatu.
Kolejna, wykonywana instrukcja, używająca otrzymanej maski (pozostawionej w argumencie celu) jako argumentu wejściowego nie będzie generowała błędu, gdyż maska złożona z samych zer odpowiada wartości zmiennoprzecinkowej +0.0, a maska złożona z samych jedynek odpowiada QNaN.
Niektóre z pośród porównań, wymienionych w tabeli 3-5 (takie jak relacje „większe”, „większe-równe”, „niewiększe”, „niewiększe-różne”) mogą być wykonane jedynie dzięki programowej emulacji. Dla tych właśnie porównań program musi podmienić argumenty (przez kopiowanie zawartości rejestrów, jeśli to konieczne, dla ochrony danych aktualnie zawartych pod argumentem celu), a następnie przeprowadzić porównanie właściwego typu. Typy porównań, używane w czasie emulacji, są wymienione w tabeli 3-5, w kolumnie oznaczonej jako „Emulacja”.

Kompilatory oraz asemblery mogą implementować poniższe dwuargumentowe pseudo instrukcje jako trzyargumentowe instrukcje CMPPS:




Pseudo instrukcja

Implementacja

CMPEQPS xmm1, xmm2

CMPPS xmm1, xmm2, 0

CMPLTPS xmm1, xmm2

CMPPS xmm1, xmm2, 1

CMPLEPS xmm1, xmm2

CMPPS xmm1, xmm2, 2

CMPUNORDPS xmm1, xmm2

CMPPS xmm1, xmm2, 3

CMPNEQPS xmm1, xmm2

CMPPS xmm1, xmm2, 4

CMPNLTPS xmm1, xmm2

CMPPS xmm1, xmm2, 5

CMPNLEPS xmm1, xmm2

CMPPS xmm1, xmm2, 6

CMPORDPS xmm1, xmm2

CMPPS xmm1, xmm2, 7

CMPPS–Porównanie spakowanych wartości zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)

Relacje typu „większe”, nie implementowane przez procesor, potrzebują więcej niż jednej instrukcji emulującej programowo i dlatego nie powinny być implementowane jako pseudoinstrukcje. (Gdy zachodzi potrzeba użycia relacji „większe”, programista powinien przywrócić argumenty niezbędne niższym porównaniom składowym, następnie użyć instrukcji przenoszących (typu MOV), aby być pewnym, że maska jest umieszczona we właściwym rejestrze docelowym, a argument źródła został niezmieniony.)


Działanie

CASE (TYP PORÓWNANIA) OF

0: OP  EQ;

1: OP  LT;

2: OP  LE;

3: OP  UNORD;

4: OP  NE;

5: OP  NLT;

6: OP  NLE;

7: OP  ORD;

EASC

CMP0  DEST[31-0] OP SRC[31-0];



CMP1  DEST[63-32] OP SRC[63-32];

CMP2  DEST[95-64] OP SRC[95-64];

CMP3  DEST[127-96] OP SRC[127-96];

IF CMP0 = TRUE

THEN DEST[31-0]  FFFFFFFFH

ELSE DEST[31-0]  00000000H; FI;

IF CMP1 = TRUE

THEN DEST[63-32]  FFFFFFFFH

ELSE DEST[63-32]  00000000H; FI;

IF CMP2 = TRUE

THEN DEST95-64]  FFFFFFFFH

ELSE DEST[95-64]  00000000H; FI;

IF CMP3 = TRUE

THEN DEST[127-96]  FFFFFFFFH

ELSE DEST[127-96]  00000000H; FI;

Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

CMPPS dla równości __m128_mm_cmpeq_ps(__m128 a,__m128 b)

CMPPS dla mniejszości __m128_mm_cmplt_ps(__m128 a,__m128 b)

CMPPS dla mniejszości-równości __m128_mm_cmple_ps(__m128 a,__m128 b)

CMPPS dla większości __m128_mm_cmpgt_ps(__m128 a,__m128 b)

CMPPS dla większości-równości __m128_mm_cmpge_ps(__m128 a,__m128 b)

CMPPS dla nierówności __m128_mm_cmpneq_ps(__m128 a,__m128 b)

CMPPS–Porównanie spakowanych wartości zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)

CMPPS dla nie mniejszości __m128_mm_cmpnlt_ps(__m128 a,__m128 b)

CMPPS dla nie większości __m128_mm_cmpngt_ps(__m128 a,__m128 b)

CMPPS dla nie większości-równości __m128_mm_cmpnge_ps(__m128 a,__m128 b)

CMPPS dla uporządkowania __m128_mm_cmpord_ps(__m128 a,__m128 b)

CMPPS dla nieuporządkowania __m128_mm_cmpunord_ps(__m128 a,__m128 b)

CMPPS dla nie mniejszości-równości __m128_mm_cmpnle_ps(__m128 a,__m128 b)
Wyjątki zmiennoprzecinkowe SIMD
Nieprawidłowość, jeśli wystąpił argument SNaN, Nienaturalność.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.
#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.



Wyjątki trybu rzeczywistego

#GP(0) Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.


Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.

CMPPS–Porównanie spakowanych wartości zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)

#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.


#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.

CMPSS–Porównanie skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji




Kod Instrukcja Opis


F3 0F C2 /r ib CMPSS xmm1,xmm2/m128,imm8 Porównuje wartości zmiennoprzecinkowe pojedynczej

precyzji z młodszych części argumentów xmm2/m32

i xmm1 w zależności od typu porównania zawartego

imm8.





Opis

Wykonuje porównanie między wartościami zmiennoprzecinkowymi pojedynczej precyzji, pochodzącymi z najmłodszych części argumentu źródła (drugi z argumentów) i argumentu celu (pierwszy z argument), oraz zwraca wynik porównania do argumentu celu. Argument trzeci określa typ wykonywanego porównania. Wynikiem porównania jest 32‑bitowa maska składająca się z samych jedynek (gdy argumenty jednakowe) lub z samych zer (gdy argumenty różne). Argumentem źródła może być rejestr XMM lub 128-bitowy obszar pamięci. Argumentem celu musi być rejestr XMM. Wynik jest zapisywany w najmłodszej części argumentu celu, reszta argumentu pozostaje niezmieniona. Argument trzeci musi mieć długość 8 bitów, gdzie 3 pierwsze definiują typ wykonywanego porównania (patrz tabela 3-5), a bity od 4 do 7 pozostają zarezerwowane.


Nieuporządkowana zależność zachodzi, gdy co najmniej jeden z dwóch porównywanych argumentów źródła jest wartości NaN lub jest nieokreślonego formatu. Uporządkowana zależność zachodzi, gdy żaden z argumentów źródła nie jest wartością NaN i nie jest nieokreślonego formatu.
Kolejna, wykonywana instrukcja, używająca otrzymanej maski (pozostawionej w argumencie celu) jako argumentu wejściowego nie będzie generowała błędu, gdyż maska złożona z samych zer odpowiada wartości zmiennoprzecinkowej +0.0, a maska złożona z samych jedynek odpowiada QnaN.
Niektóre z pośród porównań, wymienionych w tabeli 3-5 mogą być uzyskane jedynie dzięki programowej emulacji. Dla tych właśnie porównań program musi podmienić argumenty (przez kopiowanie zawartości rejestrów, jeśli to konieczne, dla ochrony danych aktualnie zawartych pod argumentem celu), a następnie przeprowadzić porównanie właściwego typu. Typy porównań, używane w czasie emulacji, są wymienione w tabeli 3-5, w kolumnie oznaczonej jako „Emulacja”.

Kompilatory oraz asemblery mogą implementować poniższe dwuargumentowe pseudo instrukcje jako trzyargumentowe instrukcje CMPSS:




Pseudo instrukcja

Implementacja

CMPEQSS xmm1, xmm2

CMPSS xmm1, xmm2, 0

CMPLTSS xmm1, xmm2

CMPSS xmm1, xmm2, 1

CMPLESS xmm1, xmm2

CMPSS xmm1, xmm2, 2

CMPUNORDSS xmm1, xmm2

CMPSS xmm1, xmm2, 3

CMPNEQSS xmm1, xmm2

CMPSS xmm1, xmm2, 4

CMPNLTSS xmm1, xmm2

CMPSS xmm1, xmm2, 5

CMPNLESS xmm1, xmm2

CMPSS xmm1, xmm2, 6

CMPORDSS xmm1, xmm2

CMPSS xmm1, xmm2, 7

CMPSS–Porównanie skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)

Relacje typu „większe”, nie implementowane przez procesor, potrzebują więcej niż jednej instrukcji emulującej programowo i dlatego nie powinny być implementowane jako pseudoinstrukcje. (Gdy zachodzi potrzeba użycia relacji „większe”, programista powinien przywrócić argumenty niezbędne niższym porównaniom składowym, następnie użyć instrukcji przenoszących (typu MOV), aby być pewnym, że maska jest umieszczona we właściwym rejestrze docelowym, a argument źródła został niezmieniony.)


Działanie

CASE (TYP PORÓWNANIA) OF

0: OP  EQ;

1: OP  LT;

2: OP  LE;

3: OP  UNORD;

4: OP  NE;

5: OP  NLT;

6: OP  NLE;

7: OP  ORD;

DEFAULT: Zarezerwowany;

CMP0  DEST[31-0] OP SRC[31-0];

IF CMP0 = TRUE

THEN DEST[31-0]  FFFFFFFFH

ELSE DEST[31-0]  00000000H; FI;

* DEST[127-32] pozostają niezmienione *;



Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

CMPSS dla równości __m128_mm_cmpeq_ss(__m128 a,__m128 b)

CMPSS dla mniejszości __m128_mm_cmplt_ss(__m128 a,__m128 b)

CMPSS dla mniejszości-równości __m128_mm_cmple_ss(__m128 a,__m128 b)

CMPSS dla większości __m128_mm_cmpgt_ss(__m128 a,__m128 b)

CMPSS dla większości-równości __m128_mm_cmpge_ss(__m128 a,__m128 b)

CMPSS dla nierówności __m128_mm_cmpneq_ss(__m128 a,__m128 b)

CMPSS dla nie mniejszości __m128_mm_cmpnlt_ss(__m128 a,__m128 b)

CMPSS dla nie większości __m128_mm_cmpngt_ss(__m128 a,__m128 b)

CMPSS dla nie większości-równości __m128_mm_cmpnge_ss(__m128 a,__m128 b)

CMPSS dla uporządkowania __m128_mm_cmpord_ss(__m128 a,__m128 b)

CMPSS dla nieuporządkowania __m128_mm_cmpunord_ss(__m128 a,__m128 b)

CMPSS dla nie mniejszości-równości __m128_mm_cmpnle_ss(__m128 a,__m128 b)

CMPSS–Porównanie skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)



Wyjątki zmiennoprzecinkowe SIMD
Nieprawidłowość, jeśli wystąpił argument SNaN. Nieprawidłowość, jeśli wystąpił QNaN i typ z tablicy powyżej, Nienaturalność.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE2 w CPUID jest wyzerowana.


#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania przy aktualnym poziomie przywilejów 3.

Wyjątki trybu rzeczywistego

#GP(0) Gdy argument w pamięci nie jest wyrównany do granicy 16 bajtów, niezależnie od segmentu.


Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.

#NM Jeśli ustawiony jest bit TS w rejestrze CR0.


#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE2 w CPUID jest wyzerowana.


CMPSS–Porównanie skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji (kontynuacja)



Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania.

COMISS–Porównanie uporządkowanych skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji z ustawieniem EFLAGS




Kod Instrukcja Opis


0F 2F /r COMISS xmm1,xmm2/m32 Porównuje wartości zmiennoprzecinkowe pojedynczej precyzji

z najmłodszych części argumentów mm1 i xmm2/m32

równocześnie ustawiając flagę EFLAGS




Opis

Dokonuje porównania wartości zmiennoprzecinkowych pojedynczej precyzji, pochodzących z najmłodszych części obydwu 32-bitowych argumentów źródła (pierwszy i drugi z argumentów) i ustawia flagi ZF, PF i CF w rejestrze EFLAGS w zależności od otrzymanego rezultatu porównania („nieporządkowalne”, „większe”, „mniejsze” lub „równe”). Flagi OF, SF i AF rejestru EFLAGS są zerowane. Rezultat „nieuporządkowane” osiągany jest wówczas, gdy jeden z argumentów to NaN (QNaN lub SNaN).


Pierwszym argumentem źródła musi być rejestr XMM, drugim argumentem źródła może być rejestr XMM lub 32-bitowy obszar pamięci.
Instrukcja COMISS różni się od instrukcji UCOMISS tym, że sygnalizuje wyjątek wystąpienia nieprawidłowej operacji zmiennoprzecinkowej SIMD (#I), gdy argumentem źródła jest QNaN lub SNaN. Instrukcja UCOMISS sygnalizuje nieprawidłowy wyjątek numeryczny tylko wtedy, gdy argument źródła to SNaN.
Rejestr EFLAGS nie jest aktualizowany, jeśli miał miejsce niezamaskowany wyjątek zmiennoprzecinkowy SIMD.

Działanie

RESULT  OrderedCompare(SRC1[31-0]<>SRC2[31-0]) {

* Set EFLAGS * CASE (RESULT) OF

UNORDERED: ZF,PF,CF  111;

GREATER_THAN: ZF,PF,CF  000;

LESS_THAN: ZF,PF,CF  001;

EQUAL: ZF,PF,CF  100;

ESAC;


OF ,AF ,SF  0;

Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

int_mm_comieq_ss(__m128 a,__m128 b)

int_mm_comilt_ss(__m128 a,__m128 b)

int_mm_comile_ss(__m128 a,__m128 b)

int_mm_comigt_ss(__m128 a,__m128 b)

int_mm_comige_ss(__m128 a,__m128 b)

int_mm_comieq_ss(__m128 a,__m128 b)

COMISS–Porównanie uporządkowanych skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji z ustawieniem EFLAGS (kontynuacja)



Wyjątki zmiennoprzecinkowe SIMD
Nieprawidłowość, jeśli wystąpił argument SNaN lub QNaN , Nienaturalność.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania przy aktualnym poziomie przywilejów 3.

Wyjątki trybu rzeczywistego

Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.


#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


COMISS–Porównanie (!)uporządkowanych skalarnych wartości zmiennoprzecinkowych pojedynczej precyzji z ustawieniem EFLAGS (kontynuacja)



Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania.

CVTPI2PS–Konwersja spakowanej całkowitej liczby 32‑bitowej do wartości zmiennoprzecinkowej pojedynczej precyzji




Kod Instrukcja Opis


0F 2A /r CVTPI2PS xmm, mm/m64 Konwertuje dwie liczby całkowite 32-bitowe ze znakiem z mm/m64

do dwóch liczb zmiennoprzecinkowych pojedynczej precyzji w xmm





Opis

Dokonuje konwersji dwóch spakowanych całkowitych liczb 32-bitowych ze znakiem, pochodzących z argumentu źródła (drugi z argumentów) do dwóch spakowanych zmiennoprzecinkowych liczb pojedynczej precyzji w argumencie celu (pierwszy z argumentów). Argumentem źródła może być rejestr MMX lub 64-bitowy obszar pamięci. Argumentem celu musi być rejestr XMM. Rezultat jest umieszczany w młodszej części liczby 64-bitowej argumentu celu, natomiast starsza część pozostaje niezmieniona.


Instrukcja ta umożliwia przejście z technologii x87 FPU do MMX (tzn. wskaźnik szczytu stosu w przypadku x87 FPU jest zerowany oraz znaczniki koprocesora są wyzerowywane [ważne]). Jeśli instrukcja ta jest wywołana w chwili, gdy zachodzi wyjątek zmiennoprzecinkowy x87 FPU, to wyjątek jest obsługiwany zanim instrukcja CVTPI2PS zostanie wykonana.

Działanie

DEST[31-0]  Convert_Integer_To_Single_Precision_Floating_Point(SRC[31-0]);

DEST[63-32]  Convert_Integer_To_Single_Precision_Floating_Point(SRC[63-32]);

* wyższa część liczby 64-bitowej argumentu celu pozostaje niezmieniona *;



Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

CVTPI2PS __m128_mm_cvtpi32_ps(__m128 a,__m64 b)


Wyjątki zmiennoprzecinkowe SIMD
Dokładność.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#MF Gdy wykryto oczekujący wyjątek koprocesora x87
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.

CVTPI2PS–Konwersja spakowanej całkowitej liczby

32‑bitowej do wartości zmiennoprzecinkowej pojedynczej

precyzji (kontynuacja)
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE2 w CPUID jest wyzerowana.


#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania przy aktualnym poziomie przywilejów 3.

Wyjątki trybu rzeczywistego

Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.


#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#MF Gdy wykryto oczekujący wyjątek koprocesora x87
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania.

CVTPS2PI–Konwersja spakowanej całkowitej liczby 32‑bitowej do wartości zmiennoprzecinkowej pojedynczej precyzji




Kod Instrukcja Opis


0F 2D /r CVTPS2PI mm, xmm/m64 Konwertuje dwie spakowane liczby zmiennoprzecinkowe

pojedynczej precyzji z xmm/m64 do dwóch spakowanych

całkowitych liczb 32-bitowe ze znakiem w mm




Opis

Dokonuje konwersji dwóch spakowanych zmiennoprzecinkowych liczb pojedynczej precyzji, pochodzących z argumentu źródła (drugi z argumentów) do dwóch spakowanych całkowitych liczb 32‑bitowych ze znakiem w argumencie celu (pierwszy z argumentów). Argumentem źródła może być rejestr XMM lub 128-bitowy obszar pamięci. Argumentem celu musi być rejestr MMX. Gdy argument źródła jest rejestrem XMM, to dwie liczby zmiennoprzecinkowe pojedynczej precyzji są zawarte w młodszej części liczby 64‑bitowej tego rejestru.


Jeśli konwersja jest niedokładna, zwracana liczba jest zaokrąglana zgodnie z bitem kontrolującym zaokrąglanie znajdującym się w rejestrze MXCSR. Jeśli zwracana liczba jest większa od maksymalnej wartości całkowitej liczby 32-bitowej ze znakiem, wtedy zwracana jest nieokreślona wartość całkowita (80000000H).
Instrukcja ta umożliwia przejście z technologii x87 FPU do MMX (tzn. wskaźnik szczytu stosu w przypadku x87 FPU jest zerowany oraz znaczniki koprocesora są wyzerowywane [ważne]). Jeśli instrukcja ta jest wywołana w chwili, gdy zachodzi wyjątek zmiennoprzecinkowy x87 FPU, to wyjątek jest obsługiwany zanim instrukcja CVTPI2PS zostanie wykonana.

Działanie

DEST[31-0]  Convert_Single_Precision_Floating_Point_To_Integer(SRC[31-0]);

DEST[63-32]  Convert_Single_Precision_Floating_Point_To_Integer(SRC[63-32]);

Wewnętrzne odpowiedniki instrukcji dla kompilatora C/C++

__m64_mm_cvtps_pi32(__m128 a)


Wyjątki zmiennoprzecinkowe SIMD
Nieprawidłowość, Dokładność.

Wyjątki trybu chronionego

#GP(0) Gdy adres efektywny argumentu w pamięci dla segmentu CS, DS, ES, FS lub GS jest nieprawidłowy.

#SS(0) Gdy adres argumentu w pamięci dla segmentu SS jest nieprawidłowy.
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
CVTPS2PI–Konwersja spakowanej całkowitej liczby

32‑bitowej do wartości zmiennoprzecinkowej pojedynczej

precyzji (kontynuacja)
#MF Gdy wykryto oczekujący wyjątek koprocesora x87
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania przy aktualnym poziomie przywilejów 3.

Wyjątki trybu rzeczywistego

Przerwanie 13 Gdy jakaś część argumentu leży poza granicą efektywnej przestrzeni adresowej od 0 do FFFFH.


#NM Jeśli ustawiony jest bit TS w rejestrze CR0.
#MF Gdy wykryto oczekujący wyjątek koprocesora x87
#XM Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest ustawiony.
#UD Jeśli wystąpi niezamaskowany wyjątek zmiennoprzecinkowy SIMD oraz bit OSXMMEXCPT w CR4 jest wyzerowany.

Jeśli bit EM w CR0 jest ustawiony.

Jeśli bit OSFXSR w CR4 jest wyzerowany.

Jeśli flaga SSE w CPUID jest wyzerowana.


Wyjątki trybu wirtualnego-8086
Są takie same, jak w przypadku wyjątków trybu rzeczywistego
#PF(błąd kodu) Jeśli wystąpił błąd strony.
#AC(0) Jeśli włączona jest kontrola wyrównania i ma miejsce odwołanie do obszaru pamięci nie leżącego na granicy wyrównywania.




©operacji.org 2019
wyślij wiadomość

    Strona główna