पर स्पिलिंग पंजीकरण मैं x86-64 असेंबली के साथ कुछ प्रयोग कर रहा हूं।जीसीसी तर्क पंजीकरण x86-64
long myfunc(long a, long b, long c, long d,
long e, long f, long g, long h)
{
long xx = a * b * c * d * e * f * g * h;
long yy = a + b + c + d + e + f + g + h;
long zz = utilfunc(xx, yy, xx % yy);
return zz + 20;
}
gcc -O0 -g
मैं समारोह के विधानसभा की शुरुआत में निम्नलिखित आश्चर्य हुआ के साथ
: इस डमी समारोह संकलित करने के बाद
0000000000400520 <myfunc>:
400520: 55 push rbp
400521: 48 89 e5 mov rbp,rsp
400524: 48 83 ec 50 sub rsp,0x50
400528: 48 89 7d d8 mov QWORD PTR [rbp-0x28],rdi
40052c: 48 89 75 d0 mov QWORD PTR [rbp-0x30],rsi
400530: 48 89 55 c8 mov QWORD PTR [rbp-0x38],rdx
400534: 48 89 4d c0 mov QWORD PTR [rbp-0x40],rcx
400538: 4c 89 45 b8 mov QWORD PTR [rbp-0x48],r8
40053c: 4c 89 4d b0 mov QWORD PTR [rbp-0x50],r9
400540: 48 8b 45 d8 mov rax,QWORD PTR [rbp-0x28]
400544: 48 0f af 45 d0 imul rax,QWORD PTR [rbp-0x30]
400549: 48 0f af 45 c8 imul rax,QWORD PTR [rbp-0x38]
40054e: 48 0f af 45 c0 imul rax,QWORD PTR [rbp-0x40]
400553: 48 0f af 45 b8 imul rax,QWORD PTR [rbp-0x48]
400558: 48 0f af 45 b0 imul rax,QWORD PTR [rbp-0x50]
40055d: 48 0f af 45 10 imul rax,QWORD PTR [rbp+0x10]
400562: 48 0f af 45 18 imul rax,QWORD PTR [rbp+0x18]
gcc
बहुत अजीब फैल सभी तर्क ढेर पर पंजीकृत करता है और उसके बाद ले जाता है उन्हें आगे के संचालन के लिए स्मृति से।
यह केवल -O0
पर होता है (-O1
के साथ कोई समस्या नहीं है), लेकिन फिर भी, क्यों? यह मेरे लिए एंटी-ऑप्टिमाइज़ेशन जैसा दिखता है - gcc
ऐसा क्यों करेगा?
मुझे लगता है कि आप इसे पीछे की ओर ले सकते हैं। मुझे पूरा यकीन है कि उपर्युक्त यह है कि जीसीसी हमेशा (प्रारंभिक रूप से) कोड उत्पन्न करता है, यह केवल सामान्य रूप से इसे नहीं देखेगा क्योंकि इसे आसानी से अनुकूलित किया जाता है (लेकिन निश्चित रूप से केवल ऑप्टिमाइज़ेशन सक्षम होने पर ही)। – user786653
यह विरोधी अनुकूलन नहीं है, यह सिर्फ कोई अनुकूलन नहीं है। – hirschhornsalz
मैंने अभी यह उदाहरण कहीं देखा था: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ :-) –