与 ARM 32 位指令集相比,thumb 16 位指令集(还没有讨论 thumb2 扩展)占用的空间更少,因为指令大小只有一半,但通常会出现性能下降,因为它需要更多指令做与手臂相同的事情。指令集的功能较少,大多数指令仅在寄存器 r0-r7 上运行。Apples to Apples比较更多的指令来做同样的事情更慢。
现在 thumb2 扩展采用以前未定义的拇指指令并创建 32 位拇指指令。了解不止一组 thumb2 扩展。ARMv6m 可能会增加几十个。ARMv7m 向 thumb 指令集添加了 150 条指令,我不知道 ARMv8 或未来会发生什么。因此,假设 ARMv7m,他们已经弥合了您在 thumb 中可以做的事情和您在 ARM 中可以做的事情之间的差距。所以 thumb2 是一个精简的 ARM 指令集,就像 thumb 一样,但没有精简。因此,与 ARM 做同样的事情相比,在 thumb2(假设加上拇指)中做同样的事情可能仍然需要更多的指令。
这给出了问题的味道,手臂中的单个指令和拇指中的等效指令。
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}
现在编译器不会这样做,编译器会知道它的目标是拇指,并通过选择其他寄存器来做不同的事情。每条指令仍然有更少的寄存器和更少的功能:
mov r0,r1
and r0,r2
仍然需要两个指令/执行周期和两个寄存器在一起,而不修改操作数,并将结果放在第三个寄存器中。Thumb2 有一个三个寄存器,因此您返回到使用 thumb2 扩展的单个指令。并且该 thumb2 指令允许在拇指限制为 r0-r7 的三个寄存器中的任何一个上使用 r0-r15。
查看 ARMv5 Architectural Reference Manual,在每个 thumb 指令下,它会显示等效的 ARM 指令。然后转到那个 ARM 指令并比较你可以用那个 arm 指令做什么,而你不能用 thumb 指令做。这是一条单向路径,拇指指令(不是拇指 2)与 ARM 指令具有一对一的关系。所有拇指指令都有一个等效的手臂指令。但并非所有手臂指令都有等效的拇指指令。您应该能够从这个练习中看到使用 thumb 指令集时对编译器的限制。然后拿到 ARMv7m Architectural Reference Manual 看指令集,对比一下“all thumb variant” 编码(包括 ARMv4T 的编码)和仅限于 ARMv6 和/或 v7 的编码,并查看 thumb 和 thumb2 之间的功能扩展以及没有 thumb 对应的仅 thumb2 指令。这应该阐明编译器必须在 thumb 和 thumb2 之间使用什么。然后,您可以将 thumb+thumb2 与完整的 ARM 指令进行比较(ARMv7 AR 就是它的名称?)。并且看到 thumb2 更接近于 ARM,但是你失去了例如每条指令的条件,所以 thumb2 中的条件执行变成了与代码分支的比较,在 ARM 中你有时可以有一个 if-then-else 没有分支.. . 这应该阐明编译器必须在 thumb 和 thumb2 之间使用什么。然后,您可以将 thumb+thumb2 与完整的 ARM 指令进行比较(ARMv7 AR 就是它的名称?)。并且看到 thumb2 更接近于 ARM,但是你失去了例如每条指令的条件,所以 thumb2 中的条件执行变成了与代码分支的比较,在 ARM 中你有时可以有一个 if-then-else 没有分支.. . 这应该阐明编译器必须在 thumb 和 thumb2 之间使用什么。然后,您可以将 thumb+thumb2 与完整的 ARM 指令进行比较(ARMv7 AR 就是它的名称?)。并且看到 thumb2 更接近于 ARM,但是你失去了例如每条指令的条件,所以 thumb2 中的条件执行变成了与代码分支的比较,在 ARM 中你有时可以有一个 if-then-else 没有分支.. .