mcommit's message

ソフトウェア開発の仕事をしているsimotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

ARMの命令セットの条件指定について (2)

昨日の続き。

mcommit.hatenadiary.com

ARMの命令では最上位4ビットで条件指定ができることがわかりましたがAL(無条件実行)以外の使い方がよく分かりませんでした。

命令の実行条件を指定するというのはイメージ的には

r0 = 1 if flag == true
r0 += 2 

のようにRubyの後置ifのようなおしゃれなイメージがあります。
何が嬉しいかというとこの書き方だとelseを書かなくてよいのでソースコードレベルでのステップ数は削減できます。
分岐の結果に関わらず後続の処理を必ず行う場合はこの条件指定を使ったほうがよさそうに見えます。

さて、ARMの命令として具体的にどのように条件指定をするかを調べてみたところ、アセンブラだと命令の後ろに条件のサフィックスを指定するようです。

例えば、

MOV r0, #1

であれば

CMP       r0, #1
MOVEQ r0, #1

とすると、事前の比較命令の結果に応じてMOVを実行するか判断してくれるようです。
MOVEQ以外にもADDEQとかあります。

もちろん条件指定もEQ以外にあります。

条件指定実行のメリット

  1. 分岐命令を使うより命令数が少なくできる場合がある→サイズの節約
  2. 条件指定実行だと、条件が成立していない場合は後続の命令が実行されるので、ジャンプ先アドレスを別途取得する必要がない。

といったところでしょうか。

条件指定実行のデメリット

よく分かりません・・・なんとなく使える状況では使って行ったほうがよい気がしますが。

実際

実験のために、raspberrypiでMOVEQを使ってくれそうなコードを書いてビルドしてみました。

int add(int oneOriginFlg, int a, int b)
{
   int ret = 0;
   if (oneOriginFlg == 1)
   {
      ret = 1;
   }
   ret += a;
   ret += b;
   return ret;
}

コンパイルの結果、残念ながら普通にコンパイルしただけでは、MOVEQを使うコードははいてくれませんでした。

gcc -Osとか O1とかつけるとMOVEQをつかってくれていたのでgccだと必要に迫られないとこういった条件指定実行のコードははいてくれないようです。
gccは多くのアーキテクチャをサポートしているので当然といえば当然かも知れません。

参考書籍

今回も調査にはARMで学ぶアセンブリ言語入門を参考にしました。

ARMで学ぶ アセンブリ言語入門

ARMで学ぶ アセンブリ言語入門

条件実行についてもP62-P63で説明されています。ARMのアセンブラを学習するのには重宝しています。