我注意到在不同的优化级别上,Clang 6有时使用ldp (load neon寄存器对)作为相邻的内存地址vld1霓虹灯加载器。
我试图使用内联程序集手动强制更多的加载对指令。源数组保存在堆栈中,当Clang本身生成ldp指令时,它使用带有偏移量的堆栈指针,但是当我输入带内联程序集的数组及其索引时,它将扩展为地址的x寄存器。然而,这一工作正在导致性能倒退。我相信这是因为读取堆栈更快,但是作为源地址的x寄存器可能指向堆,而堆可能反过来引用堆栈(虽然我不确定),或者它是从堆中的重复数据读取的。这是我现在使用的一个例子。
asm (
"ldp %q[DST1], %q[DST2], [%[SRC]]" "\n"
: [DST1] "=w" (TMP1), [DST2] "=w" (TMP2)
: [SRC] "X" (&K2[8])
);
这就是克郎把它扩展到的东西
ldp q19, q4, [x11]
但是我想使用一个带有偏移地址的堆栈指针,它可以从索引的K2数组变量中自动解析。例如:
ldp q19, q4, [sp,#32]
反汇编代码中堆栈指针地址的偏移量不相邻,因此我不能仅仅硬编码sp寄存器并输入偏移量来加载顺序数据。这是因为Clang 6正在将其他函数使用的其他数组中的相同值合并到堆栈中。
GCC有aarch64机器约束,如k(用于堆栈指针(sp)寄存器)和Ump (用于stp和ldp存储/加载对指令地址),而我从未在GCC或Clang上使用这些指令地址,后者在稀疏的文档中没有等效的约束。
我更喜欢使用Clang 6,因为它生成的代码比GCC 8快6%以上,因为它在性能关键循环中正确地安排了大部分指令。
是否有将索引作为输入输入到内联程序集中的数组,并将其自动解析为具有Clang 6中偏移地址的堆栈指针?
发布于 2019-04-28 02:16:45
您试过使用像[SRC] "m" (K2[8])
这样的内存源操作数吗?否则,您甚至没有告诉编译器,内存内容也是内联asm的输入,因此它可能会重新排序您的asm。商店,或做死商店消除。
让编译器选择寻址模式是"m"
操作数的全部要点。
https://stackoverflow.com/questions/55886461
复制相似问题