-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
でも、このままビルド続行。
明日の朝の結果待ちってことで。
今日は頭痛いので帰ります。