GCC не выпустит мою инструкцию, я старался избегать веток - PullRequest
0 голосов
/ 06 июня 2019

Мне нужно уменьшить количество веток в коде.Существует бенчмарк, называемый медианой, он имеет некоторый код, подобный следующему:

    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)))
      ]
      ""
      "min\t%0,%1,%2"
      [(set_attr "type" "move")
       (set_attr "mode" "<MODE>")]) 

Это работает в случаепростое сравнение:

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

GCC emit:

    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];

GCC emit:

    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]

Я ценю любую помощь.

1 Ответ

3 голосов
/ 06 июня 2019
    if ( A < B )
        return A = foo[i];
    else
        return B = foo[i]

А?Предполагая, что это внутри функции с именем fx(), почему бы не

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

и упростить fx(), избавившись от использования глобальных переменных A и B в процессе, до

    return foo[i];
...