我正在尝试在Xcode 4.4中编译以下代码。我知道要使编译器能够识别我必须在此文件上启用ARM编译的_asm关键字,并且我相信要这样做,我必须将-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
);
答案 0 :(得分:0)
我建议将汇编程序编写在.S
源文件中,该文件将由C编译器汇编并提供预处理器功能,也意味着您不需要引用所有内容,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