2013-05-07 5 views
5

मैंने सुना है कि x86 तुलना निर्देश: cmp x, y एक घटाव करता है और परिणाम के आधार पर विभिन्न झंडे सेट करता है।x86 तुलना निर्देश XR का उपयोग घटाव के बजाय

अब, अगर मैं सिर्फ दो ऑपरेटरों के बराबर परीक्षण करना चाहता हूं तो क्या होगा? एक घटाव के बजाय एक एक्सओआर नहीं कर रहा है बहुत तेजी से? मेरा सवाल यह है कि, क्या कोई निर्देश है जो एक्सओआर के साथ तुलना करता है कि दो ऑपरेंड बराबर हैं या नहीं? शायद यह इस तरह दिखेगा: cmpeq x, y या cmpxor x, y

मुझे लगता है कि अगर मैं सिर्फ cmpxor का उपयोग करके समानता के लिए परीक्षण करना चाहता हूं, तो cmp से तेज़ होगा, जो एक घटाव करता है। क्या ऐसे निर्देश हैं जैसे cmpxor जो मुझे एक गति प्रदान करेगा?

मैं यह भी कहना चाहता हूं कि मुझे पता है कि xorzero flag सेट करेगा। लेकिन अगर मैं xor x, y करता हूं, तो यह x बदल जाएगा। मुझे वह नहीं चाहिए। मैं एक तुलना निर्देश चाहता हूं जो अकेले दोनों ऑपरेशंस छोड़ देगा।

+3

आप क्यों मानते हैं कि एक्सओआर "बहुत तेज" होगा? – jalf

+0

यह "बहुत तेज" नहीं होगा, क्योंकि 'cmp' पहले से ही किसी भी अन्य निर्देश ('xor' सहित) जितना तेज़ है। कुछ μarchs पर, 'cmp' निर्देश को एक आश्रित शाखा निर्देश के साथ सामने के अंत तक एक μop में भी जोड़ा जा सकता है, प्रभावी ढंग से इसे और भी तेज़ बना देता है। यह सब इंटेल के अनुकूलन मैनुअल में प्रलेखित है, जो स्वतंत्र रूप से उपलब्ध है और पढ़ने योग्य है। –

+1

ईरा बैक्सटर ने यह बहुत अच्छा कहा: * तकनीकी रूप से एक एसयूबी को एक्सओआर से अधिक समय लेना चाहिए क्योंकि लेयर को सभी बिट्स के माध्यम से "लहर" करना पड़ता है, जबकि एक्सओआर थोड़ा-सा समानांतर होता है। * यह मेरा तर्क था। – Aaron

उत्तर

11

एक्सओआर, एसयूबी, सीएमपी, टेस्ट जैसे मूल मशीन ऑपरेशंस काफी सरल हैं ताकि वे सभी तेजी से काम कर सकें। उन्होंने एक ही शर्त कोड बिट्स भी सेट किए। तुलना के बराबर के दृष्टिकोण से, इन सभी ने जेड बिट को उसी तरह सेट किया है; अन्य बिट्स अलग-अलग सेट होते हैं क्योंकि ये ऑपरेशन अलग-अलग परिणामों की गणना करते हैं।

x86 CPUs के लिए, इनमें से निष्पादन समय में कोई अंतर नहीं है, क्योंकि वे सभी चिप के माध्यम से समान मार्गों का उपयोग करते हैं। नतीजतन आप उनमें से किसी भी प्रदर्शन दंड के बिना उपयोग कर सकते हैं जहां यह आपके इच्छित उत्तर की गणना करता है। (तकनीकी रूप से एक एसयूबी को एक्सओआर से अधिक समय लेना चाहिए क्योंकि लेयर को सभी बिट्स के माध्यम से "लहर" करना पड़ता है, जबकि एक्सओआर थोड़ा-सा समानांतर होता है। सीपीयू डिजाइनरों ने बेहद तेजी से कैर-कंप्यूटिंग तर्क बनाने के तरीकों का पता लगाया है ताकि प्रभावी समय अंतर महत्वपूर्ण नहीं है। उनके पास ऐसा करने के लिए बड़ी प्रेरणा है, क्योंकि कंप्यूटर जो कुछ करता है वह "जोड़" है])।

एक स्टाइल सम्मेलन के रूप में, यदि आपको लगता है कि आप "दो (मशीन-शब्द-आकार) मानों की तुलना कर रहे हैं", तो आपको शायद सीएमपी निर्देश का उपयोग करना चाहिए, क्योंकि यह आपके कोड के पाठक को क्या सोच रहा है। और इसका लाभ यह है कि यह एक ऑपरेंड में से किसी एक को नष्ट नहीं करता है, जिसे आप अंततः पर्याप्त कोड लिखने के बाद XOR के बजाय इसका उपयोग करने के लिए एक बहुत ही प्रेरक तर्क प्राप्त करेंगे। (टेस्ट में यह अच्छी संपत्ति है, बिट्स की जांच के लिए भी उपयोगी है)।

अन्य प्रकार के मूल्यों की तुलना की जाती है जिसके लिए अन्य x86 निर्देश बेहतर होते हैं: फ़्लोटिंग तुलना, स्ट्रिंग तुलना, वेक्टर रजिस्टर तुलना आदि। ये निर्देश बुनियादी परिचालनों से अलग-अलग समय लेते हैं क्योंकि उन्हें अधिक जटिल चीजें करना चाहिए (जैसे एकाधिक डेटा शब्दों की तुलना)।

+0

क्या आपके पास एक टेबल है जहां कोई निष्पादन समय देख सकता है? मैं इसकी तलाश में था, लेकिन मुझे कोई नहीं मिला। – Devolus

+5

इंटेल के प्रदर्शन अनुकूलन मैनुअल में ऐसी तालिकाएं हैं – jalf

+0

तो 'cmp' और' cmpxor' के बीच वैसे भी गति में कोई अंतर नहीं होगा। यह मेरे प्रश्न का उत्तर देता है, धन्यवाद। – Aaron

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