猫娘曰く。0607-サクラのソート2
はおはお。
サクラエディタのソートについて書いたんだです。
ここで気になったままにしてたのが
; 93 : return CLogicInt(CNative::GetRawLength() / sizeof(wchar_t));
movsxd rax, DWORD PTR [rcx+16]
shr rax, 1
でしたの。movsxd って明らかに mov の拡張命令ですよね。
調べてみたら「符号拡張してデータを転送」するとのこと。符号拡張ってのはデータ幅を大きくするよ!ってヤツです。
インテルさん、なになに……?
ほう。ダブルワードをクワッド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) を使ってつじつま合わせしているところまだまだありそうだなー。
そんなわけで 塵ツモ処理の修正でした。本題はソート。
いいなと思ったら応援しよう!
悉く書を信ずれば則ち書無きに如かず