Renesas Synergy™

FAQ 1007964 : gp(グローバル・ポインタ)とは何ですか?

回答

アプリケーション内でグローバル宣言したデータ (変数) を、レジスタではなく、 メモリに配置されているデータ (変数) を参照 (ロード、ストア)する際、 配置される位置に依存することのない参照 (PID) を実現するために用意されるポインタです。

グローバル宣言したデータ (変数) は gp 相対で参照されます。
V850マイクロコントローラでは「gp と 1 命令」か「gp と 2 命令」のどちらかでこれらのデータ (変数)を参照することができます。
そのため gp と 1 つの命令でアクセスできる方が、アプリケーションの速度の向上、 コード・サイズの縮小が見込めます。

gp と 1 命令 ( ld / st 命令 ) で参照できるセクションは「sdata 属性」 「sbss 属性」のセクションです。
この属性をもつセクションは gp から正方向、負方向にそれぞれ 「32 K バイト」内に配置されているため、この範囲にデータ (変数) を置くと 1 命令でアクセス可能で、高速参照、コード・サイズ縮小につながります。

gp は 1 つだけではなく、セグメント単位で複数作成することも可能です。
ただし複数生成した場合、gp の切り替えはアプリケーション・プログラムで明示的に行う必要があります。

【 gp の設定 】

(シンボル・ディレクティブ内)
__gp_DATA @ %GP_SYMBOL{DATA1};

(スタート・アップ・モジュール内)
mov #__gp_DATA, gp


上の例では、リンク・ディレクティブで gp シンボル値が DATA1 セグメント内を参照できるように設定します。
gp シンボル名が "__gp_DATA " なので、DATA1 セグメント内にsdata / sbss 属性セクションが存在する場合、DATA1セグメント内の最下位に位置するsdata /sbss 属性セクションの先頭アドレスから 32 K バイト足したアドレスが、シンボル "__gp_DATA " にセットされます。
一方、DATA1 セグメント内にsdata / sbss 属性セクションが存在しない場合、 DATA1セグメント内の最下位に位置するdata /bss 属性セクションの先頭アドレスから 32 K バイト足したアドレスが、シンボル "__gp_DATA " にセットされます。

 

適用製品

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