2016-11-26 29 views
6

W zestawie instrukcji RISC MIPS, mamy bajt ładowania (lbu), ładujemy pół słowa (lhu) i ładujemy instrukcje (lw). Wydaje mi się, że wszystko, co można zrobić, można osiągnąć za pomocą lw.MIPS: Dlaczego potrzebujemy bajta obciążenia, gdy mamy już słowo load?

Dlaczego więc projektanci MIPS wprowadzili lbu i lhu? W jakich okolicznościach (najlepiej niezrozumiałych) mogą być one przydatne? Być może lw trwa dłużej niż lbu, aby wykonać, nawet jeśli obie są pojedynczymi instrukcjami?

+1

Oryginalna Alpha nie miała instrukcji ładowania/zapisywania podrzędnego. Możesz dostać dość daleko bez nich, ale Alpha musiała w końcu rozszerzyć zestaw instrukcji o te instrukcje dla systemów wieloprocesorowych. – EOF

Odpowiedz

6

lw wymaga, aby adres, który ładujesz, był wyrównany do słowa (tj. Adres musi być wielokrotnością 4).

Więc powiedzmy, że masz masz tej tablicy znajduje się pod adresem 0x1000:

array: .byte 0,1,2,3 

I chcesz załadować drugi bajt (1), która znajduje się pod adresem 0x1001, co nie jest słowo -równoległy. To oczywiście nie zadziała, chyba że zrobiłeś lw z adresu 0x1000, a następnie wykonałeś kilka przesuwania i ANDing, aby uzyskać żądany bajt, co byłoby prawdziwym kłopotem jako programista.

Załóżmy, że chcesz załadować 0, który jest zlokalizowany pod adresem wyrównanym do słowa i porównać go z pewną wartością. Więc robisz lw z adresu 0x1000, ale teraz twój rejestr docelowy będzie zawierał 0x00010203 lub 0x03020100 (w zależności od endianness), a nie tylko 0. Zanim więc dokonasz porównania, będziesz musiał zrobić bitową operację AND, aby wyodrębnić żądany bajt.

Na pewno widać, że bardzo niewygodne byłoby wykonywanie tych dodatkowych kroków, gdy trzeba przetworzyć pojedyncze bajty danych - co w większości programów jest dość powszechną operacją.

+0

Michael - dziękuję. W odniesieniu do wątpliwości, jakie miałem odnośnie czasu wykonania, przypuszczam, że 'lw' i' lbu' zajmują tyle samo czasu, prawda? To znaczy, jeśli potrzebujemy czekać na pamięć, wymagany czas oczekiwania nie będzie różnił się między tymi dwoma, prawda? – flow2k

+1

@ flow2k: zero - rozszerzenie bajta do rejestru 32-bitowego jest zasadniczo bezpłatne w sprzęcie i, miejmy nadzieję, dobre wdrożenie może efektywnie wybrać właściwe słowo do pobrania z pamięci podręcznej. Spodziewałbym się, że LW i LBU wykonają to samo, ale możliwe, że LBU ma nieco większe opóźnienie w niektórych implementacjach. Jeśli LHU działa na nieprzypisanych półpasach, może zaistnieć potrzeba załadowania jednego bajtu z każdej z dwóch sąsiednich linii pamięci podręcznej. Może być wolniejszy przez cały czas lub wolniejszy w przypadku podziałów w pamięci podręcznej. (Zrobiłem tu wszystko, bazując na mojej wiedzy na temat architektury x86 i procesora, IDK, jaka jest MIPS HW). –