2.4.4. 使用条件执行的示例

此示例使用最大公约数 (gcd) 算法 (Euclid) 的两种实现方法。 它演示了如何使用条件执行来提高代码密度和执行速度。 有关执行速度的详细分析仅适用于 ARM7™ 处理器。 代码密度计算则适用于所有 ARM 处理器。

在 C 语言中,该算法可以表示为:

int gcd(int a, int b)
{
    while (a != b)
      {
        if (a > b)
            a = a - b;
        else
            b = b - a;
      }
    return a;
}

采用以下方法,可以只用跳转条件执行来实现 gcd 函数:

gcd     CMP      r0, r1
        BEQ      end
        BLT      less
        SUBS     r0, r0, r1  ; could be SUB r0, r0, r1 for ARM
        B        gcd
less
        SUBS     r1, r1, r0  ; could be SUB r1, r1, r0 for ARM
        B        gcd
end

由于跳转数目的限制,该代码的长度是七个指令。 每执行一次跳转,处理器就必须重填管道并从新位置继续执行。 其他指令和未执行的跳转各使用一个周期。

通过使用 ARM 指令集的条件执行功能,仅用四个指令即可执行 gcd 函数:

gcd
        CMP      r0, r1
        SUBGT    r0, r0, r1
        SUBLE    r1, r1, r0
        BNE      gcd

除了缩短代码之外,此代码中大多数情况下的执行速度也更快。Table 2.3Table 2.4 显示了在 r0 等于 1、r1 等于 2 的情况下每种实现方法所用的周期数。在这种情况下,用有条件地执行所有指令代替跳转可节省三个周期。

在 r0 等于 r1 时的任何情况下,两种形式的代码的执行周期数都相等。 在所有其他情况下,条件形式的代码的执行周期数较少。

Table 2.3. 仅使用条件跳转

r0: ar1: b指令周期数 (ARM7)
12CMP r0, r11
12BEQ end1(未执行)
12BLT less3
12SUB r1, r1, r01
12B gcd3
11CMP r0, r11
11BEQ end3
   总计 = 13

Table 2.4. 所有指令都是条件指令

r0: ar1: b指令周期数 (ARM7)
12CMP r0, r11
12SUBGT r0,r0,r11(未执行)
11SUBLT r1,r1,r01
11BNE gcd3
11CMP r0,r11
11SUBGT r0,r0,r11(未执行)
11SUBLT r1,r1,r01(未执行)
11BNE gcd1(未执行)
   总计 = 10

Thumb-2 以前的 Thumb 版 gcd

由于 B 是可以有条件执行的唯一一个 Thumb-2 以前的 Thumb 指令,因此必须用条件跳转来编写 gcd 算法。

与 ARM 条件跳转实现方法类似,Thumb-2 以前的 Thumb 代码也需要七个指令。 此时代码总大小为 14 字节,而较小的 ARM 实现也需要 16 字节。

此外,在使用 16 位内存的系统中,此版本比第二种 ARM 实现的运行速度更快,因为每个 16 位 Thumb 指令只需要访问一次内存,而每个 ARM 32 位指令需要两次存取。

gcd 的 Thumb-2 版本

通过使用 IT 指令使 SUB 成为条件指令,可以将此代码的 ARM 版本转换为 Thumb-2 代码:

gcd
        CMP     r0, r1
        ITE     GT 
        SUBGT   r0, r0, r1
        SUBLE   r1, r1, r0
        BNE     gcd

上述代码会正常地同样汇编为 ARM 或 Thumb-2 代码。 汇编器会检查 IT 指令,但在汇编为 ARM 代码时会忽略这些指令。 (您可以忽略 IT 指令。 在汇编为 Thumb-2 代码时汇编器会插入此类指令。)

如果 Thumb-2 代码中所需的指令比 ARM 代码多一个,则整个代码大小在 Thumb-2 代码中为 10 字节,而在 ARM 代码中则为 16 字节。

执行速度

若要优化代码的执行速度,您必须具备指令时序、跳转预测逻辑以及目标系统的缓存行为等方面的详细知识。 有关完整的信息,请参阅《ARM 体系结构参考手册》和各处理器的技术参考手册。

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential