__int64 a, b ; // アンパック BCD
__int64 c = 0xF6F6F6F6F6F6F6F6, d = 0x0505050505050505,
e = 0x0606060606060606, f = 0x0A0A0A0A0A0A0A0A, g = 0x0F0F0F0F0F0F0F0F ;
__asm
{
movq mm0, a
movq mm1, b
movq mm4, f
paddb mm0, mm1
pcmpgtb mm4, mm0
paddq mm0, c
pand mm0, g
movq mm1, mm0
pcmpgtb mm0, d
pand mm4, mm0
pand mm4, e
psubb mm1, mm4
movq a, mm1 ; a ← result
}
a, b が、上位4ビットに3が入っている形式の場合には c の値を修正するだけでOKのはずです。
また、a - b をするには、b = f - b を計算してから加算すればOKかな…?
因みにキャリーに paddq を使っているので、SSE2 以降ですね、このコードだと。
金の計算と帳票処理なら (スコア:0)
二進化十進 (スコア:1)
良いものは良い。
なんか文句がある人がいるんでしょうか。
Re: (スコア:0)
Re: (スコア:0)
Re: (スコア:2, すばらしい洞察)
Re: (スコア:0)
と不思議に思った数秒後に、
FP-1100のBASICは10進演算していたのを思い出した。(だから遅かったよNE!)
・・・懐かしい思い出をありがとう。
Re: (スコア:1)
Z-80にもDAA命令があるのでBCD演算の実装はまあ、浮動小数の実装と比べて、
そんなに極端な差は出ないと踏んだんでしょうけど、
MSXのユーザーの大半は使ってなかったと言う…。
あと懐かしいといえばNCB(Number Crunch BASIC)てのもありましたねー。
ナンバークランチングをBASICでやろうと言うのも凄い話なんですが(^^;
とにかくBCDを実装した言語はパソコンにも割とあったと言うお話です。
ちなみにIA-32のSIMD命令にもちゃんとBCD演算を考慮した命令(四則演算)は残ってますし、
IBMメインフレームじゃなくても、実装は十分出来ると思うんで
Re: (スコア:1)
IA32のSIMDにBCD命令って何かありましたっけ?
もちろん、整数演算でBCDを実現することは不可能ではないでしょうけど…
Re: (スコア:1)
Re:二進化十進 (スコア:1)
加算だと
a, b が、上位4ビットに3が入っている形式の場合には c の値を修正するだけでOKのはずです。
また、a - b をするには、b = f - b を計算してから加算すればOKかな…?
因みにキャリーに paddq を使っているので、SSE2 以降ですね、このコードだと。
Re:二進化十進 (スコア:1)
>また、a - b をするには、b = f - b を計算してから加算すればOKかな…?
b = 0x090909090909090A - b が正解かな?(汗
ま、いないとは思いますが、使う場合には自己責任でちゃんと動作チェックを…(^^;;;