1read 100read
2013年01月電気・電子28: 【Renesas】ルネサス 78K R8C RL78 RX SH V850 5 (850)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
【新時代!】PSoC スレ 其の十 (710)
【電気】理論・回路の質問【電子】 Part10 (826)
アマチュア無線を始めよう 6 (785)
【Digi-Key】部品通販屋を語るスレ 【Mouser,RS】 (866)
【Cortex-】 やっぱARMっしょ 6 【AxRxMx】 (627)
プリント基板業者発注質問スレ (310)
【Renesas】ルネサス 78K R8C RL78 RX SH V850 5
1 :2012/07/24 〜 最終レス :2013/01/05 ルネサスのマイコン全般について ■マイコン総合 http://japan.renesas.com/prod/mcumpu/ 前スレ http://uni.2ch.net/test/read.cgi/denki/1335290287/
2 : -−- _. ' ´ ` 、 / / \ / // ` ー- . //ィ' ./ __ _,./ | | ,ィ' / / ´, ' ^ ′ ,| | '´ l′ _/ .__/ / 7ト/. . / . ィ'/ 「'7女ァr / / !'| lヽ | //,r1' ,.イ ム. / / / ぇ、リ | | . ´ l.{ |/ | [_/ // ' ヾ:、 | | ヽ| | ' ん /| / | | | | ヽ、/,r´|/ ,ハ | | |\ ´’ / , , ' l/ 人生いろいろ、マイコンいろいろだよ | | | j` ー--‐ャ ´ / |/ '. ハ. |/ / / , < ! ⊂,. ̄`ヽ∨ ∨ | ̄`/ / , /,r⌒.ー、 / ゙l V' | / //'´ i´ `ヾ }',. , / | ヽl. / /' ! )
3 : スレ建立乙です
4 : 今まで20MHzのR8Cで処理していたプログラムを32MHzのRL78に移植すれば パフォーマンス的にはほぼ同等以上で処理できるのでしょうか? それともRXにしないと十分な性能ではないのでしょうか? すごく大雑把でいいので教えてください。
5 : RX-78って何? マイコン?
6 : 前スレのRL78純正コンパイラの最適化だけど、 インライン関数が使えないのはどうなの? マクロは型がアレになるので嫌
7 : >>4 参考になるか微妙だが、CoreMarkのスコアだと RL78/G14が、0.67CoreMark/MHzで R8Cと同コアのM16Cが、0.47CoreMark/MHz
8 : >>6 #pragma inlineまともに使えないんですね! 知らなかった。 これは普通にびっくり。
9 : >>7 ありがとうございます。
10 : >>5 パソコンじゃね?
11 : 「がじぇっとるねさす」って、なんでweb上でコンパイルさせるんだろう。 別に、大したコード書いてるわけじゃないが、 あんまり気持ちの良いモノでもない。
12 : mbedの真似じゃね?
13 : IPネタの収集と用途アンケート代わりだろう
14 : >>11 別にwebコンパイラ専用じゃないっしょ
15 : >>12 mbed は非公式だったと思うが、ローカルコンパイルも可能なので、 その方向に進むななら有り難いですね。 >>14 確かに、 http://japan.renesas.com/products/promotion/gr/index.jsp を見ると、 >ルネサス製コンパイラを利用されたい場合、ローカルPC上でお願いします。 なんて書いてあるから、ローカルコンパイルもできるのかもしれないな。 まあ、明日発売の製品だし、もう少し待てば、色々情報も出てくるかな。
16 : RL78/G14の講座聞きに行ったが、バッテリ駆動には結構使えそう。 あとデバイスファイルが自動的にセクション作ってくれたり(もちろん手動設定も可)、 SFRがピン数に合わせた割り振りしてくれるので 比較的シンプルにC言語に専念できるのがいい。 (商用電源がつながっていて(あるいは短時間のバッテリ駆動で)、高速度やサイズを大きく、 4バイト、8バイト変数を多用するならRXの方がいいけど)
17 : がじぇるね GR-SAKURA、登録してWebコンパイラ使うのに 何でこんなに個人情報欲しがるんだ?やな感じ。
18 : いたずら対策でしょ。 でも漏洩される危険性があるからイヤなのは同感だな。
19 : 輸出管理だろ。 テポドン引き上げたらマイコン出てきて家宅捜索食らったらしいぞ。
20 : 在日がたくさんいるんだから、その方法で輸出管理出来るわけねえだろw
21 : >>19 本当に? 秋月で買ったH8だったりして
22 : クラウド開発環境 なぜか、gcc 面白い
23 : 二番煎じじゃダメなんですかっ! あれ、もしかしてビリから一番?
24 : 目玉商品で釣って、別の商品で儲けるという戦術は 商売の基本だわな。
25 : >>22 もうちょっとサービスして欲しいところだな RXで、本当にARMよりバイナリサイズが小さくなるのか試したいんだよね。
26 : >>25 RX用のgccなら↓でダウンロードできるからコードサイズの評価くらいならタダでできるぞ http://www.kpitgnutools.com/
27 : gccじゃCPUの実力判るほど最適化されない事多すぎだしw まして新アーキテクチャのCPUなんて…
28 : archによって、最適化って左右されるし 速度優先なら、サイズが肥大化する可能性も gccで最適化無しは汗読める人にひと蹴りされるかも 昔はサイズが小さいと早くなることが多かったけど 今や、ROMサイズはそれなりの富豪プログラムが出来る時代 最適化するとハマるから、最適化禁止の縛り入れるところもあるらしいからね
29 : >>27 ARMで純正コンパイラ使ってんの? 比較ならgccで較べたほう良くね? つーかルネサスの純正コンパイラ試したいなら評価版あるぞ。 http://japan.renesas.com/products/tools/evaluation_software/index.jsp#compiler つーか文句言いたいだけのクズだなお前。
30 : >>29 べつにクズでもいいけどw 「クラウド開発環境をもうちょっと実力の出る環境にして欲しいよね。」 という話題に、 方向違いなこと言ってるおまえモナーwww
31 : >>30 >「クラウド開発環境をもうちょっと実力の出る環境にして欲しいよね。」 >という話題に、 ↓がそういう話題か? 「もうちょっとサービスして欲しいところだな RXで、本当にARMよりバイナリサイズが小さくなるのか試したいんだよね。」
32 : すまん、おまえに関わったオレがバカだった。
33 : >>32 他人に聞かれてんだから答えろよ。 「もうちょっとサービスして欲しいところだな RXで、本当にARMよりバイナリサイズが小さくなるのか試したいんだよね。」 ってのが 「クラウド開発環境をもうちょっと実力の出る環境にして欲しいよね。」 という話題か?
34 : 入門レベルの環境に あーだ、こーだ いってもね 上のレベルのクラウド的な開発環境はもっと自動化されてるよ 未熟な人はハマりながら覚えていってるみたいだよ
35 : いやー、入門用だから子供だましの環境でいいとは思えないんだが。 逆にレスポンスが悪化しない程度に、最高の環境を試せた方がいいんじゃないかなあ? まあ確かに、「まず慣れろ」ではあるねw
36 : >>25 好きなだけ試せばいいじゃん
37 : 慣れた頃にルネサス、お父さんのヨ・カ・ン。
38 : ビジネス+板のスレにこんなカキコの転載が... 4 自分:名無しさん[] 投稿日:2012/06/03(日) 20:50:52.34 ID:wmp33orD0 日本で11月4日、借金苦のNECが、 認知症のルネサスを殺害して無理心中を図ったとみられる事件の初公判が5日に行われた。 事件内容は認知症のルネサスの支援で借金苦に陥り、相談の上で殺害したというもの。 NECはルネサスを殺害した後、自分も自殺を図ったが発見され一命を取り留めたとの事。 NECはエルピーダと3企業で連盟を結んだが、2月にエルピーダが死亡。 その頃から、ルネサスに認知症の症状が出始め、NECは支援を検討。 ルネサスは2012年4月ごろから昼夜が逆転。徘徊で日立、三菱に保護されるなど症状が進行した。 NECはリストラをして支援を行おうとしたが自身の赤字が軽減せず、6月に支援切れ。 追加出資や融資は、会社設立時の経緯を理由に認められなかった。 支援と両立する施策は見つからず、12月に資金がショート。 三菱の支援も限度額に達し、運転資金が足りず、 2012年12月31日に心中を決意した。 「最後のルネサス孝行に」 NECはこの日、車椅子のルネサスを連れて川崎市内を観光し、1月1日早朝、 武蔵小杉の遊歩道で「もう生きられへん。此処で終わりやで。」などと言うと、 ルネサスは「そうか、あかんか。NEC、一緒やで」と答えた。 NECが「すまんな」と謝ると、ルネサスは「こっちに来い」と呼び、 NECがルネサスの額にくっつけると、 ルネサスは「わしは元NECエレや。わしがやったる」と言った。 この言葉を聞いて、NECは殺害を決意。ルネサスの首を絞めて殺し、 自分もロケットビルで宇宙に飛び出し自殺を図った。 冒頭陳述の間、NECは背筋を伸ばして上を向いていた。肩を震わせ、 眼鏡を外して右腕で涙をぬぐう場面もあった。 裁判では三菱の山西社長がNECが献身的なグループ再編の末に 事業失敗等を経て追い詰められていく過程を供述。 殺害時の2社のやりとりや、 「ルネサスの命を奪ったが、もう一度 半導体立国日本に」という供述も紹介。 目を赤くした日立の中西社長が言葉を詰まらせ、 三菱の山西社長も涙をこらえるようにまばたきするなど、法廷は静まり返った。
39 : 泣いた
40 : RL78をcubeSuite+でソフト書いて使ってるけど、結構快適。 低消費電力が最高クラスなので電源のない山奥での測定でも使えていい感じ。
41 : SHCコンパイラも高いし、デバッガも高い。 ARMも、本格的なツールは高いが、そこそこ使える無料コンパイラや フリーのデバッガも多い。 もしかして、ARM陣営から脅されて、わざとSH系の開発ツールを高くして いるのか?
42 : 別に収集家ってわけじゃないなら多かろうが少なかろうがあんまり関係ない 銭がないならgccとgdbでいけばいいんじゃねぇの?
43 : >>41 ARMでもgcc使ってる人は多いと思うが、SHでgccだとなんか問題あんの?
44 : SHへの最適化度合いが低いんじゃなかったかな 定量的に述べよといわれても困るけどね
45 : 遊びで使うんなら最適化なんて大した問題ではないんでないの? ARMもgccなら大していいコード吐かないぞ。 それか、仕事で使うならツールぐらい金払えば?
46 : > SHでgcc dt命令使うソース書くとハマるかも? sh2aは印方面に改悪?されてるような
47 : >>46 具体的な話ではなくて個人的印象?
48 : >>46 意味不明。バイナリで上位互換なんだから、はまりようが無いでしょ。 スーパースカラで並列実行されたらフラグの動きが変わるとか勘違いしている? SH2AはSH2のバイナリがすべてそのままで動くよ。CPUは。 ただし当たり前だがタイミングは変わるので、 組込用にポーリング間隔とかをCPUウエイトで作っていたりする場合は、 そういう部分に変更が必要だけどね。
49 : ワケワカなのが釣れるとは
50 : 最近のは何気に dt命令でハマらないようになってるな
51 : 「最近のは」って、gccでSHがサポートされるようになって何年経ってると思ってんの?w ホントこのスレこないだの ID:ch/FUsSr といいワケ分からん素人多いなww
52 : >>50 とりあえずDT命令ではまったという事例を晒してみてはどうか? 本当にはまりポイントなら情報を共有できるし、 大幅に勘違いしているのであれば、優しい人から指摘してらえるかもしれないし。 ただgccでdt命令がとか言っている時点で、だいぶずれているとは感じるので、 多分後者だとは思うんだが。
53 : >>52 別に勘違いでもいいよ、何気に治ってるから 4.7.1だよ、見たのは、過去の追っかけまでやる気ないから
54 : >>53 そのスタンスだと成長しないぞ。白黒つけておくべきだと思うがね。 DT命令がSH2→SH2Aで改悪されていることはあり得ない。 なぜなら、動きは同じだから。(つまり、改良もされていない。) それでも君が確かにはまったというのなら、それはgccのバグに命中したということだろう。 見てみれば、4.7.1は最新リリースではないか。 http://gcc.gnu.org/ その後のバージョンは4.8.0だが、これはリリース前でChangesノートが整備されていない。 「直っている」というのであれば、ここに記述されるはずだが、残念ながら不明だ。 あと、何故か4.5.4が4.7.1よりも後にリリースされているようだが、これは何故だろう? プロジェクトが分岐しているというのは、何か確実にそうせざるを得ない事態があるということだ。 gccの進め方は知らないが、見たところ、大量のRegressionが積まれているようだから、 4.5.4というのはRegression済みのStable-Releaseなのか? もし仮に最新リリースのgccのバグに命中する記述があるというのなら、それは非常に有益な情報だから、 出してみてはどうかね? もし仮にそれが君の大幅な勘違いであったとしたら、 それはこの機会に修正しておいた方が君のためにもなると思うし。
55 : >>54 gccの追っかけ歴は2.9?から archに依存したところを見始めたのは4.4の頃 自前patchのファイル名見る限り、4.4の時に見つけたようだ (mdファイルが読めるようになったからね) 2.9の頃shの割り込み抜けるとき(sh3/4はハマらない)、遅延分岐直後にレジスタ復帰があって、ハマった口 治ったのは4.5になった頃かな >あと、何故か4.5.4が4.7.1よりも後にリリースされているようだが、これは何故だろう? 安定版という事でメンテしてるだけのような backportみたいなのは期待しないほうがいいよ 個人的にやってることだからね。 壊れた人間の戯言だと思ってもらってもいいよ
56 : >>55 話を整理すると、 4.4でmdファイルのバグを見つけ、自前でパッチ。 4.5の頃に修正された模様。 4.7.1で改めて試してみたところ、正しく動作していた。 ということかな。まあこれなら特に追う必要はないが、 4.4.xがバグっている可能性があるというのはそれなりに有益な情報だろう。 4.4.7が2012/03/13にリリースされているし、実際に使っている人もいるかもしれない。 その場合、4.4.xでどうしても腑に落ちない動きをするようなら、 4.5.4で試してみるという手があるということだね。 ちなみに内容は何? 記述されている内容だと、RTE命令の遅延スロットにレジスタ復帰命令があって、 いまいち動作しなかったということ? SH3/4とSH1/2は割り込みが違う。 SH3/4は割り込み時は特権に切り替わり、レジスタも切り替わるから、レジスタ退避をする必要がない。 従って、レジスタ復帰命令がRTEの遅延スロットに存在することはありえない。 これに対して、SH1/2はレジスタ退避が必要なので、 RTEの遅延スロットにはお約束的に MOV.L @R15+,R0 が来そうだが、これがイマイチだったということか? まあもう直っているというのなら、単なる興味の範囲なので、覚えている範囲で答えてくれればうれしい。 (ちなみにRESBANK命令かとも思ったが、この命令は遅延スロット例外になるので、 さすがにこのレベルの大ポカは無いと信じたい。 ただ、mdファイルのチェックは割り込み無しで行うだろうから、普通にすり抜けても不思議ではないが。) どうでもいいが、mdファイルには、SH-Mediaがしっかり登録されているんだな。
57 : >>56 rteはこれで回避したけど、遅延分岐がちょっと ttp://gcc.gnu.org/ml/gcc-patches/2010-02/msg01142.html ここから始まってる ttp://gcc.gnu.org/ml/gcc-patches/2001-06/msg01351.html dtの件は define_peephole のdtの箇所 命令順入れ替え後にここ通るとちょっとまて状態のことがある 4.7.1はここを通るコードを吐かなくなった 4.8で自前patchが通らなくなったから見なおしてみた
58 : >>57 ありがとう。 そして、すまない。最近やってないから思いっきり間違えました。 遅延スロットにスタックから復帰する命令があった時点でアウトだな。 これでは正しく復帰できるはずがない。 RTEの遅延スロットは基本NOPだね。 で、そうなってなかったというのが1つ目だね。つまり、 「RTE後の遅延スロットにスタックからの復帰命令が入るバグ」だね。 2つ目を見る限り、2001には発見されていたようだ。それが2010になっても継続しているというのは、 mdで使っているLLVMでは遅延スロットの記述が上手くできないということなのかな? そちらの言い分だと 「遅延分岐の遅延スロットにPCを使う命令(MOV.L @(disp,PC),Rx等)が置かれるバグ」 もあるということかな?まあ何でもかんでも遅延スロットに入れるということであればそうなるし、 これを防ぐのはmdの仕様では上手く記述できないというのであれば、ある意味どうしようもない。 遅延スロットの基本は、 A1.遅延分岐命令を遅延分岐でないと仮定して普通に記述。 A2.遅延分岐命令と1つ前の命令を入れ替えられる場合、入れ替える。駄目な場合、NOPを挿入する。 A3.NOPが挿入された場合、分岐等が届くかチェックする必要がある。 あるいは、 B1.遅延分岐命令は分岐命令+NOP命令として、2命令として記述。 B2.遅延分岐命令と1つ前の命令を入れ替えられる場合、入れ替える。 B3.入れ替えた場合、不要になったNOPを削除し、コードサイズを削減することも可能。 この場合、基本的に届くが、dispの再計算は必要。 (ちなみに、B2,B3は省略可能。) なのだが、mdを読んでcc→asの流れだと、無理はあるよね。 上記A,Bの手法はmdとasにまたがっているから。これはgccの限界かもね。 とりあえずmdを記述できるのなら、B1で対策してみてはどうかな。 遅延スロットが全部NOPになっちゃうけど、動くようにはなるよ。 B2,B3はasに入る前にスクリプト処理でやってもいいし、やらなくても動きはするし。 dtの件だが、define_peepholeはいっぱいあるんだが、該当は11525-11536行かな? こちらは、gcc-4.7.1/gcc/config/sh.mdを見ている。4.8の方がよければそちらを見るようにする。 ただ申し訳ないが、こちらはSHにはそれなりに詳しいつもりだが、mdを読めるわけではないので、 なんだこの呪文は???状態だ。 読み方の簡単な説明サイトがあれば紹介してくれると助かる。 あとgccにも詳しくはないんだが、こちらの理解だと上記のように、 「mdを読んでccでLLVM的な物を作成、それを各CPU命令にマッピングしてasでオブジェクトを吐く」 と思っているんだが、そちらの言い方だと違うようだな。 「mdを辞書のように参照しながらccが直接asが食えるファイルを吐く」のか? で、その場合、何らかのログにmdのどこを利用したということが記述され、 それを参照すればどの最適化がどこで行われているかも確認が可能、ということなのかな。 だとすると単純に「通らなくなった」のは、「対策が行われた」可能性もあるが、 ただ単に「テストパターンが網羅的ではなくなって、検出できなくなっただけ」の可能性もあるな。 まあこっちは正直mdを理解するのは時間がかかりそうだから、 駄目な例をC+アセンブラで示してくれると助かる。 完全に興味の範囲で申し訳ないが。 しかしこれを見る限り、gccも結構な確率でバグに遭遇するということだね。 だからそれなりに古い奴のリリースも継続する、ということか。
59 : >>58 ttp://gcc.gnu.org/ml/gcc-patches/2010-02/msg01142.html これだと sh2aの未満のarchの時、割り込み以外の時に遅延分岐直後がnopになってしまうことがある ttp://gcc.gnu.org/ml/gcc-patches/2001-06/msg01351.html ここの最後の方の ! (ior ! (ne (symbol_ref "TARGET_SH3") (const_int 0)) ! (eq_attr "hit_stack" "no"))))) (nil) (nil)]) SH3以上に限定してるのが良くないだけ 4.4以降なら + (and + (eq_attr "hit_stack" "no") + (eq_attr "banked" "no"))))) (nil) (nil)]) gccのデバッグoption(undoc?)-da をつけてコンパイルしてみると 面白いファイルがずらずら出ます テキストファイルで中はmdファイルの記述が基本になっているので読もうと思えば読めるでしょう mdファイルからCソースのファイルにビルド時に変換されてコンパイラ内部に取り込まれます mdについての日本語の解説ページ(古るめ) ttp://www.sra.co.jp/public/sra/product/wingnut/gcc/gcc-j.html#Machine%20Desc dtについてはちょっと時間くださいませ >古い奴のリリースも継続する gcc使ってるプロジェクト系が最新に追いつけないことがあるからみたいだね 例 cygwin 一時、gcc4.3系にどっぷりだった
60 : (define_peephole [(set (match_operand:SI 0 "arith_reg_operand" "=r") (plus:SI (match_dup 0) (const_int -1))) (set (reg:SI T_REG) (eq:SI (match_dup 0) (const_int 0)))] "TARGET_SH2" "dt %0") をpeephole2化して、自分でハマったって落ちだった 悪かった
61 : >>59 現状まだ3割くらいしか理解できてないが、まあそれでも返答してみる。 何を書こうとしているのかは分かるが、この記述なら大丈夫とかを判定できるレベルではない。 間抜けなところは指摘してくれ。ファイルは4.7.1。 ●1つ目 5017 ;; Define additional pop for SH1 and SH2 so it does not get 5018 ;; placed in the delay slot. 5019 (define_insn "*movsi_pop" 5020 [(set (match_operand:SI 0 "register_operand" "=r,x,l") 5021 (match_operand:SI 1 "sh_no_delay_pop_operand" ">,>,>"))] 5022 "(TARGET_SH1 || TARGET_SH2E || TARGET_SH2A) 5023 && ! TARGET_SH3" 5024 "@ 5025 mov.l %1,%0 5026 lds.l %1,%0 5027 lds.l %1,%0" 5028 [(set_attr "type" "load_si,mem_mac,pload") 5029 (set_attr "length" "2,2,2") 5030 (set_attr "in_delay_slot" "no,no,no")]) 遅延スロットには、以下命令を置くな、ということか。 + mov.l %1,%0 + lds.l %1,%0 + lds.l %1,%0" で、結果的にNOPになっちまうのはまあ許容範囲ではないか。 ">,>,>"の意味が分からないんだが、これは何? ただ、SH3でも遅延スロットに MOV.L @(disp.PC),Rxを置くべきではないと思われる。 ここの !TARGET_SH3 は外すべきではないかと。 RTEの遅延スロット(R15変化)、BRAの遅延スロット(PC変化)とかを区別していないのが問題か。 ●2つ目 542 ;; On the SH and SH2, the rte instruction reads the return pc from the stack, 543 ;; and thus we can't put a pop instruction in its delay slot. 544 ;; ??? On the SH3, the rte instruction does not use the stack, so a pop 545 ;; instruction can go in the delay slot. 546 547 ;; Since a normal return (rts) implicitly uses the PR register, 548 ;; we can't allow PR register loads in an rts delay slot. 549 550 (define_delay 551 (eq_attr "type" "return") 552 [(and (eq_attr "in_delay_slot" "yes") 553 (ior (and (eq_attr "interrupt_function" "no") 554 (eq_attr "type" "!pload,prset")) 555 (and (eq_attr "interrupt_function" "yes") 556 (ior 557 (not (match_test "TARGET_SH3")) 558 (eq_attr "hit_stack" "no") 559 (eq_attr "banked" "no"))))) (nil) (nil)]) 4.7.1でもSH3限定は残っているように見える。ただ実際、それでもいい気はする。 ●dt 同一言語(md)で記述できる以上、peepholeでもpeephole2でもきちんと動作するべきだと思うし、 移動したらバグりました、というのも妙な気がするが、それは、 A. dt命令はpeepholeだとOKでpeephole2ではバグります、 ではなくて、 B. dt命令に当たらなくなったのはpeephole2に移動したからであって、相変わらずバグってます、 ということ?
62 : 555 (eq_attr "interrupt_function" "yes") 556 (ior 557 (not (match_test "TARGET_SH3")) 558 (eq_attr "hit_stack" "no") 559 (eq_attr "banked" "no")))) よく見ると壊れた人には理解できないことしてるな ●dt 随分前のことでよく覚えてない おかしなコードを吐いていたような気がしただけかもしれない 置き換えだけじゃdt命令をうまく使えないので追加のパターンを書いてた 悪かった、すまんかった
63 : >>62 いや、別に責めたいわけではない。そういう奴はどのスレにもいるが、 こちらは技術論で話して、こちらの知らない知識を得ようとしているだけだ。 当初は「単なる無知が自分のことを棚に上げてSHの悪口を言いたいだけか?」とも思っていたが、 実際にそちらの出してきた情報からすると、現在は、 かなりの知識があり、実力もあり、自分でも対応出来る人が、思い出を語ったということだと認識している。 実際、mdを読める奴も、読もうという気概がある奴もそんなにはいないので、 それに自己パッチを当てて利用するというのはかなりの手練れだ。普通はやらないし、出来ない。 とりあえず現在のところを纏めると、 ●事実として、gccでは遅延スロットの取り扱いに難があり、 2001年に発見されたバグが、2010になっても再出(or継続)していたりする。 ●dtについてはよく覚えていないので不明。 ということか。ただ、そちらの実力からするとdtも勘違いではなく、バグっていた可能性の方が高いと推測される。 SH2Aで何らかの最適化が行われるようになった結果、そのバグに命中しやすくなったのだろう。 まあ思い出したら教えてくれ。 おそらくgccは遅延スロットの取り扱いが上手くできないんだろう。遅延スロットについては>>58 に示したとおり、 asのプリプロセッサとして実装すれば3日で実装でき、バグる事もないはずだが、 ccのプリプロセッサ?として実装しているから無理があり、デグレードしたりするんだと思う。 スクリプト処理を挿入するのが手っ取り早いが、駄目なら、asで2〜4バイトの可変長仮想命令として BRA/NやBSR/N等をすべて定義し、as内で遅延分岐命令に置換していくというやり方がいいように思う。 ccが吐くのが中間コードになるが、これだとasだけを入れ替えればいいので、gccにも組み込めるだろう。 ただいずれにしてもmd内での遅延スロットの記述が全部不要になるので、作業としては大がかりになるが。 とはいえ、まあ、gccが今更的なバグもそれなりに含んでいる可能性があるということは分かった。 実際にmdファイルは4.7.1→4.8でも大量に書き換えられている。 それがバグ対策か最適化追加かは不明だが、いずれにしてもデグレードの可能性もそれなりに発生しており、 そしてそもそも取り扱いに難がある遅延スロット周りの記述では実際にデグレードすることもある、ということだろう。 その結果、2001年に発見されたバグが2010にも再出するわけだ。 まあ勉強にはなったよ。ありがとう。
64 : shの遅延スロットの処理はちゃんとできてるよ、gccは ttp://gcc.gnu.org/ml/gcc-patches/2010-02/msg01142.html 勢いで作ったんであろう?これが災いしてるだけのような (自前でやる時はこの処理殺してる) 555 (eq_attr "interrupt_function" "yes") 556 (ior 557 (not (match_test "TARGET_SH3")) 558 (eq_attr "hit_stack" "no") 559 (eq_attr "banked" "no")))) ここの処理をいじればいいだけ 合ってそうに見えるけど、割り込み周りの処理書いて、 archに合わせてコンパイルして汗吐かせてみたら、どうなってるのかな って感じ gccのクロス開発環境に興味があるなら crosstool-ng で検索してみたら お手軽?スクリプト、patch集みたいなのが見つかる
65 : >>64 少し理解が進んだ結果、訂正。 やっぱこれ間違っているっぽいな。 542 ;; On the SH and SH2, the rte instruction reads the return pc from the stack, 543 ;; and thus we can't put a pop instruction in its delay slot. 544 ;; ??? On the SH3, the rte instruction does not use the stack, so a pop 545 ;; instruction can go in the delay slot. 546 547 ;; Since a normal return (rts) implicitly uses the PR register, 548 ;; we can't allow PR register loads in an rts delay slot. 549 550 (define_delay 551 (eq_attr "type" "return") 552 [(and (eq_attr "in_delay_slot" "yes") 553 (ior (and (eq_attr "interrupt_function" "no") 554 (eq_attr "type" "!pload,prset")) 555 (and (eq_attr "interrupt_function" "yes") 556 (ior 557 (not (match_test "TARGET_SH3")) 558 (eq_attr "hit_stack" "no") 559 (eq_attr "banked" "no"))))) (nil) (nil)]) 以下勘違いがあれば指摘してくれ。汎用部分はSHに合わせてある。 define_delayはgcc内で定義されている型で、ベクトルで [遅延スロットに置いていい命令 分岐成立時に遅延スロットが無効化される条件 分岐不成立時に遅延スロットが無効化される条件] を並べる。SHの場合は遅延スロットが無効化されることはないので、後ろ2つは常にnilとなる。 問題は先頭の要素で、上記記述だと、 rts命令の時、!ploadか!prsetなら置いていい rte命令の時、TAGET_SH3でないか、hit_stack属性がnoか、banked属性がnoなら置いていい という風に読める。だとすると、TARGET_SH3がついてない場合、 つまりSH1,2,2Aの場合、「何でも置いていい」ということになる。これは駄目だろ。 これでは、スタックからのロードを許可してしまう。 544-545のコメント通りの動きをさせたいなら、557のnotを削除するべきだと思うが、どうか? ただ言っちゃあ悪いが、コメントを見る限り、ploadはPRへのロード、prsetはPRへのコピーだから、 この2つだけ禁止しても駄目だろとは思う。例えば、PC相対ロード命令も禁止すべきだ。 実際には、rts命令の周りでリテラルをロードするような関数を書くことがないから問題ないだけで、 例えば、 int foo(){ return 0x12345678; } とかいう間抜けな関数を作った場合、rtsの遅延スロットにPC相対命令が来ると思われ、バグると見た。 これが抜けているというのは、「分かっている人がすべての状況を考えて記述する」のではなく、 「バグがあったらパッチを当てる」方式で開発が行われているということであり、 これではバグは永遠に収束しない。ちょっと問題があるな。 遅延スロットのモデルは、上記のように [置いていい命令、無効化条件、無効化条件]のセットで記述され、 命令順の入れ替え自体はgccがやってくれるみたいだね。 SHならこれで問題ないから、mdが間違っているのが問題だね。
66 : (define_attr "in_delay_slot" "yes,no" (cond [(eq_attr "type" "cbranch") (const_string "no") (eq_attr "type" "pcload,pcload_si") (const_string "no") (eq_attr "needs_delay_slot" "yes") (const_string "no") (eq_attr "length" "2") (const_string "yes") ] (const_string "no")))
67 : >(eq_attr "type" "pcload,pcload_si") (const_string "no") PC相対ロード命令、ここで判定してる + (and + (eq_attr "hit_stack" "no") + (eq_attr "banked" "no"))))) (nil) (nil)]) mdの中身がどこまで読めてるかは自分でもわからんけどね
68 : >>67 >mdの中身がどこまで読めてるかは自分でもわからんけどね それはこちらも同じ。ただそもそも読める奴もそうはいないので、 間違いがあったら教えてもらいたいとは思うから、相手するぜ。 しかし()の多い糞言語だと言われているのは実感する。 あと、2chだと半角インデントが全部潰れて読みにくいんだが、 これの対策を教えてエロい人。 ●前半 489 (define_attr "in_delay_slot" "yes,no" 490 (cond [(eq_attr "type" "cbranch") (const_string "no") 491 (eq_attr "type" "pcload,pcload_si") (const_string "no") 492 (eq_attr "needs_delay_slot" "yes") (const_string "no") 493 (eq_attr "length" "2") (const_string "yes") 494 ] (const_string "no"))) 538 (define_delay 539 (eq_attr "needs_delay_slot" "yes") 540 [(eq_attr "in_delay_slot" "yes") (nil) (nil)]) mdファイルの動きは知らないが、単純に上から読んでいくとすると辻褄が合わないから、 スクリプト言語のように変数は前状態が残った上で次のinsnを読んでいくと見た。 だとすると、489-494、は、以下のように読める。 bool in_delay_slot = false; if ( !条件分岐命令 && !(PCロード命令 || PCロード命令.L) && (needs_delay_slot || length==2 || true)) in_delay_slot = true; 一方、538-540は int delay[3] = {false. false, false}; if (needs_delay_slot) delay[0] = in_delay_slot; で、delay[0]に指定されている命令は遅延スロットに置いていいから、結論、 条件分岐命令は、置かれない。 PCロード命令は、置かれない。 needs_delay_slot属性がついていたら、置いてもいい。 長さ2の命令なら、置いてもいい。 長さ2の命令でなくても、置いていい。 さてここで間違いは、2点。 SH2Aは32bit命令を遅延スロットに置くことが出来ないから、needs_delay_slotがlengthより優先されているのは間違い。 これだと32bit命令が遅延スロットに置かれてしまいそうだ。 次に、493行は意味をなしていない。length==2に限定しているのであれば、デフォルトの値はnoであるべきであって、 (eq_attr "length" "2") (const_string "no") とするべき。つか、ボロボロだな。ただまあ、他の部分でパッチ当てが行われているのかもしれんが。 SH2Aの改悪点に見えたのはここか?SH1,2は32bit命令を持っていないから、このバグにはヒットしない。 記述は美しくないが、PC相対命令が遅延スロットに置かれないようになっている事は理解した。 (>>65 の後半部の指摘は間違いであることを認める。) ただ、in_delay_slotで全体記述をするのか、命令ごとの記述で網羅するのかは、どちらかに統一しないと読みにくい。 まあパッチ当てで作ってきているんだろうし、有志なんだから致し方ないと言えばそうだが。 ●後半 ああ、そんな感じだと思う。 rtsの後の遅延スロットにスタック復帰を入れたいなら、それでいいと思う。
69 : in_delay_slot 中身を or で読んでるみたいだけど and で読むんじゃねえか (cond [ ] (const_string "no")) ×長さ2の命令でなくても、置いていい。 こっち系の流れは珍しいな mdの中身をそれなりに読もっうってのはもっと珍しい 半角SPは らしい、htmlでは
70 : &nsp; 半角だから消えてしもうた
71 : 流れって言っても2人でやり合っているだけではあるがな。 まあこの話題についてこれる奴もそうそういないというのもあるが。 半角、 だな。 纏めて変形して書いたから分かりにくかったか。英語版も確認したが、この部分は同じだった。 (cond [test1 value1 ...] default) この式の第一オペランドはあるベクトルであり、偶数個の式をもち、test 式と value 式の対からなる。cond 式の値は最初の真である test 式に対応する値のものである。真となる test 式がない場合は、cond 式の値は default 式の値である。 つまり、上から評価だから、より正確には、 489 bool in_delay_slot; 490 if (cbranch) in_delay_slot = true; 491 else if (pcload || pcload_si) in_delay_slot = true; 492 else if (needs_delay_slot) in_delay_slot = true; 493 else { 493a if (length==2) in_delay_slot = true; 493b else in_delay_slot = true; 494 } else in_delay_slot = false; と読んだんだが、「最初の真」というのが微妙で、length!=2だと真にならないから、493bは関係ないのかも。 そうでないと記述に一貫性がなくなるし。 (490-492のelse節の存在がないのと整合性が取れない) だとすると、2つ指摘した内の下側、デフォルト値についてはバグではなくなるが、紛らわしいから止めろだな。 ただこれでも needs_delay_slot が優先されていて、この時点では命令サイズを考慮していないのはバグだろ。 ここの記述だけでは32bit命令を遅延スロットに配置できてしまう。
72 : くっ、こっちも、半角消えてしまった。&nbsp;だな しかし、これ、明らかに開発の仕方間違っているよな。 Cコンパイラのバグをレポートしてくるような奴は間違いなくCが読めるんだから、 mdもC風に書ければ、バグ取りも捗るだろうに、なんでLispなんだよ。 EmacsがLispなのはまあ信者が書いたとしても、 gccがLisp記述を必要とするのは結果的に開発速度を落としているだけだよな。
73 : すまん、else節の対応がおかしいな。 まあ分かる範囲だと思うが、ここで誤解を招いてもくだらんので、修正版を投下しておく。 489,494 bool in_delay_slot = false; 490 if (cbranch) in_delay_slot = true; 491 else if (pcload || pcload_si) in_delay_slot = true; 492 else if (needs_delay_slot) in_delay_slot = true; 493 else { 493a if (length==2) in_delay_slot = true; 493b else in_delay_slot = true; 494 } と読んだ。493bについては多分読み間違いで、これは不要なんだろう。だから、正しくは、 489 bool in_delay_slot; 490 if (cbranch) in_delay_slot = true; 491 else if (pcload || pcload_si) in_delay_slot = true; 492 else if (needs_delay_slot) in_delay_slot = true; 493 else if (length==2) in_delay_slot = true; 494 else in_delay_slot = false; となるのかな。
74 : 素人的な感想 lisp風な書き方は中間的な表現に適している lisp->cの変換処理は今や普通になっている mdの中は部分にcで書かれてるところもある 机上より実践的なんで、俺 sh、h8300系は初期の頃からあるので、ボロボロになってる可能性はある (建築でいう建て増し状態?、ハマるコードを吐くってわけじゃないから) 比較的新しめのv850のmdはすっきりしてるよ v850の命令体型があってたのかもしれんけど intel80系の命令体型のrl78をあんな方法でレジスタ増やして gccに入れるとは思わんかったな
75 : >>74 >lisp風な書き方は中間的な表現に適している これ本当に自分の頭で考えた意見か? 信者がそういうことにしたいのを受け売りしているだけではないか? 本当にそう思うなら、どこをどう捉えたらそう思えるのか教えてくれ。 こちらの解釈が正しければ、cond節の後半部分、 490 (cond [(略) (const_string "no") 491 (略) (const_string "no") 492 (略) (const_string "no") 493 (略) (const_string "yes") 494 ] (略))) の略していない部分には当たることはない。 つまり、何を書いても良いし、論理反転を書いても同じ動作をする。 ただし、何か書かなければならない。 こういうところだけでも十分に糞言語だと思うがな。 絶対に当たらない記述なんて、記述させるべきではない。単なるバグの温床にしかならない。 この言語は廃れて当然だ。まあLispがこれと同一かどうかは知らんがね。 >mdの中は部分にcで書かれてるところもある これは””で囲まれているから生きているかどうか不明だったが、 その言い方だと埋め込みCを出来るようにしたということだな。 つーか、最初からC風に書くべきだよ。Cコンパイラなんだから。 当時も老害がいたということだろうがね。 V850とRL78については行数が少ないのは見たが、 includeが使われているので実際のところは不明だな。 ただ、最適化記述もこの中に含んでいるので、 アホコードを出せばいいのであればmdはすっきり記述出来るから、詳しく見ないと何ともいいようがないが、 実際のところ、V850とRL78は仕様を知らないので、mdを詳しく見る気はない。申し訳ない。
76 : >>75 (define_insn "divsi3_i4_int" ;<jump,jsr系 略 &nsp;&nsp;[(set_attr "type" "sfunc") &nsp;&nsp;&nsp;(set_attr "needs_delay_slot" "yes")]) (define_insn "branch_true";<branch系 略 &nsp;&nsp;[(set_attr "type" "cbranch")]) (define_insn "movsi_i"<転送系 略 &nsp;&nsp;[(set_attr "type" "pcload_si,move,movi8,mt_group,load_si,mac_gp,prget,arith,store,mac_mem,pstore,gp_mac,prset,mem_mac,pload,pcload_si") &nsp;&nsp;&nsp;(set_attr "length" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*")]) 読み間違ってた?、俺 cに変換されたコード覗くと単純な変換でない、in_delay_slot,needs_delay_slot ここまで追いかけたことは、今までなかったな lispは個人的には好きな方じゃないけど gccいじくり回す分にはmdをlispと意識したことはなかったな
77 : 489 (define_attr "in_delay_slot" "yes,no" 490 (cond [(eq_attr "type" "cbranch") (const_string "no") 491 (eq_attr "type" "pcload,pcload_si") (const_string "no") 492 (eq_attr "needs_delay_slot" "yes") (const_string "no") 493 (eq_attr "length" "2") (const_string "yes") 494 ] (const_string "no"))) in_delay_slot = no; if (!cbranch) if (!pcload) if (!pcload_si) if (!needs_delay_slot) if (length == 2) in_delay_slot = yes;
78 : この流れに参加しない奴は純正使ってるんだろう、俺もだが 仕事でやってたら、その状況を見てもgccは無理
79 : いちど、gcc使えっていう仕事がきて使ったが、RAMが宣言した順番に並ばなくてくずおれた覚えしかないな。
80 : >>77 こちらにずいぶん間違いがあったようだ。その解釈でいいと思う。 もう一度おさらいする。define_attrの内部のcondについては、 (cond [test1 value1 ...] default) この式の第一オペランドはあるベクトルであり、偶数個の式をもち、test 式と value 式の対からなる。cond 式の値は最初の真である test 式に対応する値のものである。真となる test 式がない場合は、cond 式の値は default 式の値である。 だから、上から順番に評価し、test1式が当たれば"value1"になる。 (test1式がtrueになった時点で値は"true"になる、と勘違いしていた。 その他の勘違いもあり、>>68 ,71-73は間違い。 他の部分で後ろの値はデフォルト値だというのがあった、 つまり常にif then にはelse節が必要みたいなのがあったと思ったから、それとも混同した。) ということは、 489 bool in_delay_slot; 490 if (cbranch) in_delay_slot = false; 491 else if (pcload || pcload_si) in_delay_slot = false; 492 else if (needs_delay_slot) in_delay_slot = false; 493 else if (length==2) in_delay_slot = true; 494 else in_delay_slot = false; こうなる。これで実質>>77 と同じ。日本語にすると、 cbranchは、置けない。←無条件も駄目なはずだが、他で定義されている? pcload, pcload_siは、置けない。 needs_delay_slotがyesだったら、置けない。←これがおかしい。 上記に該当せず、length==2なら、置ける。 これだと、32bit命令が遅延スロットに置かれることはないが、 遅延スロットは常に空になってしまいそうだ。 needs_delay_slotの取り扱いだが、 538 (define_delay 539 (eq_attr "needs_delay_slot" "yes") 540 [(eq_attr "in_delay_slot" "yes") (nil) (nil)]) を見る限り、needs_delay_slot=="yes"でない限り、in_delay_slotは評価されない。 だから、needs_delay_slotの取り扱いが492行と539-540行で矛盾している。 修正するとしたら、492行を削除か、影響を最小限にとどめたいなら、 (and (eq_attr "needs_delay_slot" "yes") (eq_attr "length" "2")) (const_string "yes") だろう。 つまり、>>77 の解釈は正しくて、if (!needs_delay_slot) なんだが、 needs_delay_slot属性はその名の通り遅延スロットを必要とする場合に"yes"になるようなので、 遅延スロットを必要としている場合、遅延スロットに置いていい命令はない、となり、矛盾する。 ここは if (needs_delay_slot && length==2)となるべきで、上記修正記述がそれ。 ただこれだと「遅延スロットは常に空」になるはず。多分そうではないのだろうから、 おそらくは他でパッチ当てがなされていて、そこに該当するのだろう。 つまり、489-494と538-540はこのままでは単なる無効記述であって、害を及ぼしているわけではないのかも。 (define_delayは何ヶ所でも宣言出来るので、他でパッチ当ては出来る。 ただし、複数に該当してはいけないという糞仕様。 このため、単純に上記修正記述を採用すると、 パッチ当てが既になされていた場合、そこで多重ヒットし、gccが落ちるはず。マジ糞仕様。)
81 : >>76 needs_delay_slotの取り扱いがこれまたひどいんだが、 これはgccの仕様が糞だからであって、mdが悪いわけではないだろう。 TEXT→RTLで遅延スロットを取り扱おうとしているから、 最適化記述にBRAとかを持ってくるたびに呪文のように同じ needs_delay_slot の記述を並べないといけない。 asのプリプロセッサとして実装すれば1命令につき1箇所で済むのだが。まあここら辺はどうしようもない。 ではきっちり遅延スロットの記述が出来ているかというと、 54 ;; %# -- output a nop if there is nothing to put in the delay slot ということだから、%# と (set_attr "needs_delay_slot" "yes")は必ず対になって現れるべきだが、 そうなっていない箇所が数ヶ所ある。種類は3種類で、 1780行、blink命令…仕様を知らないので不明、SH5だからどうでもいい。 define_insn_and_split系…そもそも機械語記述がないので%#をつけようがないからしょうがない? 7913行、bra命令…明らかに抜けている。←バグだと思われる。 これに命中した場合は、braの遅延スロットをnopで埋めてくれない、ということになる。 さて、現状でのこちらの主張および間違い等を整理しておく。バージョンは4.7.1(最新リリース)。 ○ SH3未満でRTE命令の遅延スロットにスタック復帰を入れてしまうバグがある。←合意した。 ○ PC相対命令が遅延スロットに置かれることはない。←他で対策がなされていた。 ○ 32bit命令が遅延スロットに置かれることはない。←こちらの勘違い。 ○ mdは不要な記述を書かせる言語ではない。←勘違いでした。 現在の主張: ? 492行はバグである。ただしヒットしない。 ? 489-494、538-540は無効記述である。機能しない。悪さもしない。 ? 7913行はバグである。ヒットすると、braの遅延スロットに何も命令が無いことがあり得る。 ? 無条件分岐が遅延スロットに置かれないようにどこかで対策されているか?当たるとしたらSH1のみだが。 >>79 ローカルか? SHの場合、MOV.x (disp,Rm),R0があって、これの届く範囲がB,W,Lによって異なるから、 スタック上に置かれるローカルは最適化がなされればR15に近い順にchar, short, intとなる。宣言順ではなく。 ただし、gccで出来ているかどうかは知らない。
82 : もう純正買うかアセンブラでもやれば?
83 : (set_attr "needs_delay_slot" "yes") needs_delay_slotの属性がyes (1) in_delay_slot = no; if (type!=cbranch) if (type!=pcload) if (type!=pcload_si) if (needs_delay_slot!=yes) if (length == 2) in_delay_slot = yes; >>77 の書き方が間違ってた
84 : すいません、アセンブラの勉強不足なんですが、 RL78の純正コンパイラ、実行速度優先のオプションで、 unsigned char x[10]; ...... P1 = *x++; というコードの最後の行が MOVW AX,[HL+0EH] INCW AX MOVW [HL+0EH],AX DECW AX MOVW DE,AX MOV A,[DE] MOV P1,A になるんですが、アセンブラの最初の4行が足して引いてで、どうしても無駄に見えるんですが、 こんなもんでしょうか。
85 : あぁ、すいません、理解しました。バカでした私
86 : >>83 より原文を尊重した書き方だとそうなるが、意味は同じでは。 問題は、 needs_delay_slot == "yes" の時は必ず in_dely_slot = "no" となってしまうことであり、 これでは540がyes側に活性化されることはない。 538 bool (define_delay 539 (eq_attr "needs_delay_slot" "yes") 540 [(eq_attr "in_delay_slot" "yes") (nil) (nil)]) ただ、needs_delay_slotが遅延分岐命令について付加されるのであれば、これにより>>81 の 「無条件分岐が遅延スロットに置かれないように」していることになるが、これだと、 SH2Aで追加されたJSR/N, RTS/N, RTS/V等の 「遅延スロット無し無条件分岐命令」が遅延スロットに入れられることを防げない。 SH2A以前では無条件分岐命令=遅延スロット付きであったため、 cbranchとneeds_delay_slotで対応出来ていたが、SH2Aには記述が不足している。 だから、>>81 は、 Q 無条件分岐が遅延スロットに置かれないようにどこかで対策されているか? ○ 遅延スロット付き無条件分岐は対策されており、置かれない。 ? 遅延スロット無し無条件分岐については不明。これはSH2Aのみ。 となる。本来なら needs_delay_slot ではなく ncbranch_with_delay_slot と ncbranch_without_delay_slot 属性を定義し、これで対応すべきだ。 ただ現実的にはSH2で遅延スロット無し条件分岐命令が追加されているので、 ここに命中させるCコードを書くのは多分不可能だろう。 だから、問題ないといえば問題ないし、問題があれば修正する方式の開発では放置だな。
87 : ちょっと言い方が曖昧だったので追記する。 mdの走査がどのように行われるのか不明なので、ややあやふやになっている。 こちらは、スクリプト言語同様、前の結果が残っている状態で次を読み込んで走査すると仮定している。 この場合、構造としては、 A.前の命令の情報が残った状態での記述。 B.needs_delay_slot情報の更新。 C.今の命令の情報での記述。 の順に記述されなければならない。 見たところ、489-494,538-540はAの部分に記述されている (needs_delay_slotは「前」の命令が遅延スロットを必要としているかどうかを示す)ようなので、 492行は不要だという認識。 これがCの部分に記述されている (needs_delay_slotは「今」の命令が遅延スロットを必要としているかどうかを示す)のであれば、 >>86 のように、「遅延スロット付き命令が遅延スロットに置かれないようにする」効果を持つ。 この場合は、492は必要であり、バグではない。 このmdの走査方法が不明なんだが、知っている人いないか?
88 : そんな上から目線の奴に答える必要はないね
89 : ここをどう読むかでしょう (define_insn "*return_i" (define_insn "calli" (dbr_sequence_length () == 0) SH2Aのときに関数が味噌? 机上だとハマりまくるほうだから、コンパイラの吐く汗見ながらやるなあ、俺は
90 : >>88 おまえ明日から会社こなくていいから
91 : >>89 こちらは全時間を思考に投入出来るという意味で机上派だが、 これ以上の深入りをする気なら-daから切り崩す方が早いと判断、クロス環境の構築を始めてる。 どうにも情報がなさ過ぎるのは、おそらく-daで一目瞭然なんだろうと期待している。 無駄な行き違いはあらかじめ避けておきたいので、 そちらの環境を教えてくれれば合わせるように努力する。 今の所、Cygwin上に4.7.1のsh-elf向けクロス環境を構築する予定。 gccのクロス環境は初めてなので、はまりどころには確実にはまるだろうから、助言頼む。 今それ以前のnative環境構築のstage3のjava(JNI)で引っかかっている。 出来れば対策をしようと試みているが、javaの知識はないからググル事くらいしか出来ない。 どうせ要らないしstage3だから無視するか、VM上のLinuxでやり直すかとも考えている。 ちょっとすぐ下のTRAPAが目に入ったので訂正。忘れてました。 × SH2A以前はすべての無条件分岐が遅延分岐 ○ 上記は間違い。SH1もTRAPAを持っており、この命令は無条件分岐で遅延スロット無し。 http://www.sra.co.jp/public/sra/product/wingnut/gcc/gcc-j.html#RTL RTL は、Lisp 言語のリストにヒントを得たものである。 http://www.sra.co.jp/public/sra/product/wingnut/gcc/gcc-j.html#Patterns define_insn は一つの RTL 式で、(ry 3. 条件。これは文字列であり、insn 本体がパターンにマッチするかどうかを 最終的に決定するための条件を C 言語の式で表したものである。 どうやら埋め込めるわけではなく、この部分はCで書かなければならないようだ。 なんで混ぜるかね、、、。少なくともどっちかに統一しとけよな、、、。
92 : >>91 このへんから? ttp://sourceforge.jp/projects/freshmeat_crosstool-ng/ mlはここ http://www.sourceware.org/ml/crossgcc/ cygwinでsh-elfのビルドやると地獄見るかもね cとc++に絞ったほうが 前はbinutils,newlib,gccでビルドできてたけど、今は...
93 : >>89 引き続き100%机上だが、 9219 (define_insn "*return_i" 9220 [(return)] 9221 "TARGET_SH1 && ! (TARGET_SHCOMPACT 9222 && (crtl->args.info.call_cookie 9223 & CALL_COOKIE_RET_TRAMP (1))) 9224 && reload_completed 9225 && lookup_attribute (\"trap_exit\", 9226 DECL_ATTRIBUTES (current_function_decl)) == NULL_TREE" 9227 "* 9228 { 9229 if (TARGET_SH2A && (dbr_sequence_length () == 0) 9230 && !current_function_interrupt) 9231 return \"rts/n\"; 9232 else 9233 return \"%@ %#\"; 9234 }" 9235 [(set_attr "type" "return") 9236 (set_attr "needs_delay_slot" "yes")]) DBR_OUTPUT_SEQEND(file) 一個の C の文。全てのスロットの埋め草命令が出力された後に実行すべき文である。必要なら dbr_sequence_length を呼び出して、あるシーケンスで埋められるスロット数(現在、シーケンスを出力中でないならゼロになる)を決定し、NOP命令を幾つ出力するかを決める。 9229-9233行は単純に、SH2Aの時に遅延スロットを埋められる命令が無ければrts/nを、 あればrtsを出力するように読める。 ただ、どっちになったとしてもneeds_delay_slot属性がyesになるのは奇妙。 これは結局、needs_delay_slot属性の本当の意味と、取り扱いに依存する。 名前通りの使い方をしているのならバグ(>>87 前者)で、 そうでない(>>87 後者)ならこれで良いが、結果的にバグの温床になっている気はする。 ちなみにTRAPAにはneeds_delay_slot属性はついていないから、 後者の使い方ならバグの可能性がある。 (TRAPAが遅延スロットに置かれることを回避する記述がどこかに必要。) ただし、TRAPAをC記述で出現させることは多分不可能なので、命中しない。
94 : 7316 (define_insn "calli" 7317 [(call (mem:SI (match_operand:SI 0 "arith_reg_operand" "r")) 7318 (match_operand 1 "" "")) 7319 (use (reg:PSI FPSCR_REG)) 7320 (clobber (reg:SI PR_REG))] 7321 "TARGET_SH1" 7322 "* 7323 { 7324 if (TARGET_SH2A && (dbr_sequence_length () == 0)) 7325 return \"jsr/n\\t@%0\"; 7326 else 7327 return \"jsr\\t@%0%#\"; 7328 }" 7329 7330 [(set_attr "type" "call") 7331 (set (attr "fp_mode") 7332 (if_then_else (eq_attr "fpu_single" "yes") 7333 (const_string "single") (const_string "double"))) 7334 (set_attr "needs_delay_slot" "yes") 7335 (set_attr "fp_set" "unknown")]) calliの7316-7335行も上記と同じ。 ただfp_modeについて記述があるんだが、これはよく分からない。 callの度に精度が切り替わる仕様はないから、 サブルーチンでのデフォルト精度が統一されているかどうかを管理しようとしているんだと思うが、 これってgcc側のサポートがないとmd記述だけではそもそも論として不可能な気がする。 まあとりあえず無視しますが。
95 : こっちは読んだ? (define_delay (and (eq_attr "type" "cbranch") (match_test "TARGET_SH2")) ;; SH2e has a hardware bug that pretty much prohibits the use of ;; annuled delay slots. [(eq_attr "cond_delay_slot" "yes") (and (eq_attr "cond_delay_slot" "yes") (not (eq_attr "cpu" "sh2e"))) (nil)])
96 : >>95 ああそれはチラ見していたが、 SH2Eがバグっているというのは知らないから、無視していた。 というか、どれだ?見たところ、FDIVしかない。 http://japan.renesas.com/products/mpumcu/superh/sh7050/sh7055/Technical_Update.jsp 489 (define_attr "in_delay_slot" "yes,no" 490 (cond [(eq_attr "type" "cbranch") (const_string "no") 491 (eq_attr "type" "pcload,pcload_si") (const_string "no") 492 (eq_attr "needs_delay_slot" "yes") (const_string "no") 493 (eq_attr "length" "2") (const_string "yes") 494 ] (const_string "no"))) 495 496 (define_attr "cond_delay_slot" "yes,no" 497 (cond [(eq_attr "in_delay_slot" "yes") (const_string "yes") 498 ] (const_string "no"))) 576 (define_delay 577 (and (eq_attr "type" "cbranch") 578 (match_test "TARGET_SH2")) 579 ;; SH2e has a hardware bug that pretty much prohibits the use of 580 ;; annuled delay slots. 581 [(eq_attr "cond_delay_slot" "yes") (and (eq_attr "cond_delay_slot" "yes") 582 (not (eq_attr "cpu" "sh2e"))) 582 (nil)]) 7015 ;; This one is used to preemt an insn from beyond the bra / braf / jmp 7016 ;; being pulled into the delay slot of a condbranch that has been made to 7017 ;; jump around the unconditional jump because it was out of range. 7018 (define_insn "stuff_delay_slot" 7019 [(set (pc) 7020 (unspec [(match_operand:SI 0 "const_int_operand" "") (pc) 7021 (match_operand:SI 1 "const_int_operand" "")] UNSPEC_BBR))] 7022 "TARGET_SH1" 7023 "" 7024 [(set_attr "length" "0") 7025 (set_attr "cond_delay_slot" "yes")]) インデントキープしようと思ったら行の長さがオーバーして駄目だった。
97 : 今の所、489-494は現在検討中の記述で、 496-498は cond_delay_slot = in_delay_slot となり、 577 if (type=="cbranch" && TARGET_SH2) { 581 delay[0] = cond_delay_slot; // 遅延スロットに置いていい場合、true 581 delay[1] = cond_delay_slot && !(cpu=="sh2e"); // 分岐成立時にキャンセルされる場合、true 581 } だから、この記述だと、SH2E「以外」のCPUでは、分岐成立時に遅延スロットはキャンセルされる、と読める。 少なくともSH2では遅延スロットがキャンセルされることはないから、完全にバグ。 コメント通り、「SH2Eに限定」する気であれば、notが要らない。 ただし、define_delayは複数ヒットを許可されていないので、TARGET_SH2"E"を定義してこれを回避しないと駄目。 そもそもSH2Eのバグは知らないので、無いのであれば、記述が丸ごと不要。 7015-7025行については、コメントは理解出来るんだが、記述はさっぱり分からない。 ただ、RTEのところでもnotが要らないように見えた。このnotの扱い方が、こちらの考えているものと違うのかな? RTEについては、そちらもnotが要らないという見解、かつ検証もなされているということでいいんだよね? とはいえ、SH2だと遅延スロット付き条件分岐は出にくいとは思うので、そんなに当たらないのかも。 まあ、なかなか当たらない地雷は「バグが出たら直す」的開発では永遠に残ってしまうものだ。 これもそうなんだろう。 ちなみに、もっとひどいのを見つけた。以下引用。 ---- http://hp.vector.co.jp/authors/VA000177/html/SH2A.html CQサイトにあるCygwin gcc(SH2A)でビルドする際の注意。 推奨: CFLAGSに -m2a-nofpu を指定すること。 そうしないと、割り込み発生後フォアグラウンド側のプロセスが死ぬ。 理由は全くもって不明。
98 : 素のgccは割り込み周りは怪しいからね,shの場合 個人的にはありだと思ってる ハマった人は自力で解決するか、gccのbugzillaにいくんだね ここに早々親切な人がいるとは思わないほうが...
99 : やれば、これくらいの汗吐かせられるかも -m2a-nofpu 0000 47F1 movml.l r7,@-r15 0002 E100 mov #0,r1 0004 4F02 sts.l mach,@-r15 0006 4F12 sts.l macl,@-r15 0008 4F22 sts.l pr,@-r15 000a 7FF0 add #-16,r15 000c 2F10 mov.b r1,@r15 000e D105 mov.l .L2,r1 0010 410B jsr @r1 0012 64F3 mov r15,r4 0014 7F10 add #16,r15 0016 4F26 lds.l @r15+,pr 0018 4F16 lds.l @r15+,macl 001a 4F06 lds.l @r15+,mach 001c 47F5 movml.l @r15+,r7 001e 002B rte 0020 0009 nop 動くかしたわけじゃないから
100read 1read
1read 100read TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
トランジスタ技術について語るスレ Part5 (743)
【学部】電気工学系学生の就職【研究】 (264)
電子工作入門者・初心者の集うスレ 46 (884)
鬱でも必死で会社に言ってる人【電電−8】 (245)
【部品屋】電子パーツ屋総合スレ 8店目 (388)
自営業 悩みごと相談室 36 (760)
--log9.info------------------
愛媛の音ゲー事情21 (756)
【賞与廃止で】アドアーズpart28【減収増益】 (841)
広島のゲーセン事情27 (453)
ガンダムトライエイジ 三沢光晴専用機 (472)
名古屋(東海地方)スレpart36 (354)
札幌ゲーセン事情 PART18 (688)
九州のゲーセン楽市楽座005 (703)
富山の音ゲー事情 V9 (705)
栃木の音ゲー事情22 (945)
宮城のQMA事情 その6 (392)
札幌音ゲー諸事情34 (642)
【常連は】アドアーズ狸小路 part1【ニートばかり】 (810)
岡山音ゲスレ オリコ専用スレ (950)
関西・近畿地方のQMA事情44 (565)
錦糸町 パトリオットM part5 (890)
滋賀のゲーセン事情 (770)
--log55.com------------------
World End Fantasy Part11
【ECO】エミルクロニクルオンライン3828【太腿】
最近のMMOに絶望した人が次の行き先を思案するスレ533
メイプルストーリー2 Part9
メイプルストーリー2 Part10
けものフレンズ2 VS ケムリクサ
昔のアニメにはよくあったが今のアニメでなくなったこと
見るたびに腹が立つ嫌いな設定・展開