10

我无法理解IT指令的功能(如果有的话)。快速参考卡有这个:

操作:If-Then
汇编器: IT{pattern} {cond}
操作:根据模式,最多生成四个有条件的以下指令。模式是最多三个字母的字符串。每个字母可以是 T(Then)或 E(Else)。IT 之后的第一条指令有条件 cond。如果对应的字母是 T,下面的指令有条件 cond,或者如果对应的字母是 E,则条件是 cond 的倒数。

其实这个梗概有点意思。架构手册条目并没有让我在理解之旅中取得任何进展:

If-Then 条件指令。
句法

IT{x{y{z}}} 条件

其中: x 指定 IT 块中第二条指令的条件切换。
y 指定 IT 块中第三条指令的条件开关。
z 指定 IT 块中第四条指令的条件开关。
cond 指定 IT 块中第一条指令的条件。

IT 块中第二条、第三条和第四条指令的条件开关可以是:
T 那么。将条件 cond 应用于指令。
E 别的。将 cond 的逆条件应用于指令。

笔记

可以在 IT 指令中使用 AL(始终条件)作为 cond。如果这样做,IT 块中的所有指令都必须是无条件的,并且 x、y 和 z 中的每一个都必须是 T 或省略,但不能是 E。 操作

IT 指令最多包含四个有条件的以下指令。条件可以完全相同,或者其中一些条件可以是其他条件的逻辑逆。IT 指令之后的条件指令构成 IT 块。

IT 块中的指令,包括任何分支,必须在其语法的 {cond} 部分中指定条件。

由于(大多数)每条指令都可以轻松指定条件,那么该IT指令有什么用?

4

2 回答 2

15

首先请注意,大多数指令可以在 ARM 指令中指定条件代码,而不是在 Thumb 中。

使用IT指令,您可以为最多 4 条指令指定条件代码。对于每条指令,您可以指定它是 If (T) 还是 Else (E) 的一部分。

例如:

ITTET EQ
ADD r0,r0,r0
ADD r1,r0,r0
ADD r2,r0,r0
ADD r3,r0,r0

实际上将转化为:

ADDEQ r0,r0,r0  (Always if for 1st one)
ADDEQ r1,r0,r0  (T for 2nd one)
ADDNE r2,r0,r0  (E for 3rd one)
ADDEQ r3,r0,r0  (T for 4th one)
于 2016-04-11T21:05:58.517 回答
8

IT实际上所做的是非常巧妙地将8 位信息编码到ITSTATECPSR 的字段中。最初的 Thumb 指令集除了分支之外没有条件指令,因为在 16 位中根本没有空间在足够的操作码和操作数之上容纳 4 位条件代码以供使用。Thumb-2 扩展所做的是将条件执行改进为现有的 16 位编码,以及新的 32 位编码。

如果您查看 ARM 条件代码,您会注意到 3 个最高有效位表示特定标志测试,而 lsb 表示一种解释或完全相反的解释 - 最初甚至 0xF 也是 0xE 的“永远”对应物' - 因此您可以将基本条件编码为 3 位,并使用其他 5 位来编码应该为下一条指令评估测试的方式,再加上一个停止位来指示剩余要条件化的指令数。因此,在它被完全消耗之前,可以将 ITSTATE 值解压缩到 ARM 条件代码中,并在将 Thumb 指令编码解压缩到其等效 ARM 指令中的同时将其馈送到管道中。

从架构的角度来看,这是一个非常酷的功能,尽管编译器工程师和 CPU 设计师可能不同意 ;)

于 2016-04-11T21:29:15.407 回答