-mieee
Perlの野良ビルドでは、makeは通るのだけど、make testでこれまでと同様の結果になった。
linux-usersで、Kaz Kojima さんに -mieee が解決策になるかもとサジェッションをいただいたので、さっそく試す。
このオプションは、Alphaアーキテクチャでは、コードの効率は悪くなるが「正規化されていない数(denormalized number)、および、非数(not-a-number)、正の無限大、負の無限大などの例外的なIEEE値を正しくサポートすることができます。」というもののようだ。SHでも有効なのだろうか。
小島さんの解説を添付。
SH では浮動小数演算における挙動をできる限り IEEE 準拠にするための option、ということになっています。
例えば SH 用の gcc-4.1 だとint foo (float a) { return a != a;}
を -O2 で compile すると常に 0 を返すような code になりますが -O2 -mieee だとまじめに a と a を比較する code を出します。
IEEE 準拠なら a が NaN のときは a != a が成立するのでこういうことになります。
x86 だと逆に -O2 -ffast-math などとすると常に 0 を返すようなcode を出します。
Makefileを編集する。
EXTRAS = -mieee
これでいいのかな。
ビルドしてみる。
# make clean # make
なんかビルド中のCCCMDやcflagsには-mieeeが出てこない。ダメかな。
OPTIMIZE='-O2'に追記したほうがよかったのか?
OPTIMIZE = -O2 -mieee
にしてリトライ。こんどは
`sh cflags "optimize='-O2 -mieee'
とちゃんと表示されている。
ん? Making DynaLoader (static)から後は-mieeeが有効ではないみたいだ。
ダメだな... 他にも対策が必要かもしれない。
とりあえず、このまま進んでみる。
おお、make test通ったよ!
t/op/cmp..................................ok
さっそくlinux-usersに報告しやう。
次はパッケージ化。
さて、Debianでパッケージ個別にcflagsを変更するには、どうしたらいいのだろうか?
rulesあたりにそんなオプションあったような。
この設定は、debian.configに入れるのがいいようだ。
case "$arch_cpu:$build_type" in
という部分があるので、
sh4)
ccflags="$ccflags -mieee";;
とでもしておくのがいいのかな。
んで、changelogに追記してパッケージビルド開始。
あれ? だめだな。
これ有効じゃないかも。
case "$arch_cpu" in
sh4)
ccflags="$ccflags -mieee";;
esac
にしてみた。
make[1]: Entering directory `/root/hemamu_plus/perl-5.8.8' `sh cflags "optimize='-O2'" perlmain.o` perlmain.c CCCMD = cc -DPERL_CORE -c -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -mieee -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -Wall
CCCMDに入っている。きっともっと妥当なところがあるんだろうな... orz
でも、このままビルド続行。
明日の朝の結果待ちってことで。
今日は頭痛いので帰ります。