शायद x86_64 पर एक स्पष्ट उदाहरण प्रदान करने के लिए, -O
ध्वज, फ़ंक्शन के साथ संकलित किया गया
pub fn leet(a : i128) -> i128 {
a + 1337
}
के लिए संकलित करता है
example::leet:
mov rdx, rsi
mov rax, rdi
add rax, 1337
adc rdx, 0
ret
(मेरे मूल पोस्ट के u128
बजाय i128
आपके बारे में पूछा गया था। फ़ंक्शन समान कोड को किसी भी तरह से संकलित करता है, एक अच्छा प्रदर्शन जो हस्ताक्षरित और अहस्ताक्षरित जोड़ आधुनिक सीपीयू पर समान है।)
अन्य लिस्टिंग ने अडॉप्टिमाइज्ड कोड का उत्पादन किया। डिबगर में कदम रखना सुरक्षित है, क्योंकि यह सुनिश्चित करता है कि आप कहीं भी एक ब्रेकपॉइंट लगा सकते हैं और कार्यक्रम की किसी भी रेखा पर किसी भी चर की स्थिति का निरीक्षण कर सकते हैं। यह धीमा और पढ़ने में कठिन है। अनुकूलित संस्करण कोड के बहुत करीब है जो वास्तव में उत्पादन में चलेगा।
a
इस फ़ंक्शन का पैरामीटर 64-बिट रजिस्टर, आरएसआई: आरडीआई की एक जोड़ी में पारित किया गया है। परिणाम रजिस्टरों की एक और जोड़ी में वापस किया जाता है, rdx: rax। कोड की पहली दो पंक्तियाँ योग को आरंभ करती हैं a
।
तीसरी पंक्ति इनपुट के कम शब्द में 1337 जोड़ती है। यदि यह ओवरफ्लो होता है, तो यह सीपीयू के कैरी फ्लैग में 1 ले जाता है। चौथी पंक्ति इनपुट के उच्च शब्द में शून्य जोड़ती है - प्लस 1 अगर यह ले गया है।
आप इसे एक अंकों की संख्या के दो अंकों की संख्या के सरल जोड़ के रूप में सोच सकते हैं
a b
+ 0 7
______
लेकिन आधार में 18,446,744,073,709,551,616 हैं। आप अभी भी सबसे कम "अंक" जोड़ रहे हैं, संभवतः अगले कॉलम पर 1 ले जा रहे हैं, फिर अगले अंक और कैरी को जोड़ सकते हैं। घटाव बहुत समान है।
गुणन को पहचान (2⁶⁴a + b) (2 +c + d) = 2¹²⁸ac + 2 b (विज्ञापन + bc) + bd का उपयोग करना चाहिए, जहाँ इनमें से प्रत्येक गुणनफल उत्पाद के ऊपरी आधे भाग को एक रजिस्टर में और उत्पाद के निचले आधे हिस्से को लौटाता है एक और। उन में से कुछ पद छोड़ दिए जाएंगे, क्योंकि 128 वें से ऊपर बिट्स एक में फिट नहीं u128
होते हैं और खारिज कर दिए जाते हैं। फिर भी, यह कई मशीन निर्देश लेता है। डिवीजन भी कई कदम उठाता है। एक हस्ताक्षरित मूल्य के लिए, गुणन और विभाजन को अतिरिक्त रूप से ऑपरेंड और परिणाम के संकेतों को बदलने की आवश्यकता होगी। वे ऑपरेशन बहुत कुशल नहीं हैं।
अन्य आर्किटेक्चर पर, यह आसान या कठिन हो जाता है। RISC-V एक 128-बिट इंस्ट्रक्शन-सेट एक्सटेंशन को परिभाषित करता है, हालांकि मेरी जानकारी के लिए किसी ने इसे सिलिकॉन में लागू नहीं किया है। इस विस्तार के बिना, RISC-V वास्तुकला मैनुअल एक सशर्त शाखा की सिफारिश करता है:addi t0, t1, +imm; blt t0, t1, overflow
SPARC में x86 के नियंत्रण झंडे की तरह नियंत्रण कोड होते हैं, लेकिन आपको add,cc
उन्हें सेट करने के लिए , एक विशेष निर्देश का उपयोग करना होगा। दूसरी ओर, MIPS आपको यह जांचने की आवश्यकता है कि क्या दो अहस्ताक्षरित पूर्णांकों का योग किसी एक ऑपरेंड से कम है। यदि ऐसा है, तो इसके अलावा बह निकला। कम से कम आप सशर्त शाखा के बिना कैरी बिट के मूल्य में एक और रजिस्टर सेट करने में सक्षम हैं।