Not only is the Internet dead, it's starting to smell really bad.:2007年10月下旬

2007/10/22(Mon)

[pcc] integer promotion issue with +=

今の実装では(どうやら)TBOOL vs TANYにはならないのです。
事前にSCONVが呼ばれ0/1に変換(つまりTBOOL vs TBOOL)された上で
OPSIMPされるのでs/add/or/;s/sub/xor/してしまえばおkなはず。

...なのですが、これじゃぁC99の仕様的に駄目なんですよね。
JIS X0310:2003から引用。

6.3.1 算術オペランド
6.3.1.1 論理型, 文字型及び整数型
すべての整数型は, 次のとおり定義される整数変換の順位(integer conversion rank)をもつ。
(中略)
 - _Bool型は, その他すべての標準整数型より低い順位をもたなければならない。
(中略)
 - 整数変換の順位がint型及びunsigned int型より低い整数型をもつオブジェクト又は式
 - _Bool型, int型, signed int型,またはunsigned int型のビットフィールド
これらのものの元の型のすべての値をint型で表現可能な場合, その値をint型に変換する。
そうでない場合, unsigned int型に変換する。これらの処理を, 整数拡張(integer promotion)と呼ぶ。
(以下略)

この整数拡張が行われなければならないので
SCONVでTANYが先にTBOOLに変換してしまうと正しい結果が出ないのです。
これが前回の「多分駄目かも」の理由。

整数拡張は_Boolだけではなく、charやshortなどでも必要です。

char x;
int y;

x += y;

というCソースでは、charはintに拡張されますので

movsbl	x,%eax
movl	y,%edx
addl	%edx,%eax
movb	%al,x

というアセンブラになるはずです *1

しかしこのアセンブラは最適化 *2してしまえば

movl	y,%eax
addb	%al,x

と同じです *3
pccもpass1の時点で

0xbb901068) +=, char, 0x0, 0x8075818
    0xbb901154) NAME, 0, -1148186320, char, 0x0, 0x8075818
    0xbb901180) SCONV, char, 0x0, 0x8075818
        0xbb901104) NAME, 0, -1148186124, int, 0x0, 0x8075848

というNode treeを作成し、整数拡張を見事に無視してくれやがります。

ところが_Boolの場合この最適化をやられてしまうと困るのです。

#include <stdbool.h>

_Bool x = true;
int y = 100;
main(void)
{
	x -= y;
	printf("%d\n", x);
}

というコードを考えた場合、今の実装では

となりますが、実際には

とならなければなりません *4、あばばばばばばばばばば。

*1:gcc4は最適化なしだとこれに近いアセンブラを出力します。
*2:6.3.1.3 符号付き整数型及び符号無し整数型 も参照。
*3:gcc3は最適化の有無に関わらず、gcc4だと-01以上でこれに近いアセンブラを出力します。
*4:gccはちゃんと後者で出力されますな。

土曜日

PearlTAMAの檜原村へ。

今回は人数と荷物の関係でレンタカー借りたんだけど
ツーリングワゴンでなくミニバンにしとけばよかった、ちと狭い。
最近の車はよー判らん。

日曜は風邪寒鰤返して寝てた、ゲホゲホ。

2007/10/23(Tue)

[pcc] integer promotion issue with += その2

さーてpass1の修正をどうするかね…PLUSEQ/MINUSEQについては

$ cat >test.c
#include <stdbool.h>
_Bool x;
int y;
main(void)
{
	x += y;
}
^D
$ cpp test.c | /usr/pkg/libexec/ccom -Xb
0xbb901068) +=, bool, 0x0, 0x80758d0
    0xbb901104) NAME, 0, -1148186320, bool, 0x0, 0x80758d0
    0xbb9011b8) SCONV, bool, 0x0, 0x80758d0
        0xbb9011e4) NAME, 0, -1148186248, int, 0x0, 0x8075828

$ cat >test.c
#include <stdbool.h>
_Bool x;
int y;
main(void)
{
	x = x + y;
}
^D
$ cpp test.c | /usr/pkg/libexec/ccom -Xb
0xbb901278) =, bool, 0x0, 0x80758d0
    0xbb901104) NAME, 0, -1148186320, bool, 0x0, 0x80758d0
    0xbb9012a4) SCONV, bool, 0x0, 0x80758d0
        0xbb9011b8) +, int, 0x0, 0x8075828
            0xbb90124c) SCONV, int, 0x0, 0x8075828
                0xbb9011e4) NAME, 0, -1148186320, bool, 0x0, 0x80758d0
            0xbb901068) NAME, 0, -1148186248, int, 0x0, 0x8075828

のようにいったんx = x + y に展開しとかないとダメだよな。
+= のまま扱おうとすると

SCONV, bool # ここにSCONVを置くのは変
	+=, int
	SCONV, int
		NAME, bool
	NAME, int

のようにツリー構造が破綻してpass1の以降の処理もpass2も動かなくなりそう。

[FreeBSD] isspace((int)0xA0) + UTF-8 locale problem

あっちでもcommitされた模様、えんがちょ。

2007/10/24(Wed)

[pcc] integer promotion issue with += その3

こんなんでいいのかな。
あんまり叩いてないけど、とりあえずこれでPLUS/MINUSはおkのよな希ガス。

あとはINCR/DECRとtable.cの不足分(LSとかRS)の追加かぁ。

鍵盤

YAMAHA NP-30、76鍵で5.4kgはいいねぇ。
乾電池駆動可というのもKORG POLY-800っぽくてイイ。
ホイールないけどどーせ使わんので全然おk。
Roland JV-90は処分してこれ買うかちょっと考え中。

もしくは M-AUDIO Keystation 88esかね。
でも88鍵まではさすがに不要だし重さ10kgってなぁ。

2007/10/25(Thu)

[C言語] C1X

VAIO C1X[E-G]の話ではないぞよ。

ちょっと古い話だけど JTC1/SC22/WG14C1X宣言きてるねぇ、後日読もうかね。

めも、 ISO の制定順序

ところで char16_t/char32_t は C++0X の方が先に入りそうなんだが
こーゆーの順序的に前後していいのだろか。

[pcc] pcc(1) _Bool type bug その11

INCR/DECRの場合、buildtree()内で

x = y++;
 ↓
x = y;
y = y + 1;

へ書き換えるのはちと難しげ。
delvoid()でやるのもあんまり夜露死苦なさげ。
cgram.yでなんとかできるかな?

[pcc] _Bool vs atomicity

_Boolの実装しててatomicityまわりに不安があったんだけど
C99読んでもよーわからん、C++の方では こんな感じなので安心かな?

2007/10/27(Sat)

最近買ったもの

2007/10/29(Mon)

週末

現像したまま放置してたポジをひたすらスキャンしてた。

Photoshop Elements 5.0の写真整理モード遅すぐる。
1枚130MB程度のtiffが大量にあるとまるで使いものにならん。
Lightroomだとどうなんだろ、体験版でも入れてみるか。

今年の夏はFUJIFILMの FortiaSPを多用してたら、その毒々しい色に慣れてしまい
Velviaですら地味に感じてヤバい、ちょ化学調味料シンドロームwwwww

α-8700iシャッター壊れた(´・ω・`)フィルム入れる前だったのは不幸中の幸い。

のでサブ機として重宝してたんだが、合掌。
これで同機種は残り1台、もう何台か捕獲するかどしよか...相場は3~5kぐらいだし。
ただ最近は状態のいい中古が少ないんだよなぁ。

2007/10/30(Tue)

[pcc] pcc(1) _Bool type bug (intermission)

サボり中。

INCR/DECRをpass1レベルでPLUS/MINUSにRewriteするのは
いろいろ破綻してるげなんで、さっさとpass2に処理任せる方針で。

友達の友達は(以下略

新宿アルタ前への法相派遣法案なら今国会でも成立しそうだな。

今日

某商用チャート生成ツール、グラフの軸の注釈を改行したい場合
メーカーのFAQにはHTMLタグが使えるのでPタグなりBRタグなり好きなの使え
と書いてあるんだが、内部的にはこれ

とゆー実装になってるようで、両者混在させると字の大きさがびみょーに合わず地味に困る。
あとswingだと字が汚くなるのよね(Java5以降はいいとして)。