2006年12月の日記

2006年12月31日(日)

仕事

朝5:00起床。仕事で有明へ。

2006年12月25日(月)

時間がない

むむむ、大してやることもないのになぜか時間がないぞ。おかしい。時間がずれているだけか?

2006年12月24日(日)

Motherload

GIGAZINE経由。かなり面白い。ただ、プレイにはそれなりに時間を要するので完遂するのは大変かも。途中でセーブしつつ、暇が出来たらまたやろう。

2006年12月21日(木)

妥協のないコード

今日は久しぶりに妥協をせずにコードを書ききった。こういうコードを書けてしまうから、まだまだプログラマーをやめたくないと思っちゃうんだよな。と、ヒカ碁に似たような台詞があったような。

Packed Multiply High Word

a*b/65536(ただしa=[-255, 255], b=[0, 65535])をpmulhwで計算するとき、pmulhwは符号付き16bit乗算命令だから工夫が必要だ。aは符号付き16bitに収まるから問題ないとして、bは[32768, 65535]の範囲で符号付き16bitに収まらない。bは符号「なし」16bitには収まるので、符号付き16bit×符号なし16bitの乗算を行えばよいことになる。でもpmulhw命令は二つの項を符号付きとして扱ってしまう。bの範囲[32768, 65535]は16進数では[8000h, ffffh]となり、二の補数表現で符号付き16bitと解釈すると[-32768, -1]となる。例えば255×65535を計算したいとき、pmulhwはこれを255×-1として解釈してしまう。すると 255×65535 = 16711425 = 00feff01h、255×-1 = -255 = ffffff01h のように当然答えは食い違ってしまう。pmulhwは答え32bitのうち上位16bitを求める命令なので、真の値は00feh、間違った値はffffhとなる。その差はffh。

符号付き乗算は四つの場合に分けられる。aが正でbが正として扱われるとき、aが正でbが負として扱われるとき、aが負でbが正として扱われるとき、aが負でbが負として扱われるときの四つだ。aとbが正のときは問題がない。aが負でbが正のときも問題がない。問題はbが負のとき(負として扱われるとき)である。

で、結局どうすればいいのかというと、ハッカーのたのしみにも書いてあるのだけど、bが負として扱われたときに間違った値の上位16bitにaを加算してやればいい。前の例だとffhの差があったのはaが255だったからと言うわけ。

というわけで、a*b/65536を求めるコードは次のようになる(mm0=a四つ分、mm1=b四つ分、結果はmm0)。

movq mm2, mm1
psraw mm2, 15 ;mm2をbの符号で埋める。
pand mm2, mm0 ;bが負ならa、そうでないなら0。
pmulhw mm0, mm1 ;mm0=a×b (bを符号付きとして扱った場合)
paddw mm0, mm2 ;mm0=a×b (bを符号なしとして扱った場合)
        

とまあ、単にかけ算をしたいだけでこういう事を分かっていないといけない。もっと言えば証明できないといけない。みんなこういうのってどこで覚えるのかなぁ。

MMX

恥ずかしながら、ようやくMMX命令が自然に書けるようになってきた。今までpsrawだっけ、psarwだっけ? みたいな感じだったんだけど、よく考えたらShift Arithmetic Rightは語順的に不自然かな?

MS-DOSの頃まではアセンブリ言語でアプリ全部を書くこともあったけど、もうそんなことは無いし、時々使うだけではなかなか覚えないものだなぁ。

8086命令は中学生の時に本を片手に紙に延々プログラムを書いて、BASICのモニタモードで打ち込んでいるうちに覚えたんだよね。今はもうそんなことやる気にならないんだけど……もう少し昔の自分を見習うべきかな。

2006年12月19日(火)

めがねオーダー

仕事が行き詰まってイライラしたので職場を飛び出していつもの眼鏡屋へ行き新しいめがねを注文した。また度が上がるのか。憂鬱だ。今回は店員の強い勧めでニコンの上下で度が違うというレンズを選んでみた(これかな?)。どうなる事やら。おとなしく近距離用のめがねを一本作った方が良かったのかな。

2006年12月18日(月)

H2AF11

SRB-A四本は速い。

2006年12月17日(日)

番組改編期

年末ということよりも次々と流れる最終回予告の方がよっぽどプレッシャーを感じる今日この頃。

2006年12月15日(金)

宇宙開発委員会 安全部会(第5回)議事録・配付資料

スラド経由。何となく興味深かったのでメモ。

64bitナノ秒化

MライブラリのTimerTaskの遅延時間・周期を64bitナノ秒単位で指定できるようにした。本当は周波数指定モードでも作ろうかとも思ったのだけど、ナノ秒単位で周期を指定できれば十分だと思ったので。

2006年12月14日(木)

wavearc1.3

やばい

なんていうんだろ? スッカラカン?

脳内BGM

なんか蒼天の拳のOPがまわっています。薔薇が咲く、薔薇が散る。

2006年12月13日(水)

secmake5.4

sas5.21

2006年12月12日(火)

ときめきメモリアル Only Love

ダメなところは本当にダメなアニメだけど、ヒロインの可愛らしさは布団の上を転がり回りたくなるくらいだね。転がり回れるほど広くないけどさ。

2006年12月10日(日)

色違いに舞う

大学通りの銀杏の葉が舞い散る様が見事でした。顔に当たった黄色い葉は、前日の雨のせいか濡れていました。

2006年12月06日(水)

省略の誘惑

この日記を書いていてもそうなのだけど、ついつい省略したくなってしまう。書かなくて良いものなら書かないですませたくなる。本当は書かなくちゃいけないものでも書かないですませたくなる。はい、具体例が書いてないですね。すみません。文章を書いている時、人と話をしている時、主語や目的語、助詞を省いてしまう。プログラムを書いている時、本当は新しい関数やクラスでまとめるべきなのに、同じような変更を複数の箇所に施して済ましてしまう。ついついテストを省いてしまう。マニュアルを書いている時、二つの単語を無理矢理一つにしてしまう。囲碁を打っている時、何となく危なそうだけどよく分からないので手を抜いてしまう。日記を書いている時、本当は読み直さないといけないのだけど、文章が頭に入ってこないので読まずに済ましてしまう。この日記をどうやって終わらせようか考えている時、面倒だから結論めいたことは書かずに投げっぱなしにしてしまう。

2006年12月05日(火)

位相

このところ作業完遂周期の位相と一日の作業時間の位相が半日ずれていて気持ちが悪い。仕事の途中で帰って、次の日の昼過ぎに完了する感じ。それも作業完遂周期がほぼ一日の作業時間なのでなかなかずれが変化しない。

いや、この位相のずれにはメリットもあるのだけど、なんか気持ちが悪い。

2006年12月03日(日)

NHK杯

今期はまだハンカチおじさん趙治勲が見られます。

冬と休日とお茶

温かいお茶が飲みたいのだけど電気ポットは壊れているし、そもそもお茶っ葉をいつもの店へ買いに行く時間が取れない。

2006年12月02日(土)

落ち込み

落ち込んでいるのも時間の無駄だと知りつつも、落ち込んでいたい今日この頃。

2006年12月01日(金)

年末

そろそろ「もう十二月かぁ!」と嘆くのにも飽きてきたお年頃です。