arm 组件 向量数无效

Posted

技术标签:

【中文标题】arm 组件 向量数无效【英文标题】:arm assembly Invalid number of vectors 【发布时间】:2018-10-08 03:22:52 【问题描述】:

关于armv8中的asm汇编有两个问题。

首先,“向量数量无效”,我的代码如下。

"prfm   pldl1keep, [%7, #64] \n"
"ld1    v0.4s, v1.4s, v2.4s, v3.4s, v4.4s, v5.4s, [%7], #48 \n"

第二,“寄存器大小后缀不匹配”。

"prfm   pldl1keep, [%5, #64] \n"
"ld1    v0.4s, v1.2s, [%7], #24 \n"

我直接google了这两个问题,但得到的答案很少。

【问题讨论】:

您希望这些说明能起到什么作用?您是否在问为什么它们无效,或者如何通过多个指令完成您想要的?此外,这看起来像内联汇编。 %7 来自什么约束,以防万一?编译器在 asm 模板中填写 %7 后,最后的 asm 指令是什么,然后汇编器阻塞了它? 我读的是docs 对吗?看起来 ld1 最多只支持 4 个寄存器。至于不匹配的寄存器大小,您确定可以在一条指令中混合和匹配这样的大小吗?文档表明 2 寄存器变体只能使用 #16 或 #32。 谢谢,你们所有人。你说的对。我将第一个 ld1 指令分成两个 ld1,然后它就可以工作了。而第二个问题,我也把ld1分成了两个ld1(#16和#8),然后就可以了。 请不要张贴代码图片。始终将您的代码作为文本发布,以便其他人可以编译/组装它并重现您的错误。 好主意,但我认为这不是解决此错误的正确方法。 【参考方案1】:

将我的评论(似乎已经回答了这个问题)变成了“答案”,这样这个问题就可以结束了。

根据docs,ld1 最多只支持 4 个寄存器,而您指定 6 个,这将是一个 invalid number of vectors

至于mismatched register size suffix,文档表明 2 寄存器变体只能使用 #16 或 #32,而不是您提供的 #24。也许不支持不匹配的尺寸?

请注意,我对 ARM 的了解不足,无法评论 OP 解决方案的效率。可能还有其他更好的解决方案。但是,这似乎可以解释两条错误消息的原因。

【讨论】:

以上是关于arm 组件 向量数无效的主要内容,如果未能解决你的问题,请参考以下文章

统计学中的自由度是啥意思

将 NEON 组件与非向量函数混合

ARM中的异常中断是如何实现进入中断程序的,比如如何进入...

LINUX-内核-中断分析-中断向量表-arm

ARM中断向量表与响应流程

ARM64 固有的 x86_64 点向量积