代码之家  ›  专栏  ›  技术社区  ›  Mark Probst

在PowerPC上有条件地移动

  •  1
  • Mark Probst  · 技术社区  · 15 年前

    PowerPC(32或64)指令集上是否有同等条件移动?显然可以使用条件分支来模拟它,但是我想要一些比它更好的东西。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Chris Waters    15 年前

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

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

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

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

        2
  •  2
  •   Paul R    15 年前

    记住PowerPC是RISC,所以指令集是有意简单的。不过,您可以在IBM“PowerPC编译器编写器指南”(ISBN 0-9649654-0-2)中找到有用的提示-有许多无分支实现条件序列(例如max/min)的示例,这些示例可能会给您一些建议。

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

        3
  •  2
  •   ohmantics    14 年前

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

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

    IBM拥有 selii , selir , selri , selrr AS/400系统中的说明。它们可以在每个源的寄存器或有符号的5位立即数之间进行选择。该决定基于一个特定于AS/400的寄存器。

    摩托罗拉/飞思卡尔在E200和E500系列(可能还有其他系列)中发现了“ISEL APU”。它们使用常规条件寄存器位,但只能从寄存器源中选择。