ARM przeszedł postępy:
- Architektura instrukcji 32-bitowych, która zawierała obszerniejszy kod niż wiele innych architektur, ale którą można szybko zdekodować i wykonać wiele operacji przy mniejszej liczbie instrukcji niż architektura konkurencyjna
- Architektura formatu z dwiema instrukcjami, która może przełączać się między ładnym i mocnym (ale niestety nieco rozdętym) zestawem instrukcji ARM, a mniej wydajnym (ale o wiele bardziej kompaktowym) 16-bitowym zestawem instrukcji „Thumb”. Każda instrukcja Thumb miała odpowiednią instrukcję ARM, co minimalizuje potrzebę uczenia się dwóch zestawów instrukcji przez programistów.
- Architektura Thumb2, która dodała instrukcje składające się z dwóch słów do zestawu instrukcji Thumb, co daje w zasadzie wygraną: typowy kod ARM zawierałby zestaw instrukcji dostępnych tylko w ARM oraz instrukcji dostępnych w Thumb ale i tak musiał być reprezentowany jako 32 bity; w Thumb2 taki kod zyskuje korzyści przestrzenne, zastępując niektóre 32-bitowe instrukcje 16-bitowymi.
- Architektura tylko dla kciuka, która jest bardziej ograniczająca niż mnie to obchodzi, ale która jest mniejsza i tańsza niż jakakolwiek inna.
Architektura ARM pozwala na wykonywanie bardzo skomplikowanych operacji bardzo szybko - znacznie szybciej niż na jakimkolwiek innym układzie. Na przykład (przy użyciu ARM7-TDMI):
ldrh r0, [r10, # ADDR_BUS_OFS]; Odczytaj docelową magistralę adresową systemu (13 bitów)
ldrb r1, [r9, r0, lsr # 8]; Użyj górnych bitów, aby wyszukać adres w tabeli programów obsługi
dodaj pc, r9, r1 lsl # 2; Przejdź do odpowiedniego przewodnika
Każdy moduł obsługi jest przechowywany jako bajt, co daje 1/4 przesunięcia adresu od początku tabeli. Efektem netto jest to, że po pobraniu zawartości magistrali adresowej potrzeba tylko sześciu cykli (dwóch instrukcji), aby przejść do modułu obsługi na podstawie pięciu górnych bitów pobranego pliku, używając 32-bajtowej tabeli skoków.
Odpowiadający kod THUMB byłby bardziej podobny do:
; Zakładając, że nie potrzebujemy r6 / r7 do niczego innego, są one ponownie przypisane z r9 / r10
ldrh r0, [r7, # ADDR_BUS_OFS]
mov r1, r0
lsr r1, r1, # 8; THUMB wymaga, aby źródło i miejsce docelowe były takie same
ldrb r1, [r6, r1]
lsl r1, r1, # 1; Przydałoby się przesunięcie w lewo-dwa, jeśli adresy docelowe były wyrównane pełnymi słowami
dodaj komputer, r1
Z punktu widzenia gęstości kodu jest to w porządku, biorąc pod uwagę, że instrukcje są tylko w połowie tak duże jak oryginały, ale po pobraniu zajęłyby dziewięć cykli, a nie sześć. W aplikacji, w której obserwowany autobus będzie działał z własną prędkością, niezależnie od tego, czy ARM poradził sobie z tym, szybsze instrukcje ARM są dużym plusem.
Nawiasem mówiąc, Thumb2 jest binarnie kompatybilny z Thumb, co ułatwia korzystanie z wcześniejszych narzędzi, ale oznacza, że jest kilka rzeczy, których nie może zrobić tak dobrze, jak oryginalny ARM. Na przykład w ARM można „obrócić” bitmapę 8x8 przechowywaną w czterech rejestrach przy użyciu około 3 instrukcji na dwa bity:
movs r0, r4, lsl # 25; Umieść górny bit LSB w C, a następny bit w N
orrcs r6, # 0x00000001
orrmi r6, # 0x00000100
W Thumb2 konieczne byłoby dodanie wyraźnych instrukcji warunkowych:
movs r0, r4, lsl # 25; Umieść górny bit LSB w C, a następny bit w N
itcs
orrcs r6, # 0x00000001
itmi
orrmi r6, # 0x00000100
33% redukcja wydajności czasu i przestrzeni netto w porównaniu z ARM; oznacza to prawdopodobnie najgorszy przykład, że kod Kciuka jest mniej wydajny niż ARM, a nawet to nie jest aż tak straszne.
Jeszcze jedna niewielka wada Thumb2 w porównaniu z ARM: w kodzie ARM wszystkie instrukcje zaczynają się od granic pełnych słów, co ułatwia analizę statyczną. W Thumb2 instrukcje mogą dowolnie zaczynać się od granic półsłów i przekraczać granice pełnych słów. Analiza statyczna może być zatem znacznie trudniejsza.