プログラミングが好きな人は誰でも、この問題の解決策の独自のバージョンを書く義務があります。私も例外ではないと決めました。
に従って、x64 software conventions
変換される番号はにあると想定しXMM0
ます。
ビットアドレス指定にはx64
ビットコードを使用しますx32
。このアドレス指定方法により、両方の方言を利用できます。
スタック値を保存し、段落に沿ったデータポイントを作成して、パフォーマンスを向上させます。
;
mov r9d, esp
lea r8d,[r9d - 70h]
and r8d, 0FFFFFFF0h
mov esp, r8d
FPU
データから解放して準備し、精度の向上と丸めをゼロに設定します。
fsave [esp]
finit
mov dword ptr[esp - dword], 037F0F7Fh
fldcw [esp - dword]
からXMM0
への数をオーバーロードしFPU
ます:
movd qword ptr[esp - xmmword], xmm0
fld qword ptr[esp - xmmword]
番号の小数順を見つけます。
fld st(0)
fxtract
fldl2t
fst st(1)
fdivr st(0),st(2)
frndint
四捨五入を最も近い数値に設定します。
fldcw [esp - word]
数値の順序を保持し、乗算器の10進数の順序を見つけて、数値の有効数字を整数部分に変換します。
fist dword ptr[esp - dword]
movzx edx, word ptr[esp - dword]
mov dword ptr[esp - dword], 10h
fisubr dword ptr[esp - dword]
10進数の乗数を見つけて、それを数値で乗算します。
fmulp st(1),st(0)
fst st(1)
frndint
fsub st(1),st(0)
fld1
fscale
fstp st(1)
fmulp st(2),st(0)
f2xm1
fld1
faddp st(1),st(0)
fmulp st(1),st(0)
frndint
我々は、から生じる数をリロードFPU
レジスタにAX
及びXMM0
、それぞれ、第2及び8後続バイトの大きさ。レジスタに8バイトをロードするときXMM0
、次の段落でスタックポインタを事前に整列させることにより、バイトの順序を同時に変更します。
fbstp tbyte ptr[esp - xmmword]
mov ax, word ptr[esp - qword]
pshuflw xmm0, xmmword ptr[esp - xmmword], 00011011b
状態を復元しますFPU
:
frstor [esp]
0
:
punpcklbw xmm0, xmm0
pshuflw xmm0, xmm0, 10110001b
pshufhw xmm0, xmm0, 10110001b
:
mov dword ptr[esp], 0FF00FF0h
pshufd xmm1, xmmword ptr[esp], 0
pand xmm0, xmm1
psrlw xmm1, 4
movdqa xmm2, xmm1
pand xmm1, xmm0
psrlw xmm1, 4
pandn xmm2, xmm0
paddb xmm1, xmm2
:
pxor xmm0, xmm0
pcmpeqb xmm0, xmm1
:
mov dword ptr[esp], 30303030h
pshufd xmm2, xmmword ptr[esp], 0
paddb xmm1, xmm2
:
mov byte ptr[esp],'-'
btr ax, 0Fh
adc esp, 0
add ax,'.0'
mov word ptr[esp], ax
0
:
movdqu xmmword ptr[esp + word], xmm1
pmovmskb ecx, xmm0
bsf ecx, ecx
add esp, ecx
:
mov ecx,(word + dword)
mov eax, edx
neg dx
jnc @f
cmovns eax, edx
setns dh
:
cmp ax, 0Ah
sbb ecx, ecx
mov dl, 0Ah
div dl
cmp al, 0Ah
sbb ecx, 0
shl eax, 8
shr ax, 8
div dl
add eax, 303030h
lea edx,[edx * 2 + 2B51h]
mov dword ptr[esp + word + ecx + word], eax
mov word ptr[esp + word], dx
EAX
ECX
:
@@: lea ecx,[esp + ecx + qword] sub ecx, r8d mov eax,ecx
XMM1
XMM2
:
movdqa xmm1, xmmword ptr[r8d]
movdqa xmm2, xmmword ptr[r8d + xmmword]
:
mov esp, r9d
.
/ . x64 software conventions
.
- .
- , .
- .
- SIMD
FPU
.
, - .