PIC XC8コンパイラの最適化力
PICマイコン用開発環境MPLAB XのCコンパイラ XC8の最適化の力を調べる
単純なマクロはコンパイル時計算される
RQ: #define F(x) (x << (定数 - 定数)) みたいなのはコンパイル時計算されるか?
定数 - 定数 はコンパイル時計算されるか?
x が定数のときに、全体がコンパイル時計算されるか?
A: どちらもされる
code:マクロ展開実験プログラム.c
#define DAC_PRECISION_BITS 8
#define DAC_TO_MA(dac_val) ((dac_val) << (10 - DAC_PRECISION_BITS))
void main(void) {
printf("%d", DAC_TO_MA(0x23));
printf("%d", DAC_TO_MA(DAC1_GetOutput()));
}
uint8_t DAC1_GetOutput(void) {
return DACCON1;
}
code:マクロ展開のアセンブリ
313: void main(void) {
314: printf("%d", DAC_TO_MA(0x23));
0559 30F6 MOVLW 0xF6
055A 0020 MOVLB 0x0
055B 00E6 MOVWF fmt
055C 3085 MOVLW 0x85
055D 00E7 MOVWF 0x67
055E 308C MOVLW 0x8C ← DAC_TO_MA(0x23) がコンパイル時計算されている
055F 00E8 MOVWF 0x68
0560 3000 MOVLW 0x0
0561 00E9 MOVWF 0x69
0562 3185 MOVLP 0x5
0563 25B0 CALL 0x5B0 ← printf の呼び出し
0564 3185 MOVLP 0x5
315: printf("%d", DAC_TO_MA(DAC1_GetOutput()));
0565 30F6 MOVLW 0xF6
0566 0020 MOVLB 0x0
0567 00E6 MOVWF fmt
0568 3085 MOVLW 0x85
0569 00E7 MOVWF 0x67
056A 3185 MOVLP 0x5
056B 25F9 CALL 0x5F9 ← DAC1_GetOutput の呼び出し
056C 3185 MOVLP 0x5
056D 0020 MOVLB 0x0
056E 00EC MOVWF 0x6C
056F 01ED CLRF 0x6D ← 上位バイトを 0 クリア
0570 35EC LSLF 0x6C, F ← 下位バイトを左 1 ビットシフト(溢れたビットは C フラグへ)
0571 0DED RLF 0x6D, F ← 溢れた 1 ビットを上位バイトに記録
0572 35EC LSLF 0x6C, F ← 下位バイトを左 1 ビットシフト(溢れたビットは C フラグへ)
0573 0DED RLF 0x6D, F ← 溢れた 1 ビットを上位バイトに記録
0574 086C MOVF 0x6C, W
0575 00E8 MOVWF 0x68
0576 086D MOVF 0x6D, W
0577 00E9 MOVWF 0x69
0578 3185 MOVLP 0x5
0579 25B0 CALL 0x5B0 ← printf の呼び出し
057A 3185 MOVLP 0x5