Renesas Synergy™

FAQ 1008052 : 外部変数へのアクセスをテンポラリ変数のアクセスへ置き換える記述例は?

回答

外部変数アクセスはロード/ストアともに4byte必要なので、代入以外の場合にも、 外部変数の値をいったんテンポラリ変数に代入してそのテンポラリ変数を使い回すと、 メモリ・アクセスがレジスタ・アクセスに変わりコード・サイズが減る可能性があります。


※以下の例で s は外部変数であるとします。

 

変更前   変更後 (14byte減 ※)
    if (x != 0) {
        if ((s & 0x00F00F00) != MASK1) {
            return;
        }
         s >>= 12;
         s &= 0xFF;
    }
    else {
        if ((s & 0x00FF0000) != MASK2) {
            return;
        }
        s >>= 24;
    }
    unsigned int tmp = s;

    if (x != 0) {
        if ((tmp & 0x00F00F00) != MASK1) {
            return;
        }
        tmp >>= 12;
        tmp &= 0xFF;
    }
    else {
        if ((tmp & 0x00FF0000) != MASK2) {
            return;
        }
        tmp >>= 24;
    }
    s = tmp;


※削減量は例に関するものであり、個々のケースにより異なります。



ソースを変更した結果、出力命令が減少し、高速化もされる場合があります。



ソース変更を行う際には、次のような点に注意してください。

  • ソース変更によりレジスタの使用状況が変わるため、意図しない箇所において、 それまで最適化されずに残っていたレジスタ転送が削除されたり、 逆に、最適化が効かなくなって冗長なレジスタ転送が残ったりする可能性があります。
  • テンポラリ変数を追加することにより、新たなレジスタ変数用レジスタが使用されるようになり、それに伴い、関数の入口/出口でそのレジスタの退避/復帰が追加されることがあります。この場合、退避/復帰のコード分(8バイト)だけコード・サイズが増加します。

 

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください