एक std :: unordered_map <> (https://godbolt.org का उपयोग करके) के लिए आईसीसी 17 जेनरेट कोड को देखकर मुझे बहुत उलझन में छोड़ दिया।आईसीसी इस तरीके से इस लूप को अनलॉक क्यों करता है और अंकगणित के लिए ली का उपयोग करता है?
मैं इस के लिए उदाहरण के नीचे आसुत:
long count(void** x)
{
long i = 0;
while (*x)
{
++i;
x = (void**)*x;
}
return i;
}
-O3 ध्वज के साथ आईसीसी 17 के साथ इस संकलन,, निम्नलिखित disassembly की ओर जाता है:
count(void**):
xor eax, eax #6.10
mov rcx, QWORD PTR [rdi] #7.11
test rcx, rcx #7.11
je ..B1.6 # Prob 1% #7.11
mov rdx, rax #7.3
..B1.3: # Preds ..B1.4 ..B1.2
inc rdx #7.3
mov rcx, QWORD PTR [rcx] #7.11
lea rsi, QWORD PTR [rdx+rdx] #9.7
lea rax, QWORD PTR [-1+rdx*2] #9.7
test rcx, rcx #7.11
je ..B1.6 # Prob 18% #7.11
mov rcx, QWORD PTR [rcx] #7.11
mov rax, rsi #9.7
test rcx, rcx #7.11
jne ..B1.3 # Prob 82% #7.11
..B1.6: # Preds ..B1.3 ..B1.4 ..B1.1
ret #12.10
स्पष्ट कार्यान्वयन की तुलना में (जो जीसीसी और क्लैंग का उपयोग, ओओ 3 के लिए भी), ऐसा लगता है कि कुछ चीजें अलग-अलग होती हैं:
- यह लूप को अनलॉक करता है, वापस लूपिंग से पहले दो कमी के साथ - हालांकि, इसके बीच में एक सशर्त कूद है।
- यह गणित से कुछ के लिए ली का उपयोग करता
- यह जबकि पाश के हर दो पुनरावृत्तियों के लिए एक काउंटर (इंक RDX) रहता है, और तुरंत (Rax और RSI में) हर यात्रा के लिए इसी काउंटरों की गणना करता है
यह सब करने के संभावित लाभ क्या हैं? मुझे लगता है कि शेड्यूलिंग के साथ ऐसा कुछ हो सकता है?
count(void**):
mov rdx, QWORD PTR [rdi]
xor eax, eax
test rdx, rdx
je .L4
.L3:
mov rdx, QWORD PTR [rdx]
add rax, 1
test rdx, rdx
jne .L3
rep ret
.L4:
rep ret
'लीए' के लाभों में शामिल हैं: (1) दो स्रोत संचालन की अनुमति देता है, जिनमें से दोनों परिणाम से भिन्न हो सकते हैं, जबकि 'add' के परिणामस्वरूप एक स्रोत ऑपरेंड परिणाम के समान होना आवश्यक है; साझा स्रोत ऑपरेंड (2) को संरक्षित करने के लिए 'ली' का उपयोग अतिरिक्त 'एमओवी' के उपयोग से बच सकता है, अंतर्निहित स्केल फैक्टर (3) के माध्यम से सरल गुणा की अनुमति देता है, झंडे को प्रभावित नहीं करता है, जिससे अधिक लचीलापन होता है निर्देश शेड्यूलिंग। – njuffa
'ली' का उपयोग समय की शुरुआत के बाद से अंकगणित के लिए किया गया है। असल में, यह 'inc'/'dec' से अधिक जटिल है और' लीए' ऐसा कर सकता है, फिर 'ली' इसे करने का सबसे प्रभावी तरीका है। किस कारण से, यह स्पष्ट नहीं है कि 'ली' के बारे में आपके प्रश्न को किसने प्रेरित किया। यदि आप असेंबली पढ़ सकते हैं, तो आपको पहले से ही 'ली' और इसकी भूमिका के बारे में पता होना चाहिए। – AnT