この高級言語にCと競合するものがないと仮定すると、armCコンパイラを使用してスニペットからアセンブリコードを作成できます。たとえば、test.cに次のようなものがある場合、
void test() {
register int i asm("r0");
register int *a asm("r8");
register int *b asm("r9");
register int *c asm("r10");
for (i = 0; i < 10000; i++) {
a[i] = b[i] + c[i];
}
}
あなたが実行することができます
arm-linux-androideabi-gcc -O0 -S test.c
test.sファイルを作成します。このファイルには、テスト関数のアセンブリコードといくつかの追加情報が含まれています。ループがどのようにアセンブリにコンパイルされたかを以下で確認できます。
<snipped>
.L3:
mov r2, r8
mov r3, r0
mov r3, r3, asl #2
add r3, r2, r3
mov r1, r9
mov r2, r0
mov r2, r2, asl #2
add r2, r1, r2
ldr r1, [r2, #0]
mov ip, sl
mov r2, r0
mov r2, r2, asl #2
add r2, ip, r2
ldr r2, [r2, #0]
add r2, r1, r2
str r2, [r3, #0]
mov r3, r0
add r3, r3, #1
mov r0, r3
.L2:
mov r2, r0
ldr r3, .L5
cmp r2, r3
ble .L3
sub sp, fp, #12
ldmfd sp!, {r8, r9, sl, fp}
bx lr
<snipped>
このアプローチの問題は、コンパイラが研究に最適なコードを生成することを信頼することです。これは常に当てはまるとは限りませんが、人々を待つのではなく、上記のような質問にすばやく答えることができます:)
- 追加 -
GCCを使用すると、変数を特定のレジスタに入れることができます。関連ドキュメントを参照してください。
ここで腕の指示に関するチートシートを入手できます。
新しいバージョンのGCCは、予想どおり、より優れたアームコードを作成します。上記の切り取りはバージョン4.4.3で生成されており、Linaroの4.7.1が私の主張を証明していることを確認できます。したがって、私のアプローチを採用する場合は、入手できる最新のツールチェーンを使用してください。