Trevaの接続のため、「あるビットの値を見つつ1bitずつ詰めて8bit分処理」という部分の最適化検討。
c = c << 1; if (FFUART_MSR & UART_MSR_CTS) { c = c | 1; }
まあこういうコードだったわけですが、常道に従いif文を除去してJUMP命令を無くす方向に
c = (c << 1)|((FFUART_MSR & UART_MSR_CTS) >> 7); ※ >>7は UART_MSR_CTSが 0x80であるため
なんと、上記では 7回シフトのため、7回ループするコードが吐かれたり…頭痛。-Osつけてるとこんなもんか…
c = (c << 1)|(FFUART_MSR & UART_MSR_CTS) ;
しかたないので、cの型を shortにして上記コードをLOOP展開して8回実行後に7回shiftするコードに変更。ASMで書いたような良い感じのコード吐いてくれました
unsigned short c = 0 ; FFUART_MCR &= ~UART_MCR_RTS ; dummy(); c = (c << 1) | (FFUART_MSR & UART_MSR_CTS); FFUART_MCR |= UART_MCR_RTS ; dummy();
UART_MCR_RTSとかは元コード(りなざう用)から流用。
mov.b @16777178:8,r2l and #-65,r2l mov.b r2l,@16777178:8 jsr @_dummy mov.w @(-2,er6),r2 extu.l er2 mov.l er2,er3 shll.l er3 mov.b @16777178:8,r2l extu.w r2 and.w #128,r2 or.w r3,r2 mov.w r2,@(-2,er6) mov.b @16777178:8,r2l or #64,r2l mov.b r2l,@16777178:8 jsr @_dummyPosted by minemaz at 2004年01月25日 18:46
トラックバック時刻: 2010年04月27日 10:49