我使用riscv gcc来编译这个简单的C程序。

int main()
{
    float a, b, c, d;
    a = 4.0;
    b = 3;
    c = 5.3;
    d = a*b + c;
    return 0;
}

我希望riscv gcc生成浮点乘法加法(fma)指令来计算d,但是gcc生成浮点乘法指令和浮点加法指令。
下面是由risv gcc生成的程序的程序集:
main:
    addi    sp,sp,-32
    sd  s0,24(sp)
    addi    s0,sp,32
    lui a5,%hi(.LC0)
    flw fa5,%lo(.LC0)(a5)
    fsw fa5,-20(s0)
    lui a5,%hi(.LC1)
    flw fa5,%lo(.LC1)(a5)
    fsw fa5,-24(s0)
    lui a5,%hi(.LC2)
    flw fa5,%lo(.LC2)(a5)
    fsw fa5,-28(s0)
    flw fa4,-20(s0)
    flw fa5,-24(s0)
    fmul.s  fa5,fa4,fa5
    flw fa4,-28(s0)
    fadd.s  fa5,fa4,fa5
    fsw fa5,-32(s0)
    li  a5,0
    mv  a0,a5
    ld  s0,24(sp)
    addi    sp,sp,32
    jr  ra
    .size   main, .-main
    .section    .rodata
    .align  2
.LC0:
    .word   1082130432
    .align  2
.LC1:
    .word   1077936128
    .align  2
.LC2:
    .word   1084856730
    .ident  "GCC: (GNU) 8.2.0"

如何强制riscv gcc使用fma指令?

最佳答案

你的编译没有优化。

float fma(float a, float b, float c)
{
    return a*b + c;
}

使用-O3:
fma(float, float, float):
        fmadd.s fa0,fa0,fa1,fa2
        ret

关于c - 为什么不使用融合乘法加法运算?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57248403/

10-11 15:36