मैं Computer Systems: A Programmer's Perspective पढ़ रहा हूं और होमवर्क यह वर्णन करना था कि यह एल्गोरिदम कैसे काम करता है।असेंबली में यह 128 बिट पूर्णांक गुणा कैसे काम करता है (x86-64)?
सी समारोह:
void store_prod(__int128 *dest, int64_t x, int64_t y) {
*dest = x * (__int128)y;
}
विधानसभा:
movq %rdx, %rax
cqto
movq %rsi, %rcx
sarq $63, %rcx
imulq %rax, %rcx
imulq %rsi, %rdx
addq %rdx, %rcx
mulq %rsi
addq %rcx, %rdx
movq %rax, (%rdi)
movq %rdx, 8(%rdi)
ret
मैं नहीं जानता कि क्यों यह करता है: xh * yl + yh * xl = value which we add after unsigned multiplication
सिर्फ एक अनुमान: स्थानांतरण यह 128 बिट बनाता है, जब से तुम शुरुआत में 64 बिट्स मिलता है। 1 और -1 संख्या –
की pos/neg का अनुमान लगा रहा है गुणा में दोनों ऑपरेटरों को एक ही प्रकार का होना चाहिए। इसके अंत में, 'x' को' __int128' टाइप करने के लिए प्रचारित किया जाता है, क्योंकि 'y' कास्ट के बाद इस प्रकार का होता है, और '__int128' का पूर्णांक पदोन्नति रैंक' int64_t' की तुलना में अधिक होता है। रूपांतरणों में से एक 'cqto' द्वारा किया जाता है, लेकिन यह केवल' रैक्स' पर काम करता है, इसलिए दूसरा 'सरक' द्वारा परिवर्तित किया जाता है। – EOF
@EOF लेकिन हम 1 या -1 के साथ वाई के निम्न ऑर्डर बिट्स को गुणा क्यों करते हैं? imulq% रैक्स,% आरसीएक्स - सही निर्देश के बाद, यह निर्देश, ठीक है। निम्न आदेश बिट्स के बाद, कोई भी साइन जानकारी नहीं है, हम ऐसा क्यों करते हैं? – denis631