xc16 コンパイラはビット処理が苦手なの? [PIC]
MPLAB X で xc16 をいじっています。環境は
MPLAB X IDE v2.00
xc16-gcc(v1.23)
です。
コンパイラの最適化オプションのバリエーションとしては
となっていますが、使用しているコンパイラは当然 free版 なので最適化オプションは 0と1しか選択できません^^;
C言語で PORTBの7ビット目を反転するとコンパイル結果が下記(青文字部分がCソース)のように悲しい状態になります。
最適化レベル0は上記説明によればコンパイルコストを減らし最適化しないとなっていますが、普通に考えれば(機械的にハンドコンパイルするならば)下記の3になるのでは??
最適化レベルが0や1ではコンパイルコストを余分にかけて複雑なコードにしているように思えるのは気のせいでしょうか・・・?
[ 前へ ] 連載記事 [ 次へ ]
MPLAB X IDE v2.00
xc16-gcc(v1.23)
です。
コンパイラの最適化オプションのバリエーションとしては
level | effect |
---|---|
0 | Do not optimize. The compiler’s goal is to reduce the cost of compilation and to make debugging produce the expected results. |
1 | Optimize. Optimizing compilation takes somewhat longer, and a lot more host memory for a large function. The compiler tries to reduce code size and execution time. |
2 | Optimize even more. The compiler performs nearly all supported optimizations that do not involve a space-speed trade-off. |
3 | Optimize yet more favoring speed (superset of O2). |
s | Optimize yet more favoring size (superset of O2). |
となっていますが、使用しているコンパイラは当然 free版 なので最適化オプションは 0と1しか選択できません^^;
C言語で PORTBの7ビット目を反転するとコンパイル結果が下記(青文字部分がCソース)のように悲しい状態になります。
最適化レベル0は上記説明によればコンパイルコストを減らし最適化しないとなっていますが、普通に考えれば(機械的にハンドコンパイルするならば)下記の3になるのでは??
最適化レベルが0や1ではコンパイルコストを余分にかけて複雑なコードにしているように思えるのは気のせいでしょうか・・・?
- Optimizations : 0 の場合
! LATBbits.LATB7 ^= 1;
0x2A6: MOV LATB, W4
0x2A8: LSR W4, #7, W4
0x2AA: AND.B W4, #0x1, W4
0x2AC: BTG.B W4, #0
0x2AE: AND.B W4, #0x1, W4
0x2B0: ZE W4, W4
0x2B2: AND W4, #0x1, W4
0x2B4: SL W4, #7, W4
0x2B6: MOV LATB, W6
0x2B8: MOV #0xFF7F, W5
0x2BA: AND W6, W5, W5
0x2BC: IOR W4, W5, W4
0x2BE: MOV W4, LATB
- Optimizations : 1 の場合
! LATBbits.LATB7 ^= 1;
0x2A4: MOV #0xFF7F, W10
0x2AA: MOV LATB, W4
0x2AC: LSR W4, #7, W4
0x2AE: COM W4, W4
0x2B0: AND W4, #0x1, W4
0x2B2: SL W4, #7, W4
0x2B4: MOV LATB, W6
0x2B6: AND W10, W6, W5
0x2B8: IOR W4, W5, W4
0x2BA: MOV W4, LATB
- インラインアセンブラで普通にコーディング
!// LATBbits.LATB7 ^= 1;
! asm("mov #0x0080,W0");
0x2C2: MOV #0x80, W0
! asm("xor LATB");
0x2C4: XOR LATB
[ 前へ ] 連載記事 [ 次へ ]
コメント 0