プログラマのつれづれなるままにプログラマのつれづれなるままに音宮志久が思ったことなどをネタにします。プログラムネタ・数学ネタがメインです。その21件のフィードバックで、昨日書いた文章にちょっと予定外の抜けがあったのでその部分を追加しておきます。追加する可能性もあるので「その2」という題名の付け方になっています。インラインアセンブラの扱いそもそも64bitコードでは基本的にインラインアセンブラを扱うことができません。コンパイラから文句を言われます。これはコードの互換性を保つ上では必須ともいえるので仕方ないと思います。これによって困るのは以下のような場合です。自前で画像圧縮や音楽圧縮などのアルゴリズムを使っていて、その場所でSIMD演算を使用するパターン描画ルーチンでARGBフォーマットでの2Dアルゴリズムを使用するときにSIMD演算を使用するパターンcpuid命令など直接CPUの情報が欲しいときにインラインアセンブラを使用するパターンで、これらのパターンについてみていきます。CPUID系の命令などを使いたいときこのパターンではVisualStudio2005以降であればintrin.hというファイルに組み込み関数形式で必要な関数が定義されています。cpuid命令ですが、インラインアセンブラで記述しようとすると次のような形になります。12],edx}}cpuidasm(cpuinfo,1);で、これはもちろん64bitコードでは「ソースコード内」には記述できません。そのときは代理としてコンパイラ組み込み命令として定義されている__cpuid関数を使用します。intrin.hに定義されている関数のほとんどはコンパイラによって実際の機械語へと直接変換される特性を持っています。<intrin.h>__cpuid(cpuinfo,1);のような形で使用して回避します。同じことができるアセンブラ命令としては例として以下のようなものがあります。排他的に変数をデクリメントする機械語(WinAPIではInterlockedDecrement関数が関数形式で存在する)SIMD命令を使用するパターンSMID命令も同様にして回避することができます。VisualStudio2005以上であればintrin.hを使うことで最低でもSSE2までの命令は組み込み命令としてサポートされますのでこれを使ってインラインアセンブラを「書いた気になる」ことで回避できます。64bitコードでは通常MMXを使用しません。これはMMXの上位命令セットとなるSSE2が常にサポートされていると仮定できるためで、通常はこちらを組み込み命令として使用します。64bitコード上で組み込みMMX命令が使用できないことはないですが、使用は推奨されていませんし、処理速度的にも移行した方がいいと思います。Compilerあたりを参照してください。ゲーム開発レベルではSSE2まであれば十分な速度のコードが作れると思います。いうかSSE2を使っても十分な速度にならないようなコードを作っちゃう方がまずいです。SIMDなどをインラインアセンブラの形式で記述していたコードの場合はその移植に手間をかけることになると思います。今から組む場合はこの時点で組み込みアセンブラを使う形式として再度コードを組み替えた方がいいと思います。組んでしまっているときは変数としてレジスタを宣言する形で無理矢理Cのコードに変換するという方法が使えます。一度自分で組んだことがあるコードならそれほど手間はかからないはずです。lDestPitch;}}見ればわかりますが、命令の本質がまったく変わっていないと思います。(使っているSIMDの順番がそのままになってますし)ま、これを繰り返す「だけ」なのですが、この「だけ」が非常に面倒だと思います。組んでおくのが楽ですね・・・。コンパイルされれば命令の順番が変わることもあるのでアセンブラコード(というか機械語のコード)でこの順番に命令が並ぶわけではないです。ちなみに透過率を使って演算を行うところで誤差が入り込む余地があるルーチンですが、その辺は結果がそれほど間違っていなければ演算の精度よりも高速な処理ができる方を優先するゲーム系のライブラリならではのコードになっています。してもアセンブラコードで書く必要があるコードあるかどうかはわかりませんが、このときはインラインアセンブラではなくアセンブラコードファイル(.asm)を組み込む形にすれば無理矢理通すことはできると思います。こんな必要があるか考える前に組み込み命令で対応するように変化する方がいいと思います。簡単にC#などを使ってそんなことを気にしないで組んでしまうこれは簡単で安全な方法ですね。互換がとりやすい言語で組んだ方がいいと思うときはその方がいいとおもいます。いつのまにやら64bitOSだけではなく128bitOSとかそんなものまで計画されている時代ですので、64bitへの対応コードが一時しのぎになってしまうこともあり得ます。それを避ける意味でも中間言語型やインタプリタ型のコードはそれらの影響を受けないので一考してみる価値があります。いうことで今回は64bitコードへの移植とインラインアセンブラの関係についてちょっと詳しく見てみました。意味がないかもしれませんが・・・。コメントをキャンセルメールアドレスが公開されることはありません。名前メールサイトΔ{{#message}}{{{message}}}{{/message}}{{^message}}送信は失敗しました。{{status_code}})。このフォーム処理機能の開発者に連絡して、このメッセージを改善してください。詳しく{{/message}}{{#message}}{{{message}}}{{/message}}{{^message}}送信は成功したようです。送信が処理されていない場合があります。このフォーム処理機能の開発者に連絡して、このメッセージを改善してください。気になるプログラムネタや数学ネタがあったら書き込みたいのだが残業が長すぎて眠気が全くとれず体調があまりよくない。過労などでぶっ倒れるかもしれない。あと、さすがに独り身が寂しいのでなんとかしたいと考えてはいるのだが...。アクセスカウンタアクセス数:スポンサーリンクモバイルバージョンを。