きのうの Linux 版のコードを短くしようとしていたら、逆に DOS 版コードをもっと縮められそうな気がしてきて、やってみたところ、できた。 112 バイト。 まだ 6 バイトも縮む余地があったのか。
そしてこれも全部コードになった。
COM 形式なのでコードの後ろをデータ領域に使う方式にはしたけど、考え方はきのうのと同じ。
ただ stosl
はできないから 2 回の STOSW
にわけて、そうすると Fizz と Buzz で後ろの 2 文字が同じなのを利用して一部まとめることができた。
SI
(きのうのコードだと %rsi
) にバッファーの開始アドレス・数字の文字列の次のアドレスがほぼ残っている状態なのが大きい。
きのうのコードはデータ領域をスタックから確保したのに %rsp
を含むアドレッシングが一度も出てこなかったし、今日のコードでも OFFSET
が出てくるのは 2 回しかない。
そして、3 か 5 の倍数の時だけ回数を数えることにして、0x77777777 回数えたら最後の FizzBuzz は出力せずに終了する、という形に変更して、性能改善も狙った。 まぁ、改善といっても微々たるものだろうがw
11 バイト縮めたバージョン。 意外と縮んだな。
%ecx
に 9 をセットするのを、push $9
を使うことで 1 バイト削減。stosw
や movw
はプリフィックスがついて無駄なので stosb
と movb
にして 1 バイト削減。sub
命令にすることで Fizz の stosl
を流用でき 1 バイト削減。push
がなくなり、システムコール用の 1 のセットを手前に持ってくることで dec
と同じバイト数で sub
になり、jrcxz
のかわりに jc
となり、1 バイト削減。%dh
レジスターで 8〜15 ビットにアクセスできるのがうれしい。write
システムコールに使うサイズの指定が %edx
レジスターで、そのレジスターを他の用途に使っていないもんだから、%edx
レジスターでサイズを計算しておけばそのままシステムコールに使える。ただし改行文字のストアを移動、桁上がり処理に immediate が復活するため、削減は 3 バイト。write
システムコールは、push $1
を使うことで %eax
のセットが 4 バイトから 3 バイトに。%rax
が 1 の状態でやってくるから、exit システムコールの番号は %al
にセットすればよくなり、%eax
のセットが 4 バイトから 2 バイトに。push
で 8 ビット符号付きの整数を指定して符号拡張でスタックに積めるのはこれはいつからだっけな、80286 か? 80386 かな?
それが小さな値をロードするのに有用だとはね。
そういえばこれ 32 ビット時代からそうだっけな。
うっかりしていた。
最後のシステムコールは lea
でもいいじゃんと気づいたのが最初だったんだけど、いろいろ改修していくうちに 1 バイト mov
でさらに短くっていう。
終了判定もいろいろ DOS のプログラムに引っ張られていたな。
条件成立の 1 回目はフラッシュ、次の FizzBuzz をバッファーに書き込んだ後で、それを捨てて終了っていう、それなりに合理的な仕組みに変わった。
DOS のやつは DEC
が 1 バイトなのを利用しているのと、カウンターにふたつのレジスターを使うためレジスターが余っていないこともあり、同じ作戦は取れない。
晴れ。 ちょい暑。
テレビでやってた映画『余命 10 年』。 2022 年の邦画。 まぁー良くも悪くも日本の映画らしい展開だ。 ワードプロセッサの画面は Microsoft Word かな、今時あり得ないくらいの低解像度で小さなビットマップフォントにちょっと笑ってしまった。 頻繁に登場したディジタルビデオカメラもちょっぴり古そうな感じだったな。 病気で宣告された余命の 10 年を楽しむぞー、ということかと思ったら、やることないし暇だしー、みたいなところから始まり、同窓会からのいろいろでちゃんと人生楽しめたっていう、そういう話なんだけど、最後に誰々に捧げるみたいなのが出てきて、何だ? と思ったら原作小説の作者は難病で亡くなっているとのことだ。
どうにかならんかなと眺めていたらなおせるところが見つかって 4 バイト縮んだ。
.text セクションが 111 バイト。
DOS 版に対抗してもしょうがないんだけど、まぁうまくいったほうかな。
DOS 版は DOS 版で、けっこうかつかつで、メモリーをもっとガッツリ食っていいなら一番最初の CX
を DI
で初期化すれば 1 バイト縮むんだけど、それはそれでどうかと思ってやっていない。
今回の修正は 4 つで、ひとつは label の位置を変えただけでサイズに影響はない。
ふたつめは最初のスタックポインターの減算処理をかえて 1 バイト増やして、代わりに最初の stosb
のための mov
をなくして 2 バイト減ったので、合わせて 1 バイト減った。
sub
に %rsp
と 32 ビットの immediate を指定するとあまりに長いので、そこを 1 バイト増やす代わりに %eax
もセットしてしまおうという。
スタックポインターを 8 の倍数じゃない値で引くのはどうかと思ったので、もっと大きな値で引いて、桁上がりの処理で 10 引く代わりに 0x31 と AND をとるように変更してある。
3 つめはトリッキーな内容、immediate で 16 ビットの %bx
をセットする mov
が 4 バイト、32 ビットの %ebx
をセットするなら 5 バイト。
今回 %ebx
の上位 16 ビットは使用しないので、前者を使っていたが、あえて後者に切り替えた上で、その余った 2 バイトに inc %ecx
を入れるという荒技最適化で 1 バイト減った。
桁数を増やすための inc %ecx
が 2 バイトあるので何とかならないかと、いろいろ考えた結果これになった。
そして 4 つめは exit システムコールまわり。
DOS 版のように共用したかったができないかな、と思っていたところ、方法が見つかった。
フラッシュルーチンが基本的にキャリーフラグがセットされていない状態で呼ばれることを利用し、exit の際はキャリーフラグがセットされた状態で同じフラッシュルーチンにジャンプさせる。
そして、syscall
命令の直前でキャリーフラグで分岐を行い、キャリーフラグがセットされていたら、システムコールの番号を exit に差し替え、さらに %edi
を 0 にする。
終了コードを 0 以外に変えてもいいなら、と思っていたところに、この技により 0 のままで syscall
命令の数をひとつだけにすることができて、2 バイト減った。
もちろん、終了コードが 1 でいいならさらに 2 バイト減らすこともできる。
この遊びで、AMD64 は特有の REX プリフィックスを除くと、割と 2 バイト命令が多いなという印象を持った。
普通にコンパイラーに出させればもっともっと長い命令が量産されるけどね。
16 ビットの 8086 は 1 バイト命令がまぁまぁ多くて、80386 の 32 ビットモードでもそれが引き継がれている感じだったが、AMD64 の 64 ビットはやっぱり 1 バイトの INC
DEC
と BCD 演算系の命令の消滅でだいぶコードが伸びてしまう感じがする。
PUSH
POP
を引き続き 1 バイト版も残したのはどういうわけなのか、INC
DEC
より頻繁に使われると考えたんだろうか?
でも PUSH SP
とか INC SP
とかは昔からまず使われる機会がなかったし、なんかそのへんだけ除外する、例えば 4 つずつ残す、みたいな手もあったんだろうけど、命令コードがとびとびになるのも嫌だし、別の命令コードを割り当てるのも嫌だし、といったところだろうか。
INC
DEC
はなぜかキャリーフラグを保持するという特殊性のせいで性能重視の最適化には向いていない、みたいな話もあり、実際コンパイラーに最適化をさせても使われないので、INC
DEC
はなくなって当然、みたいなことかも知れないんだけど、どうせならキャリーフラグにも結果を反映する新しい INC
DEC
を導入してくれても良かったのになw
こっちもさらに 2 バイト減って 110 バイトなんだけど、バッファーサイズがいつの間にか 2 倍の 16384 バイト (+ アルファ) に...w バッファーサイズを 8192 バイトのままにするなら、111 バイトかな。 システムコールの番号が 16384/256 だからという、とてもひどい話である。
ま、それはいいとして。
もう 1 バイトはカウンターの片方を DX
に変えたことで生まれた。
1 バイトの CWD
命令で DX
をクリア。
そのためにカウンターは再び毎回減算方式になり、フラッシュ条件判定も毎回減算するようにしたからだいぶオーバーヘッドは増えただろう。
晴れ。 時々曇り。
インフルエンザワクチン接種から 1 週間。 SARS-CoV-2 ワクチン接種から 1 か月。 あと 1 週間ぐらいすれば免疫最強かな?w 最強の効果はおそらく半年あるかないか、変異によっては予防効果はあんまり期待できないだろう、的な。
車検。 代車はヤリス。 いっぺんレンタカーで運転したことがある車種なので気持ちは楽だ。 東京で運転するのは初めてだけど。 とってもしっかりした実用的なコンパクトカー。 今回のはオートエアコンだったが、クルーズコントロールはなさそう。 前調べた時は 1L でもクルーズコントロールあったのかなみたいなことを書いたけど、あらためて調べると 1.5L って書いてあるように見えるな。 色がようわからんひどいカタログだけど。
F1 アメリカ GP 予選。 アストンマーチンがなんか free practice 1 をほとんど走れなかったみたいで、予選 Q1 で 2 台とも脱落してしまった。 ウィリアムズも最近好調なのかと思いきや 2 台とも Q1 脱落。 地元アメリカのハースも 1 台が Q1 脱落。 そんな出だしだったが、Q3 では終盤にフェルスタッペンがトラックリミットをとられた。 トラックはみ出しながらでルクレールとは 100 分の 1 秒未満の差のトップタイムだったので、トラック内にとどまっていたらトップタイムだったかどうかはそもそも怪しい。 そしてそのタイムは抹消なので 6 番手、これは決勝が楽しみだ。 ...というのは半分はそうだけど、フェルスタッペンは途中で中古タイヤでもトップタイムをたたき出した時があったので、まぁ、現実にはアクシデントがなければフェルスタッペンが優勝するんだろうけどね、残念ながら。 えっ、ペレス? 9 番手だったね... 車が好みに合わないとしても、ライコネンがアロンソのチームメイトだった時ぐらいの位置にはつけていてほしいんだよな... いやまぁ今回タイム抹消があったので近いんだけれども...
テレビドラマ『トクメイ! 警視庁特別会計係』。 カンテレドーガ配信 (関西テレビ放送)。 橋本環奈主演。 沢村一樹が警察の係長を演じている。 1 話。 未来の警察、お金が無くて経費削減。 コメディ的なやつ。 主人公は疫病神。 事件現場、どう見ても配線がないダミーの防犯カメラだなぁと思ったら、本当にダミーの設定だったw 疫病神だから現場には行かないはずが現場に行って活躍する的な。
これは短い版じゃなくて高速版。 きのうまでの短い版をかなり流用しつつ、この前の C++ 版の高速化手法をアセンブリ言語で実装した。 1000 未満と、桁数が増えてから最初のバッファーが埋まるまでの処理はきのうまでの短い版がベースのため、そこだけ見れば速くはないはずである。 しかも、最初のバッファーが埋まった後の数字を読み取って 0xf6 の変換を入れているので、コンパイル時に決定できるものを実行時に計算している風になっている。 SSE2 (xmm) も使用していない。 それでも実行時間は C++ 版とほぼ変わらない。 やっぱりここまでアルゴリズムを工夫すると最後はメモリー転送がボトルネックなんだろうね。
しかしアセンブリ言語で書くとあの 0xf6 のインクリメント補正の計算がけっこう面倒くさくて笑った。
64 ビットの immediate は演算命令のオペランドに使えないので、いちいちレジスターに入れて...
ビット探索系の命令 (bsf
) を使うほうが速い可能性もあるな、と思ったんだけど、10 桁目の特殊扱いの関係もあって bsf
に変えてもあまりシンプルにならなそうだ。
別の演算方法も検討してみたけど、いい案は出てこなかった。
まぁ、そうやって考えてみると、必ずしも 0xf6 ずらす必要はないことにも気づいた。
例えば 0x393939... との排他的論理和をとれば、9 が終わる桁をビット探索で特定することも可能。
それでテーブル参照で足す値を引っ張り出すなり、あるいは今のコードと同様の論理演算でも桁上がりを処理できる。
(0x313939 に 0xf6f7 を足すと 0x323030 になる... という具合。)
試しに C++ の実装でそれをやってみたが、論理演算にしても、__builtin_ffsl
を使ってテーブル参照にしてみても、実行時間にあんまり差が出ない (笑)。
でもやっぱり論理演算のほうが速いかな。
インクリメント処理に条件分岐を入れてみたらどうなるか、も結局目立つ差は確認できなかった。 繰り上がりがない時には補正用の演算が無駄っぽく感じるけど、分岐しないほうが都合が良いんだろう。
晴れ。 ひんやり。
F1 アメリカ GP スプリント。 スプリントシュートアウトは角田が SQ1 で時間切れで計測できずをやらかした。 リカルドが先に進んでいたところを見るとマシンは良いのだろうか。 と思ったが、スプリントレースを見たらリカルドはズルズル順位を落としていたな。 やっぱり決勝も厳しいだろうか。 ハミルトンが 3 番手スタートでドーンとルクレールを攻略して、そのまま 2 番手でフィニッシュ。 フェルスタッペンはトップスタートで余裕の勝利。 今回ピアストリがさえない走りだった。
車検が終わった。 バッテリーは交換推奨だが (笑) 他は特に問題なし。 何も言われなかったが、助手席のところの車検証入れの磁石が外れかけていたのを何か対策してくださった模様。 あとヒューズボックスのふたが外れていたとのこと (笑) 自分で ETC 車載器などを取り付けた関係で何かゆるんでいたかな、まぁいいけど。
ヤリスでも自宅駐車場の出し入れはだいぶ気を遣う。 iQ に慣れているので自分の内輪差の認識が怪しいところはあるんだけど、それでも、壁が近づいた時の警告音を鳴らさずに出し入れするのは無理じゃないかな。 警告音とともにカメラの映像を表示してくれるのは何とも親切であるが、後輪の段差についてはあまり頼れない感じがするので、ミラーを動かしまくって出発した。
やっぱりヤリスの 1L は加速が遅い。 そーっと走らせていると不満なところが見つからない車だが、アクセルをぐいっと踏み込むと、パワーのなさをカバーしようとする CVT の努力が... MT ならもっと不満に思わないかも知れないところはあるが、1L に MT の設定はないという。
テレビアニメ『呪術廻戦』。 37 話。 血の攻撃。 トイレを破壊するたたかい。 たたかいの最中に、敵の状況を説明するナレーション。 また主人公しんじゃった?
たまに思い出すレトロな音楽、CD があったよなーと思って探したら出てきた。 「二人は旅立ちます」、「パパとママへ」と表には書かれている。 裏と CD にはさらに「START」とある。 曲とカラオケの 2 トラックしかないのに 12 cm CD、つまりマキシシングルである。 作詞は岩元恭一、作曲・編曲が津村 彰、唄は元 俊行・児玉和子、となっている。 75th anniversary MADE BY YAMAKATAYA と表記があり、I01.T001 というコード番号みたいなのもある。 CD にも MADE BY YAMAKATAYA JAPAN という表記がある他、丸 P で 1992. と書かれている。 そう、1917 年に設立された山形屋の 75 周年記念の何かなのだった。 岩元恭一とは山形屋社主で、検索すると 2022 年に亡くなったというニュースが出てくる。 あとは児玉和子という名前で検索するとカラオケがヒットするのでどうも歌手のようだ。 それ以外のことは不明。 CDDB にもデータはないし、曲名で検索しても、歌詞で検索しても、音で検索しても何もヒットしない。 福武書店の非売品 CD、涙 2 (青春ヴァージョン) も同年なのに、いくらでも情報が見つかるしカラオケ (DAM) にも入っているというのに。 ま、全国区じゃないし枚数が全然違うんだろうけどね。 そもそも、何かで誰かからもらったんだったと思うが、どういう経緯だったかもすっかり忘れてしまった。
晴れ。
F1 アメリカ GP 決勝。 序盤にオコンとピアストリの接触があり、それでふたりとも短い間にリタイアしてしまったのは残念だった。 フェルスタッペンは 6 番手スタートからあげていっていたが、ハミルトンがすいすいオーバーテイクしていたのに比べて、フェルスタッペンはどうにも手こずっているように見えた。 するとブレーキの調子が悪いんだという無線の声が。 ほーん。 しかしさすがはチャンピオンマシン、ブレーキの調子が悪くてもやっぱりペースは速いのであった。 他車は近づけはしても歯が立たない。 角田とリカルドはやはりレースで苦労しているように見え、角田が 10 位近辺を走っていたが、ポイントは厳しいかな... って思っていたら、終盤にアロンソがトラブルでリタイアして、10 位が転がり込んできた。 さらにはピットインしてソフトタイヤで最終ラップにまさかのファステストラップ更新! いやー、確かに今日の展開では上位勢はファステストラップポイントを狙うピットインをすると順位を落としてしまう状況だったけど、最下位チームでこれを決めるとはね! 見事だった。 ファステストラップを取った日本人は中嶋悟・小林可夢偉以来 3 人目らしい。 ファステストラップポイントとしては日本人初だが、始まったのが最近 (2019 年) の話だからなw
そして、ハミルトンとルクレールがマシンの違反により失格という裁定が後から出て、角田は 8 位に! 引き続きアルファタウリのコンストラクターズポイントは最下位だけど、今後に向けてこれは大きいな。 そして、今年の F1 で唯一のアメリカ人ドライバーであるサージェントも 10 位入賞となった。 めでたい。
テレビアニメ『るろうに剣心 ―明治剣客浪漫譚―』2023 年版。 16 話。 何にも教えてもらえていない、らいじゅうたの弟子? そういえば前のアニメにもそんなような話あったっけ。 もうちょっと、なんか明るいところでのたたかいだった気がするけど。 この世で一番恐ろしい男の逆鱗。
テレビアニメ『葬送のフリーレン』。 7 話。 エルフは緩やかに絶滅? 銅像、フリーレン様に似ていますな。 まぞく、人食いの化け物、言葉を話す魔物。 角が生えている。
ほとんど差は出ないといいつつ、少し見直して改良してみたところ、同じ 11 秒台でも半ばぐらいが出る頻度が上がった気がする。 なおバッファーサイズを倍にすると 10 秒台前半になるのは秘密。
今回の微修正は、主に、10 進数のインクリメントを行う部分。
マクロで展開しなくても、call
にしても性能に差はないようなので、call
にかえた。
そしていろいろ試してみて、今は、3 回分の足し算をサブルーチン inc3
で行う仕掛けにしてある。
インクリメントでは、桁上がりが絶対に起きない回というのが多いはず。
それを、test
を使って最低限の識別を行い除外する。
0xf6 ずらした値の下位 2 ビットを見て、0 なら 3 回インクリメントしても桁上がりはない。
1 なら 3 回目に桁上がりがあるかも知れない。
2 なら 2 回目、3 なら 1 回目、とまぁそういう具合なので、その桁上がりがあるかも知れない回だけ補正を行う。
これは効果がありそうだ。
最初の test
を、cmp
にしたら、より多く除外することができるが、性能はほんのわずかに下がったように見えた。
たぶん、ビット演算のほうが待ち時間が短いんだろうと思っているが、もしかしたら、分岐予測に影響が出るのかも知れない。
そのへんはよくわからん。
今時の CPU はアウトオブオーダー実行という機能を持っていて、先の命令をどんどん読み込んでいって、もしそっちを先に処理できるなら済ませてしまおうという、そういうことをしている。 演算器の結果が出るまでには時間がかかるが、その結果が出る前にやれることはやってしまおう、とか、演算器のパイプラインに流し込んでしまおう、とか、そういう想像しがたいことが実現している。 そういう話を認識はしていても、いざアセンブリ言語で書くと、どうしても演算結果を使って何かするという処理が出てくるのでそこでストールするんじゃないかと心配になる。 しかし見た感じはビット演算系はたぶん演算器が別か何かで速い。 ビット演算は桁上がりの配線がいらない分シンプルだし、さらには今はビット操作の専用命令もあり、指定したビットだけ読み書きなんてことができるので、ああいうのはさらに効率が良いんじゃないだろうか。
ビット探索命令はやっぱりうまく使えなかった。
ビット探索って、たぶん一発で求める回路があるんだろうと思うので、加算器を使ってごちゃごちゃやるより速いはずだと思う。
ところが、全ビット 0 だと結果が未定義という縛りと、今回の 9 桁目の罠もあってそれを上手にいかす方法を思いついていない。
結果を cmp
なんてやったらさ、そこで演算器を使っちゃうんだからね。
やっぱり 10 桁目は別枠扱いのほうが速いな、ってことがわかった。 インクリメントの改良でちまちま稼ぐのと違い、いきなり 0.3 秒ぐらい短縮した。 pv で見た時に後半やや失速する感じに見えていたのが解消した。
ちなみに、インクリメントから補正を全部取っ払って、ただの足し算だけにしても、実行時間はほとんど変わらなかった。
なので、様々な処理の中で吸収されているようだ。
なお、1 ずつ add
(++
) しては取り出すという方法で 3 回の足し算を繰り返すと、11 秒台の中で 0.1〜0.2 秒程度だが遅くなった。
やはり、次の計算のために前の計算を待つ必要があると、例え +1 であっても遅い、と。
まぁでもそんなもんなので、メモリーへのストアの改良のほうがきくってことだな。
なお、8 バイトのストアをわざと 4 バイトにしてみても、実行時間はたいして変わらなかったので、これは書き込みバイト数より回数がきいているか?
キャッシュラインは 64 バイトのはずだから、4 バイトだろうが 8 バイトだろうが差がないというのも納得はできるけど、だから 9 バイトの書き込みはつらいのか。
一応 C++ 版も書き換えてみた。 微妙にアセンブリ言語版のほうが速いのがおもしろいけど、これ 7 バイトを 8 バイト書き込みにするのやっていないからそのせいだろうか?
晴れ。 寒い日。
テレビアニメ『MF ゴースト』。 テレビアニメ『頭文字 D』から 25 年、コンピューターの進化とともにコンピューターグラフィックスもめちゃくちゃ進化したが、未だにタイヤスモークの表現はグランツーリスモ並に違和感あるし、カーブ脱出時の車のスライドが止まる動きはグランツーリスモ以上に違和感がある。 3 話。 予選終了。 ギリギリ... 予想通りの展開だ。 「ホルモン小田原」。
テレビアニメ『16bit センセーション ANOTHER LAYER』。 オープニング曲、中川翔子の、曲名が 65535 なのかw 3 話。 秋葉原... あそこの公園か? 昌平小学校の近くの? プール? 1996 年。 Windows 95、そんな頃だねぇw PUFFY でアジアの純真、そんな頃だねぇww 「Nifty のフォーラム」。 「パソコン工房 田中」。 キューハチブイエムくん。 時間貸し駐車場が「skky com」は 1996 年なのかな。 キューハチ (PC-98) でしかゲーム作らない!、まぁ当時中学生だった自分から見てもわからんでもない気がする。 アクションゲームじゃないなら別に何とかなっただろうけどね。 学校にあった FM TOWNS や FMV なんかを見ても、一太郎と 1-2-3 が使えればいいだけなら (一部外れ機種はあるとしても) 正直何でもよかった。 Windows 版なら各メーカーで使えたし、ソリティアも遊べた。 しかしアクションゲームとなるとね。 フルスクリーンでスクロールする 2 次元シューティングゲームみたいな、そういうのは 1996 年頃ならまだハードウェア直接制御、みたいな時代で、機種ごとの機能・性能がある程度わかっている PC-98 専用のほうが作りやすかっただろうな。
テレビアニメ『オーバーテイク!』。 3 話。 もてぎだ。 「三日月飲料」。 トップチームのチームオーダー。 スリップストリーム。 このアニメの車の動きは 1990 年代のビデオゲームみたいな感じかな。 あんなにタイヤ動かねぇし。 もてぎのバックストレートエンドの曲がり方もなんか変だった。
テレビドラマ『トクメイ! 警視庁特別会計係』。 2 話。 刑事の残業削減。 納豆クレープ。 「ソウルメート」。 「1 ミクロンもわかりません」。 ミクロンって久しぶりに聞いたな。
0xf6 ずらしを使わず、bswap
も使わないバージョン。
実行時間はほとんど変わらない。
0xf6 ずらしをしなくても 0xf6 は現れる。
US-ASCII で 9
の次の :
を 0
に持ち込むために 0xf6 を加算するので。
bswap
も使わないため little endian の AMD64 では上位側に下の桁が来る状態のまま。
まず足す前に xor
で 9
の位置を全部 0 にした上で、ビット探索命令 bsr
を使って一番上の 1 のビット位置を特定する。
そのビット位置を 8 の倍数になるように減らし (2 進数で見たら切り捨て)、それを使って 0xf6f6...f701 という値を左にシフトする。
んでそれを元の値に足すと、1 足した結果が得られる。
という具合である。
全部 9
の時だけはこの処理ではうまくいかないので条件分岐にしている。
0xf6 ずらしと違い下位 2 ビットを見て加算を簡単にするというのはできないので、少し不利か。
でも実は補正処理の計算の数はこっちのほうが少ない。
ビット探索結果から足す数を生成するところがとてもスムーズだし、後で 0xc6 を引く (きのうのバージョンは符号反転して足し算にしているが) 処理もいらないのだからそれはそう。
まぁ、bswap
を使わなくていいしこっちのほうが速いかな、なんて思ったが、全くそんな差は見えないところを見ると、やっぱりもうメモリー書き込みのほうがネックなんだな。
0xf6 ずらしの話がすごくないわけではなくて、あれは冷静に考えると +1 でなくても適用できるおもしろ話だ。 連続するビットを探索するのは本質じゃない。 1234 を 8 ビット単位で 0x01020304 みたいに表す unpacked BCD を使った場合に、これに 5678、つまり 0x05060708 を足す、みたいな話を考える。 0x01020304 に 0xf6f6f6f6 を足して、0xf7f8f9fa。 これに 0x05060708 を足して、0xfcff0102。 こんな感じで 9 をこえてしまった桁はまるで 0xf6 ずらしたのがなくなったかのように上位 4 ビットが 0 になり、キャリーは伝搬する。 ということは 0xf0f0f0f0 で論理積を実施すれば、0xf0f00000 になり、これを 4 ビット右シフトしたものと論理和を求めて 0xffff0000 になり、0xf6f6f6f6 との論理積で 0xf6f60000 になり、これをさっきの足し算結果から引けば 0x06090102 となって 6912 という答えが得られるわけだ。 8086 から続く x86 に存在する BCD 補正命令は、下位 4 ビットのみのキャリーフラグである補助キャリーフラグなるものを使っているが、8 ビットに 1 桁なら補助キャリーフラグがなくても何とかなるんだな、と。 (厳密には 5 ビットごとでもいけるんだろうがあまり用途がなく...)
晴れ。 寒い日。
【速報】東京・小金井市の2階建て住宅で火事 逃げ遅れていた1人を救助 | TBS NEWS DIG
このニュースを知らずにたまたま現場を通りがかってしまったが、最初に目にしたのは覆面パトカー。 なんかセダンが路上駐車しているな? と思いながら、合図を出してよけ始めた頃、セダンの屋根に赤色灯が出ていることに気づき、ほぇーパトカーか、何かあったんかな、と思ったらその先には消防車が何台かいて、まぁ手前だからいいやと曲がろうとした道は封鎖されていて、そこにも消防車がいた。 その交差点まで来て初めて大事なのに気づき、こりゃあ向こう側の道も無理かな、と即座に転回して反対側の道を使ったんだけど、これが正解。 その時に近くの駐車場にパトカーも赤色灯をつけたまま駐車していることに気づいた。 住宅密集地で道幅があまりなく、火事のあった住宅の前の道と、裏の別の住宅の前の道の両方を封鎖して、両側から救助と消火活動をしていた感じか。 すぐ近くの幼稚園の関係者も影響があったのではないだろうか。 整形外科から帰るときにはだいぶ撤収されていたものの、道の封鎖は続いており、パトカーもまだいたので、鎮火はしたけど現場検証が、みたいな感じだったのかな。 これからはまた乾燥する季節、火の元には気をつけよう。
ポッチが付いた「HHKB Studio」登場。マウス操作可能になり、メカニカルスイッチも初採用 - PC Watch
コンピューター業界では時々話題になる Happy Hacking Keyboard の新製品。 メカニカルスイッチでどう違うのか試し打ちをしたい、みたいなギーク達もいるみたいだけど、自分はもう写真だけでわかるレベルでこんなの使いこなせないので手を出す心配はないw キー配列もだめだし (1 の左に grave accent がない、Shift の下に Ctrl がない、テンキーがない、カーソルキーがない、ファンクションキーがない、etc.)、文字が読めない真っ黒なキーのデザインも好みじゃないし、スイッチがどうのこうの以前の問題。 (今使っている Realforce も黒で好みじゃないデザインだけどこれは中古なので... その前に買った新品 Realforce は白にしていた。あれは使ってみた結果配列がクソだったので売ったけど。)
晴れ。 寒い日。
東京ラーメンフェスタ 2023。 今年も駒沢オリンピック公園の例のやつ。 何やら体育館が工事中のようで雰囲気が違うが広場は変わらない。 去年と違い会場に柵もない。 今回は同級生がやっている店は別の店とのコラボで出店とのことで、珍しい豚骨醤油味だ。 ちょっと濃ゆく感じるというか、関東のラーメンっぽさが少しある。 このコラボはどちらの店でもやっていない豚骨醤油味でいくとのことだ。 なるほど。 若干自分の好みとはズレるかも。 指宿の鰹節のトッピングを入れると美味かった。
もうひとつ。 なんとカリフォルニアの日本ラーメン店が今回ラーメンフェスタに出ているとのことで。 店舗の住所や連絡先がまんまアメリカ合衆国で驚く。 サンディエゴらしい。 豚骨ラーメンだという。 30 枚限定の厚切りチャーシューも注文。 これがね、美味かった! 厚切りじゃないほうのチャーシューもとろとろだし。 さすがは海外進出クラス!
例の FizzBuzz プログラム、意外と IA-32 向けに性能重視で書くのは難しそうだよな、なんてことを考えていたのだけど。
bswap
命令、なんだか新しい命令のような気がしていたが、なんと初めて登場したのは 80486 らしい。
マジか。
昔実家で使っていた Cx486DLC も対応していたんだろうか。
全然知らなかった。
そして、ビット操作系の命令、bt
や bts
や bsf
など数種類があるが、これはなんと 80386 かららしい。
つまり IA-32 にはすべて存在するのだ。
へぇぇぇ。
きのうの xor
から bsr
っていうテクニックは 80386 でも通用するってわけだ。
もちろん、一度に 32 ビットしか扱えない分、64 ビットのようにはいかないけど、bswap
の代わりをガリガリ書くよりはまだ期待ができそうな感じだ。
まぁ、今時のオペレーティングシステムはもはや 80386 に対応しておらず、浮動小数点コプロセッサなしの環境にも対応していないものがほとんどだ。
内蔵の浮動小数点ユニット搭載であれば、便利な 64 ビットデータ置き場になりうる。
さらにさらに。 80486/i486 といえば、キャッシュがついたのが大きな特徴だった。 自分の記憶では、write-through だったと。 Pentium 以降で write-back だと、そんな記憶だった。 ところが、Wikipedia を眺めていたら、ごく一部のモデルのみ i486 に write-back キャッシュがついたものがあったらしい。 えええぇぇ。
80486 や Pentium を DOS で使っていた頃のキャッシュ制御は謎だった。 何しろそのへんの知識が無かったし、Intel のソフトウェアデベロッパーズマニュアル (日本語版) のコピーを初めてゲットしたのもいつ頃だったっけな。 高校入学ぐらいの頃までにゲットしていたら、ニヤニヤしながらキャッシュ制御まわりをいじっていた可能性も微レ存。 ま、いいや。 なぜか当時の data sheet らしきものが検索すると出てきてだな、そこにはキャッシュ制御関連のピンがあるという説明がある。 CPU 自身が出力するキャッシュ禁止関連の信号の他に、CPU に入力される、キャッシュ無効化関連の信号、キャッシュ可能かどうかを示す信号、キャッシュフラッシュさせる信号などがあるらしい。 たぶんだけど、ビデオ RAM なんかはこれでキャッシュ禁止になるようにハードウェアが構成されていた、ってことなんだろうな。 Write-through ならキャッシュされていても問題ない場合もあっただろうけど、PC-98 には EGC という、ビデオ RAM のアクセスに介入するデバイスがついていたから、write-through でも困るんだよね。 今時は MTRR っていうレジスターでキャッシュ禁止のアドレス範囲が設定されているけどね、当時はなかったから。
キャッシュといえば、Cx486DLC はもともとキャッシュがない 80386 の置き換え用だったから、専用のデバイスドライバーでキャッシュを有効にしないといけなくて、いろんなパラメーターがあったのを覚えている。 しかし write-through キャッシュの i486DX2 から Pentium ODP に載せ替えた実家の PC-9821Ap2 の場合は、Pentium ODP のキャッシュはちゃんと write-back になっていたんだろうか? という疑問もある。 当時はなかなかアグレッシブなプロセッサ載せ替え手段があったもんだよな。 ファームウェアアップデートなんてなかったもんね。
i486 の data sheet らしきものには、test registers という記載がある。 なんじゃそりゃ? と今の Intel のマニュアルを見ると、(Pentium と?) i486 には TR3 から TR7 という test registers があったっぽい記載があった。 Test registers の MOV 命令は 80386 にもあったようだ。 ふぇぇぇ。 今は MSR に置き換わったらしい。
晴れ。 出社した。
朝、早めに行ったら、駐輪場があいていた。 とめて、松屋で朝食。 ごはんと半熟卵、を頼めばみそ汁は勝手に付いてくるw 240 円。
職場近くの東急ストアが移転してきれいな新築マンションのテナントに入っていた。 もう何か月も経つが今日初めて行ってみた。 弁当は普通のスーパーの弁当、値段も普通、店内は広々としていて人が多いわけでもなく快適な感じ。 QUICPay+ が使用できる。 オーケーストアだと値段はクソ安いんだが、店内は通路が狭くごちゃごちゃとしていて人が多い感じ。 移転前の東急ストアはだいぶ建物がボロくなっていたので、もうあの建物は建て替えるんだろうなぁ、という感じだが、そういえば駅の反対側にも東急ストアがあって、それもだいぶ建物がボロい。 どうするんだろうね。
バイクで調布 IC〜首都高〜谷田部 IC。 高井戸の渋滞、山手トンネルの混雑、中央環状線から三郷方面への合流までに何カ所か渋滞、三郷料金所手前の渋滞、など。 トンネルの中は暑くて外に出ると寒かったがまぁ。 つくば中央 IC に行ってみようかなーって軽く考えていたが、どんよりとした雲が見えてきて、路面が濡れていて、うっすらと水滴がスクリーンに着くようになって、空気もひんやりとして、これは雨が来るなと思って谷田部 IC で降りたところ、それ以上は降られずに済んだ。 ちょっと道を間違えつつ到着。
ひさびさバーベキュー。 前回参加は 2018 年。 その後 3 年間不開催。 昨年は不参加のため 5 年ぶり。 みんな元気そうでよかった。 つくばで子育て勢は受験絡みが悩ましい感じらしい。 高校のレベルが高いのと低いのにわかれちゃっている? それで中学受験を目指す、みたいな... 考えてみると鹿児島市なんか地方都市で公立高校もたくさんあって適度にレベルも分散していてけっこう恵まれているんだな。
帰りは谷田部 IC〜首都高〜新宿出口。 首都高は中央環状線が工事渋滞の情報を見て都心環状線を選択。 そして都心環状線を走っている時に 4 号線が工事渋滞の情報を知った。 どうも、6 号線あたりにいると 4 号線の情報は出ないんだな。 そういう意味わからん取捨選択は勘弁してほしい。 代々木からと出ていたが、代々木を過ぎたとたん、本当に進まない感じのひどい渋滞だった。 永福まで 25 分? フーン、というところで新宿でさっさと出て、適当に甲州街道に出て、そのまま一般道で帰った。
新宿出口からは左折・左折で、首都高の下まで行って右折が正解なのかな。 逆に行っちゃったから遠回りだったな。
朝の東京は晴れており、つくばは昼頃から晴れており、そして夜に東京に戻ると晴れていたが、濡れたあとがあったのでどうも雨は降ったらしい。 つまりバイクで出かけていながら雨をほぼ回避できたというパターンだった。
朝は雨が降っていた。 あとは晴れ。
きのうのバーベキュー会場の駐車場は未舗装のスペースで、穴ぼこに水たまりができている有様だった。 400X はオフロード車ではないが、最低地上高は 150 mm あり、タイヤも大きいので、うっかり水たまりの上を通過しても何も起きない程度の走行性能はある。 前の NC750X みたいなバカデカトルクはないし、MT なのでクラッチを滑らせればさらに小さなトルクでゆっくり動ける。 しかし、そんな路面でサイドスタンドを使うとすごく傾いて不安になったw のでメインスタンドを使った。 つけていてよかった、メインスタンド。
最近、メインスタンドの立て方にやっと慣れてきた感じがする。 200 kg クラスのバイクはスタンドに単純に体重を載せても簡単にはあがらない。 GSR250S の時から、前後に揺すって勢いであげていたことが多かったけど、最近は方法を変えて、スタンドを踏み込みながら、左リアのグリップとハンドルの左グリップを両手で引っ張り上げるような、そんな感じで立てている。 手を使って足を強く押しつける感じ。 力のかけ方によってはバイクが傾くことがある。 そうならないように、うまいことバランス良く引っ張るのがポイントのようだ。 グラストラッカーのキックペダルを使ってみた時にも、うまくやらないとバイクが傾いてしまうというのがあったけど、自分は何となくそういう力感覚がうまく捉えられるタイプではないようなので、どこを押してどこを引っ張るか、考えて試行錯誤しないといけない。
HP の 3 万円ノートパソコン 14s-dk000、最近 Linux の無線 LAN のデバイスドライバーがパワーマネジメントが云々とカーネルに大量にログを残すようになったので、設定を調べて追加した:
$ cat /etc/NetworkManager/conf.d/a.conf
[connection]
wifi.powersave = 2
# https://github.com/lwfinger/rtw88/issues/61
Ubuntu ではデフォルトでファイルがあってそれを書き換えるという話っぽいのだが、Debian GNU/Linux ではこの conf.d ディレクトリは空だったので、新規作成した。
F1 メキシコ GP 予選。 角田はパワーユニットとギヤボックスの交換のためグリッド降格があり最後尾スタートが確定らしい。 それで、チームメイトのリカルドを引っ張る役目を Q1 と Q2 でこなしていた。 リカルドは Q3 で 4 番手タイムをたたき出した。 今回はアルファタウリのマシンが合っているみたいだな。
テレビアニメ『呪術廻戦』。 38 話。 ういういと姉様とカラス。 24 fps の酔っぱらいじじい最速術師。 領域に対抗する。
テレビアニメ『葬送のフリーレン』。 8 話。 牢の中でもたたかえるんだな、このエルフ。 魔族つよし。
テレビアニメ『オーバーテイク!』。 4 話。 スポンサーの CM 動画が完成。 過去がちょっとずつ明かされていく。 主人公のフォトグラファーは震災の取材による影響が。 ドライバーのほうは父親がレース中に事故死。 フィクションでも、震災は実際の東日本大震災のことを指しているようなので、あれはやっぱりショックだったよなぁ。
テレビアニメ『16bit センセーション ANOTHER LAYER』。 4 話。 たまたまニコニコ動画で見つけた。 ABEMA より配信開始が早いようだ。 1996 年の続き。 雫 for Windows。 キューハチには戻れませんねって、それ PC-9821 だろ。 でも PC-9821 は 640x480 256 色いけたからな、確かに絵のレベルはそれまでとは違っただろう。 ラーメン屋「九州じゃん××」、あそこだなw 泊まり込み。 夏コミ。 未来の "PDA" に教えてもらった、キューハチの時代の終わり。 「コミケ」って言っているな。 1996 年時点で「コミケット」だけじゃなかったんだ。 "PDA" 乾電池で復活w このプログラマーだけ、未来をかいま見てしまっているなw
スーパーフォーミラ 2023 最終戦鈴鹿。 ABEMA 観戦。 2 連戦できのうの 1 戦目は大きなクラッシュがあり赤旗終了して 3 周分の結果が採用されたらしい。 それでポイント差ついちゃったからもう今日は宮田は無難に走ればチャンピオンだったんだけど、まぁ無難に 3 位でチャンピオンを決めた。 ローソンは今日はポールポジションスタートで結果は 2 位、ランキング 3 位。 ガスリーに続き、ルーキーでチャンピオン争いに加わっただけでもめちゃくちゃ優秀だけど、やっぱり、もてぎの失敗はもったいなかったな。
東京ラーメンフェスタの駒沢オリンピック公園、Google Maps でチェックしていると、昼間は「いつもより混んでいます」のグラフが上限に達していたw めっちゃ人多そうだw 夕方頃チェックしたところそれが落ち着いていたので、夜行ってみた。 やはり日曜の夜はみんな帰っちゃって平日夜並になっちゃうのである。 東京らしい人の動きだ。 なにわの金の鶏白湯、麺を口にした時にすこーし臭いがしたかな、という感じだが、あっさりスープはおいしくて飲み干してしまいそうだった。
バイクで世田谷通りから環八に出るルート。 まぁ悪くはないんだが... 帰りに、246 から環八に出るのではなく、246 で多摩川をこえるでもなく、手前のほうで右折して 40km/h 道路 (用賀中町通り) をするすると走っていったら、突き当たりの丁字路が世田谷通りで驚いた。 そりゃまぁ 40km/h なので環八みたいな流れではないけど、信号のサイクルが短いので、実はこっちのほうが早いんじゃないのという気分になった。
インフルエンザ 千葉 埼玉 神奈川 東京 茨城 群馬「注意報レベル」 | NHK
ニュースタイトルは「注意報レベル」でも、記事中の流行分布マップを見たら、明らかに調布・府中・三鷹・小金井・武蔵野・小平あたりが真っ赤っかなんだけど!? 整形外科の受付に出ていたあの感染者数の数字も納得だ。 というかこんなに細かく地域差が現れるんだ。
晴れ。
昼前ぐらいに東京ラーメンフェスタへ。 道がこんでいた。 平日朝はそんなもんか。 国領で工事渋滞、環八通りが普通に渋滞、用賀中町通りは工事渋滞、... 片側交互通行に何カ所も遭遇したぞ... 京都ラーメン、本家 第一旭っていうところの醤油ラーメン、しょっぱかった...
帰りは 246 から二子玉川駅近くの橋を渡って多摩川沿いを帰るルート。 橋の上が渋滞。 多摩川沿いは比較的快適というパターンだった。 246 で多摩川を渡っちゃうと多摩川沿いの道に出るのが難しそうだしな、うまい解決策が見つからないな。
F1 メキシコシティ GP 決勝。 スタートでメキシコ人ドライバーのペレスが前に出そうになったが、3 台並んで 1 コーナーに入っていくのはあぶねーぞと思ったらクラッシュ、自走して戻れたがリタイア。 そこからたんたんと続くレース。 最後尾から追い上げる角田はマグヌッセンとのバトルでもしかしたらウィングを痛めたか、10 秒ものピットインをしてまた最後尾からの追い上げ。 またしばらくたんたんと続いていたが、マグヌッセンの、サスペンショントラブルではないかと思われる変な挙動によるクラッシュでセーフティカーからの赤旗中断。 角田はセーフティカー中にピットインをしなかったので、順位をあげた上に赤旗でタイヤ交換できてもうけもの。 ルクレールはペレスとの接触でウィングが壊れていたが、ピットインでも交換していなかったそれも赤旗で交換しただろう。 残り 35 周ぐらいあるのに、メルセデスやマクラーレンはミディアムタイヤを選択していた。 角田は 8 位を走行していたが、ピアストリとぶつかって最後尾近くに落ちた。 ハミルトンがサインツの後ろで我慢して我慢して 2 位にあがったのと対照的。 まぁ、7 回チャンピオンのメンタルは伊達じゃないね。 今回、赤旗から 35 周ぐらいをミディアムタイヤで走行した上、最後にファステストラップを出していたし。 角田は速さはあるんだけど、なんか一時期のグロージャンみたいな感じに見えなくもない。 リカルドは上手なレースで 7 位入賞。
テレビアニメ『MF ゴースト』。 4 話。 新品タイヤ。 トラクションコントロールをカットする。 江ノ電。 長谷駅。 主人公両親の思い出の写真スポットを探す。 安そうなファミリーレストランでは人がサーブしている。 現実世界から見ると、過去だw やじきた兄弟。 レースに出るガソリン車で店に来ている。 小柏カイさん解説、『頭文字 D』のあの人だ。 Ryo Takahashi のことは知っているがしゃべれないw 取材でイギリスに国際電話をかけまくり... 過去だww 霞ヶ浦ナンバー、湾岸ナンバー。 レーススタート。 ドリフトしてタイヤをあっためる。 まぁ、うん、カートに乗っているともうちょっとタイヤをあっためたいっていう時は確かにあるんだけど、そういう微調整ならあんな漫画みたいなドリフトはさせないなw 普通に負荷がかかれば温度はあがるからな。 ちょっと小回りするみたいな、そういうのでいい。
レンタルカート。 飯能。 3 回乗ってベストタイムは 35.333 秒。
車検シールを貼った。 サイズが大きくなった、と説明されていた気がするけど実物を見てもよくわからない。 昔のどデカいシールに比べたら今のも小さい。 そして貼る位置が変わって、運転席側角に貼ることになっているので、適当にガラスのそのへんをティシューで拭き拭きしてから、貼った。 新しい IC 車検証はバイクで一足先に見ているのと同じようなものだが、コピーのほうはこんなんだったっけ? まぁいいか。
給油した。 162 円/L。 燃費計算 18.8km/L。 燃費表示 19.0km/L。
飯能に向かう途中にエンプティになってしまい、帰りに青梅インターチェンジの近くの給油所で入れようと思ったら、給油所が大混雑。 安いのか。 それで立川のモノレール下のところで給油したら 27 L 以上入った。 32 L タンクだからね、なかなか...
晴れ時々曇り。 寒い日。
エアコンを 25 度自動でつけていたら午前中はちょっとひんやりする時もあったが、夕方頃はかなり快適だった。
スマートフォンの Pokemon Go は何度か起動中に止まる事象に遭遇しているんだけど、普通にアプリの再起動で復活しており、Google Play 開発者サービスの再起動をしないといけない状況には遭遇していない。 2 週間前に書いた事象はたまたまだったのか、それともあの時も Pokemon Go をそっと再起動すれば何とかなったのか、もはやわからない。 その Pokemon Go は今年もハロウィーンイベントがありまぁ不真面目に適当にやった。 何しろ道具箱が上限を 1400 ぐらい突破している状態で、1 日 1 回レイドバトルをしてジムのディスクを回すしか、ポケストップを回すミッションをこなせないのだけど、たまにしかレイドバトルをやらないので...