1
コンパイラがLSRを直接使用しないのはなぜですか
こんにちは、タイミングが非常に重要なArduino Uno(ATmega328p)を使用するプロジェクトに取り組んでいるため、コンパイラーがコードを変換する命令を確認したいと思いました。そしてそこに私はuint8_t使用する各反復で右に1ビットシフトするものを持っています、そしてdata >>= 1コンパイラーはこれを5つの命令に翻訳したようです(にdataありますr24): mov r18, r24 ldi r19, 0x00 asr r19 ror r18 mov r24, r18 しかし、命令セットのドキュメントを見ると、これを正確に実行する命令が見つかります。 lsr r24 私は何かを見落としたり、コンパイラがこれも使用しないのはなぜですか?レジスタr18とr19は他では使用されません。 私はArdunioを使用していますが、正しければ通常のavr-gccコンパイラを使用します。これは、シーケンスを生成するコード(トリミング)です。 ISR(PCINT0_vect) { uint8_t data = 0; for (uint8_t i = 8; i > 0; --i) { // asm volatile ("lsr %0": "+w" (data)); data >>= 1; if (PINB …