IPhoneでインラインアセンブリを行うにはどうすればよいですか?
-
04-07-2019 - |
質問
どのように行われますか?どのステップを踏む必要があり、考慮すべき落とし穴と落とし穴はありますか?
解決
これが機能するようになりました。 Apple Devforums の内部ヘルプのおかげで、専用のIPhone開発者の場合はサインアップしてください。
まず最初に、それは __ asm __()であり、単純な asm()ではありません。
次に、デフォルトでは、XCodeはARM Thumb命令セットに対してインラインアセンブリをコンパイルするコンパイルターゲットを生成するため、 usat は適切な命令として認識されませんでした。これを修正するには、「情報を取得」を実行してください。ターゲット上。 「GCC 4.0-コード生成」セクションまでスクロールします。 [" Thumb用にコンパイルする"]のチェックを外します。 Active SDKを" Device"に設定すると、次のスニペットは問題なくコンパイルされます
inline int asm_saturate_to_255 (int a) {
int y;
__asm__("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
return y;
}
当然、今ではIPhone Simulatorでは動作しません。ただし、 TargetConditionals.h には、#ifdefに対して定義できる定義があります。つまり、 TARGET_OS_IPHONE および TARGET_IPHONE_SIMULATOR です。
他のヒント
かなり多くのARM Cortex-A8アセンブリコードを記述しています。 iPhoneのCPUはARM11(afaik)であるため、コア命令セットは同じです。
正確に何を探していますか?必要に応じて、いくつか例を挙げることができます。
編集:
iPhoneでは、llvm-gccコンパイラを使用する必要があることがわかりました。私の知る限り、GCCのインラインアセンブラ構文を理解する必要があります。その場合、すべてのARMインラインアセンブラチュートリアルはiPhoneでも機能します。
これは非常に最小限のインラインアセンブラー関数です(C)。コンパイルしてiPhoneで動作するかどうか教えてください。うまくいけば、ARMインラインアセンブラで、特にARMv6アーキテクチャとDSP拡張機能で便利なことをする方法を少し暴くことができます。
inline int saturate_to_255 (int a)
{
int y;
asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
return y;
}
次と同等のはずです
inline int saturate_to_255 (int a)
{
if (a < 0) a =0;
if (a > 255) a = 255;
return a;
}
レジスタはインラインasmで明示的に使用することもできます
void foo(void) {
#if TARGET_CPU_ARM64
__asm ("sub sp, sp, #0x60");
__asm ("str x29, [sp, #0x50]");
#endif
}
Thumbは、重いフロート操作を必要としないアプリケーションに推奨されます。 Thumbはコードサイズを小さくし、コードの実行を高速化します。
したがって、3Dゲームなどのアプリケーションでは、Thumbのみをオフにする必要があります...