C语言 无用的 jp / jnp 组装指令x86_64



我试图弄清楚jp/jnp指令在LLVM生成的C代码中有什么用途。样本:

int main(int argc, const char * argv[]) {
    double value = 1.5;
    if (value == 1.5) {
        value = 3.0;
    }
    return 0;
}

组件输出:

Ltmp4:
    movsd   LCPI0_0(%rip), %xmm0
    movl    $0, -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
Ltmp5:
    movsd   %xmm0, -24(%rbp)
Ltmp6:
    movsd   -24(%rbp), %xmm1
    ucomisd %xmm0, %xmm1
    jne LBB0_2
    jp  LBB0_2
## BB#1:
    movabsq $3, %rax
    cvtsi2sdq   %rax, %xmm0
Ltmp7:
    movsd   %xmm0, -24(%rbp)
Ltmp8:
LBB0_2:
    movl    $0, %eax
    popq    %rbp
    retq

jne正在检查是否value != 1.5并跳过作业,但在这种情况下,jp在做什么?

jnejump if not equal的,即如果没有设置零标志,则跳转。 jpjump if parity.

ucomisd定义为比较两个doubles。它将表明它们是以下四种事物之一:无序、相等、大于或小于。

如果数字无序或相等,则设置零标志。因此,jne避免了大于或小于的其余情况。

仅当结果无序时,才设置奇偶校验。jp抓住了这一点。

所以两者一起避免:无序、大于、小于。只留下第四种可能性,相等。

最新更新