Recent Entries
Archives
Search


Links
Powered by
Movable Type 2.64

2004年01月25日

h8300-elf-gccと最適化

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     @_dummy
Posted by minemaz at 2004年01月25日 18:46
トラックバック
このエントリーのトラックバックURL:
http://www.lancard.com/mt/mt-tb.cgi/100

Lipitor adverse reaction. from Lipitor.
Lipitor. Lipitor memory. Generic lipitor. Drug lipitor side effects. Lipitor side effects. [続きを読む]

トラックバック時刻: 2010年04月27日 10:49

Comments
Post a comment









Remember personal info?