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

2.14.15 Intel 386 オプション

以下の ‘-m’ オプションが、i386 シリーズ向けに定義されている。

-mcpu=cpu type

命令スケジューリングを行う際の機種型のデフォルトを cpu type と想定する。cpu type に指定可能な値は以下の通りである。

i386

i486

i586

i686

pentium

pentiumpro

k6

ある特定の cpu type を選ぶとその特定のチップ向けに適切に スケジューリングを行う一方で、GCC は、‘-march=cpu type’ オプション を指定しないと i386 上で動作しないコードは一切生成しない。 ‘i586’ は ‘pentium’ に、‘i686’ は ‘pentiumpro’ に 同じである。‘k6’ は、Intel のチップに対する AMD のチップである。

-march=cpu type

機種型 cpu type 用の命令を生成する。 cpu type に指定できる値は、‘-mcpu’ に対するものに同じである。 さらに言うなら、‘-march=cpu type’ を指定することには、 ‘-mcpu=cpu type’ が含まれる。

-m386
-m486
-mpentium
-mpentiumpro

それぞれ、-mcpu=i386、-mcpu=i486、-mcpu=pentium、-mcpu=pentiumpro の 別名である。これらの別名は反対を唱えられている。

-mieee-fp
-mno-ieee-fp

IEEE 浮動小数点比較を使うかどうかを指定する。 IEEE 浮動小数点比較を使うと、比較の結果が順序づけられない場合を 正しく取り扱える。

-msoft-float

浮動小数点用ライブラリ呼び出しを含む出力を生成する。 警告: 必要となるライブラリは GCC の一部ではない。 であるわけではない。普通はその機種の通常の C コンパイラの機能が 使われるが、クロスコンパイルの場合はこれをそのまま行なうことはできない。 クロスコンパイルの場合は、適切なライブラリ関数を自分で用意しなければ ならない。

関数の浮動小数点の戻り値を 80387 のレジスタ・スタックに置く 機種では、‘-msoft-float’ が指定された場合でも、 いくらか浮動小数点オペコードが出力されることがある。

-mno-fp-ret-in-387

関数の戻り値に対し、FPU レジスタを使わない。

通常の呼出し規約では、FPU が無い場合でも、関数は float 型と double 型の値を FPU レジスタで返す。 OS が FPU をエミュレートすべきであるという考え方である。

-mno-fp-ret-in-387’ オプションを指定すると、代わりに、 float 型とdouble 型の値を通常の CPU のレジスタに入れて 返す。

-mno-fancy-math-387

387 のエミュレータの中には、387 の sincossqrt 命令をサポートしていないものがある。その場合は、このオプションを 指定して、これらの命令を生成しないようにする。このオプションは FreeBSD ではデフォルトになっている。GCC のバージョン 2.6.1 以降は、 ‘-ffast-math’ オプションも指定しない限り、 これらの命令は生成されない。

-malign-double
-mno-align-double

double 型、long double 型、long long 型の変数を 二語境界に整列するか、一語境界に整列するかを指定する。 double 型の変数を二語境界に整列させると、‘Pentium’ プロセッサ ではメモリを余分に食うものの、いくらか高速なコードを生成する。

注意。‘-malign-double’ を使った場合は、 上記の型を含む構造体は、整列の仕方が、386 用アプリケーション・バイナリ・ インターフェース仕様書のものとは異なる。

-msvr3-shlib
-mno-svr3-shlib

GCC が非初期化ローカル変数を bss に置くか data に 置くかを制御する。‘-msvr3-shlib’ を指定すると bss に置く。 この二つのオプションは、System V Release 3 でのみ意味がある。

-mno-wide-multiply
-mwide-multiply

GCC が mulimul を使って、32ビットのオペランドから long long の乗算と定数による 32ビット除算を行って、 eax:edx に 64 ビットの結果を生成するかどうかを制御する。

-mrtd

異なる関数呼出し規約を使う。この規約では、決まった数の引数を取る関数は ret num 命令で戻る。この命令は、戻るときに引数をポップする。 これにより呼出し側で一命令節約できる。呼出し側で引数をポップする必要が ないからである。

個々の関数がこの呼出し規約で呼ばれるようにするには関数属性 ‘stdcall’ を指定すれば良い。また、関数属性 ‘cdecl’ を使うとを ‘-mrtd’ オプションを上書きできる。 See section 関数属性の宣言

注意。この呼出し規約は通常 Unix で使われているものとは 互換性がない。このため、Unix のコンパイラでコンパイルされたライブラリ を呼び出す必要があるときには使用できない。

また、可変数引数(printf を含む)を取る関数全てに 関数プロトタイプを提供しなければならない。そうしないと、 それらの関数の呼出しに対し、正しくないコードが生成されて しまう。

さらに、引数がたくさんありすぎる関数を呼び出すと重大な誤りのあるコードが 生成される。(普通、引数が余分にある場合は問題なく無視される。)

-mreg-alloc=regs

整数レジスタの割当順序のデフォルトを指定する。 文字列 regs は、レジスタを指定する一連の文字である。 使用できる文字は次の通り。a は EAX を割り当てる。 b は EBX、c は ECX、d は EDX、S は ESI、D は EDI、B は EBP を割り当てる。

-mregparm=num

整数引数を渡すのにレジスタを何個使うかを指定する。デフォルトでは、 引数を渡すのにはレジスタは一個も使われず、最大でも 3 個のレジスタが 使用可能である。ある特定の関数でこの振るまいを変えたいときは、 関数属性 ‘regparm’ を使うことができる。 See section 関数属性の宣言.

警告:このオプションを指定し、かつ num がゼロでない場合は、 どんなライブラリも含めて、全てのモジュールを同じ値で 作らなければならない。システムのライブラリとスタートアップモジュールも 例外ではない。

-malign-loops=num

ループを 2 の num 乗バイト境界に整列する。 ‘-malign-loops’ が指定されない場合、gas 2.8 以降を使わない 限りデフォルトは 2 である。gas 2.8 以降の場合は、デフォルトは、 8 バイトより離れていなければ、ループを 16 バイト境界に整列する。

-malign-jumps=num

命令のジャンプ先が 2 の num 乗境界になるように整列する。 ‘-malign-jumps’ を指定しないと、デフォルトは 386 で最適化を行う場合は 2 であり、486 については gas 2.8 以降を 使わない限り 4 である。 gas 2.8 以降の場合は、デフォルトは、 8 バイトより離れていなければ、ループを 16 バイト境界に整列する。

-malign-functions=num

関数の開始点を 2 の num 乗バイト境界に整列する。 ‘-malign-functions’ を指定しない場合、デフォルトは、 386 用に最適化する場合は 2 で、486 用に最適化する場合は 4 である。

-mpreferred-stack-boundary=num

スタック境界を 2 の num 乗バイト境界に整列している状態を 保つことを試みる。‘-mpreferred-stack-boundary’ を指定しない場合、 デフォルトは 4(16バイトか 128 ビット)である。

スタックは 4 バイト境界に整列させる必要がある。Pentium と PentiumPro では、 doublelong double の値は 8 バイト境界に整列するべきである。そうしないと、実行時に実行速度の ペナルティが非常に大きくなる。Pentium III では、 ストリーミング SIMD 拡張(SSE) データ型 __m128 は、 16 バイト境界に整列しておかないと同様のペナルティを受ける。

スタック上のこれらの値のアラインメントが適切になることを保証するために、 スタック境界は、スタックに格納された任意の値で必要になるだけの大きさの アライメントに整列させる必要がある。さらに、各関数は、スタックの アライメントを保つように生成しなければならない。 スタック境界を高くしてコンパイルした関数をスタック境界を低くして コンパイルした関数から呼び出すのは、ほとんどの場合スタックの整列が 正しくなくなる。 コールバックを使うライブラリは常にデフォルトの設定を使うことを お奨めする。

アライメントを余分に取れば、スタックスペースも余分に使う。 スタックスペースの使用量に注意しなければいけないコード、 例えば、組み込みシステムや OS のカーネル等は、 ‘-mpreferred-stack-boundary=2’ と指定して、好ましいアラインメントを 小さくするのが良いだろう。


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

This document was generated using texi2html 1.78.