[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: powerpc-elf-netbsd patch for egcs-980214



<199803111502.AAA14671@ruri.iri.co.jp>の記事において
1998年03月12日00時02分頃、tsubai@iri.co.jpさんは書きました。

 > main()
 > {
 >         printf("%qu\n", (long long)1);
 > }
 > を実行すると楽しいことになります。
 > % ./a.out 
 > 18446721550901051392

# ./a.out
18446722066297126912

あ、ほんとだ。
gcc version egcs-2.91.08 980214 (gcc-2.8.0 release) です。


 > # 引数をわたすレジスターが1つずれているようなきがする。

 18002b0:       3d 20 01 80     lis     r9,384
 18002b4:       38 69 7a cc     addi    r3,r9,31436
 18002b8:       38 a0 00 00     li      r5,0
 18002bc:       38 c0 00 01     li      r6,1
 18002c0:       4c c6 31 82     crclr   4*cr1+eq
 18002c4:       48 00 00 bd     bl      1800380 <printf>

SYSTEM V ABIによれば、long longの引数を渡すときは、
奇数番目のレジスタから2つ使うそうなので、
これはこれで正解のような気がします。


ん? ひょっとして...

gcc-2.8.0以前は、レジスタの奇数偶数関係なしに並べていたけど、
gcc-2.8.0以降は、SYSTEM V ABIに沿ったlong long引数の並べ方(奇数から)に
変更になったのかな? 

だったりすると、ライブラリをコンパイルしたgccが古いと、
long long引数の取り扱いが変わってて...
てなことだったりしますかね?

試してないので確証はないのですが...

sakamoto@cec.co.jp