GCCについて part8at TECH
GCCについて part8 - 暇つぶし2ch708:デフォルトの名無しさん
09/02/07 12:22:48
お疲れ。
double func(double a, double b){double c; return (a+b);}
でreturn (a+b);
とc=a+b;return c;の違いは何?

709:デフォルトの名無しさん
09/02/07 13:12:02
>>708
浮動小数点な数値のプロセッサ内での保持方法の差だっけ。
どっかのブログでSunの科学計算の手引きみたいなページが紹介されてた。


710:デフォルトの名無しさん
09/02/07 13:30:28
参考にさせてもらいます。
> gcc
URLリンク(kansai2channeler.hp.infoseek.co.jp)
を、これで修正したら動いた理由が知りたいのですが。
スレリンク(tech板:350番)

711:デフォルトの名無しさん
09/02/07 14:17:01
どうやら、fld dword ptr 抜けが原因らしいです。
gcc version 3.4.4 (gcc Win/on Win2000)
では、戻り値がdoubleの関数は、return 文の所で
演算していはいけない。必ずglobalかlocalの変数に結果を入れてから、
return 変数名;
としないと、いけないようだ。

712:デフォルトの名無しさん
09/02/07 15:03:28
>gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
無問題。

713:デフォルトの名無しさん
09/02/07 15:13:02
gcc に-O3 のオプション付きでなら良いみたい。

714:712
09/02/07 15:14:01
つけてもつけなくても8228.cで問題が出ない。

715:713
09/02/07 15:29:08
そうですか、こちらのPCはLavie C LC60H 確か32bitです。
exeか、逆アセンブル結果でも、掲示板に張って送ります?
-O3 無し
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h]
0040105C pop ebp
0040105D ret


716:712
09/02/07 15:53:53
それの何が問題だと言いたいのか判らない。
--8228.s:total()
_total:
pushl %ebp
movl %esp, %ebp
fldl 16(%ebp)
faddl 24(%ebp)
faddl 32(%ebp)
popl %ebp
ret
--
確かに-O3つけたらインライン展開されるから関数自体見えなくはなるけど。

717:713
09/02/07 16:01:34
fadd した結果が消えて、return値にセットされているか?
fadd の次はpopなので、結果の値が消えるのでは。

718:デフォルトの名無しさん
09/02/07 16:03:10
はぁ? 何を寝ぼけたことを。

719:デフォルトの名無しさん
09/02/07 16:04:29
・faddした結果はどこに格納されるか
・pop ebpは何をどこに戻すか
・doubleの戻り値はどこに格納されるか

少し勉強してこい。

720:713
09/02/07 16:28:54
すみません。
それで、問題はfunction側に有るのでは無くて、call側です。
戻ってきた直後で、ストアじゃなくてロードすると、以前の内容が
レジスタから消えます。

-O3 無し
00401400 call 00401050h
00401405 fld qword ptr [ebp-10h]

721:デフォルトの名無しさん
09/02/07 16:35:22
fldはプッシュなんだよ

722:デフォルトの名無しさん
09/02/07 16:59:47
>>720
数多の天才が気付かずに使っているコンパイラのバグを、浅学無能非才のあんたに見つけられるというのか?
思慮が足りないにも程があるぞ。

723:デフォルトの名無しさん
09/02/07 17:07:29
すみません、exe おいておきます。どうぞ参考に。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

cygwin1.dll version 1005.25.0.0 (0.156 2008-06-12 19:34)


724:デフォルトの名無しさん
09/02/07 17:18:27
Cのソースは?

725:723
09/02/07 17:23:24
どぞ
URLリンク(kansai2channeler.hp.infoseek.co.jp)

726:デフォルトの名無しさん
09/02/07 17:47:35
で、結局何がしたいんだ?
デバッグだったら一人で勝手にやってろよ。
勿論、その場合はスレ違いだ。

727:デフォルトの名無しさん
09/02/07 17:51:49
gccに-O3オプションは必須か?

728:デフォルトの名無しさん
09/02/07 17:53:05
>>727
質問の意図は? >723の言っていることなら只の世迷言だから無視しておけ。

729:デフォルトの名無しさん
09/02/07 17:57:19
>>714

730:711
09/02/07 19:05:31
どぞ

731:デフォルトの名無しさん
09/02/07 19:47:18
ソートでスタック喰いつぶしるような?

732:711
09/02/07 19:57:07
戻り値を一旦変数に代入すれば大丈夫?

354 :325 :2009/02/07(土) 04:54:11
>>326
double a;

do{
while((a=total(st[pl])) > x) pl++;
while((a=total(st[pr])) < x) pr--;

355 :325 :2009/02/07(土) 05:01:10
>>326
double a;

do{
pc = (pl + pr) / 2;
if((a=total(st[pc])) == key)
return pc;
else if((a=total(st[pc])) > key)

733:デフォルトの名無しさん
09/02/07 19:58:54
浮動小数点演算ではまった話
URLリンク(0xcc.net)

これかな…?

734:デフォルトの名無しさん
09/02/07 20:08:49
いいえ。8828.cがまともに動かないのは自前で実装したクイックソートが腐っている所為。

735:デフォルトの名無しさん
09/02/07 20:40:06
total関数をコメント側のコードにすると動く。

736:デフォルトの名無しさん
09/02/07 21:19:06
結果がスタック渡しなのに、結果をスタックに書き込んでないからみたい。

737:デフォルトの名無しさん
09/02/07 21:47:30
>結果がスタック渡しなのに
いいえ、FPUレジスタ渡しです。

738:デフォルトの名無しさん
09/02/07 21:50:46
でも、>>720のコードになってる?

739:デフォルトの名無しさん
09/02/07 22:30:25
だから、FPUの勉強してこい。FPUレジスタはFPU内部(と言っても今や単にCPU内部だが)で
スタック上に利用するようになっている。だからfldを繰り返したら複数のレジスタに順に格納されるわけ。

740:713
09/02/07 22:36:24
>>733 参考にしました。結局、gcc 3.4.4はdoubleを使うと「ときどき」桁落ちする。
double total(){return (st.ascore + st.bscore + st.cscore);}
=7>=====
00401050 push ebp
00401051 mov ebp, esp
00401053 fld qword ptr [ebp+10h]
00401056 fadd qword ptr [ebp+18h]
00401059 fadd qword ptr [ebp+20h] ;;結果はFPUスタックに置く(80bit値)
0040105C pop ebp
0040105D ret


if(st[pc].number == key)
00401153 call 00401050h
00401158 fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115B fxch st(1)
0040115D fucompp ;;数値比較(80bit値 : 64bit値)


double a;
if((a=st[pc].number) == key)
00401153 call 00401050h
00401158 fstp qword ptr [ebp-18h] ;;メモリ内容をFPUスタックから出す(sp=sp-1)(64bit値)
0040115B fld qword ptr [ebp-18h] ;;メモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
0040115E fld qword ptr [ebp+10h] ;;keyメモリ内容をFPUスタックに入れる(sp=sp+1)(64bit値)
00401161 fxch st(1)
00401163 fucompp ;;数値比較(64bit値 : 64bit値)


741:デフォルトの名無しさん
09/02/07 23:22:43
return (st.ascore + st.bscore + st.cscore);

double a = (st.ascore + st.bscore + st.cscore);
return a;
では、吐く汗のコードに違いがあるのですが、何が違うのでしょうか?

742:デフォルトの名無しさん
09/02/07 23:30:28
return (st.ascore + st.bscore + st.cscore);
結果の戻り値の数値が80bit表現

double a = (st.ascore + st.bscore + st.cscore);
return a;
結果の戻り値の数値が64bit表現

743:デフォルトの名無しさん
09/02/07 23:34:10
なるほど。なんとなく、わかりました。

744:デフォルトの名無しさん
09/02/08 00:03:32
GCC関係なく、x86一般の話のようにしか思えない。

745:706
09/02/08 02:51:15
>>744 何告白ってるんだ。
ソフト板 URLリンク(pc11.2ch.net)

746:デフォルトの名無しさん
09/02/08 04:22:49
うぜえ

747:デフォルトの名無しさん
09/02/14 06:48:19
gcc -S でコンパイルしたときにコンパイラオプションをアセンブラソースに出力する
オプションってありますか?

748:デフォルトの名無しさん
09/02/14 07:44:24
-fverbose-asm

749:デフォルトの名無しさん
09/02/14 08:43:07
>>748
ありがとうございます

750:デフォルトの名無しさん
09/03/05 23:15:00
gcc *.c -S
とするとAT&T Syntaxで*.sができますが、Intel Syntaxで出すことはできますか?

751:デフォルトの名無しさん
09/03/06 02:40:48
-masm=intel

間違った命令を吐いてしまうという噂を聞いたことがある。
最近の状況はわからん。

752:デフォルトの名無しさん
09/03/06 11:18:14
>>751 へー。知らんかった

753:750
09/03/06 23:58:24
>>751
tnx

754:デフォルトの名無しさん
09/03/07 00:03:18
生成コードが心配ならgccには普通にオブジェクト作らせて、objdumpに
欲しい方のシンタックスでダンプさせるのはどう?

755:デフォルトの名無しさん
09/03/07 01:37:29
そっちもおかしかったりして。

てことはないと思うが、読みにくくなるからなあ。


756:デフォルトの名無しさん
09/03/07 05:26:47
そもそも噂ってなんだよ?w
毎週snapshotが出て、全世界で最も多く使われているコンパイラが、
判りやすいbugをいつまでもほっとくわけ無いだろ。

最も多く使われている筈のOSは、10年もディレクトリ掴んだまま
放さないbugが取れなくて、たまにイライラするけどな。

757:デフォルトの名無しさん
09/03/07 09:48:26
masmバックエンドって使われてないだろうし

758:デフォルトの名無しさん
09/03/07 11:41:18
組み込み系で結構使われてますよ。> masm=intel
まあnasmでなんとかなる昨今ですが。


759:デフォルトの名無しさん
09/03/07 13:12:36
>>767
なれりゃAT&Tでも特に困らんしなあ。
あれは完全におまけ機能だよなあ。

>>768
たぶんそのmasmは関係無いと思う。


760:デフォルトの名無しさん
09/03/07 15:14:02
>>759
gcc -masm=intel → 組み込み評価ボードのアセンブラ(by Intel)

761:デフォルトの名無しさん
09/03/07 20:13:31
>>759
767と768に期待

762:デフォルトの名無しさん
09/03/12 00:59:10
64bit環境で

gcc -O2でコンパイルする場合と

gcc -m64を付ける場合でゲロったバイナリの内容って異なることは
ありえないですよね?

763:デフォルトの名無しさん
09/03/12 02:22:11
ありえるのでは?
gcc -O2とgcc -m64 -O2が違うのはあり得ないというのならともかく。

764:デフォルトの名無しさん
09/03/30 18:24:57
4.5


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch