ARM telah mengalami kemajuan:
- Arsitektur 32-bit-instruksi, yang memiliki kode lebih besar daripada banyak arsitektur lain, tetapi yang dapat diterjemahkan dengan cepat dan dapat melakukan banyak operasi dengan instruksi lebih sedikit daripada arsitektur yang bersaing
- Arsitektur format dua instruksi, yang dapat beralih di antara set instruksi ARM yang bagus dan kuat (tapi sayangnya agak membengkak), dan set instruksi "Thumb" 16-bit yang kurang kuat (tapi jauh lebih ringkas). Setiap instruksi Jempol memiliki instruksi ARM yang sesuai, meminimalkan kebutuhan programmer untuk mempelajari dua set instruksi.
- Arsitektur Thumb2, yang menambahkan instruksi dua kata ke set instruksi Thumb, menghasilkan apa yang sebagian besar win-win: kode ARM khas akan berisi campuran instruksi yang hanya tersedia di ARM, dan instruksi yang akan tersedia di Thumb tetapi harus direpresentasikan sebagai 32 bit; di Thumb2, kode tersebut mendapat manfaat ruang menggantikan beberapa instruksi 32-bit dengan yang 16-bit.
- Arsitektur khusus-jempol, yang lebih membatasi daripada yang saya rawat, tetapi yang lebih kecil dan lebih murah daripada yang lain.
Arsitektur ARM memungkinkan beberapa operasi yang agak canggih untuk dilakukan dengan sangat cepat - jauh lebih cepat daripada chip lainnya. Misalnya (menggunakan ARM7-TDMI):
ldrh r0, [r10, # ADDR_BUS_OFS]; Baca bus alamat sistem target (13 bit)
ldrb r1, [r9, r0, lsr # 8]; Gunakan bit atas untuk mencari alamat di tabel penangan
tambahkan pc, r9, r1 lsl # 2; Pergi ke penangan yang tepat
Setiap handler disimpan sebagai byte, yang memberikan 1/4 perpindahan alamat dari awal tabel. Efek bersihnya adalah setelah isi bus alamat diambil, hanya dibutuhkan enam siklus (dua instruksi) untuk melompat ke handler berdasarkan lima bit teratas dari yang diambil, menggunakan tabel lompat 32-byte.
Kode THUMB yang sesuai akan lebih seperti:
; Dengan asumsi kita tidak perlu r6 / r7 untuk hal lain, mereka dipindahkan dari r9 / r10
ldrh r0, [r7, # ADDR_BUS_OFS]
mov r1, r0
lsr r1, r1, # 8; THUMB membutuhkan sumber dan tujuan yang sama
ldrb r1, [r6, r1]
lsl r1, r1, # 1; Bisa menggunakan shift-left-two, jika alamat target disejajarkan dengan kata lengkap
tambahkan pc, r1
Itu bagus dari sudut pandang kepadatan kode, mengingat bahwa instruksi hanya setengah sebesar aslinya, tetapi akan mengambil sembilan siklus setelah pengambilan daripada enam. Dalam aplikasi di mana bus yang diawasi akan berjalan dengan kecepatannya sendiri apakah ARM berhasil menanganinya, instruksi ARM yang lebih cepat adalah nilai tambah yang besar.
Kebetulan, Thumb2 adalah biner yang kompatibel dengan Thumb, yang memfasilitasi penggunaan alat sebelumnya, tetapi berarti ada beberapa hal yang tidak dapat dilakukan serta ARM asli. Misalnya, dalam ARM, seseorang dapat "memutar" bitmap 8x8 yang disimpan dalam empat register menggunakan sekitar 3 instruksi per dua bit:
movs r0, r4, lsl # 25; Masukkan bit atas LSB ke dalam C dan bit berikutnya ke N
orrcs r6, # 0x00000001
orrmi r6, # 0x00000100
Di Thumb2, perlu menambahkan instruksi kondisional eksplisit:
movs r0, r4, lsl # 25; Masukkan bit atas LSB ke dalam C dan bit berikutnya ke N
itcs
orrcs r6, # 0x00000001
itmi
orrmi r6, # 0x00000100
Net 33% pengurangan efisiensi waktu dan ruang dibandingkan dengan ARM; itu mungkin tentang contoh terburuk dari kode Jempol yang kurang efisien daripada ARM, dan bahkan itu tidak sepenuhnya mengerikan.
Satu kerugian kecil lain dari Thumb2 dibandingkan dengan ARM: dalam kode ARM, semua instruksi mulai dari batas kata penuh, memfasilitasi analisis statis. Di Thumb2, instruksi bisa secara sewenang-wenang mulai dari batas setengah kata dan mengangkangi batas kata penuh. Analisis statis dapat jauh lebih sulit.