調べないと寝つきが悪そうな気がしたので、調べてみました。
シェアードソースライセンスで公開されている.NET Frameworkはライブラリのコードは公開されていますが、肝心のCLRのコードは公開されていないので、同じくシェアードソースライセンスで公開されているShared Source Common Language Infrastructure 2.0のソースで調べてみました。
気になる人は上のsscli20\clr\src\bcl\system\decimalcppのDecimalAdd関数あたりを見てもらうのがいいです。
まとめると以下のようになります。
- Decimalのデーターフォーマットの実態はCOMのDecimal型(構造体)
- 四則演算はdecimal.cppの実装としてはビット演算をしていて、プロセッサの整数浮動小数点演算機能は使用していない
- あくまでもrotor(Shared Source Common Language Infrastructure 2.0)での実装ではということ。
ということで、少しは寝つきがよくなりそうなのと、やっぱりこの実装は遅いんだろうねということです。
FaceBookで助言いただいたMS荒井さんには多謝。いつも変なことを考えていてすいません、すいません。
追記(2012/11/01 13:11)
何を調べたかったのかというと、80386のDAAあるいはDAS命令などを.NET FxのランタイムはDecimal型の演算に使用しているのか、DecimalはBCDで、BCD演算なのかという疑問です。結局そうでは無いと言うことが結論なのですが、この辺も調べないとわからないですからね。なんでそんなことを疑問に思うのかは、私がおたくだからです。
INTEL 80386 PROGRAMMER’S REFERENCE MANUAL 1986
http://eriberto.pro.br/files/386intel.pdf
(検索でトップに出てきたリンクなので著作権的に大丈夫かは多少疑問も)
コメント
@ishisaka クラスライブラリのソースだけですか? JITも見ないと実際にILがどうマシン語命令に変換されているかは断言できませんよ? (ニヤリ