ハードウェアモデルとコンフィグレーションオプション

 異なるターゲットマシンに対応した複数の異なるインストール済みコンパイラの中から選択するための標準オプション-bについては説明しました.

 これに加えて,これら個々のターゲットマシンタイプは,名前が-mで始まる特殊なオプションをもっています.

 これによって,たとえば68010と68020,浮動小数点コプロセッサをもつものともたないものなど,さまざまなハードウェアのモデルやコンフィグレーションの中から選択することができます.

 インストールされたコンパイラがただ一つであっても,指定されたオプションにしたがって任意のモデルやコンフィグレーションをターゲットマシンとするコンパイル処理を実行することが可能です.

 コンパイラのコンフィグレーションによっては,さらにこれ以上の特殊オプションもサポートされています.通常,これは,同一プラットホーム上の他のコンパイラとの互換性のためです.

 これらのオプションは,マシン記述中のマクロTARGET_SWITCHESにより定義されます.これらのオプションのデフォルトも同じマクロにより定義されているので,デフォルトを変更することが可能です.

 この項に関しては,検証は事実上不可能に等しいので,説明のみにとどめます.

M680x0オプション

 モトローラのM68ファミリを使用するマシンをターゲットとする際にこのオプションを指定します.Appleのマシンで動作するMKlinuxで使うときに有効でしょう.なお,PowerPCマシンには別のオプションがあります.

 以下の-mオプションが68000シリーズに対して定義されています.これらのオプションのデフォルトの値は,コンパイラのコンフィグレーション時に指定された68000の種類に依存します.もっとも一般的な選択肢に対するデフォルトが以下に示されています.

・-m68000,-mc68000

 68000用の出力を生成します.これは,68000ベースのシステム用のコンフィグレーションがコンパイラに対して行われた場合のデフォルトです.このオプションは,68008,68302,68306,68307,68322,68328,68356などの68000またはEC000コアを持つマイクロコントローラに対して使います.

・-m68020,-mc68020

 68020用の出力を生成します.これは,68020ベースのシステム用のコンフィグレーションがコンパイラに対して行われた場合のデフォルトです.同じく-m68030オプションは68030ベースの場合です.

・-m68881

 浮動小数点を処理するための68881の命令を含む出力を生成します.これは,コンパイラのコンフィグレーションが行われた際に-nfpが指定されていなければ,ほとんどの68020システムは浮動小数点プロセッサがあるはずなので,これがデフォルトとなります.

・-m68040

 68040用の出力を生成します.これは,68040ベースのシステム用のコンフィグレーションがコンパイラに対して行われた場合のデフォルトです.このオプションは,68040上においてはソフトウェアによってエミュレートしなければならない68881/68882命令の使用を禁止します.使用している68040にこれらの命令をエミュレートするコードが存在しない場合は,このオプションを使ってください.存在する場合には68881/68882命令を書き換えたほうが安心です.同じく-m68060オプションは68060ベースの場合です.

・-mcpu32

 CPU32用の出力を生成します.これは,CPU32ベースのシステム用のコンフィグレーションがコンパイラに対して行われた場合のデフォルトです.このオプションは,68330,68331,68332,68333,68334,68336,68340,68341,68349,68360などのCPU32またはCPU32+コアをもつマイクロコントローラに対して使ってください.組み込みシステム用ソフトウェアのオンチップデバッグ環境を構築する場合に使用することがあると思います.

・-m5200

 32ビットRISCプロセッサである520X coldfireファミリのCPU用の出力を生成します.これは,520Xベースのシステム用のコンフィグレーションがコンパイラに対して行われた場合のデフォルトです.このオプションは,MCF5202,MCF5203,MCF5204,MCF5202などの,5200コアをもつマイクロコントローラに対して使ってください.

・-m68020-40

 68040において新規に導入された命令をいっさい使用せずに68040用の出力を生成します.これにより,68020/68881,68030,もしくは68040において共用でき,かつ比較的効率よく実行可能なコードが生成されます.生成されたコードは,68040上においてはエミュレートされる68881の命令を使います.

・-m68020-60

 68060において新規に導入された命令をいっさい使用せずに68060用の出力を生成します.これにより,68020/68881,68030,68040,68060において共用でき,かつ比較的効率よく実行可能なコードが生成されます.生成されたコードは,68060上においてはエミュレートされる68881の命令を使います.

 モトローラ社のCISCチップは,68060が最後となります.

・-mfpa

 浮動小数点を処理するためのSun FPAの命令を含む出力を生成します.

・-msoft-float

 浮動小数点を処理するためのライブラリ呼び出しを含む出力を生成します.通常,そのマシンにおいて通常使われるCコンパイラのライブラリが利用されますが,これはクロスコンパイル環境では直接使うことができません.クロスコンパイルを行う場合は,適切なライブラリ関数群を提供するための準備を自分で行わなければなりません.組み込みターゲットであるm68k-*-aoutやm68k-*-coffでは,ソフトウェアによる浮動小数点のサポートが提供されています.

・-mshort

 intは,short intと同様16ビット幅であるとみなします.32ビットCPUでもこれを指定して強制的に整合性を取ることができます.

・-mnobitfield

 ビットフィールド命令を使いません.もともとその命令が使用できないCPUがターゲットである-m68000,-mcpu32,-m5200の各オプションでは,暗黙のうちに-mnobitfieldを指定します.

・-mbitfield

 ビットフィールド命令を使います.-m68020オプションは暗黙のうちに-mbitfieldを指定します.68020用に設計されたコンフィグレーションを使うと,これがデフォルトになります.

 MC68020〜MC68060 で使うことができるビットフィールド命令は,1〜32ビットの任意の幅の領域(ビットフィールド)を扱うことができます.

 ビットフィールドを扱うということは,レジスタやメモリ上で,バイト境界に関係なく任意の位置から始まる任意の幅の領域を読み出したり書き換えるということです.ビットフィールドと同じバイトに含まれているビットであってもビットフィールドの外側ならばその内容はビットフィールド命令によって使用されることも変化することもありません.

・-mrtd

 異なる関数呼び出し規約を使います.この関数呼び出し規約では,引き数の数が固定である関数は,復帰の際に引き数をポップするrtd命令を使って呼び出し元に復帰します.これにより,呼び出し元では引き数をポップする必要がなくなるので,命令を一つ節約することができます.この呼び出し規約は,通常のUNIX上において使われる呼び出し規約とは互換性がありません.

 標準ライブラリや標準スタートアップを使用しない場合で,処理系が閉じている場合ならば,これを使うことで実行速度が少し改善されると思います.UNIXのコンパイラによってコンパイルされたライブラリを呼び出す必要がある場合には,これを使うことはできません.また,可変個数の引き数を取るすべての関数について関数プロトタイプを提供しなければなりません.

 なお,関数の呼び出しに際して引き数の数が多すぎると,深刻な問題をもつコードが生成されてしまいます(通常であれば,余分な引き数は実害なく無視される).rtd命令は,68010,68020,68030,68040,68060,CPU32の各プロセッサによりサポートされていますが,68000や5200ではサポートされていません.

・-malign-int,-mno-align-int

 GCCによるint,long,long long,float,double,long doubleのそれぞれの型の変数の境界整列を,32ビット境界(-malign-int)にするか,16ビット境界(-mno-align-int)にするかを制御します.変数を32ビット境界に境界整列させると,生成されるコードはより多くのメモリを消費するようになりますが,32ビットのバスをもつプロセッサ上ではいくらか高速に実行されるようになります.ただし-malign-intオプションを使うと,GCCは上記の型を含む構造体については,公開されているm68kのアプリケーションバイナリインターフェース仕様とは異なる境界整列を行うので注意してください.

VAXオプション

 DECのVAXマシンをターゲットとする際にこのオプションを指定します.

 以下の-mオプションがVAXに対して定義されています.

・-munix

 ジャンプの距離が長い場合にVAX用のUNIXアセンブラが処理することのできない特定のジャンプ命令(aobleqなど)を出力しません.C言語上ではジャンプの意識をすることがないと思いますが,アセンブラ上でそのような問題が起きることがあります.

 GCCでクロスコンパイルして,デバッグはGCCのインストールされていないVAXで行う場合などの場合,エラーが起きた場合はこのオプションを指定してください.

・-mgnu

 GNUアセンブラを使ってアセンブルを行うと想定して,上記のジャンプ命令を出力します.

 ターゲットマシンがVAXでもそこにGCCがインストールされているなら,上のオプションは不要です.このオプションを使用してください.

・-mg

 dフォーマットの浮動小数点数ではなく,gフォーマットの浮動小数点数用のコードを出力します.

SPARCオプション

 SUNのSPARCマシンをターゲットとする際にこのオプションを指定します.

 SPARC上では以下の-mオプションがサポートされています.

・-mno-app-regs,-mapp-regs

 SPARC SVR4 ABIにおいてアプリケーション用として予約されているグローバルレジスタ2からグローバルレジスタ4までを使う出力を生成するには,-mapp-regsを指定します.これがデフォルトです.いくらか性能を犠牲にしてでも,SVR4 ABIに完全に準拠させるには,-mno-app-regsを指定します.ライブラリやシステムソフトウェアは,こちらのオプションを指定してコンパイルすべきです.

・-mfpu,-mhard-float

 浮動小数点命令を含む出力を生成します.これがデフォルトです.

・-mno-fpu,-msoft-float

 浮動小数点を処理するためのライブラリ呼び出しを含む出力を生成します.

 ただし,必要となるライブラリは,すべてのSPARCターゲットにおいて利用可能なわけではありません.通常,そのマシンにおいて通常使われるCコンパイラのライブラリが利用されますが,これはクロスコンパイル環境では直接使うことができません.クロスコンパイルを行う場合は,適切なライブラリ関数群を提供するための準備を自分で行わなければなりません.組み込みターゲットであるsparc-*-aoutやsparclite-*-*では,ソフトウェアによる浮動小数点のサポートが提供されています.-msoft-floatは,出力ファイルの中における呼び出し規約を変更します.したがって,プログラム全体をこのオプションを使ってコンパイルする場合にしか役に立ちません.このオプションが機能するようにするためには,とくにGCCに付属しているライブラリであるlibgcc.aを-msoft-floatを指定してコンパイルする必要があります.

・-mhard-quad-float

 4ワード(long double)の浮動小数点命令を含む出力を生成します.

・-msoft-quad-float

 4ワード(long double)の浮動小数点命令を実現するライブラリ呼び出しを含む出力を生成します.呼び出される関数群はSPARC ABIにおいて指定されているものです.これがデフォルトです.原稿執筆時点では,4ワードの浮動小数点命令に対するハードウェアサポートをもつSPARCはありません.どのSPARCにおいても,これらの命令に対してトラップハンドラが起動され,そのトラップハンドラがその命令の持つ効果をエミュレートします.トラップハンドラのオーバヘッドのため,この方式はABIライブラリルーチン群を呼び出すよりもはるかに遅くなります.したがって,-msoft-quad-floatオプションがデフォルトとなっています.

・-mno-epilogue,-mepilogue

 -mepilogueを指定すると,コンパイラは常に関数を終了させるためのコードを個々の関数の末尾に出力します.関数の途中で関数を終了させるところがあると,関数の末尾に存在する関数終了コードのところへジャンプするコードが生成されます.-mno-epilogueが指定されると,コンパイラは関数を終了させるところすべてにおいて関数終了コードをできる限りインライン出力します.

・-mno-flat,-mflat

 -mflatが指定されると,コンパイラは,セーブ命令やリストア命令を生成せず,「フラットな」呼び出し規約,すなわち単一レジスタウィンドウ呼び出し規約を使います.-mno-flatが指定されると,コンパイラはセーブ命令やリストア命令を出力し,通常の動作モードとなります.

・-mno-unaligned-doubles,-munaligned-doubles

 double型は8バイト単位に境界整列されると想定します.これがデフォルトです.-munaligned-doublesが指定されると,GCCは別の型の中に含まれる場合や絶対アドレスが指定されている場合のみ,double型は8バイト単位に境界整列されると想定します.これら以外の場合には,4バイト単位の境界整列を持つものと想定します.このオプションを指定することにより,他のコンパイラにより生成されたコードとの組み合わせによってまれに発生するいくつかの互換性の問題を回避することができます.とくに浮動小数点関連のコードで性能の劣化が引き起こされるために,このオプションはデフォルトにはなっていません.

・-mv8,-msparclite

 これら二つのオプションは,SPARCアーキテクチャの種類を選択するものです.デフォルトでは,(富士通SPARClite用に特別なコンフィグレーションが行われていない限り)GCCはv7用のコードを生成します.-mv8を指定するとSPARC v8のコードが生成されます.v7コードとの唯一の違いは,SPARC v8に存在する整数乗算命令と整数除算命令をコンパイラが出力するという点です.-msparcliteを指定すると,SPARClite用のコードが生成されます.これにより,SPARC v7には存在しないがSPARCliteには存在する整数乗算命令,整数除算命令,およびステップアンドスキャン(ffs)命令が追加されます.

 なお,将来のGCCリリースにおいて,これらのオプションは削除される予定です.これらのオプションに代わるものとして,-mcpu=xxxが提供されています.

・-mcypress,-msupersparc

 これら二つのオプションは,コードがどのプロセッサ用に最適化されるかを選択するものです.-mcypressが指定されると,コンパイラはSparcStation/SparcServer 3xxシリーズに使われているCypress CY7C602チップ用にコードを最適化します.このオプションは,より古いSparcStation1,2,IPXなどに対しても適切です.-msupersparcが指定されると,コンパイラはSparcStation10,1000,2000シリーズに使われているSuperSparc CPU用にコードを最適化します.またこのフラグはSPARC v8の命令セット全体を使えるようにします.

 なお,将来のGCCリリースにおいて,これらのオプションは削除される予定です.これらのオプションに代わるものとして-mcpu=xxxが提供されています.

・-mcpu=cpu_type

 マシンタイプcpu_typeの命令セット,レジスタセット,命令スケジューリングパラメータを設定します.cpu_typeとしてサポートされる値は,v7,cypress,v8,supersparc,sparclite,hypersparc,sparclite86x,f930,f934,sparclet,tsc701,v9

,ultrasparcです.アーキテクチャを選択するだけで具体的な実装まで選択しない値については,デフォルトの命令スケジューリングパラメータが使われます.該当する値は,v7,v8,sparclite,sparclet,v9です.以下に,サポートされる個々のアーキテクチャと,そのアーキテクチャにおいてサポートされる実装とのリストを示します.

   v7: cypress
   v8: supersparc, hypersparc
   sparclite: f930, f934, sparclite86x
   sparclet: tsc701
   v9: ultrasparc

・-mtune=cpu_type

 マシンタイプcpu_typeの命令スケジューリングパラメータを設定します.しかし,オプション-mcpu=cpu_typeのように,命令セットやレジスタセットの設定は行いません.-mtune=cpu_typeについても-mcpu=cpu_typeと同じ値が使われます.しかし,実際に使って役に立つ値は,特定のCPU実装を選択する値だけです.該当するのは,cypress,supersparc,hypersparc,f930,f934,sparclite86x,tsc701,ultrasparcです.

・-malign-loops=num

 2をnum乗したバイト数単位にループを境界整列します.

-malign-loopsが指定されないと,デフォルトのnumの値は2となります.

・-malign-jumps=num

 ジャンプ命令によってのみ到達される命令を,2をnum乗したバイト数単位に境界整列します.-malign-jumpsが指定されないと,デフォルトのnumの値は2となります.

・-malign-functions=num

 関数の先頭を,2をnum乗したバイト数単位に境界整列します.-malign-functionsが指定されないと,デフォルトのnumの値は32ビットSPARC用にコンパイルしている場合は2,64ビットsparc用にコンパイルしている場合は5となります.

 また,SPARCletプロセッサ上においては,上記のオプションに加えて,次の-mオプションがサポートされています.

・-mlittle-endian

 リトルエンディアンモードで動作しているプロセッサ用のコードを生成します.

・-mlive-g0

 レジスタ%g0を通常のレジスタとして扱います.GCCはこのレジスタの内容を必要に応じて破壊しますが,このレジスタの値を読むと常に0が返ってくるという想定は行わなくなります.

・-mbroken-saverestore

 save命令,restore命令のうち単純形式以外のものを使わないコードを生成します.SPARCletプロセッサの初期のバージョンでは,引き数付きのsave命令,restore命令が正しく処理されません.引き数付きでないsave命令,restore命令は正しく処理されます.引き数付きでないsave命令は,カレントなウィンドウポインタをインクリメントしますが,新しいスタックフレームを割り当てません.割り込みハンドラと同様の方法で,ウィンドウオーバフローのトラップハンドラがこのようなケースを適切に処理するものと想定されています.

 そしてさらに,SPARC V9プロセッサ上の64ビット環境では,上記のオプションに加えて,以下の-mオプションがサポートされています.

・-mlittle-endian

 リトルエンディアンモードで動作しているプロセッサ用のコードを生成します.

・-m32,-m64

 32ビット環境用または64ビット環境用のコードを生成します.32ビット環境では,int型,long型,およびポインタ型は32ビットになります.64ビット環境では,int型は32ビットに,long型とポインタ型は64ビットになります.

・-mcmodel=medlow

 Medium/Lowコードモデル用のコードを生成します.プログラムはアドレス空間の低位32ビットの範囲でリンクされなければなりません.ポインタは64ビットです.プログラムは静的にリンクすることも動的にリンクすることもできます.

・-mcmodel=medmid

 Medium/Middleコードモデル用のコードを生成します.プログラムは,アドレス空間の低位44ビットの範囲でリンクされなければなりません.テキストセグメントの大きさは2Gバイト未満でなければならず,データセグメントはテキストセグメントの2Gバイトの範囲になければなりません.ポインタは64ビットです.

・-mcmodel=medany

 Medium/Anywhereコードモデル用のコードを生成します.プログラムは,アドレス空間の任意の位置にリンクすることができます.テキストセグメントの大きさは2Gバイト未満でなければならず,データセグメントはテキストセグメントの2Gバイトの範囲になければなりません.ポインタは64ビットです.

・-mcmodel=embmedany

 組み込みシステムのMedium/Anywhereコードモデル用のコードを生成します.(リンク時に決定される)任意の位置から始ま

る32ビットのテキストセグメントと32ビットのデータセグメントの存在を想定します.レジスタ%g4は,データセグメントのベースアドレスを指します.ここでもポインタは64ビットです.プログラムは静的にリンクされ,PIC(6)はサポートされません.

・-mstack-bias,-mno-stack-bias
 -mstack-biasが指定されると,GCCはスタックポインタが

−2047だけオフセットされていると想定します.またフレームポインタが存在する場合には,フレームポインタについても同様の想定を行います.スタックフレームを参照する際には,この数が再加算されなければなりません.-mstack-biasが指定されなければ,そのようなオフセットは存在しないと想定されます.

*          *

 以上のように,かなり詳細なオプションがターゲットマシン用に用意されています.ほかには,

・HPのConvexをターゲットにするオプション
・AMD Am29000をターゲットにするオプション
・ARMアーキテクチャをターゲットにするオプション
・ARMのThumbをターゲットにするオプション
・松下のMNシリーズをターゲットにするオプション
・三菱のM32R/Dアーキテクチャをターゲットにするオプション
・Motorola 88kアーキテクチャをターゲットにするオプション
・IBM RS/6000とPowerPCをターゲットにするオプション
・IBM RT PCをターゲットにするオプション
・MIPSファミリのコンピュータをターゲットにするオプション
・インテルのi386ファミリのコンピュータをターゲットにするオプション
・HPPAファミリのコンピュータをターゲットにするオプション
・Intel 960をターゲットにするオプション
・DEC Alphaをターゲットにするオプション
・Intergraph社のClipperをターゲットにするオプション
・日立のH8/300やSHをターゲットにするオプション
・System V Release 4をターゲットにするオプション
・TMS320C3x/C4xをターゲットにするオプション
・NECのV850をターゲットにするオプション
・ARCプロセッサをターゲットにするオプション
・ナショナルセミコンダクターの32000プロセッサファミリをターゲットにするオプション

などのCPUやアーキテクチュアをターゲットにすることが可能です.

NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
プリプロセッサオプション
リンクオプション
ディレクトリ探索用オプション
ターゲット機種とコンパイラバージョンの指定オプション
◆ハードウェアモデルとコンフィグレーションオプション

Copyright 2002 岸 哲夫

Copyright 1997-2017 CQ Publishing Co.,Ltd.