[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.19 種々雑多なパラメータ

以下に、種々雑多なパラメータを示す。

PREDICATE_CODES

ファイル ‘machine.c’ で特殊な目的の述語を定義した場合は、 これを定義する。このマクロは、ある構造体の配列の初期化子内で呼び出される。 この構造体の先頭のフィールドは述語名で、第二のフィールドは RTL コードの配列である。各述語について、式中でその述語にマッチする 可能性のある全ての RTL コードのリストを第二のフィールドの値とする。 このリストには最後にコンマを付ける。典型的な RISC マシン向けの、 二つのエントリを持つリストの例を以下に示す。

 
#define PREDICATE_CODES \
  {"gen_reg_rtx_operand", {SUBREG, REG}},  \
  {"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}},

このマクロを定義しても生成されるコードには影響を与えない。 (ただし、間違った定義により、その述語にマッチする可能性のある RTL コード が排除されると、コンパイラは誤動作を起こす。) そのかわり、‘genrecog’ により作られるテーブルがよりコンパクトで 効率の良いものになり、コンパイラの速度を速める。 このマクロで定義されるリストに含めるべき述語で一番重要なものは、 ほとんどの insn パターンで使われる述語である。

CASE_VECTOR_MODE

あるマシンモード名の別名である。 これは、ジャンプテーブルの要素が持つべきマシンモードである。

CASE_VECTOR_SHORTEN_MODE (min_offset, max_offset, body)

オプションのマクロである。 最小オフセットと最大オフセットが既知の場合、addr_diff_vec に 適したモードを返す。 これが定義されていると、分岐短縮の追加のコードを有効にし、 addr_diff_vec を取り扱う。これを動作させるためには、 INSN_ALIGN を定義し、addr_diff_vec のアラインメントを 明確にする必要もある。 引数 body は、‘offset_unsigned’ とスケールフラグが 更新可能なように提供されている。

CASE_VECTOR_PC_RELATIVE

このマクロは、ジャンプテーブルが相対アドレスを保持すべき場合を 表す C の式に定義する。ジャンプテーブルが相対アドレスを保持することが なければ、このマクロを定義する必要はない。

CASE_DROPS_THROUGH

これは、インデックス値が範囲外にあるときに、プログラムの制御が case insn を通り抜けるときに定義する。これは、指定された default ラベルが、case insn 自体により実際に無視されるという ことを意味する。

CASE_VALUES_THRESHOLD

条件分岐のツリーではなく、ジャンプ表を使うのが最適であるような、 異なる値の最小値を定義する。デフォルトは、casesi 命令のある 機種では 4 で、それ以外の場合は 5 である。 ほとんどの機種でこれが最適である。

WORD_REGISTER_OPERATIONS

レジスタとワードより小さな整数モード間の演算が常にそのレジスタ全体を 使って行なわれるなら、このマクロを定義する。

LOAD_EXTEND_OP (mode)

一個の C の式。この式は、insn が、ワードより狭い整数モードである mode でメモリを読み出すとき、mode の外側のビットを、 読み出したデータを符号拡張したものに設定するか、ゼロ拡張したものに 設定するかを指定する。その insn が符号拡張する mode の値には SIGN_EXTEND を、ゼロ拡張する場合には ZERO_EXTEND を、 それ以外のモードには NIL を返す。

このマクロは、mode が非整数だったり、幅が BITS_PER_WORD 以上だと呼び出されないので、そういう場合は任意の値を返して良い。 常に NIL を返すようなら、このマクロは定義しないこと。 このマクロを定義する機種では、普通は定数 SIGN_EXTENDZERO_EXTEND をそのまま定義することになるだろう。

SHORT_IMMEDIATES_SIGN_EXTEND

short の即値をレジスタにロードすると符号拡張されるなら このマクロを定義する。

IMPLICIT_FIX_EXPR

浮動小数点値を固定小数点値への変換でデフォルトで使われるべき 木コードの別名。 通常は、FIX_ROUND_EXPR が使われる。

FIXUNS_TRUNC_LIKE_FIX_TRUNC

浮動小数点数を符号付き固定少数点数に変換するのと同じ命令が、 符号なしの固定少数点数にも正しく変換出来るなら、このマクロを定義する。

EASY_DIV_EXPR

一般の場合向けにコードをコンパイルするのに一番簡単な種類の割り算を 表す木コードの別名。 TRUNC_DIV_EXPRFLOOR_DIV_EXPRCEIL_DIV_EXPRROUND_DIV_EXPR のどれかになる。 これら4つの割り算は、結果の整数へ丸め方に違いがある。 EASY_DIV_EXPR は、どの種類の割り算を使っても構わない場合で、 効率が良いものを選択するときに使われる。

MOVE_MAX

ある一つの命令で、メモリとレジスタ間またはメモリとメモリ間で 高速に移動できる最大のバイト数。

MAX_MOVE_MAX

ある一つの命令で、メモリとレジスタ間またはメモリとメモリ間で 高速に移動できる最大のバイト数。 これが定義されていない場合、デフォルトは MOVE_MAX になる。 定義されている場合には、MOVE_MAX が実行時に取りうる値のうち、 最大値を値とする定数値になる。

SHIFT_COUNT_TRUNCATED

一個の C の式。この式は、対象機種でのシフト演算のシフト数に実際に使われる ビット数が、シフト対象のオブジェクトの大きさを表現するのに必要な ビット数と同じであるなら、ゼロでない値となる。 このマクロがゼロでないと、コンパイラは、符号拡張やゼロ拡張や、あるいは シフト演算のシフト数を切り詰めるための何らかのビット毎の and 命令を 省略しても問題ないと想定する。bit test 命令も含む、可変位置の ビットフィールドに作用する命令を持つ機種では、SHIFT_COUNT_TRUNCATED がゼロでないと、ビットフィールド命令への引数として振る舞う値の 切り詰めを削除することを有効にする。

どちらのタイプの命令もシフト数と位置(ビットフィールド演算用)を 切り詰めるか、あるいは可変位置のビットフィールド命令が存在しない場合は、 このマクロを定義すべきである。

しかし、80386 や 680x0 のように、機種によっては、シフト演算に対して だけ切り詰めが行なわれ、(本物であれ見かけだけのものであれ)ビットフィールド 演算には適用されないものがある。そういう機種では SHIFT_COUNT_TRUNCATED をゼロに定義すること。 そして、代わりに、‘md’ファイルに、シフト命令の暗黙の切り詰めを含む パターンを追加する。

このマクロは、常に値がゼロになるようなら定義する必要はない。

TRULY_NOOP_TRUNCATION (outprec, inprec)

一個の C の式。この機種で、inprec ビットの整数を outprec ビットの整数に、単にその inprec ビットの整数が outprec ビット しかないかのように操作することで「変換」しても大丈夫なら、この式は ゼロでない値となる。ここで、outprecinprec よりも 小さいとする。

多くの機種では、この式は 1 になる。

TRULY_NOOP_TRUNCATION が、MODES_TIEABLE_P が 0 になるモードに 対するサイズの対については 1 を返すときは、結果のコードは最適とは 言えない。これが問題になる場合は、こういうケースで TRULY_NOOP_TRUNCATION が 0 を返すようにすると改善される。

STORE_FLAG_VALUE

C の式である。この式は、条件が真のときに、整数モードの比較演算で返され、 フラグ格納命令(‘scond’)で格納される値を記述する。 この記述は、全ての ‘scond’ パターンと結果が MODE_INT モードになる全ての比較演算に適用されなければならない。

この値が 1 か -1 の場合は、比較演算を実現している命令が比較が真の場合 厳密に 1 または -1 を返し、偽の場合は 0 を返すということを意味する。 それ以外の値の場合は、その値は、比較が真になるときに、その結果のうち、 1 になることが保証されているビットを表す。この値は、比較演算のモードで 解釈される。このモードは、‘scond’ パターンの先頭の オペランドのモードで与えられる。STORE_FLAG_VALUEの 下位ビットか符号ビットのどちらかが立つ。現時点では、この二つのビットしか 使われていない。

STORE_FLAG_VALUE が 1 でも -1 でもない場合は、コンパイラは 指定されたビットにのみ依存するコードを生成する。 また、それは比較演算を等価な演算に置き換えることも、等価な演算が 必要なビットを設定するのであれば、その他のビットが未定義状態に なったとしても、可能である。 例えば、比較演算が SImode の値を返し、STORE_FLAG_VALUE が ‘0x80000000’ と定義されている機種では、符号ビットのみが関係するので、

 
(ne:SI (and:SI x (const_int power-of-2)) (const_int 0))

という式は、次のように変換することができる。

 
(ashift:SI x (const_int n))

ここで n は、テスト対象のビットを符号ビットの位置に移動するために 適切なシフト数である。

真の値に対し常に下位のビットを設定するが、他のどのビットの値も保証しない という機種を記述する方法は存在しない。だが、そういう命令を持つ 機種を一つも知らない。GNU CC をそういう機種に移植する場合には、 比較演算子用パターンに、その結果と 1 の論理積を実行する命令を含めるように してほしい。そして、我々に知らせて欲しい。 (see section How to Report Bugs).

ある機種が、比較演算の結果(あるいは条件コード)から値を得る命令には複数 あることが良くある。以下に、STORE_FLAG_VALUE の値、すなわち 使われる命令を選択する指針を示す。

多くの機種では、STORE_FLAG_VALUE として選ばれた値と その否定を同じ命令数で生成することができる。 そういう機種では、その場合用のパターンも定義すべきである。 例えば、以下にマッチするパターンである。

 
(set A (neg:m (ne:m B C)))

機種によっては、条件コード値に対する andplus 演算が、 対応する ‘scond’ 命令に andplus が続いた ものより、少ない命令数で実行することもできる。 そういう機種では、適切なパターンを定義すること。 条件コード値に対する plusminus 演算を実行する パターンには、それぞれ incsccdecscc という名前を 使うこと。例としては ‘rs6000.md’ を参照ほしい。 GNU Superoptimizer を使うと、それ以外の機種でこのような命令列を 見つけることができる。

ストアフラグ命令のない機種では STORE_FLAG_VALUE を定義する必要はない。

FLOAT_STORE_FLAG_VALUE

C の式で、浮動小数点の比較演算結果が真の場合に返されるゼロでない 浮動小数点値を与える。比較演算が浮動小数点値を返す機種では このマクロを定義すること。そういう演算がこの場合は、このマクロは 定義しないこと。

Pmode

ポインタ向けのマシンモードの別名である。 ほとんどのマシンでは、ハードウェアポインタの幅に対応する整数モードに 定義する。 32ビットマシンなら SImode だし、64ビットマシンなら DImode に なる。 マシンによっては、PSImode のような、部分整数モードの一つに 定義しなければならない。

Pmode の幅は、少なくとも POINTER_SIZE の値と 同じでなければならない。同じでない場合は、マクロ POINTERS_EXTEND_UNSIGNED を定義して、ポインタが Pmode に どのように拡張されるかを指定しなければならない。

FUNCTION_MODE

call RTL 式の中で、 呼びだし中の関数をメモリ参照するのに使われるマシンモードの 別名である。ほとんどのマシンではこれは QImode とすべきである。

INTEGRATE_THRESHOLD (decl)

最大の命令数を表す C の式。この数を越えたら、関数 decl を インライン展開すべきでない。 decl は、ある FUNCTION_DECL ノードである。

このマクロの定義のデフォルトは、64 に、関数が受け付ける引数の数を 8倍したものを足したものになる。 RISC マシンではもっと大きな敷居値を使うべきであると考えている人もいる。

SCCS_DIRECTIVE

プリプロセッサに、#sccs という制御子を無視させ、エラーメッセージを 出力させない場合はこれを定義する。

NO_IMPLICIT_EXTERN_C

システムのヘッダファイルが、C だけでなく C++ もサポートしている場合は、 このマクロを定義する。このマクロを定義すると、C++ でシステムヘッダファイル を使う場合に良く行なわれる方法である、 ファイルの中身を ‘extern "C" {…}’ で囲むという処理を行なわない。

HANDLE_PRAGMA (getc, ungetc, name)

なんらかの pragma を実装する場合はこのマクロを定義する。 定義するなら、その #pragma がマクロにより処理されるなら、値が 1 と なり、そうでなければ 0 となる C の式とする。 引数 getc は、‘int (*)(void)’ 型の関数であり、入力ストリームの 次の文字か、あるいは文字が残っていなければ EOF を返す。 引数 ungetc は、‘void (*)(int)’ 型の関数であり、文字を 入力ストリームに戻す。 name は、入力ストリームで #pragma に続く単語である。 入力ストリームポインタは、この単語の直後を指すことになる。 入力ストリームは、この式がゼロを返すなら何もいじらないままにしておくべきだし、 ゼロでない値を返すなら、pragma の最後の次の文字を指しているべきである。 pragma の行に残っているその他の文字は無視される。

一般に、#pragma の新しい使い方を実装しようとするのは良くない。 このマクロを定義すべきただ一つの理由は、他のコンパイラのサポートしている #pragma を既に使ってしまっているユーザプログラムのために 互換性を提供することにある。

プラグマが属性により実装可能なら、マクロ ‘INSERT_ATTRIBUTES’ が 定義するのに役に立つものになるだろう。

注意: このマクロの古いバージョンには引数が二つしか無かった。 streamtoken である。このマクロは、gcc を構築するときに cpp ライブラリがあってもなくても動作するようにするために変更された。

HANDLE_SYSV_PRAGMA

System V 形式のプラグマ ‘#pragma pack(<n>)’ と ‘#pragma weak <name> [=<value>]’ を GCC でサポートしたい場合は このマクロを値が 1 になるように定義する。

pack’ プラグマは構造体内のフィールドの最大アラインメントをバイト数 で指定する。‘__aligned__’ と ‘__packed’ の __attribute__ と同じである。‘pack’ の値としてゼロを指定すると、デフォルトの動作に 戻る。

weak プラグマは SUPPORTS_WEAKASM_WEAKEN_LABEL が 定義されている場合にのみ動作する。これが有効になっていると、 具体的に指定されたウィーク・ラベルを作ることができるようになる。 このラベルには値を持たせることもできる。

HANDLE_PRAGMA_PACK_PUSH_POP

Win32 形式のプラグマ ‘#pragma pack(push,<n>)’ と ‘#pragma pack(pop)’ をサポートする場合は、このマクロを 値が 1 になるように定義する。pack(push,<n>) プラグマは、 構造体内のフィールドの最大アラインメントをバイト数で指定する。 ‘__aligned__’ と ‘__packed’ の __attribute__ と同じである。‘pack’ の値としてゼロを指定すると、デフォルトの動作に 戻る。このプラグマを連続して呼び出すと、直前の値がスタック状に 積まれる。このため、‘#pragma pack(pop)’ を呼び出すと、直前の値が 返ってくる。

VALID_MACHINE_DECL_ATTRIBUTE (decl, attributes, identifier, args)

定義されているなら、一個の C の式である。 その値は、引数が args である identifier が、 decl についての有効な機種固有の属性なら、ゼロでない値となる。 attributes に指定される属性は、事前に decl に割り当てられている。

VALID_MACHINE_TYPE_ATTRIBUTE (type, attributes, identifier, args)

定義されているなら、一個の C の式である。 その値は、引数が args である identifiertype についての有効な機種固有の属性なら、ゼロでないとなる。 attributes に指定される属性は、事前に type に割り当てられている。

COMP_TYPE_ATTRIBUTES (type1, type2)

定義されているなら、一個の C の式である。 その値は、type1type2 の属性に互換性がなければゼロであり、 互換性があるなら 1 であり、ほぼ互換(警告が出る)なら 2 になる。

SET_DEFAULT_TYPE_ATTRIBUTES (type)

定義されるなら、デフォルトの属性を新規に定義された type に 割り当てる C の文とする。

MERGE_MACHINE_TYPE_ATTRIBUTES (type1, type2)

type 属性をマージするのに特別な取扱いが必要な場合はこのマクロを定義する。 定義されていれば、type1type2TYPE_ATTRIBUTES の 組合せのリストになる。‘comptypes’ が既に呼び出されており、1 を 返していることを想定している。

MERGE_MACHINE_DECL_ATTRIBUTES (olddecl, newdecl)

decl 属性をマージするのに特別な取扱いが必要な場合はこのマクロを定義する。 定義されていれば、olddeclnewdeclDECL_MACHINE_ATTRIBUTES の組合せのリストになる。 newdeclolddecl の重複した宣言である。 これが必要になる例は、一つの属性がもう一つ別の属性を上書きする場合や、 属性が後続の定義により無効化される場合である。

INSERT_ATTRIBUTES (node, attr_ptr, prefix_ptr)

decl が作られるときに属性を追加するのを可能にしたい場合は、 このマクロを定義する。 これは、普通はバックエンドがプラグマを実装するときに、そのプラグマの 効果に対応する属性を使って行うときに役に立つ。 引数 node は、作られようとしている decl である。 引数 attr_ptr は、この decl 用の属性リストへのポインタである。 prefix_ptr は、宣言の指定子や修飾子の後、しかし宣言自体の前に 現れる属性のリストへのポインタである。

SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes)

定義されていれば、一個の C の文。新しく定義された decl に デフォルトの属性を割り当てる。

DOLLARS_IN_IDENTIFIERS

このマクロを定義することで、識別子名中での文字 ‘$’ の使用方法を 制御する。定義する値は 0 か 1 か 2 でなければならない。 0 に定義すると、デフォルトでは ‘$’ を使うことは許されない。 1 に定義すると、デフォルトでは ‘-traditional’ が指定された場合に ‘$’ を使うことができる。 2 に定義すると、デフォルトでは ‘-ansi’ が指定されない場合に ‘$’ を使うことができる。 このマクロのデフォルト値は 1 である。デフォルト値で良いなら、この マクロを定義する必要はない。 このマクロはコンパイラ本体を制御し、プリプロセッサには影響がない。

NO_DOLLAR_IN_LABEL

アセンブラがラベル名として文字 ‘$’ を受け付けない場合に このマクロを定義する。 デフォルトでは、G++ が生成するコンストラクタ名とデストラクタ名の 識別子で ‘$’ が使われる。 このマクロを定義すると、代わりに ‘.’ を使う。

NO_DOT_IN_LABEL

アセンブラがラベル名として文字 ‘.’ を受け付けない場合に このマクロを定義する。 デフォルトでは、G++ が生成するコンストラクタ名とデストラクタ名で ‘.’ が使われる。 このマクロを定義すると、‘.’ を使わないように名前を書き換える。

DEFAULT_MAIN_RETURN

ターゲットシステムが、全てのプログラムは、main 関数は、 デフォルトで、つまり明示的な戻り値がない場合は、 標準的な「成功」値を返すと想定しているなら、このマクロを定義する。

この定義は C の文(セミコロンなし)とし、適切な rtl 命令を 生成するようにする。 これは、main 関数の終端をコンパイルするときだけ使われる。

HAVE_ATEXIT

ターゲットシステムが ANSI C 規格の atexit 関数をサポートしている 場合はこのマクロを定義する。これが定義されておらず、かつ、 INIT_SECTION_ASM_OP も定義されていない場合は、デフォルトの exit 関数が C++ をサポートするために提供される。

EXIT_BODY

exit 関数が、_exit で終了する前に、外部関数 _cleanup を呼び出す以外に何か処理を必要とするなら、 このマクロを定義する。 マクロ EXIT_BODY を定義する必要があるのは、 HAVE_ATEXITINIT_SECTION_ASM_OP も定義されていないときだけである。

INSN_SETS_ARE_DELAYED (insn)

このマクロは、一個の C の式として定義する。 この式は、たとえ insn 内で設定されたり 破壊されるリソースを使っているようにみえても、 遅延スロットスケジューラが insn の遅延スロットに命令を 置くのが安全であるなら、ゼロでない値となる。 insn は常に、一個の jump_insninsn である。 insnjump_insn が実際には関数呼び出しであり、 そのために、このように動作するのであれば、このマクロを定義すべきである。

これが常にゼロを返すようなら、このマクロを定義する必要はない。

INSN_REFERENCES_ARE_DELAYED (insn)

このマクロは、一個の C の式として定義する。 この式は、たとえ insn で参照されているリソースを設定したり 破壊したりするように見えたとしても、 遅延スロットスケジューラが insn の遅延スロットに命令を 置くのが安全であるなら、ゼロでない値となる。 insn は常に、一個の jump_insninsn である。 insnjump_insn が実際には関数呼び出しであり、 そのオペランドが呼び出されるサブルーチンで実際に使われるレジスタ となる機種では、このマクロを定義すべきである。 こうすることで、遅延スロットスケジューラが、引数レジスタに引数を コピーする命令を、 insn の遅延スロットに移動できるようになる。

これが常にゼロを返すようなら、このマクロを定義する必要はない。

MACHINE_DEPENDENT_REORG (insn)

非常にまれだが、コード生成を正しく行なおうとすると、 二回目のジャンプ最適化パスと遅延分岐スケジューリングの間で、 機種依存の処理が必要になることがある。 そういう機種では、このマクロを insn で開始するコードに 作用する C の文として定義する。

MULTIPLE_SYMBOL_SPACES

一つのコンパイル単位で定義されているグローバルシンボルを 他のコンパイル単位にある未定義シンボルに結び付けるのにユーザの 介在が必要な場合は、このマクロを定義する。 例えば、Microsoft Windows では、シンボルは共有ライブラリ(DLL)から 明示的にインポートしなければならない。

ISSUE_RATE

一個の C の式で、スーパスカラ機種の場合、幾つの命令を同時に発行できるかを 返す。これは ‘Haifa’ スケジューラでのみ使われており、 旧来のスケジューラでは使われていない。

MD_SCHED_INIT (file, verbose)

-fsched-verbose-n. 一個の C の文。これは、スケジュールされる各命令ブロックの先頭で ‘Haifa’ スケジューラにより実行される。 file はヌルポインタか、あるいはデバッグ出力の書きだし先の 標準入出力ストリームである。verbose は、 ‘-fsched-verbose-n で指定される詳細度レベルである。

MD_SCHED_REORDER (file, verbose, ready, n_ready)

一個の C の文であり、‘Haifa’ スケジューラがレディ・リストを スケジューリングした後に実行される。これにより、マシン記述で、 並べ変えを行うことが可能になる。 (例えば、‘VLIW’ マシンで二つの小さい命令を組み合わせる)。 file はヌルポインタか、デバッグ出力の書きだし先標準入出力 ストリームである。verbose は、‘-fsched-verbose-n で 指定される饒舌度レベルである。ready は、 スケジュールされる準備の整っている命令のレディ・リストである。 n_ready はレディ・リストにある要素数である。スケジューラは レディ・リストを逆順に読む。ready[n_ready-1] から始めて ready[0] に向かうのである。

MD_SCHED_VARIABLE_ISSUE (file, verbose, insn, more)

一個の C の文であり、‘Haifa’ スケジューラがレディ・リストの ある一個の insn をスケジューリングした後に実行される。 file はヌルポインタか、デバッグ出力の書きだし先標準入出力 ストリームである。verbose は、‘-fsched-verbose-n で 指定される饒舌度レベルである。 insn は、スケジュールされた命令である。 more は現在のサイクルで発行可能な命令数である。 マクロ ‘MD_SCHED_VARIABLE_ISSUE’ に、more の値を 更新する(普通は more– とする)責任がある。

MAX_INTEGER_COMPUTATION_MODE

ロード、ストア、コピー演算以外の演算に使用可能な整数マシンモードの うち最大のものに定義する。

このマクロを定義する必要があるのは、ターゲットが word_mode より 大きな値を汎用レジスタに保持できる場合である。ほとんどのターゲットでは このマクロを定義すべきではない。

MATH_LIBRARY

C の文字列定数を定義する。これは、システムの数学ライブラリをリンクするための リンカへの引数を表す。ターゲットに独立した数学ライブラリがない場合は、 ‘""’ とする。

このマクロを定義する必要があるのは、デフォルトの ‘"-lm"’ では まずい場合だけである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated using texi2html 1.78.