x86_64

2015-01-28 10 views
5

पर बेकार जेपी/जेएनपी असेंबली निर्देश मैं यह जानने का प्रयास कर रहा हूं कि jp/jnp निर्देश एलएलवीएम से उत्पन्न सी कोड में कौन सा उद्देश्य प्रदान करते हैं। नमूना:x86_64

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 इस संदर्भ में कर रहा है?

+1

मुझे लगता है कि आपने llvm को अनुकूलित कोड या कुछ नहीं करने के लिए कहा था। कोई संकलक कभी भी 'xor% eax,% eax' के बजाय' mov $ 0,% eax' को ऑप्टिमाइज़ेशन के किसी भी स्तर के साथ उत्सर्जित नहीं करेगा। उस कोड में अन्य गंदे सामान हैं: 'movabsq $ 3,% rax'' movl $ 3,% eax' की तुलना में 10 बाइट्स है, लेकिन इसका एक समान प्रभाव है। –

उत्तर

10

jnejump if not equal है, यानी शून्य ध्वज सेट नहीं होने पर कूदें। jpjump if parity है।

ucomisd को दो doubles की तुलना करने के लिए परिभाषित किया गया है। यह इंगित करेगा कि वे चार चीजों में से एक हैं: अनियंत्रित, बराबर, उससे कम या उससे कम।

शून्य ध्वज सेट किया गया है यदि संख्याएं असामान्य या बराबर हैं। तो jne से अधिक या उससे कम के शेष मामलों से बचाता है।

समानता केवल तभी सेट की जाती है जब परिणाम अनियंत्रित हो। jp उसको पकड़ता है।

तो दोनों एक साथ बचें: अनियंत्रित, उससे कम, उससे कम। बराबर की चौथी संभावना छोड़कर।

+1

शब्दावली पर एक नोट: "अनॉर्डर्ड" का अर्थ है कि दो तर्कों के पास कोई रिलेवेट ऑर्डर नहीं है; यानी, उनमें से कम से कम एक NaN है। यदि वे गैर-नाएन और बराबर हैं, तो यह "अनियंत्रित" नहीं है। – Dolda2000

+0

इसका मतलब है कि, 'जेन' संख्याओं के मामले को असमान होने का मामला पकड़ता है, और 'जेपी' उनके मामले को बिना किसी सीमा के पकड़ लेता है। ये अलग-अलग मामले हैं, और अनावश्यक नहीं हैं। – Dolda2000

+0

@ डॉल्डा 2000 वास्तव में; यहां शब्दावली की विफलता। यह सभी तीन झंडे अनियंत्रित के लिए सेट है। – Tommy

संबंधित मुद्दे