【发布时间】:2019-04-16 04:26:06
【问题描述】:
我们正在将主要应用程序从 Arm32 移植到 Arm64。我们的算法经常使用SSAT 和USAT 指令。它们非常有用,可以执行任意大小的左移或右移,然后执行有符号或无符号的饱和到任意位数。这对于图像处理算法非常有用,因为我们可以执行一些生成 32 位整数结果的数学运算,然后从中获取我们需要的任何位(饱和到输出图像的位深度的最大/最小值)一条指令。
这些指令在 Arm64 中莫名其妙地消失了,我们发现的最接近的替代方案是 SQSHRN / UQSHRN / SQSHLN / UQSHLN 执行移位和饱和,但它们执行的饱和度要有限得多(USAT 可以饱和到任何宽度,甚至 7 位;新指令只能饱和到输入宽度的一半,例如,在 32 位输入的情况下为 16 位,这需要额外的处理才能达到所需的结果) .
有人可以解释为什么这些指令被删除,以及有效移植使用它们的现有代码的最佳方法是什么?
【问题讨论】:
-
用 C 语言编写它们的等价物并让编译器翻译该代码?
-
@IraBaxter 在 C 中编写饱和度代码需要一个分支(“如果值超过 255,则将其设置为 255”),这是我宁愿避免深入算法内核的东西。
-
查看我对 255 的限制:codereview.stackexchange.com/a/6504/8792
-
@itaych - 为什么你(r 编译器)不能使用条件指令而不是分支?
-
@TobySpeight 因为 arm64 没有很多这些。您有什么特别的解决方案吗?