ARM7 IT(如果那时)指令真正做了什么?

时间:2016-04-11 20:46:10

标签: arm cpu-architecture machine-instruction

我无法绕过IT指令的功能(如果那样)。 quick reference card有这个:

  

操作:If-Then
  汇编程序:IT{pattern} {cond}
  操作:根据模式,最多可以有条件地执行以下四条指令。 pattern是一个最多三个字母的字符串。每个字母可以是T(Then)或E(Else)。 IT之后的第一条指令条件为cond。如果相应的字母为T,则以下指令具有条件cond,如果相应的字母为E,则具有cond的反转。

实际上,这个概要有点意义。架构manual entry并没有让我在理解之旅中占据任何位置:

  

If-Then条件指令。
  语法

     

IT {x {y {z}}} cond

     

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

     

IT块中第二,第三和第四条指令的条件开关可以是:
  T       然后。将条件cond应用于指令。
  E       其他。将cond的逆条件应用于指令。

     

注意

     

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

     

IT指令最多可以有条件地遵循以下四条指令。条件可以完全相同,或者其中一些条件可以是其他条件的逻辑反转。 IT指令后面的条件指令构成IT块。

     

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

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

2 个答案:

答案 0 :(得分:7)

首先请注意,大多数指令可以在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)

答案 1 :(得分:4)

IT实际上 encode 8 bits of information into the ITSTATE field of the CPSR非常聪明。除了分支之外,原始的Thumb指令集没有条件指令,因为在足够的操作码和操作数之上,只有16位的空间不适合4位条件代码。 Thumb-2扩展所做的是改进条件执行到现有的16位编码,以及新的32位编码。

如果你看一下ARM条件代码,你会注意到3个最高有效位代表一个特定的标志测试,而lsb表示一个解释或它完全相反 - 最初甚至0xF是一个'从不'对应的0xE''always' - 所以你可以用3位编码基本条件,并使用另外5个编码为下一条指令评估测试的方式加上一个停止位来指示留给条件化的指令数。因此,在完全消耗ITSTATE值之前,可以将ITSTATE值解压缩为ARM条件代码并将其与Thumb指令编码一起送入管道,并将其解压缩到等效的ARM指令中。

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