見出し画像

猫娘曰く。0607-サクラのソート2

はおはお。

サクラエディタのソートについて書いたんだです。

ここで気になったままにしてたのが

; 93   : 		return CLogicInt(CNative::GetRawLength() / sizeof(wchar_t));

	movsxd	rax, DWORD PTR [rcx+16]
	shr	rax, 1

でしたの。movsxd って明らかに mov の拡張命令ですよね。

調べてみたら「符号拡張してデータを転送」するとのこと。符号拡張ってのはデータ幅を大きくするよ!ってヤツです。

インテルさん、なになに……?

(https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/EM64T_VOL2_30083502_i.pdf)

ほう。ダブルワードをクワッドwワードに符号拡張するとな。え、それって CPUとしてアリだとしても処理としてどうなの?? たかだか行の文字数を返す関数で…… 。4バイトを 16バイトに拡張転送!

よくわかってないですけど、REX.Wなしの場合は推奨されないって。だったらはじめから使わないほうがいいよね?

ってことで mov 命令が使われるようにしましたよ!

; 94   : 		return CLogicInt(CNative::GetRawLength() >> (sizeof(wchar_t) >> 1));

	mov	eax, DWORD PTR [rcx+16]
	sar	eax, 1

おお、見覚えのあるレジスタ eax が使われてるw

ほんとは O(1) にしたかったのですが、カオスなコードをワタクシにはどうすることもできませんでした。クラスの下層行って上層行って特殊なことして…… 特殊なことしないでっ。

まぁ、ANSI版から Unicode版にしたときの苦労さが見受けられますね💦

sizeof(wchar_t) を使ってつじつま合わせしているところまだまだありそうだなー。

そんなわけで 塵ツモ処理の修正でした。本題はソート

悉く書を信ずれば則ち書無きに如かず