C 中的 IF 条件转换为 MIPS
IF condition in C translation to MIPS
我想知道为什么
if(x == y)
用C语言翻译成
'bne' 条件而不是 MIPS 中的 'beq' 条件 ?
暂时忽略条件,考虑这些代码块可能在汇编语言指令流中打印的顺序:
// A
if (x == y) {
// B
}
// C
当x == y
为真时,流程按顺序从A到B再到C。相等时不需要跳转(beq
),因为所需的流程与块在指令流中打印的方式。
当x == y
为假时,在A的末尾,流程必须绕过B直接跳转到C。这就是为什么分支指令在不等式上触发是有意义的( bne
).
当然,这些只是作为这个特定案例的思考过程的例子。
在一般情况下,这些都是实现细节。编译器可以以任何它认为合适的方式打印指令,包括反转条件。 (请记住,由于现代 CPU 管道,编译器成功猜测最可能的执行路径并确保它包含尽可能少的跳转通常是一个强大的优化目标。)
如果条件为假,则分支到if-block,而不是如果条件为真,则执行if-block。
这些听起来很相似,但比较以下内容:
if (x == y)
{
A;
}
B;
等同于 (pseudo-C bne
变体):
if (x != y)
goto not_equal;
A;
not_equal:
B;
仅当 x != y
.
时才会分支
如果你使用 beq
,你会得到这样的结果:
if (x == y)
goto equal;
goto not_equal;
equal:
A;
not_equal:
B;
这两种情况都会分支。
即使没有指令流水线,仅有时分支也比总是分支更有效。
我想知道为什么
if(x == y)
用C语言翻译成
'bne' 条件而不是 MIPS 中的 'beq' 条件 ?
暂时忽略条件,考虑这些代码块可能在汇编语言指令流中打印的顺序:
// A
if (x == y) {
// B
}
// C
当
x == y
为真时,流程按顺序从A到B再到C。相等时不需要跳转(beq
),因为所需的流程与块在指令流中打印的方式。当
x == y
为假时,在A的末尾,流程必须绕过B直接跳转到C。这就是为什么分支指令在不等式上触发是有意义的(bne
).
当然,这些只是作为这个特定案例的思考过程的例子。
在一般情况下,这些都是实现细节。编译器可以以任何它认为合适的方式打印指令,包括反转条件。 (请记住,由于现代 CPU 管道,编译器成功猜测最可能的执行路径并确保它包含尽可能少的跳转通常是一个强大的优化目标。)
如果条件为假,则分支到if-block,而不是如果条件为真,则执行if-block。
这些听起来很相似,但比较以下内容:
if (x == y)
{
A;
}
B;
等同于 (pseudo-C bne
变体):
if (x != y)
goto not_equal;
A;
not_equal:
B;
仅当 x != y
.
如果你使用 beq
,你会得到这样的结果:
if (x == y)
goto equal;
goto not_equal;
equal:
A;
not_equal:
B;
这两种情况都会分支。
即使没有指令流水线,仅有时分支也比总是分支更有效。