山之上 卓
yaman****@cc*****
2008年 11月 16日 (日) 23:07:42 JST
北村様 はじめまして。山之上です。 鈴木先生から北村さんのことは伺っていました。 ご指摘いただき、どうもありがとうございました。助かります。 山之上 卓 鹿児島大学学術情報基盤センター 情報メディア基盤部門 教授 情報セキュリティ対策支援室 yaman****@cc***** http://yama-linux.cc.kagoshima-u.ac.jp/~yamanoue +81-99-285-7187 -----Original Message----- From: coins****@lists***** [mailto:coins****@lists*****] On Behalf Of kitamura Sent: Sunday, November 16, 2008 10:42 PM To: coins****@lists***** Subject: [Coins-compiler-users] Cell/B.E. SPE のコンパイラ 山之上先生 北村と申します。(arm.tmd と mb.tmd を作成したものです。) 浮動小数点演算で、レジスタだけで計算できるはずなのに、メモリを 使っている。 の件ですが、レジスタ変数として使用するレジスタセットが定義されていない ためです。 現状の (defregsetvar (I128 *reg-I128*)) (defregsetvar (I32 *reg-I32*)) に加えて (defregsetvar (F32 *reg-F32*)) を追加すれば以下のようなコードが生成されました。 .L4: csflt $3,$80,0 fa $81,$81,$3 fesd $3,$81 stqd $3,-48($sp) ila $3,string.5 ori $4, $80, 0 lqd $5,-48($sp) brsl $lr,printf nop (一般的には I8-I64, F32, F64 すべてに対して defregsetvar で割り当てる レジスタセットを宣言する必要があります。) ご参考まで > <000301c947cf$b9df6ec0$2d9e4c40$@kagoshima-u.ac.jp> > From: yaman****@cc***** > Date: Sunday, 16 November 2008 18:43:04 +0900 > > 中田先生、山之上です。 > > 早速お返事いただき、どうもありがとうございました。 > > (1) について、ジャンプ最適化の流れについて良くわかりました。対策を練っ てみ > ます。 > > (2) について、現在のやり方の方法が間違いとはいえないことがわかってうれ しい > です。 > > > > 今後もいろいろご指導いただけると幸いです。 > > > > From: Ikuo Nakata [mailto:nakat****@kamak*****] > Sent: Sunday, November 16, 2008 9:02 AM > To: yaman****@symph***** > Cc: coins****@lists***** > Subject: Re: [Coins-compiler-users] Cell/B.E. SPE のコンパイラ > > > > 山之上様 > > > > 中田です. > > > > COINS Cell Compiler > > を作っていただけるのは大変ありがたいです. > > > > On 2008/11/16, at 0:26, <yaman****@cc*****> wrote: > > > 現在抱えている問題の解決方法に関する助言や、TMD の書き方についての > 助言をいただけると幸いです。 > > > > 問題点として > > (1)条件判定とその結果によるジャンプにおいて、余分な命令が残っている。 > > (2)フレームサイズと浮動小数点のメモリ上の割り当て方法がよくわからな い。現 > 在、力ずくでやっている。 > > があげられていますね.その具体的な内容は分かりませんが,ひょっとしたらご 参考 > になるかも知れない > > ことを下記します. > > > > (1)について,余計なジャンプを取り除くのは > > apply(JumpOpt.trig); > > を呼ぶことで行われていますが,それはEarlyRewritingの後でも,LateRewriting の > 後でも > > 呼ばれています.ただし,LateRewritingの後では定数によるジャンプなどが最適 化 > されません. > > > > 「コンパイラの基盤技術と実践 コンパイラ・インフラストラクチャCOINSを用い > て」 > > の > > 12.5 定数による掛算/割算 > > に,その変換をEarlyRewritingで行う,と書いてあるのはそのためです. > > > > ただし,EarlyRewritingで行うとその後で行われるSSA最適化との関係で > > 問題が生ずる場合がありますので,現在は定数になる場合だけEarlyRewritingで 行い > > それ以外はLateRewritingで行っています.そのことは正誤表 > > http://www.coins-project.org/COINS-book/seigohyou.html > > に書かれています. > > > > (2)については,私も力ずくでやっています.その例が上記の本の227ページに > > 次のように書かれています. > > > > バックエンドでフレーム変数の場所(オフセット)を決めているのは CodeGenerator > > のprocessFramesメソッドであり,それが最初に呼ばれるのはLateRewritingの フェー > ズである. > > processFramesメソッドでは,既にオフセットの決まっている変数があったら,決 > まっていない > > 変数に対してはそれ以降のオフセットを割当てる.また,フレーム変数を登録す ると > きに > > オフセットを強制的に指定することも出来る. > > > > これらのことから,フレームの先頭部分を確保するには,LateRewriting以前の > フェーズで > > フレーム変数を登録し,そのときにオフセットを強制的に指定すればよいことが 分か > る. > > x86.tmdでは,EarlyRewritingフェーズでva_startが呼ばれていることが > > 分かったときに,その関数が可変引数関数であると判定している.ここでもその 方式 > で, > > EarlyRewritingフェーズでva_startが呼ばれていることが > > 分かったときに,setVaStartCalledメソッドで,フレームの先頭の176バイトを確 保 > することにする. > > それには,そのメソッドで以下の命令を実行すれば良い. > > > > func.localSymtab.addSymbol("__argSaveArea", > > Storage.FRAME, Type.AGGREGATE, 16, -176, null); > > > > 中田 育男 > > nakat****@kamak***** > _______________________________________________ Coins-compiler-users mailing list Coins****@lists***** http://lists.sourceforge.jp/mailman/listinfo/coins-compiler-users