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
版本中的乘法指令在哪里?