首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有偏移量的aarch64内联程序集堆栈指针约束内存地址用于Clang 6+

具有偏移量的aarch64内联程序集堆栈指针约束内存地址用于Clang 6+
EN

Stack Overflow用户
提问于 2019-04-28 02:11:42
回答 1查看 489关注 0票数 0

我注意到在不同的优化级别上,Clang 6有时使用ldp (load neon寄存器对)作为相邻的内存地址vld1霓虹灯加载器。

我试图使用内联程序集手动强制更多的加载对指令。源数组保存在堆栈中,当Clang本身生成ldp指令时,它使用带有偏移量的堆栈指针,但是当我输入带内联程序集的数组及其索引时,它将扩展为地址的x寄存器。然而,这一工作正在导致性能倒退。我相信这是因为读取堆栈更快,但是作为源地址的x寄存器可能指向堆,而堆可能反过来引用堆栈(虽然我不确定),或者它是从堆中的重复数据读取的。这是我现在使用的一个例子。

代码语言:javascript
运行
复制
asm (
    "ldp %q[DST1], %q[DST2], [%[SRC]]" "\n"
    : [DST1] "=w" (TMP1), [DST2] "=w" (TMP2)
    : [SRC] "X" (&K2[8])
);

这就是克郎把它扩展到的东西

代码语言:javascript
运行
复制
ldp q19, q4, [x11]

但是我想使用一个带有偏移地址的堆栈指针,它可以从索引的K2数组变量中自动解析。例如:

代码语言:javascript
运行
复制
ldp q19, q4, [sp,#32]

反汇编代码中堆栈指针地址的偏移量不相邻,因此我不能仅仅硬编码sp寄存器并输入偏移量来加载顺序数据。这是因为Clang 6正在将其他函数使用的其他数组中的相同值合并到堆栈中。

GCC有aarch64机器约束,如k(用于堆栈指针(sp)寄存器)和Ump (用于stp和ldp存储/加载对指令地址),而我从未在GCC或Clang上使用这些指令地址,后者在稀疏的文档中没有等效的约束。

我更喜欢使用Clang 6,因为它生成的代码比GCC 8快6%以上,因为它在性能关键循环中正确地安排了大部分指令。

是否有将索引作为输入输入到内联程序集中的数组,并将其自动解析为具有Clang 6中偏移地址的堆栈指针?

EN

回答 1

Stack Overflow用户

发布于 2019-04-28 02:16:45

您试过使用像[SRC] "m" (K2[8])这样的内存源操作数吗?否则,您甚至没有告诉编译器,内存内容也是内联asm的输入,因此它可能会重新排序您的asm。商店,或做死商店消除。

让编译器选择寻址模式是"m"操作数的全部要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55886461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档