このコードを正しい方法で最適化しようとしています。私が正しいとはどういう意味ですか...他の誰かがコードを見た場合、最適化を削除できるように、これらの最適化を実行する一般的なアプローチがあると思います。
読みやすくするための C コードのサンプル...
int a = 1; // mapped to %l0
int b = 5; // mapped to %l1
int c = 0; // mapped to %l2
int d; // mapped to %l3
while( a < b ) {
c += a * b;
++a;
}
d = c * b;
SPARC アセンブリ バージョン...
mov %g0, %l2
cmp %l0, %l1
bge END_LOOP
nop
LOOP:
mov %l0, %o0
call .mul
mov %l1, %o1 ! Fill delay slot with second argument
add %l2, %o0, %l2
inc %l0
cmp %l0, %l1
bl LOOP
nop
END_LOOP:
mov %l2, %o0
call .mul ! Fill delay sot with second argument
mov %l1, %o1
mov %o0, %l3
最初の部分は最適化できますが (正しいかどうかはわかりません)、2 番目の部分を最適化する方法がわかりません。
mov %g0, %l2
cmp %l0, %l1
bge,a END_LOOP ! Annul branch to execute if branch is taken
mov %l2, %o0 ! Instruction at target
LOOP:
mov %l0, %o0
call .mul
mov %l1, %o1 ! Fill delay slot with second argument
add %l2, %o0, %l2
inc %l0
cmp %l0, %l1
bl LOOP
nop
mov %l2, %o0 ! Move the instruction to above the target
END_LOOP:
call .mul ! Fill delay sot with second argument
mov %l1, %o1
mov %o0, %l3
これらの最適化を実行する方法に関するヘルプは、非常に高く評価されます。