プログラムでCPU周波数を特定するために使用しようとしている小さなプログラムがあります。
私のプログラムは次のように構成されています。
- アラームを設定する
while(1)
ループでレジスタをインクリメントする- 計算速度
SIGALRM
当初、私は使用していました
register unsigned int cycles asm("r6");
...
while(1)
cycles++;
objdump を使用すると、これが実際に次のように変換されることに気付きました。
9aa0: e1a03006 mov r3, r6
9aa4: e2833001 add r3, r3, #1
9aa8: e1a06003 mov r6, r3
9aac: eafffffb b 9aa0 <estimate_from_cycles+0x1cc>
なぜこれが 3 つの命令に変換されるのかわからなかったので、代わりにインライン アセンブリを使用してみました。
register unsigned int cycles asm("r6");
...
while(1)
asm("add r6, r6, #1);
これは次のように翻訳されました。
9aa0: e2866001 add r6, r6, #1
9aa4: eafffffd b 9aa0 <estimate_from_cycles+0x1cc>
- 以前の実装が 3 つの命令に変換されたのはなぜですか?
- ARM プラットフォームでは、
b <label>
命令に 3 サイクルかかります。ただし、ARM での減算演算は、1 サイクルのみを使用します。- PCレジスタから減算する方法はありますか?
- 減算はPCでも許可されていますか?
- 同じロジックを実装するために必要なサイクル数を減らす他の方法はありますか?
編集: CodeSourcery の arm-none-linux-gnueabi-toolchain を最適化なしで使用しています