条件付き実行を使用するメリットの実例

ここでは、分岐を使用した場合と条件付き命令を使用した場合の違いについて見ていきます。最大公約数(gcd)のユークリッドアルゴリズムを使用して、条件付き命令によって、コードサイズと速度がどのように改善されるかを示します。

C では、gcd アルゴリズムを以下のように記述できます。

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

以下の例では、条件付き命令を使用した場合と使用しない場合の gcd アルゴリズムの実装を示しています。

Note

実行速度の詳細分析は、ARM7™ プロセッサでのみ実行できます。コード密度の計算は、すべての ARM プロセッサで実行できます。

Show/hideARM コードの分岐を使用した条件付き実行の例

これは、分岐以外の条件付き命令を使用していない gcd アルゴリズムの ARM コードの実装です。条件付き実行は、以下のように、個別の条件付き命令ではなく、条件分岐を使用して実現しています。

gcd     CMP      r0, r1
        BEQ      end
        BLT      less
        SUBS     r0, r0, r1  ; ARM の SUB r0, r0, r1 を条件付きで実行する
        B        gcd
less
        SUBS     r1, r1, r0  ; ARM の SUB r1, r1, r0 を条件付きで実行する
        B        gcd
end

分岐を使用するため、このコードでは 7 つの命令を実行します。分岐が発生するたびに、プロセッサはパイプラインを再充填して新しい位置から行を継続する必要があります。他の命令と未実行分岐にはそれぞれ 1 サイクルが使用されます。

以下の表に、ARM 7 ベースのプロセッサで、R0 = 1 かつ R1 = 2 の場合に、この実装によって使用されるサイクル数を示します。

Table 19. 条件分岐のみの場合

R0: aR1: b命令サイクル(ARM7)
12CMP r0, r11
12BEQ end1(実行されません)
12BLT less3
12SUB r1, r1, r01
12B gcd3
11CMP r0, r11
11BEQ end3
   合計 13

Show/hideARM コードの条件付き命令を使用した条件付き実行の例

これは、個別の条件付き命令を使用した gcd アルゴリズムの ARM コードの実装です。この gcd アルゴリズムで実行する命令は 4 つだけです。

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

コードサイズが小さくなるだけでなく、ほとんどの場合、分岐だけを使用したときよりも、コードの実行速度が向上します。

以下の表に、ARM 7 ベースのプロセッサで、R0 = 1 かつ R1 = 2 の場合に、この実装によって使用されるサイクル数を示します。

Table 20. すべての命令を条件付きで実行する場合

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

これと分岐のみを使用した場合の例を比較すると、以下のことがわかります。

  • 分岐を使用せずに、すべての命令を条件付き実行にすることにより、3 サイクルを省くことができます。

  • R0 = R1 の場合、どちらの実装も同じサイクル数で実行されます。それ以外の場合は、条件付き命令を使用する実装の方が、分岐のみを使用する実よりも少ないサイクル数で実行されます。

Show/hideThumb コードの条件付き命令を使用した条件付き実行の例

ARMv6T2 以降のアーキテクチャでは、IT 命令を使用して、Thumb コードの条件付き命令を記述できます。条件付き命令を使用した gcd アルゴリズムの Thumb コードの実装は、ARM コードの実とよく似ています。Thumb コードの実装は、以下のようになります。

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

この実装は、ARM コードと Thumb コードのどちらにも正常にアセンブルされます。アセンブラは IT 命令をチェックしますが、ARM コードへのアセンブリでは省略します。

Thumb コードでは ARM コードよりも命令(IT 命令)が 1 つ多く必要ですが、全体のコードサイズは Thumb コードでは 10 バイト、ARM コードでは 16 バイトです。

Show/hideThumb コードの分岐を使用した条件付き実行の例

ARMv6T2 より前のアーキテクチャでは、IT 命令が存在しないため、B 分岐命令を除き、Thumb 命令を条件付きで実行することはできません。gcd アルゴリズムは条件分岐を使用して記述する必要があり、条件付き命令使わずに、分岐を使用した ARM コードの実装によく似ています。

条件付き命令を使用しない gcd アルゴリズムの Thumb コードの実装には、7 つの命令が必要です。全体のコードサイズは 14 バイトです。これは、条付き命令を使用した ARM 実装(16 バイト)よりも小さくなります。

さらに、16 ビットメモリを使用しているシステムでは、この Thumb の実装の実行速度が両方の ARM の実装を上回ります。これは、1 つの 32 ビット ARM 命令には 2 回のフェッチが必要であるのに対して、1 つの 16 ビット Thumb 命令では 1 回のメモリアクセスで済むからです。

Show/hide関連項目

概念
参照

『ARM アーキテクチャリファレンスマニュアル』

該当するプロセッサのテクニカルリファレンスマニュアル

『アセンブラリファレンス』

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0473FJ
Non-ConfidentialID111311