c++ - 程序集用寄存器值替换常量

标签 c++ assembly arm inline-assembly neon

我不是 assembly 专家,所以这可能很简单。

如果我有一条指令需要一个常量值作为参数,如下所示:

VQSHRN.U32 d0,q0,#16

如何用寄存器中的值替换#16,例如r0?该说明甚至可能允许您这样做,但我还没有找到有关该功能的文档。有这样做的常规方法吗?

如果这很重要,我正在编写 ARMv7 程序集并将其与 C++ 代码内联。谢谢。

最佳答案

正如@Michael 所指出的,VQRSHL 是这里合适的逐寄存器移位指令 - 幸运的是,右恰好是负左。我会先使用 VDUPr0 转换为适当的移位值 vector ,然后使用 VQMOVN 进行缩小。所有这些都可以作为内部函数使用,以帮助避免内联汇编的麻烦,就像这样:

vshift = vdupq_n_s32(-shift);
result = vqmovn_u32(vqrshlq_u32(data, vshift));

关于c++ - 程序集用寄存器值替换常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21762977/

相关文章:

c++ - 为什么这段代码会失败? child 不等

linux - 汇编浮点运算

c - 为什么 GCC 为 Cortex-A9 生成 Fxxx 而不是 Vxxx 浮点汇编指令?

linux - Qemu-ARM 用户仿真。使用 Go 时出错

c++ - header 中的 std::vector 大小

c++ - 使用Poco多线程时如何使用信号量保证顺序?

c++ - Poco框架通知中心示例

assembly - 从 FPU 堆栈中删除某些内容的最简单方法

c++ - 我如何正确地将 asm 文件链接到 C++?

linux - 在 ARM 或 powerPC 架构中,是否正在使用 PCI IO 空间?