Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在NEON Cortex-A8的装配示例中_C++_C_Linux_Eclipse_Gcc - Fatal编程技术网

C++ 在NEON Cortex-A8的装配示例中

C++ 在NEON Cortex-A8的装配示例中,c++,c,linux,eclipse,gcc,C++,C,Linux,Eclipse,Gcc,我正在尝试编译NEON for cortex A8的汇编代码并举例,以便在BeagleBone黑板(BBB)上使用此二进制文件。我使用下面列出的eclipse工具GCC编译器和汇编程序 GCC:armlinux-gnueabi-GCC 汇编程序:arm linux gnueabi as 下面的错误发生在一个示例中,对于我使用的每个示例,我都会发现类似的错误 Description Path Resource Location Type SP not allowed in reg

我正在尝试编译NEON for cortex A8的汇编代码并举例,以便在BeagleBone黑板(BBB)上使用此二进制文件。我使用下面列出的eclipse工具GCC编译器和汇编程序

GCC:armlinux-gnueabi-GCC

汇编程序:arm linux gnueabi as

下面的错误发生在一个示例中,对于我使用的每个示例,我都会发现类似的错误

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
我使用的代码

/************************
*霓虹灯 * ************************/

#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_buffer\n\t"
"   movt        r12, #:upper16:neontest_save_buffer\n\t"
"   stmia       r12, {r4-r11, r13, lr}        @ save registers\n\t"
"   vld1.16     {q1}, [r0:128]\n\t"
"   vld1.16     {q2}, [r1:128]\n\t"
"   vadd.i16    q0, q1, q2\n\t"
"   vst1.32     {q0}, [r2:128]\n\t"
"   movw        r12, #:lower16:neontest_save_buffer\n\t"
"   movt        r12, #:upper16:neontest_save_buffer\n\t"
"   ldmia       r12, {r4-r11, r13, lr}        @ reload all registers and return\n\t"
"finish:\n\t"
    );

}

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("%d\n", out[i]);

  return(0);
}
#包括
__属性(对齐(16)))
无符号短整型数据1[8];
无符号短整型数据2[8];
无符号短整型输出[8];
void*neontest\u save\u缓冲区[16];
无效的
neontest(无符号短整数*a,无符号短整数*b,
无符号短整数*q)
{
__asm__(
movw r12,#:lower16:neontest\u save\u buffer\n\t
movt r12,#:upper16:neontest_save_buffer\n\t
stmia r12,{r4-r11,r13,lr}@save registers\n\t
vld1.16{q1}[r0:128]\n\t
“vld1.16{q2},[r1:128]\n\t”
vadd.i16 q0、q1、q2\n\t
“vst1.32{q0},[r2:128]\n\t”
movw r12,#:lower16:neontest\u save\u buffer\n\t
movt r12,#:upper16:neontest_save_buffer\n\t
ldmia r12,{r4-r11,r13,lr}@重新加载所有寄存器并返回\n\t
“完成:\n\t”
);
}
int
主(空)
{
int i;

对于(i=0;i似乎您正在使用Thumb32模式,在此模式下,
sp不能位于寄存器列表中(从)

如果没有设置新堆栈,为什么需要保存堆栈?
只需尝试从
stm
块和
ldm
块中删除r13即可。

默认编译器使用thumb模式,在命令行中添加“-marm”以ARM模式编译代码:

armlinux gnueabihf 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]\n\t"
"   vld1.16     {q2}, [%[b]:128]\n\t"
"   vadd.i16    q0, q1, q2\n\t"
"   vst1.32     {q0}, [%[q]:128]\n\t"

     : [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("%d\n", out[i]);

  return(0);
}
#包括
__属性(对齐(16)))
无符号短整型数据1[8];
无符号短整型数据2[8];
无符号短整型输出[8];
无效的
neontest(无符号短整数*a,无符号短整数*b,
无符号短整数*q)
{
__挥发性物质(
vld1.16{q1},[%[a]:128]\n\t
vld1.16{q2},[%[b]:128]\n\t
vadd.i16 q0、q1、q2\n\t
vst1.32{q0},[%[q]:128]\n\t
:[q]“+r”(q)
:[a]“r”(a),[b]“r”(b)
:“q0”、“q1”、“q2”
);
}
int
主(空)
{
int i;

对于(i=0;我可以提供一个完整的示例让人们尝试编译吗?