arm内联程序集输出操作数转换

arm内联程序集输出操作数转换,arm,inline-assembly,neon,Arm,Inline Assembly,Neon,我正在尝试以下代码: glm::vec4 a; asm volatile( "mov r1,#64 \t\n" "vld1.32 q4,[%[input]],r1 \n\t" :[input] "+r" (a.x)) 但它会生成错误“EXC\u BAD\u ACCESS(代码=1,地址=0x0)” 如果我将操作数类型更改为浮点,错误将消失: float a[4]; asm volatile( "mov r1,#64 \t\n" "vld1.32 q4,[%[inp

我正在尝试以下代码:

glm::vec4 a;
asm volatile(
   "mov r1,#64 \t\n"
   "vld1.32 q4,[%[input]],r1 \n\t"
   :[input] "+r" (a.x))
但它会生成错误“EXC\u BAD\u ACCESS(代码=1,地址=0x0)”

如果我将操作数类型更改为浮点,错误将消失:

float a[4];
asm volatile(
   "mov r1,#64 \t\n"
   "vld1.32 q4,[%[input]],r1 \n\t"
   :[input] "+r" (a[0]))

为什么类型很重要?是否可以将glm::vec4强制转换为浮动?我尝试了很多不同的方法,但都不起作用。

我不会说ARM,但您似乎在不让gcc知道的情况下更改了寄存器(
r1
)的值。这不应该被添加为一个重击吗?您是否查看了生成的输出(-S)?如果[input]碰巧选择r1作为其寄存器,可能会发生不好的事情。我实际上包括了clobber(为了简单起见没有在这里添加),但它没有改变任何东西:我仍然有一个错误。我已经看过了反汇编:在这两种情况下都会生成相同的代码,而ARM人员随时都可能发生,因为我在这里,也许您可以描述一下您认为
vld1.32 q4,[%[input]],r1
将要做什么。a.x不就是一个号码吗?如果它是(比如)22,那就意味着
“+r”(a.x)
将22移到通用寄存器(可能是r3)中。在x86世界中执行
vld1.32 q4[r3],r1
看起来就像是从地址22(偏移量64字节)读入q4,该地址可能不是有效的内存位置。也许你的意思是(&a.x)?我只想从a到q4向量加载四个浮点,并在地址上添加一个偏移量,以便在下一步将下一个四个浮点加载到另一个向量寄存器(为了简单起见,这里没有)。我尝试了&a.x,但编译器生成了“asm输出中的无效左值”。我要补充的是,在ARM中,偏移量只是添加到通用寄存器中(读取到q4时没有偏移量)。因此,据我所知,它应该是一个有效的内存位置。我不说ARM,但似乎您在不让gcc知道的情况下更改了寄存器(
r1
)的值。这不应该被添加为一个重击吗?您是否查看了生成的输出(-S)?如果[input]碰巧选择r1作为其寄存器,可能会发生不好的事情。我实际上包括了clobber(为了简单起见没有在这里添加),但它没有改变任何东西:我仍然有一个错误。我已经看过了反汇编:在这两种情况下都会生成相同的代码,而ARM人员随时都可能发生,因为我在这里,也许您可以描述一下您认为
vld1.32 q4,[%[input]],r1
将要做什么。a.x不就是一个号码吗?如果它是(比如)22,那就意味着
“+r”(a.x)
将22移到通用寄存器(可能是r3)中。在x86世界中执行
vld1.32 q4[r3],r1
看起来就像是从地址22(偏移量64字节)读入q4,该地址可能不是有效的内存位置。也许你的意思是(&a.x)?我只想从a到q4向量加载四个浮点,并在地址上添加一个偏移量,以便在下一步将下一个四个浮点加载到另一个向量寄存器(为了简单起见,这里没有)。我尝试了&a.x,但编译器生成了“asm输出中的无效左值”。我要补充的是,在ARM中,偏移量只是添加到通用寄存器中(读取到q4时没有偏移量)。据我所知,它应该是一个有效的内存位置