Skompresowany zestaw instrukcji

Skompresowany zestaw instrukcji lub po prostu skompresowane instrukcje to odmiana architektury zestawu instrukcji mikroprocesora (ISA), która umożliwia reprezentację instrukcji w bardziej zwartym formacie. W większości rzeczywistych przykładów skompresowane instrukcje mają długość 16 bitów w procesorze, który w przeciwnym razie używałby instrukcji 32-bitowych. 16-bitowy ISA jest podzbiorem pełnego 32-bitowego ISA, a nie oddzielnym zestawem instrukcji. Mniejszy format wymaga pewnych kompromisów: ogólnie dostępnych jest mniej instrukcji i można użyć mniej rejestrów procesora .

Koncepcja ta została pierwotnie wprowadzona przez firmę Hitachi jako sposób na poprawę gęstości kodu ich projektu procesora SuperH RISC , który przeszedł z instrukcji 16-bitowych na 32-bitowe w wersji SH-5. Nowy projekt miał dwa zestawy instrukcji, jeden dający dostęp do całego ISA nowego projektu, oraz mniejszy 16-bitowy zestaw znany jako SHcompact, który umożliwiał uruchamianie programów w mniejszej ilości pamięci głównej . Ponieważ pamięć nawet najmniejszych systemów jest teraz o rzędy wielkości większa niż systemy, które zrodziły tę koncepcję, rozmiar nie jest już głównym problemem. Dziś zaletą jest to, że zmniejsza liczbę dostępów do pamięci głównej, a tym samym zmniejsza zużycie energii w urządzeniach mobilnych .

Patenty Hitachi były licencjonowane przez Arm Ltd. dla ich procesorów, gdzie były znane jako „Thumb”. Podobne systemy można znaleźć w MIPS16e i PowerPC VLE. Oryginalne patenty wygasły, a koncepcję można znaleźć w wielu nowoczesnych projektach, w tym w RISC-V , który od początku był zaprojektowany do jej wykorzystania. Wprowadzenie przetwarzania 64-bitowego spowodowało, że termin ten nie jest już tak powszechnie używany; te procesory na ogół używają instrukcji 32-bitowych i technicznie są formą skompresowanego ISA, ale ponieważ są to w większości zmodyfikowane wersje starszego ISA z 32-bitowej wersji tej samej rodziny procesorów; nie ma prawdziwej kompresji.

Pojęcie

Mikroprocesory kodują swoje instrukcje w postaci serii bitów , zwykle podzielonych na pewną liczbę 8-bitowych bajtów . Na przykład w MOS 6502 instrukcja ADC wykonuje dodawanie binarne między wartością operandu a wartością już przechowywaną w akumulatorze . Istnieje wiele miejsc, w których procesor może znaleźć operand; może znajdować się w pamięci głównej lub na specjalnej stronie zerowej lub może być wyraźną stałą, taką jak „10”. Każda z tych odmian wykorzystywała inną 8-bitową instrukcję lub kod operacji ; gdyby ktoś chciał dodać stałą 10 do akumulatora, instrukcja zostałaby zakodowana w pamięci jako 69 $ 0A , przy czym $ 0A byłoby szesnastkowe dla wartości dziesiętnej 10. Gdyby zamiast tego dodać wartość przechowywaną w pamięci głównej pod adresem 4400 $, to byłoby $6D $0044 , z adresem little-endian .

Zauważ, że druga instrukcja wymaga trzech bajtów, ponieważ adres pamięci ma długość 16 bitów. W zależności od instrukcji może używać jednego, dwóch lub trzech bajtów. Jest to obecnie znane jako zestaw instrukcji o zmiennej długości , chociaż termin ten nie był wówczas powszechny, ponieważ większość procesorów, w tym komputery typu mainframe i minikomputery , zwykle używała pewnej odmiany tej koncepcji. Nawet pod koniec lat 70., kiedy mikroprocesory zaczęły przechodzić z formatów 8-bitowych na 16-bitowe, koncepcja ta pozostała powszechna; Intel 8088 nadal używał 8-bitowych kodów operacji, po których mogło następować od zera do sześciu dodatkowych bajtów, w zależności od trybu adresowania .

To właśnie podczas przechodzenia na systemy 32-bitowe, a zwłaszcza gdy koncepcja RISC zaczęła przejmować projektowanie procesorów, instrukcje o zmiennej długości zaczęły zanikać. Na przykład w architekturze MIPS wszystkie instrukcje są pojedynczą wartością 32-bitową, z 6-bitowym kodem operacji w najbardziej znaczących bitach , a pozostałe 26 bitów jest używanych na różne sposoby, reprezentujących ograniczony zestaw trybów adresowania. Większość projektów RISC jest podobna. Przejście do formatu instrukcji o stałej długości było jedną z kluczowych koncepcji projektowych stojących za wydajnością wczesnych projektów RISC; we wcześniejszych systemach odczytanie instrukcji mogło zająć od jednego do sześciu cykli pamięci, co wymagało okablowania między różnymi częściami logiki, aby procesor nie próbował wykonać instrukcji, zanim dane były gotowe. W projektach RISC operacje zwykle trwają jeden cykl, co znacznie upraszcza dekodowanie. Oszczędności w tych obwodach blokujących są zamiast tego stosowane w dodatkowej logice lub dodawaniu rejestrów procesora , co ma bezpośredni wpływ na wydajność.

Gęstość kodu

Wadą podejścia RISC jest to, że wiele instrukcji po prostu nie wymaga czterech bajtów. Na przykład Logical Shift Left przesuwa bity w rejestrze w lewo. W 6502, który ma tylko jeden rejestr arytmetyczny A, ta instrukcja może być w całości reprezentowana przez jej 8-bitowy kod operacji $06 . W procesorach z większą liczbą rejestrów wszystko, czego potrzeba, to kod operacji i numer rejestru, kolejne 4 lub 5 bitów. Na przykład w MIPS instrukcja wymaga tylko 6-bitowego kodu operacji i 5-bitowego numeru rejestru. Ale tak jak w przypadku większości projektów RISC, instrukcja nadal zajmuje pełne 32 bity. Ponieważ tego rodzaju instrukcje są stosunkowo powszechne, programy RISC zwykle zajmują więcej pamięci niż ten sam program na procesorze o zmiennej długości.

W latach 80., kiedy po raz pierwszy pojawiła się koncepcja RISC, był to powszechny punkt skarg. Ponieważ instrukcje zajmowały więcej miejsca, system musiałby spędzać więcej czasu na czytaniu instrukcji z pamięci. Zasugerowano, że te dodatkowe dostępy mogą faktycznie spowolnić program. Obszerne testy porównawcze ostatecznie wykazały, że RISC był szybszy w prawie wszystkich przypadkach i ten argument zniknął. Istnieją jednak przypadki, w których użycie pamięci pozostaje problemem niezależnie od wydajności, i dotyczy to małych systemów i aplikacji wbudowanych. Nawet na początku XXI wieku cena pamięci DRAM była wystarczająca, aby niedrogie urządzenia miały ograniczoną pamięć. To właśnie dla tego rynku firma Hitachi opracowała projekt SuperH .

We wcześniejszych projektach SuperH, od SH-1 do SH-4, instrukcje zawsze zajmowały 16 bitów. Wynikowy zestaw instrukcji ma ograniczenia w świecie rzeczywistym; na przykład może wykonywać obliczenia matematyczne tylko z dwoma argumentami w postaci A = A + B , podczas gdy większość procesorów tamtej epoki używała formatu z trzema argumentami, A = B + C . Usunięcie jednego operandu powoduje usunięcie czterech bitów z instrukcji (jest 16 rejestrów, które wymagają 4 bitów), chociaż odbywa się to kosztem uczynienia kodu matematycznego nieco bardziej skomplikowanym do napisania. Dla rynków docelowych SuperH był to łatwy kompromis. Istotną zaletą formatu 16-bitowego jest to, że pamięć podręczna instrukcji zawiera teraz dwa razy więcej instrukcji dla danej ilości SRAM . Pozwala to systemowi działać z wyższymi prędkościami, chociaż niektóre z nich można złagodzić, stosując dodatkowe instrukcje potrzebne do wykonywania operacji, które mogą być wykonywane przez pojedynczą instrukcję z 3 argumentami.

W przypadku SH-5 firma Hitachi przeszła na 32-bitowy format instrukcji. Aby zapewnić kompatybilność wsteczną z ich wcześniejszymi projektami, dołączyli drugi zestaw instrukcji, SHcompact. SHcompact zmapował oryginalne instrukcje 16-bitowe w jedną stronę na wewnętrzną instrukcję 32-bitową; nie wykonywał wielu instrukcji, jak miałoby to miejsce we wcześniejszych mikrokodowanych , był to po prostu mniejszy format dla tej samej instrukcji. Umożliwiło to łatwe przeniesienie oryginalnych programów małoformatowych do nowego SH-5, jednocześnie niewiele zwiększając złożoność dekodera instrukcji .

Firma ARM udzieliła licencji na szereg patentów Hitachi dotyczących aspektów projektu instrukcji i wykorzystała je do wdrożenia swoich instrukcji Thumb. Procesory ARM z literą „T” w nazwie zawierały ten zestaw instrukcji oprócz ich oryginalnych wersji 32-bitowych i można je było przełączać z trybu 32-bitowego na 16-bitowy w locie za pomocą polecenia BX . W trybie Thumb widocznych jest tylko osiem górnych rejestrów z normalnych szesnastu rejestrów ARM, ale są to te same rejestry, co w trybie 32-bitowym, a zatem dane mogą być przesyłane między Thumb a normalnym kodem przy użyciu tych rejestrów. Każda instrukcja Thumb była odpowiednikiem wersji 32-bitowej, więc Thumb był ścisłym podzbiorem oryginalnego ISA. Jedną z kluczowych różnic między modelem ARM a SuperH jest to, że Thumb zachowuje niektóre instrukcje z trzema argumentami w formacie 16-bitowym, co osiągnięto poprzez zmniejszenie widocznego pliku rejestru do ośmiu, więc do wybrania rejestru wymagane są tylko 3 bity.

Architektura MIPS dodała również podobny skompresowany zestaw w swoim MIPS16e, który jest bardzo podobny do Thumb. Pozwala również na użycie tylko ośmiu rejestrów, chociaż nie jest to po prostu pierwszych osiem; projekt MIPS wykorzystuje rejestr 0 jako rejestr zerowy , więc rejestry 0 i 1 w trybie 16-bitowym są zamiast tego mapowane na rejestry 16 i 17 MIPS32. Większość innych szczegółów systemu jest podobna do Thumb. Podobnie najnowsza wersja Power ISA , dawniej PowerPC , zawiera instrukcje „VLE”, które są zasadniczo identyczne. Zostały one dodane na żądanie firmy Freescale Semiconductor , której zainteresowanie Power jest skierowane głównie na rynek systemów wbudowanych.

Nowoczesne zastosowanie

Od około 2015 roku wiele procesorów przeszło na format 64-bitowy. Na ogół zachowywały one 32-bitowy format instrukcji, jednocześnie rozszerzając rejestry wewnętrzne do formatu 64-bitowego. Zgodnie z pierwotną definicją są to instrukcje skompresowane, ponieważ są mniejsze niż podstawowy rozmiar słowa danych. Jednak termin ten nie jest używany w tym kontekście; odniesienia do skompresowanych instrukcji niezmiennie odnoszą się do wersji 16-bitowych.

Cytaty

Bibliografia