2012-10-02 6 views
9

मैं कुछ सी कार्यक्रमों को अलग करके उत्पन्न कुछ असेंबली देख रहा हूं और मैं एक अनुकूलन से उलझन में हूं जिसे मैं अक्सर बार-बार देखता हूं।जीसीसी ने घटाव के लिए "उप" के बजाय "ली" क्यों छोड़ा?

जब मैं जीसीसी संकलक पर भी अनुकूलन नहीं है घटाव के लिए subl अनुदेश का उपयोग करता है, लेकिन जब मैं की क्या ज़रूरत है अनुकूलन चालू (-O3 सटीक होना करने के लिए) संकलक घटाव के बजाय एक leal अनुदेश का उपयोग करता है, नीचे दिए गए उदाहरण:

बिना अनुकूलन:

83 e8 01  subl $0x1, %eax 
अनुकूलन के साथ

8d 6f ff  leal -0x1(%edi), %ebp 

इनमें से दोनों निर्देश 3 बाइट लंबे हैं, इसलिए मुझे यहां अनुकूलन नहीं दिख रहा है। क्या कोई मेरी मदद कर सकता है और संकलक की पसंद को समझाने की कोशिश कर सकता है?

किसी भी मदद की सराहना की जाएगी।

उत्तर

13

मूल सी कोड को देखे बिना यह बताना मुश्किल है।

लेकिन अगर मुझे लगता है, तो ऐसा इसलिए है क्योंकि leal स्रोत रजिस्टर को नष्ट किए बिना घटाव को बाहर करने की अनुमति देता है।

यह एक अतिरिक्त रजिस्टर चाल बचा सकता है।


पहला उदाहरण:

83 e8 01  subl $0x1, %eax 

अधिलेखित कर देता है %eax जिससे मूल मूल्य को नष्ट करने।

दूसरे उदाहरण:

8d 6f ff  leal -0x1(%edi), %ebp 

भंडार %ebp में %edi - 1%edi भविष्य के उपयोग के लिए संरक्षित है।

+0

मैंने इसे इस परिप्रेक्ष्य से नहीं माना था क्योंकि गैर-अनुकूलित संस्करण केवल घटाव में तत्काल मानों का उपयोग करता है। धन्यवाद, यह बहुत उपयोगी था। –

10

ध्यान रखें कि lea झंडे को प्रभावित नहीं करता है जबकि sub करता है। इसलिए यदि आने वाले निर्देश घटाव द्वारा अद्यतन किए जा रहे झंडे पर निर्भर नहीं हैं तो झंडे को अपडेट करने से भी अधिक कुशलता होगी।

+0

यदि 'लीए 'झंडे को प्रभावित नहीं करता है, तो यह' उप' के बराबर कैसा है? क्या यह झूठ को 'उप' के समान प्रभाव के साथ प्रभावित नहीं करेगा? – crisron

+1

@ क्रिस्रॉन वे बराबर नहीं हैं और विभिन्न उद्देश्यों की सेवा करते हैं। यदि आप साइड इफेक्ट्स नहीं चाहते/चाहते हैं, ली का उपयोग करें, अन्यथा उप का उपयोग करें –

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