【问题标题】:Conditional Move on the PowerPCPowerPC 上的条件移动
【发布时间】:2010-04-30 12:53:26
【问题描述】:

PowerPC(32 或 64)指令集是否有条件移动等效项?它显然可以使用条件分支来模拟,但我想要一些性能优于它的东西。

【问题讨论】:

    标签: assembly powerpc machine-language


    【解决方案1】:

    PowerPC 至少有一个浮点条件移动操作 fsel,其工作原理如下:

    fsel f0, f1, f2, f3 // f0 = ( f1 >= 0 ? f2 : f3 )
    

    对于整数值,您可以使用位掩码来“选择”要使用的值。

    Here's a discussion on this topic(底部的整数)

    【讨论】:

    • 可选指令,所以你应该检查它是否存在于你的目标处理器上;)
    【解决方案2】:

    请记住,PowerPC 是 RISC,因此指令集有意简单。您可以在 IBM “PowerPC Compiler Writer's Guide”(ISBN 0-9649654-0-2)中找到有用的提示 - 有许多条件序列(例如 max/min)的无分支实现示例,它们可能会给您一些想法.

    此外,如果您有 AltiVec,并且您的代码可以向量化,那么使用条件移动非常容易,例如比较和vec_sel

    【讨论】:

    • PowerPC 并不简单。我发现 ARM 更加 RISCy,并且“一切都可以是有条件的”方面很好。当我感到无聊并试图在没有表查找的情况下实现快速 CRC32 时,我发现“乘以 blah&1”和“AND with -(blah&1)”的流水线组合最快 - mul 很慢,但指令较少,并且可以运行在与 neg+and 不同的执行单元上。不过还是有点乏味。
    【解决方案3】:

    单独使用fsel 通常会导致异常值(如 NaN 和 Inf)的错误结果。您必须仔细考虑每次比较的结果。

    整数选择已在至少两个 PowerPC 变体中实现。

    IBM 在其 AS/400 系统中有 selii,selir,selri,selrr 指令。这些可以为每个源在寄存器或带符号的 5 位立即数之间进行选择。该决定基于特定于 AS/400 的寄存器。

    摩托罗拉/飞思卡尔拥有 e200 和 e500 系列(可能还有其他)中的“isel APU”。这些使用常规条件寄存器位,但只能从寄存器源中选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多