2015-01-28 16 views
5

Ich versuche herauszufinden, welchen Zweck /jnp Anweisungen in LLVM-generierten C-Code dienen. Beispiel:Useless jp/jnp Montageanleitung auf x86_64

int main(int argc, const char * argv[]) { 
    double value = 1.5; 

    if (value == 1.5) { 
     value = 3.0; 
    } 

    return 0; 
} 

Assembly Ausgabe:

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 

Die jne wird überprüft, ob value != 1.5 und über die Zuweisung springen, aber was ist die jp in diesem Zusammenhang zu tun?

+1

Ich denke, du hast gesagt, llvm nicht optimierten Code oder etwas zu machen. Es gibt keine Möglichkeit, dass ein Compiler jemals "mov $ 0,% eax" anstelle von "xor% eax,% eax" mit irgendeiner Optimierungsebene ausgibt. Es gibt noch andere böse Sachen in diesem Code: 'movabsq $ 3,% rax 'ist 10 Bytes, verglichen mit' movl $ 3,% eax', hat aber einen völlig identischen Effekt. –

Antwort

10

jne ist jump if not equal, d.h. springe, wenn das Null-Flag nicht gesetzt ist. jp ist jump if parity.

ucomisd ist definiert, um zwei doubles zu vergleichen. Es zeigt an, dass sie eines von vier Dingen sind: ungeordnet, gleich, größer oder kleiner als.

Das Null-Flag wird gesetzt, wenn die Nummern ungeordnet oder gleich sind. So vermeidet die jne die verbleibenden Fälle von größer als oder kleiner als.

Parität wird nur gesetzt, wenn das Ergebnis ungeordnet ist. Die jp fängt das ein.

Also die beiden zusammen vermeiden: ungeordnet, größer als, kleiner als. Laß nur die vierte Möglichkeit, gleich.

+1

Ein Hinweis zur Terminologie: "Ungeordnet" bedeutet, dass die beiden Argumente keine richtige Reihenfolge haben; das heißt, dass mindestens einer von ihnen ein NaN ist. Wenn sie nicht-NaNs und gleich sind, ist das nicht das Gleiche "ungeordnet". – Dolda2000

+0

Das bedeutet jedoch, dass der "jne" den Fall der ungleichen Zahlen erfasst, und der "jp" den Fall, dass sie ungeordnet sind. Dies sind verschiedene Fälle und nicht redundant. – Dolda2000

+0

@ Dolda2000 tatsächlich; ein Versagen der Terminologie hier. Es sind alle drei Flags für ungeordnet gesetzt. – Tommy