I'm trying to figure out what purpose jp
/jnp
instructions serve in LLVM-generated C code. Sample:
int main(int argc, const char * argv[]) {
double value = 1.5;
if (value == 1.5) {
value = 3.0;
}
return 0;
}
Assembly output:
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
The jne
is checking if value != 1.5
and jumping over the assignment, but what is the jp
doing in this context?
mov $0, %eax
instead ofxor %eax, %eax
with any level of optimization. There's other nasty stuff in that code:movabsq $3, %rax
is 10 bytes, compared tomovl $3, %eax
, but has a completely identical effect. – Hemiplegia