それはどのように行われますか?どのような手順を踏む必要がありますか? また、考慮すべき落とし穴や落とし穴はありますか?
5 に答える
Apple Devforumsの内部ヘルプのおかげで、これが機能するようになりました。熱心な iPhone 開発者であれば、サインアップする必要があります。
まず最初に、プレーンなasm( ) ではなく __asm__( )です。
次に、XCode はデフォルトで、ARM Thumb 命令セットに対してインライン アセンブリをコンパイルするコンパイル ターゲットを生成するため、usatは適切な命令として認識されませんでした。これを修正するには、ターゲットで「Get Info」を実行します。「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でコンパイルして動作するかどうか教えてください。それが機能する場合、特に ARMv6 アーキテクチャと DSP 拡張機能について、ARM インライン アセンブラで便利なことを行う方法を少し怒鳴ることができます。
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をオフにする必要があります...