私の組み込みシステムのクラスでは、指定された C 関数 AbsVal を ARM アセンブリに再コーディングするよう求められました。私たちができる最善のことは3行だと言われました。私は 2 行の解決策を見つけようと決心し、最終的にはそうしましたが、今私が抱えている問題は、実際にパフォーマンスを低下させたのか、それとも増加させたのかということです。
C コード:
unsigned long absval(signed long x){
unsigned long int signext;
signext = (x >= 0) ? 0 : -1; //This can be done with an ASR instruction
return (x + signet) ^ signext;
}
TA/教授の 3 行ソリューション
ASR R1, R0, #31 ; R1 <- (x >= 0) ? 0 : -1
ADD R0, R0, R1 ; R0 <- R0 + R1
EOR R0, R0, R1 ; R0 <- R0 ^ R1
私の2行ソリューション
ADD R1, R0, R0, ASR #31 ; R1 <- x + (x >= 0) ? 0 : -1
EOR R0, R1, R0, ASR #31 ; R0 <- R1 ^ (x >= 0) ? 0 : -1
潜在的なパフォーマンスの違いを確認できる場所がいくつかあります。
- Arithmetic Shift Right 呼び出しを 1 つ追加
- 1 つのメモリ フェッチの削除
では、どちらが実際に速いのでしょうか。プロセッサまたはメモリのアクセス速度に依存しますか?