1

Xcode 4.4 で次のコードをコンパイルしようとしています。コンパイラが _asm キーワードを認識できるようにするには、このファイルで ARM コンパイルを有効にする必要があることを知っています。そのためには、この翻訳単位のコンパイラ フラグに -marm を追加する必要があると思います。Xcodeでこれを行う方法を知っている人はいますか。これは正しいですか?Xcode 4.4でそれを行う方法を知っている人はいますか?

_asm volatile 
(
 // Store A & B leaving room for q4-q7, which should be preserved
 "vldmia %1, { q0-q3 } \n\t"
 "vldmia %2, { q8-q11 }\n\t"

 // result = first column of B x first row of A
 "vmul.f32 q12, q8, d0[0]\n\t"
 "vmul.f32 q13, q8, d2[0]\n\t"
 "vmul.f32 q14, q8, d4[0]\n\t"
 "vmul.f32 q15, q8, d6[0]\n\t"

 // result += second column of B x second row of A
 "vmla.f32 q12, q9, d0[1]\n\t"
 "vmla.f32 q13, q9, d2[1]\n\t"
 "vmla.f32 q14, q9, d4[1]\n\t"
 "vmla.f32 q15, q9, d6[1]\n\t"

 // result += third column of B x third row of A
 "vmla.f32 q12, q10, d1[0]\n\t"
 "vmla.f32 q13, q10, d3[0]\n\t"
 "vmla.f32 q14, q10, d5[0]\n\t"
 "vmla.f32 q15, q10, d7[0]\n\t"

 // result += last column of B x last row of A
 "vmla.f32 q12, q11, d1[1]\n\t"
 "vmla.f32 q13, q11, d3[1]\n\t"
 "vmla.f32 q14, q11, d5[1]\n\t"
 "vmla.f32 q15, q11, d7[1]\n\t"

 // output = result registers
 "vstmia %0, { q12-q15 }"
 : // no output
 : "r" (output), "r" (a), "r" (b)   // input - note *value* of pointer doesn't change
 : "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" //clobber
 );
4

1 に答える 1

0

.SCコンパイラによってアセンブルされ、プリプロセッサ機能を提供するソースファイルにアセンブラを書くことをお勧めします。また、すべてを引用する必要はなく、Xcodeは何も有効にせずにファイルを受け入れることを意味します。

これは私が使用するソース ファイルの一部です (これは X86-64 ですが、お分かりいただけると思います)。

#ifdef __APPLE__
#define NAME(name) _##name
#else
#define NAME(name) name
#endif

#define IN_ASM
#include "Asm.h"

.data
.align 8

cpu_caps:   .long   0x0

.text
.align 8

C55:        .quad   0x5555555555555555
C33:        .quad   0x3333333333333333
C0F:        .quad   0x0F0F0F0F0F0F0F0F
C01:        .quad   0x0101010101010101

#ifdef __x86_64

.globl NAME(asmInit);
//.type NAME(asmInit), %function
NAME(asmInit):
    pushq %rbx

    movl $1, %eax
    cpuid       // ecx=feature info 1, edx=feature info 2

    xorl %eax, %eax         // prepare return value

    testl $1 << 0, %edx
    jz 1f
    orl $CPUCAP_FPU, %eax

1:
    testl $1 << 23, %edx
    jz 2f
    orl $CPUCAP_MMX, %eax

2:
    testl $1 << 25, %edx
    jz 3f
    orl $CPUCAP_SSE, %eax

3:
    testl $1 << 26, %edx
    jz 4f
    orl $CPUCAP_SSE2, %eax

4:
    testl $1 << 0, %ecx
    jz 5f
    orl $CPUCAP_SSE3, %eax

5:
    testl $1 << 9, %ecx
    jz 6f
    orl $CPUCAP_SSSE3, %eax

6:
    testl $1 << 19, %ecx
    jz 7f
    orl $CPUCAP_SSE4_1, %eax

7:
    testl $1 << 20, %ecx
    jz 8f
    orl $CPUCAP_SSE4_2, %eax

8:
    testl $1 << 23, %ecx
    jz 9f
    orl $CPUCAP_POPCNT, %eax

9:
    movl %eax, cpu_caps(%rip)

    movl $1, %eax           // return true
    popq %rbx
    ret
于 2012-08-01T07:59:19.350 に答える