[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