W porównaniu z 32-bitowym zestawem instrukcji ARM, zestaw 16-bitowych instrukcji kciuka (nie mówiąc już o rozszerzeniach thumb2) zajmuje mniej miejsca, ponieważ instrukcje są o połowę mniejsze, ale ogólnie występuje spadek wydajności, ponieważ wymaga więcej instrukcji, aby zrobić to samo, co na ramieniu. W zestawie instrukcji jest mniej funkcji, a większość instrukcji działa tylko na rejestrach r0-r7. Porównanie jabłek z jabłkami więcej instrukcji, aby zrobić to samo, jest wolniejsze.
Teraz rozszerzenia thumb2 poprzednio nieokreślone instrukcje kciuka i tworzenie 32-bitowych instrukcji kciuka. Zrozum, że istnieje więcej niż jeden zestaw rozszerzeń thumb2. ARMv6m może dodać kilkadziesiąt. ARMv7m dodaje coś takiego jak 150 instrukcji do zestawu instrukcji kciuka, nie wiem, co ARMv8 lub przyszłość trzyma. Zakładając ARMv7m, zminimalizowali różnicę pomiędzy tym, co możesz zrobić w kciuku, a tym, co możesz zrobić w ARM. Zatem thumb2 jest zredukowanym zestawem instrukcji ARM, jak kciuk, ale nie tak zredukowanym. Więc nadal może potrzebować więcej instrukcji, aby zrobić to samo na kciuku 2 (załóż plus kciuk) w porównaniu z ARM robiąc to samo.
Daje to poczucie problemu, jedną instrukcję w ramieniu i jej odpowiednik w kciuku.
ARM
and r8,r9,r10
THUMB
push {r0,r1}
mov r0,r8
mov r1,r9
and r0,r1
mov r1,r10
and r0,r1
mov r8,r0
pop {r0,r1}
Teraz kompilator nie byłby to zrobić, kompilator będzie wiedział, że jest kierowana kciuk i robić rzeczy inaczej, wybierając inne rejestry. Masz jeszcze mniej rejestrów i mniej funkcji za instrukcją:
mov r0,r1
and r0,r2
Wciąż trwa dwie instrukcje/cykle egzekucji do rejestrów i dwa razem, bez modyfikacji argumentów i umieścić wynik w trzecim rejestrze. Thumb2 ma trzy rejestry, więc powracasz do pojedynczej instrukcji za pomocą rozszerzeń thumb2. I ta instrukcja thumb2 pozwala na r0-r15 na każdym z tych trzech rejestrów, w których kciuk jest ograniczony do r0-r7.
Spójrz na Podręcznik Architektoniczny ARMv5, pod każdą instrukcją kciuka pokazuje równoważną instrukcję ARM. Następnie przejdź do instrukcji ARM i porównaj to, co możesz zrobić z tą instrukcją ramienia, której nie możesz wykonać za pomocą instrukcji obsługi kciuka. Jest to ścieżka jednokierunkowa. Instrukcje dotyczące kciuka (nie kciuka2) mają związek jeden do jednego z instrukcją ARM.wszystkie instrukcje kciuka mają równoważną instrukcję ramienia. ale nie wszystkie instrukcje ramion mają równoważną instrukcję kciuka. Powinieneś być w stanie zobaczyć z tego ćwiczenia ograniczenie kompilatorów podczas korzystania z zestawu instrukcji kciuka. Następnie pobierz podręcznik ARMv7m Architectural Reference Manual i spójrz na zestaw instrukcji, i porównaj kodowania "all thumb warianty" (te, które zawierają ARMv4T) i te, które są ograniczone do ARMv6 i/lub v7 i zobacz rozszerzanie funkcji między kciukiem i kciukiem2, jak również instrukcjami dotyczącymi tylko kciuka2, które nie mają odpowiednika kciuka. To powinno wyjaśnić, z czym muszą pracować kompilatory między kciukiem a kciukiem2. Możesz następnie posunąć się tak daleko, aby porównać kciuk + kciuk2 z pełnymi poleceniami ARM (ARMv7 AR jest tak zwany?). I zobacz, że kciuk2 jest o wiele bliżej ARM, ale tracisz na przykład warunkowe warunki dla każdej instrukcji, więc warunkowa realizacja w kciuku staje się porównaniem z rozgałęzieniem nad kodem, gdzie w ARM możesz czasami mieć if-then-else bez rozgałęzień.
Wydajność jest zawsze względna. W wielu przypadkach kod 'thumb' działa lepiej niż' arm'. Głównie jeśli szyna pamięci jest szyjką butelki. Ogólnie rzecz biorąc, 'kciuk' nie ma tylu rejestrów, więc nawet jeśli zestaw instrukcji jest bardziej zwarty, z niektórymi algorytmami będzie musiał częściej uzyskiwać dostęp do pamięci w celu rozlewania rejestrów. –
Jeśli mam ciężarówkę dostawczą A i ciężarówkę dostawczą B, która jest o połowę mniejsza niż A. Jeśli ilość dostarczanych towarów pasuje do ciężarówki A, ale jest dwa duże dla ciężarówki B, to zabiera ona ciężarówkę B dwa razy więcej do zrobienia ta sama praca. Kciuk nie jest w połowie tak wydajny jak ARM, bardziej przypomina o 10-15% więcej instrukcji, żeby zrobić to samo co ARM. –
Zobacz także: Stackoverflow's [Gcc -mthumb vs -marm] (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) i [Arizona paper] (http: //www.cs.arizona .edu/~ arvind/papers/lctes02.pdf) na kompilacjach sterowanych kciukiem i ARM. –