为 zig `@mulAdd` 生成 MIPS 指令?

问题描述 投票:0回答:1

系统信息

  • zig 版本 0.12.0-dev.15+1c7798a3c
  • zig 标志:-O ReleaseFast -target mips-linux-gnu

背景

MIPS 新手,试图找出一些简单的示例!

我有以下 zig 代码:

export fn square(num: f32) f32 {
    const result = 2e-3 * num + 1;
    return result;
}

生成程序集:

$CPI0_0:
        .4byte  0x3b03126f
$CPI0_1:
        .4byte  0x3f800000
square:
        lui     $1, %hi($CPI0_0)
        lwc1    $f0, %lo($CPI0_0)($1)
        lui     $1, %hi($CPI0_1)
        lwc1    $f1, %lo($CPI0_1)($1)
        mul.s   $f0, $f12, $f0           # <- here's the multiply!
        jr      $ra
        add.s   $f0, $f0, $f1            # <- here's the add!

如果我更改该 zig 代码以使用内置函数

@mulAdd

export fn square(num: f32) f32 {
    const result = @mulAdd(f32, 2e-3, num, 1);
    return result;
}

它将生成此程序集:

$CPI0_0:
        .4byte  0x3b03126f
square:
        addiu   $sp, $sp, -24           # <- ...what is this add doing?
        sw      $ra, 20($sp)
        lui     $1, %hi($CPI0_0)
        lwc1    $f14, %lo($CPI0_0)($1)
        jal     fmaf                    # <- multiply-then-add instruction?
        lui     $6, 16256
        lw      $ra, 20($sp)
        jr      $ra
        addiu   $sp, $sp, 24            # <- ...is this add undoing the first add?

此版本总共有 9 条指令,而原始版本总共有 7 条指令。

问题

  • @mulAdd
    版本中的乘法指令在哪里?
  • 第二个版本的汇编要点是什么?与第一个版本相比,为什么需要额外的两条指令?
mips zig
1个回答
0
投票

第二个版本调用

fmaf
;这只是一个 C99 函数,而不是内置函数。您看到的附加添加用于移动堆栈指针
$sp
以将参数传递给
fmaf
(并在调用后再次重置它)。

© www.soinside.com 2019 - 2024. All rights reserved.