在NEON Cortex-A8的组装示例中
In-Assembly example for NEON Cortex-A8
我正在尝试编译并举例说明皮质A8的NEON汇编代码,以便在BeagleBone黑板(BBB)上使用此二进制文件。我使用eclipse工具GCC编译器和下面列出的汇编程序,
GCC:arm linux gneabi GCC
ASSEMBLER:arm-linux-gneabi作为
下面的错误发生在一个例子中,对于我使用的每个例子,我都会发现类似的错误
Description Path Resource Location Type
SP not allowed in register list -- `ldmia r12,{r4-r11,r13,lr}' EXAMPLE_NEON line 61, external location: /tmp/ccTXrczs.s C/C++ Problem
我使用的代码
/************************
*neon.c*************************/
#include <stdio.h>
__attribute__((aligned (16)))
unsigned short int data1[8];
unsigned short int data2[8];
unsigned short int out[8];
void* neontest_save_buffer[16];
void
neontest(unsigned short int *a, unsigned short int *b,
unsigned short int* q)
{
__asm__(
" movw r12, #:lower16:neontest_save_buffernt"
" movt r12, #:upper16:neontest_save_buffernt"
" stmia r12, {r4-r11, r13, lr} @ save registersnt"
" vld1.16 {q1}, [r0:128]nt"
" vld1.16 {q2}, [r1:128]nt"
" vadd.i16 q0, q1, q2nt"
" vst1.32 {q0}, [r2:128]nt"
" movw r12, #:lower16:neontest_save_buffernt"
" movt r12, #:upper16:neontest_save_buffernt"
" ldmia r12, {r4-r11, r13, lr} @ reload all registers and returnnt"
"finish:nt"
);
}
int
main(void)
{
int i;
for (i=0; i<8; i++)
{
data1[i]=i*10;
data2[i]=5;
out[i]=0;
}
neontest(data1, data2, out);
printf("output is: ");
for (i=0; i<7; i++)
{
printf("%d, ", out[i]);
}
printf("%dn", out[i]);
return(0);
}
看起来您使用的是Thumb32模式,其中sp cannot be in the list of registers
(来自[1])。
如果不设置新堆栈,为什么需要保存堆栈?只需尝试从stm
块和ldm
块中删除r13。
默认编译器使用拇指模式,在命令行中添加"-marm"以在ARM模式下编译代码:
arm linux gneabihf gcc-mcpu=cortex-a8-mfpu=neon-marm neon.c
您也可以调整代码,让编译器进行寄存器保存/恢复,这样可以为ARM和thumb2指令集编译代码:
#include <stdio.h>
__attribute__((aligned (16)))
unsigned short int data1[8];
unsigned short int data2[8];
unsigned short int out[8];
void
neontest(unsigned short int *a, unsigned short int *b,
unsigned short int* q)
{
__asm volatile (
" vld1.16 {q1}, [%[a]:128]nt"
" vld1.16 {q2}, [%[b]:128]nt"
" vadd.i16 q0, q1, q2nt"
" vst1.32 {q0}, [%[q]:128]nt"
: [q] "+r" (q)
: [a] "r" (a), [b] "r" (b)
: "q0", "q1", "q2"
);
}
int
main(void)
{
int i;
for (i=0; i<8; i++)
{
data1[i]=i*10;
data2[i]=5;
out[i]=0;
}
neontest(data1, data2, out);
printf("output is: ");
for (i=0; i<7; i++)
{
printf("%d, ", out[i]);
}
printf("%dn", out[i]);
return(0);
}
arm linux gneabihf gcc-mcpu=cortex-a8-mfpu=neon-marm neon2.c
arm linux gneabihf gcc-mcpu=cortex-a8-mfpu=neon-mthumb neon2.c
相关文章:
- ARM NEON aarch64:如何以优化的方式比较和更新 neon 寄存器
- 最终的ARM Linux内存碎片与NEON Copy,但不是memcpy
- 无法在Eclipse Neon.3中同时使用-std = C 11和-l/-l选项
- 如何将 Clang 静态分析器与 Cortex-M 项目一起使用?
- C++中的 ARM Cortex-M 中断处理程序
- Cortex-M0 ASF基础知识
- ARM Neon:如何从uint8x16_t转换为uint8x8x2_t
- C/C++ 远程编译,使用 ELF 的本地调试会话(嵌入式,Cortex-M)
- Eclipse Neon.3 更改类型层次结构/调用层次结构中的颜色
- 如何在ARM Cortex-M芯片上使用STL
- Eigen on ARM Cortex M3 with armcc
- 如何在汇编语言ARM中使用Neon扩展高效地反转数组
- ARM Cortex M Procssor的GNU科学库编译错误
- 防止链接Cortex-M4不必要的STDLIBC++例程
- 拥有带有InfiniBand的Windows Azure A8节点支持如何从一个节点发送N个字节并在另一个节点上接收
- ARM Cortex-A8:使用简单浮点乘法时,来自交叉编译器的不同程序集输出
- 通过ARM NEON程序集最大限度地优化元素乘法
- 在NEON Cortex-A8的组装示例中
- Cortex-A8 强制内存缓存
- Cortex A9 NEON与VFP使用混淆