PSP xvi

PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

PSP-X.gif

記事の間違いを報告  新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク

公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル

TAG
全記事にタグをつけています  http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター

このブログについて

このブログでは、非公式のPSPソフト、いわゆる自作ソフト( PSP Homebrew )を作る事を目的とします。

著作権などの こまかい利用規約については、こちらを開いてお読み下さい

このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ


当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。


このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all

スポンサーサイト 

--/--/--
--. --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[edit]

CM: --
TB: --

page top

コンパイラに渡すコンパイルオプションは、実行ファイルの生成に色々と影響を与えます。

以前 私は -O パラメータの値によって int のサイズが可変するらしいと書きましたが、実際に調べてみると、変化はありませんでした(4バイト固定)。
-O は、最適化を行なうオプションです。


数日、試行錯誤して私が下したコンパイルオプションは、下記のようになりました(MAKEFILE)。

CFLAGS = -march=allegrex -mips2 -mabi=eabi -Wall -G0 -O3\
     -fomit-frame-pointer -mgp32 -mlong32



以下に、解説を書きます。

参考にしたページ(部分引用&部分コピペ)

  http://www.sra.co.jp/wingnut/gcc/gcc-j.html




psp-gcc の コンパイルオプション

-c コンパイル、アセンブルするが、リンクを行なわない
-S コンパイルのみ -- アセンブル、リンクを行なわない
-E プリプロセスのみ -- コンパイル、アセンブル、リンクを行なわない
-pass-exit-codes フェーズからのエラーコードの最大値を exitコードとして返す
--help ヘルプ情報を表示
--target-help ターゲット固有のコマンドラインオプションを表示
--help={target|optimizers|warnings|undocumented|params}[,{[^]joined|[^]separate}]
特定のタイプのコマンドラインオプションを表示する
-dumpspecs 組み込まれた spec 文字列を全て表示
-dumpversion コンパイラのバージョンを表示
-dumpmachine コンパイラのターゲットプロセッサを表示
-print-search-dirs コンパイラのサーチパスにあるディレクトリを表示
-print-libgcc-file-name コンパイラのコンパニオンライブラリ名を表示
-print-file-name=<lib> ライブラリ <lib> へのフルパスを表示
-print-prog-name=<prog> コンパイラの部品 <prog> へのフルパスを表示
-print-multi-directory libgcc のバージョンディレクトリルートを表示
-print-multi-lib コマンドラインオプションと複数のライブラリ探索
-print-multi-os-directory ディレクトリとの対応を表示
-print-sysroot-headers-suffix ヘッダー探しに使われるシスルートサフィックスを表示
-Wa,<options> カンマ区切りの <options> をアセンブラに渡す
-Wp,<options> カンマ区切りの <options> をプリプロセッサに渡す
-Wl,<options> カンマ区切りの <options> をリンカに渡す
-Xassembler <arg> <arg> をアセンブラに渡す
-Xpreprocessor <arg> <arg> をプリプロセッサに渡す
-Xlinker <arg> <arg> をリンカに渡す
-combine すぐにコンパイラに多数のソースファイルを渡す
-save-temps 中間ファイルを削除しない
-pipe 中間ファイルではなくパイプを使う
-time 子プロセスごとの実行時間を計測する
-specs=<file> 標準の specs ファイルを読み込んだ後に <file> を処理し、
     ドライバプログラムである psp-gcc が、コンパイラやアセンブラやリンカ等に
     渡すべきオプションを決定するときに使うデフォルトを変更する。
-std=<standard> 入力ソースを <standard> と見なす
--sysroot=<directory> ヘッダーとライブラリのルートディレクトリとして<directory>を
             使用する
-B <directory> <directory> をコンパイラの探索パスに追加する
-b <machine> インストールされていればターゲット <machine> として
gcc を実行する
-V <version> インストールされていれば <version> バージョン番号の
gcc として実行する
-v コンパイラによって起動されるプログラムを表示
-### -vに似ているがオプションは引用されず、コマンドは実行されない
-x <language> 次のインプットファイルの言語を<language>に指定
許される言語は C C++ アセンブラ 'none' を含む
'none' は、ファイル拡張子に従った言語




警告メッセージ関連のオプション

-w すべての警告メッセージを表示しない
-Wall 殆んどの警告メッセージを有効にする




MIPS用オプション

PSPに採用されているCPUは、MIPS社のR4000の32bitカスタムCPU「Allegrex」。
対応クロックは1~333MHz。パワーセービングのための拡張命令を持ち、FPUとVFPUが直結されている。


一覧
-EB -EL -g -g2 -G<num> -mips1 -mips2 -mips3 -mips4 -mips5 -mips32
-mips32r2 -mips64 -mips64r2
-march=<CPU> -mtune=<CPU> -m<CPU>
-no-m<CPU> -mips16 -no-mips16 -mfix-vr4120 -mfix-vr4130 -mgp32
-mfp32 -mno-shared -msym32 -O0 -O --[no-]construct-floats --trap
--no-break --break --no-trap -KPIC -call_shared -non_shared -xgot -mpdr
-mno-pdr -mshared -mno-shared -mabi=<ABI> -32 -n32 -64

解説
-march=<CPU>
  命令スケジューリングの際の機種のデフォルトを <CPU> と想定する。
  <CPU> は、
  mips1, mips2, mips3, mips4, mips5, mips32, mips32r2, mips64, mips64r2, r3000
  , r2000, r3900, r6000, allegrex, r4000, r4010, vr4100, vr4111, vr4120, vr4130
  , vr4181, vr4300, r4400, r4600, orion, r4650, r8000, r10000, r12000, vr5000
  , vr5400, vr5500, rm5200, rm5230, rm5231, rm5261, rm5721, rm7000, rm9000
  , 4kc, 4km, 4kp, 5kc, 20kc, sb1, from-abi
  のどれかである。

ある特定の <CPU> を選ぶとその特定のチップに適したスケジューリングを行なう一方で、-mipsX や -mabi を指定しない限り、MIPS ISA(Instruction Set Architecture、命令セットアーキテクチャ)のレベル 1 に合わないコードは何も生成しない。

-mips1
  MIPS ISA のレベル 1 の命令を発行する。これがデフォルトである。r3000 が、この ISA レベルのデフォルトの CPU タイプである。

-mips2
  MIPS ISA のレベル 2 の命令(branch likely, square root 命令)を発行する。r6000 が、この ISA レベルのデフォルトの CPU タイプである。

-mips3
  MIPS ISA のレベル 3 の命令(64ビット命令)を発行する。r4000 が、この ISA レベルのデフォルトの CPU タイプである。

-mips4
  MIPS ISA のレベル 4 の命令(条件付き move 命令、プリフェッチ命令、強化された FPU 命令)を発行する。r8000 は、この ISA レベルのデフォルトの <CPU> である。

-mgp32
  32個の32ビット汎用レジスタが利用可能であることを仮定する。これはデフォルトである。

-mlong32
  long 型を int 型と同じ 32 ビットにする。

-EB ビッグエンディアンのバイト順を使用する
-EL  リトルエンディアンのバイト順を使用する

-G<number>
  <number> バイト以下の大きさのグローバルなデータ項目と静的なデータ項目を、普通のデータセクションや bss セクションではなく、小データセクションや小 bss セクションに置く。これにより、アセンブラが、通常の 2 命令のメモリ参照の代わりに、グローバルポインタ(gp あるいは $28)に基づいた一命令のメモリ参照を生成することが可能になる。<number> のデフォルト値は、MIPS のアセンブラを使う場合は 8。


-G<number> オプションはアセンブラとリンカにも渡される。
全てのモジュールは、同じ値の -G<number> でコンパイルしなければならない。


最適化オプションとして -O2 を使う場合は、-Olimit 3000 も使う必要がある。この二つのオプションはどちらも、configure が構築するMakefile には自動的に追加される。make の変数 CC を上書きして MIPS のコンパイラを使うには、-Wf,-XNg1500 -Olimit 3000 を追加する必要がある。





最適化オプション

-O0
  最適化を行なわない。

-O
-O1

  完成したコードのサイズを小さくし、実行速度が速くなるよう最適化処理を施す。
  最適化を行なう。最適化を行なうコンパイルには幾らか余計に時間がかかり、大きな関数についてはたくさんのメモリを余計に使う。
  -O を指定しない場合は、コンパイラの目標はコンパイルのコストを小さくすることとデバッグが期待どおりの結果にすることである。各文は独立している。文と文の間にブレークポイントを設定してプログラムを止めたとき、どの変数にも新たな値を代入できるし、プログラムカウンタを変更して、その関数内の他のどの文にも飛ばすことができ、そしてソースコードから期待できる結果と全く同じものが得られる。
  -O を指定しないと、register 宣言した変数しかレジスタに割り当てない。コンパイル結果のコードは、-O なしの PCC で作られるよりもやや悪い。
  -O を指定すると、コードサイズと実行時間を小さくしようとする。
  -O を指定すると、全機種で -fthread-jumps と-fdefer-pop を有効にする。
-fthread-jumps は、ジャンプスレッドの最適化を行なう
-fdefer-pop は、関数引数をスタックから pop するのを呼び出し後まで遅らせる
遅延スロットのある機種では-fdelayed-branch をオンにし、フレームポインタなしでもデバッグをサポートできる機種では -fomit-frame-pointer をオンにする。機種によっては、他のオプションをオンにするものもある。
-fdelayed-branch は、分岐命令の遅延スロットを使うことを試みる
-fomit-frame-pointer は、可能な場合、スタックフレームを生成しない

-O2
  -O1 よりも頑張って最適化する。psp-gcc の持つほとんどの最適化が有効になる。
  さらなる最適化を行なう。GCC は、スペース-速度のトレードオフを含まないほとんど全ての最適化を実行する。-O2 を指定した場合は、ループ展開や関数のインライン展開を行なわない。-O と比べると、このオプションはコンパイル時間が増え、生成コードの効率が良くなる。
  -O2 を指定すると、ループ展開と関数のインライン展開、それに厳密なエイリアシングを除いた全ての最適化が有効になる。また、全ての機種で -fforce-mem オプションを付け、デバッグと干渉しない機種ではフレームポインタの削除を行なう。
-fforce-mem は、メモリオペランドについて算術演算を行なう前に、そのメモリオペランドをレジスタに強制的にコピーさせる。この結果、全てのメモリ参照を潜在的な共通部分式とすることにより、生成コードが良くなる。これらのメモリ参照が共通部分式でない場合は、命令組合せフェーズが独立したレジスタへのロードを削除する必要がある。-O2 を指定するとこのオプションが有効になる。

-O3
  さらに頑張る。関数のインライン化、レジスタリネーミングが有効となる。
  -O3 は -O2 で指定される全ての最適化を行ない、かつ inline-functions オプションを行なう。
inline-functions は、単純な関数を呼び出し側に統合する

-Os
  -O2 の最適化と同じ程度であるが、完成するコードのサイズを小さくするように頑張る。
  サイズについて最適化する。-Os を指定すると、普通はコードサイズを大きくしない -O2 の最適化を全て有効にする。また、コードサイズを小さくするよう設計されたさらなる最適化を実行する。

● -O オプションを複数指定した場合は、最適化レベルの数字が付いていてもいなくても、最後に指定したオプションが有効になる ●

-fomit-frame-pointer
  フレームポインタを必要としない関数については、フレームポインタをレジスタに保持しないようにする。これにより、フレームポインタをセーブ、設定、リストアする命令をなくすことができる。また、多くの関数で利用可能なレジスタが一つ増える。また、機種によってはデバッグが不可能になる。

  機種によっては、Vax のように、このオプションの効果がないものもある。標準の呼び出しシーケンスが自動的にフレームポインタを取扱うので、フレームポインタが存在しない振りをしても何もセーブされないからである。



全てのモジュールは、同じ値の -G<number> でコンパイルしなければならない。



参考までに、他の Cコンパイラ のコンパイルオプションの解説ページを貼り付けておきます。

GCC の コンパイルオプション解説
http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Invoking%20GCC
http://argent.shinshu-u.ac.jp/lab/math/note/gcc-option.pdf

BCC の コンパイルオプション解説
http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/bcc32_xml.html


【 関連記事 】
PSPプログラミング EBOOT.PBP 生成用 Makefile 記述方法
PSPプログラミング プラグイン生成用 Makefile 記述方法
PSPプログラミング PSPSDK に同梱されているライブラリの一覧とリンク記述

関連記事
スポンサーサイト

[edit]

CM: 2
TB: 0

page top

この記事に対するコメント

あれ?-Sオプションってアセンブリコード出力の為のオプションじゃないの?
等と思って調べたら両方正解でしたw

コンパイルが終った所で処理を停止し、アセンブルは行いません。アセンブラコードではない入力ファイルが指定された場合は、出力はアセンブラコードのファイルになります。

Manpage of GCCより引用

憂煉 #- | URL | 2009/11/01 16:52 * edit *

ぉぅぃぇーーっ!

ちゃんと調べたもんね。

コンパイルオプションも知っておかないとな、とか思って急遽作ってみた記事です。

猫山猫宗 #jjrqi.Ao | URL | 2009/11/01 21:59 * edit *

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://nekoyama2gillien.blog36.fc2.com/tb.php/182-00c8d013
この記事にトラックバックする(FC2ブログユーザー)

page top


h o m e |


 

2017-04