112 Anatomia PC
Jak powszechnie wiadomo, nic ma nic za darmo i to genialnie proste rozwiązanie pociąga za sobą pewne konsekwencje. Instrukcjom fsave/frstok jest z pewnością obojętne jak należy interpretować przesyłane dane. Jakkolwiek rejestry' MM i ST stanowią fizycznie odrębne jednostki, każdy dostęp do FPL ma swoje odbicie w MMX i odwrotnie. W obrębie danego zadania (Task)> od przełączenia do przełączenia, procesor pracuje albo w trybie MMX albo w trybie zmiennoprzecinkowym - nigdy w obydwu na raz. Każda zmiana stanu musi być przeprowadzona z udziałem pary rozkazów r save/ FRSTOR.
Programy wykorzystujące specyfikę rozszerzeń MMX muszą być pisane w przebiegły sposób. Z jednej strony nie można sobie wyobrazić, nowoczesnego algorytmu 3D bez intensywnej operacji na danych zmiennoprzecinkowych; bazuje na nich cały rachunek współrzędnych w przestrzeni. Drugą stronę medalu stanowi astronomicznie długi czas przełączania: fsave zajmuje 124 takty zegarowa a FR37CR trwa 70 taktów1 2. Częste stosowanie tych instrukcji obraca w' niwecz ideę przyspieszania czegokolwiek.
Jeżeli pominąć momenty przełączania wątków skupić się można na wykonywaniu programu zawierającego zarówno instrukcje MMX jak i te odwołujące się do jednostki zmiennoprzecinkowej. Idealnym rozwiązaniem jest grupowanie partii kodu jednego rodzaju w możliwie duże bloki. Jeżeli każdy z bloków' wie, że w newralgicznych rejestrach zastaje „śmieci” pozostawione tam przez poprzednika operacja przełączania nie musi być tak czasochłonna.
Rejestry MMX można przecież jeśli to konieczne czyścić przed użyciem szybkimi instrukcjami typu:
PXOR mmxf mmx ; jeden cy!<l aeqarowy
Każdy blok MMX zakończany jest specjalną instrukcją emms (Empty Multimedia State). Jej działanie sprowadza się do ustawienia flag informujących jednostkę FPU, że przejmowane przez rejestry ST dane są nieważne3 i nie podlegają interpretacji. Czas wykonywania emms wynosi jak na razie nie mało bo aż 57 taktów zegarowych. Intel planuje usunięcie tego mankamentu w kolejnych wersjach procesora i zredukowanie czasu przełączenia do trzech taktów'.
Fiaginenly kodu operujące na liczbach zmiennoprzecinkowych powinny pozostawiać czysty stos.
kod fp otok 1r
/* zwolniony stos FT V
' W przypadku szczególnie korzystnym, gdy dane znajdują się w pamięci podręcznej (cache hil).
W praktyce stan taki ma rzadko miejsce co prowadzi do zwielokrotnienia podanych czasów'.
Zastanie w rejestrze eksponenty wartości 0xffff zostanie zinterpretowane jako nieskończoność i koprocesor generuje przerwanie