C语言 GCC 不会发出我的指令,我尽量避免分支



我需要减少代码中的分支数量。存在称为中位数的基准测试,它有一些代码,例如:

    if ( A < B )
            return A = foo[i];
        else
            return B = foo[i];

我在机器描述文件 *.md 中编写了一个模式以避免分支:

    (define_insn "smin<GPR:mode>3"
      [
        (set 
          (match_operand:GPR 0 "register_operand" "=r")
            (if_then_else:GPR
          (lt:GPR 
            (match_operand:GPR 1 "register_operand" " r")
            (match_operand:GPR 2 "register_operand" " r"))
        (match_dup 1)
        (match_dup 2)))
      ]
      ""
      "mint%0,%1,%2"
      [(set_attr "type" "move")
       (set_attr "mode" "<MODE>")]) 

它在简单比较的情况下有效:

    if ( A < B )
            return A ;
        else
            return B;

海湾合作委员会发出:

    min a0,a0,a1    # 9 smindi3 [length = 4]
    ret # 21    simple_return   [length = 4]

但是如果我尝试相同,但使用索引变量(数组(:它将不起作用:

    if ( A < B )
            return A = foo[i];
        else
            return B = foo[i];

海湾合作委员会发出:

    blt a0,a1,.L5   # 11    *branch_orderdi [length = 4]
    sd  a1,8(a2)    # 18    *movdi_64bit/4  [length = 4]
    mv  a0,a1   # 8 *movdi_64bit/1  [length = 4]
    ret # 34    simple_return   [length = 4]
    .L5:
    sd  a0,8(a2)    # 13    *movdi_64bit/4  [length = 4]
    ret # 28    simple_return   [length = 4]

我需要 GCC 发出这样的东西:

    min a0,a0,a1    # 9 smindi3 [length = 4]
    sd  a0,8(a2)    # 18    *movdi_64bit/4  [length = 4]
    ret # 34    simple_return   [length = 4]

我感谢任何帮助。

    if ( A < B )
        return A = foo[i];
    else
        return B = foo[i]

哼??假设这是在一个名为fx()的函数中,为什么不呢

if (A < B) A = fx(); else B = fx();

并简化fx(),摆脱使用全局变量AB过程中,以

    return foo[i];

相关内容

  • 没有找到相关文章

最新更新