जब आप XOR दो रजिस्टरों का उत्पादन करने के लिए MIPS R0 को "शून्य" के रूप में उपयोग करते हैं, तो 0 का उत्पादन कैसे करें?


10

मुझे लगता है कि मैं एक सामान्य प्रश्न के उत्तर की तलाश में हूं। मैं यह समझने की कोशिश कर रहा हूं कि एमआइपी आर्किटेक्चर एक रजिस्टर में एक स्पष्ट "शून्य" मूल्य का उपयोग क्यों करता है जब आप केवल अपने खिलाफ किसी भी रजिस्टर को XOR'ing करके उसी चीज को प्राप्त कर सकते हैं। कोई कह सकता है कि ऑपरेशन पहले से ही आपके लिए किया गया है; हालाँकि, मैं वास्तव में ऐसी स्थिति की कल्पना नहीं कर सकता जहाँ आप बहुत सारे "शून्य" मूल्यों का उपयोग कर रहे हों। मैंने हेनेसी के मूल पत्रों को पढ़ा, और यह बिना किसी वास्तविक औचित्य के केवल एक शून्य को तथ्य के रूप में निर्दिष्ट करता है।

क्या शून्य के एक हार्ड-कोडेड बाइनरी असाइनमेंट का तार्किक कारण मौजूद है?

अद्यतन: PIC32MZ में MIPS कोर के लिए xc32-gcc से एक निष्पादन योग्य के 8k में, मेरे पास "शून्य" का एक भी उदाहरण है।

add     t3,t1,zero

वास्तविक उत्तर: मैंने उस व्यक्ति को इनाम दिया है जिसके पास MIPS और कंडीशन कोड्स के बारे में जानकारी थी। उत्तर वास्तव में परिस्थितियों के लिए MIPS वास्तुकला में निहित है। हालाँकि मैं शुरू में इसके लिए समय नहीं देना चाहता था, मैंने ओपनस्पार्क , एमआइपीएस -वी और ओपनपावर (यह दस्तावेज़ आंतरिक था) के लिए वास्तुकला की समीक्षा की और यहां सारांश निष्कर्ष हैं। R0 पाइपलाइन की वास्तुकला के कारण शाखाओं पर तुलना के लिए आवश्यक रजिस्टर करता है।

  • पूर्णांक शून्य और शाखा के खिलाफ तुलना (bgez, bgtz, blez, bltz)
  • पूर्णांक दो रजिस्टरों और शाखा की तुलना करें (beq, bne)
  • पूर्णांक दो रजिस्टरों और जाल की तुलना करता है (teq, tge, tlt, tne)
  • पूर्णांक तुलना रजिस्टर और तत्काल और जाल (टेकी, tgei, tlti, tnei)

यह बस कैसे हार्डवेयर कार्यान्वयन में दिखता है नीचे आता है। MIPS-V मैनुअल से, पृष्ठ 68 पर एक अप्रतिबंधित उद्धरण है:

सशर्त शाखाओं को दो रजिस्टरों के बीच अंकगणितीय तुलना संचालन शामिल करने के लिए डिज़ाइन किया गया था (जैसा कि PA-RISC और Xtensa ISA में भी किया गया है), बजाय कंडिशन कोड (x86, ARM, SPARC, पावरपीसी) का उपयोग करने के लिए, या केवल शून्य के खिलाफ एक रजिस्टर की तुलना करने के लिए ( अल्फा, MIPS), या केवल समानता के लिए दो रजिस्टर (MIPS)। यह डिज़ाइन अवलोकन से प्रेरित था कि एक संयुक्त तुलना-और-शाखा निर्देश एक नियमित पाइपलाइन में स्थित है, अतिरिक्त स्थिति कोड स्थिति या एक अस्थायी रजिस्टर के उपयोग से बचा जाता है, और स्थिर कोड आकार और गतिशील अनुदेश भ्रूण टीआरसी को कम करता है। एक और बिंदु यह है कि शून्य के मुकाबले तुलना के लिए गैर-तुच्छ सर्किट विलंब की आवश्यकता होती है (विशेष रूप से उन्नत प्रक्रियाओं में स्थिर तर्क की चाल के बाद) और इसलिए अंकगणितीय परिमाण की तुलना में लगभग उतना ही महंगा है। फ़्यूस्ड तुलना-और-शाखा निर्देश का एक और लाभ यह है कि शाखाएँ पहले-अंत अनुदेश स्ट्रीम में देखी जाती हैं, और इसलिए पहले से भविष्यवाणी की जा सकती है। इस मामले में हालत कोड के साथ एक डिजाइन के लिए शायद एक फायदा है जहां एक ही स्थिति कोड के आधार पर कई शाखाएं ली जा सकती हैं, लेकिन हमारा मानना ​​है कि यह मामला अपेक्षाकृत दुर्लभ है।

MIPS-V दस्तावेज़ उद्धृत अनुभाग के लेखक पर हिट नहीं करता है। मैं सभी को उनके समय और विचार के लिए धन्यवाद देता हूं।


6
आप अक्सर स्रोत मान के रूप में कुछ ऑपरेशन में 0 मूल्यवान रजिस्टर का उपयोग करना चाहते हैं । यह उन कार्यों से पहले एक रजिस्टर को शून्य करने के लिए कुछ ओवरहेड होगा, इसलिए प्रदर्शन लाभ अगर आप किसी दिए गए शून्य का उपयोग कर सकते हैं बजाय इसे स्वयं बनाने के जब भी जरूरत हो। उदाहरणों में कैरी फ़्लैग शामिल है।
जिमीबी

3
AVR आर्किटेक्चर पर, gcc स्टार्टअप पर r1 को शून्य करने के लिए ध्यान रखता है और कभी भी उस मान को नहीं छूता है, r1 का उपयोग एक स्रोत के रूप में करता है जहाँ एक तत्काल 0 का उपयोग नहीं किया जा सकता है। यहाँ, प्रदर्शन कारणों से संकलक द्वारा सॉफ्टवेयर में समर्पित शून्य रजिस्टर को 'अनुकरण' किया जाता है। (अधिकांश एवीआर में 32 रजिस्टर होते हैं, इसलिए एक (दो, वास्तव में) को अलग करना संभव प्रदर्शन और कोड आकार के लाभों के संबंध में बहुत अधिक खर्च नहीं करता है।)
जिमी बीआर

1
मैं MIPS के बारे में नहीं जानता, लेकिन इसे साफ़ करने के लिए XORing की तुलना में किसी अन्य रजिस्टर में r0 को स्थानांतरित करना तेज़ हो सकता है।
जिम्मी

तो आप इस बिंदु पर असहमत हैं कि शून्य इतनी बार है कि यह रजिस्टर फ़ाइल में एक स्थिति के लायक है? तब शायद आप सही हैं क्योंकि यह सच है कि यह विवादास्पद है और बहुत सारे आईएसएएस हैं जो शून्य रजिस्टर को आरक्षित नहीं करते हैं। रजिस्टर विडों की तरह अन्य विवादास्पद फीचर की तरह, "पुराने दिन" से विंडो, ब्रांच स्लॉट, इंस्ट्रक्शन प्रिडिक्शन ... यदि आप आईएसए डिजाइन करना चाहते हैं, तो आपको तय नहीं करने पर उनका उपयोग नहीं करना है।
user3528438

2
एक पुराने बर्कले आरआईएससी पेपर, आरआईएससी I: एक कम किए गए निर्देश सेट वीएलएसआई कंप्यूटर को पढ़ना दिलचस्प हो सकता है । यह दिखाता है कि हार्ड वायर्ड शून्य रजिस्टर का उपयोग करते हुए, R0, कई वैक्स निर्देशों और एड्रेसिंग मोड को एक ही आरआईएससी निर्देश में लागू करने की अनुमति देता है।
मार्क प्लॉटनिक

जवाबों:


14

RISC CPU पर शून्य-रजिस्टर दो कारणों से उपयोगी है:

यह एक उपयोगी स्थिरांक है

ISA के प्रतिबंधों के आधार पर, आप कुछ निर्देशों को एन्कोडिंग में शाब्दिक रूप से उपयोग नहीं कर सकते हैं, लेकिन आप सुनिश्चित कर सकते हैं कि r0आप 0 प्राप्त करने के लिए इसका उपयोग कर सकते हैं ।

इसका उपयोग अन्य निर्देशों को संश्लेषित करने के लिए किया जा सकता है

यह शायद सबसे महत्वपूर्ण बिंदु है। ISA डिज़ाइनर के रूप में, आप अन्य उपयोगी निर्देशों को संश्लेषित करने में सक्षम होने के लिए एक सामान्य उद्देश्य रजिस्टर को शून्य-रजिस्टर में ट्रेड कर सकते हैं। सिंथेसाइज़िंग निर्देश अच्छा है क्योंकि कम वास्तविक निर्देश होने से, आपको ओपकोड में एक ऑपरेशन को एनकोड करने के लिए कम बिट्स की आवश्यकता होती है, जो कि निर्देश एन्कोडिंग स्पेस में फ़्रीज़-अप स्पेस को मुक्त करता है। आप उस स्थान का उपयोग कर सकते हैं जैसे कि बड़ा पता ऑफ़सेट और / या शाब्दिक।

शून्य-रजिस्टर का शब्दार्थ /dev/zero* निक्स सिस्टम पर जैसा है : इसमें लिखी गई हर चीज को छोड़ दिया जाता है, और आप हमेशा 0 पढ़ते हैं।

आइए देखते हैं कि r0शून्य-रजिस्टर की मदद से हम छद्म निर्देश कैसे दे सकते हैं :

; ### Hypothetical CPU ###

; Assembler with syntax:
; op rd, rm, rn 
; => rd: destination, rm: 1st operand, rn: 2nd operand
; literal as #lit

; On an CPU architecture with a status register (which contains arithmetic status
; flags), `sub` can be used, with r0 as destination to discard result.
cmp rn, rm     ; => sub r0, rn, rm

; `add` instruction can be used as a `mov` instruction:
mov rd, rm     ; => add rd, rm, r0
mov rd, #lit   ; => add rd, r0, #lit

; Negate:
neg rd, rm     ; => sub rd, r0, rm

; On CPU without status flags,
nop            ; => add r0, r0, r0

; RISC-V's `jal` instruction -- Jump and Link: Jump to PC-relative instruction,
; save return address into rd; we can synthesize a `jmp` instruction out of it.
jmp dest       ; => jal r0, dest

; You can even load from an absolute (direct) address, for a usually small range
; of addresses by using a literal offset as an address.
ld rd, addr    ; => ld rd, [r0, #addr]

MIPS का मामला

मैं MIPS निर्देश सेट पर अधिक बारीकी से देखा। छद्म-निर्देशों का एक मुट्ठी भर उपयोग होता है $zero; वे मुख्य रूप से शाखाओं के लिए उपयोग किए जाते हैं। यहाँ कुछ उदाहरण हैं जो मैंने पाया है:

move $rt, $rs          => add $rt, $rs, $zero

not $rt, $rs           => nor $rt, $rs, $zero

b Label                => beq $zero, $zero, Label ; a small relative branch

bgt $rs, $rt, Label    => slt $at, $rt, $rs
                          bne $at, $zero, Label

blt $rs, $rt, Label    => slt $at, $rs, $rt
                          bne $at, $zero, Label

bge $rs, $rt, Label    => slt $at, $rs, $rt
                          beq $at, $zero, Label

ble $rs, $rt, Label    => slt $at, $rt, $rs
                          beq $at, $zero, Label

इस कारण से कि आपने $zeroअपने डिस-कोड में रजिस्टर का केवल एक ही उदाहरण पाया है , शायद यह आपका डिस्सेम्बलर है जो निर्देशों के ज्ञात अनुक्रमों को उनके समकक्ष छद्म-निर्देश में बदलने के लिए पर्याप्त स्मार्ट है।

क्या शून्य-रजिस्टर वास्तव में उपयोगी है?

खैर, जाहिर है, एआरएम को शून्य-रजिस्टर पर्याप्त उपयोगी लगता है कि उनके (कुछ) नए ARMv8-A कोर में, जो AArch64 को लागू करते हैं, अब 64-बिट मोड में एक शून्य-रजिस्टर है; इससे पहले शून्य-रजिस्टर नहीं था। (हालांकि रजिस्टर थोड़ा खास है, कुछ एन्कोडिंग संदर्भों में यह एक शून्य-रजिस्टर है, दूसरों में यह स्टैक पॉइंटर को नामित करता है )


मुझे नहीं लगता कि MIPS झंडे का उपयोग करता है, यह करता है? शून्य रजिस्टर किसी भी सीपीयू रजिस्टरों की सामग्री के संबंध में बिना किसी पते के अतिरिक्त पते को पढ़ने / लिखने की क्षमता को जोड़ता है और "mov तत्काल" -स्टाइल ऑपरेशन की सुविधा में मदद करता है, लेकिन अन्य movs तार्किक या स्वयं के साथ स्रोत द्वारा किया जा सकता है ।
सुपरकैट

1
दरअसल, कोई रजिस्टर है कि अंकगणित झंडे पकड़ है, बजाय तीन निर्देश दिए गए हैं कि मदद का अनुकरण आम सशर्त शाखाओं ( slt, slti, sltu)।
जरमेंदर

MIPS निर्देश सेट को देखते हुए, और यह देखते हुए कि जो मैं समझता हूं कि प्रत्येक निर्देश को उस समय तक प्राप्त किया जाएगा जब तक कि पिछले अनुदेश निष्पादित होता है, मुझे आश्चर्य है कि अगर एक opcode होना मुश्किल होता, जो सीधे कुछ भी नहीं करता, बल्कि यह कहता है कि यदि एक तत्काल-मोड अनुदेश निष्पादित होता है और अगले प्राप्त निर्देश में वह बिट पैटर्न होता है, तो ऑपरेंड के ऊपरी 16 बिट्स को पूर्वनिर्मित निर्देश से लिया जाएगा? 32-बिट तत्काल-मोड संचालन को दो शब्दों और दो चक्रों को खर्च करने के बजाय दो-शब्द दो-चक्र निर्देश के साथ संभाला जाएगा ...
सुपरकैट

... एक ऑपरेंड लोड करना और फिर वास्तव में इसका उपयोग करने के लिए एक तीसरा चक्र।
सुपर

7

अधिकांश ARM / POWER / SPARC कार्यान्वयन में एक छिपा हुआ RAZ रजिस्टर होता है

आप सोच सकते हैं कि ARM32, SPARC आदि में 0 रजिस्टर नहीं है लेकिन वास्तव में वे करते हैं! माइक्रो-आर्किटेक्चर स्तर पर, अधिकांश सीपीयू डिज़ाइन इंजीनियर एक 0 रजिस्टर में जोड़ते हैं जो सॉफ्टवेयर के लिए अदृश्य हो सकता है (एआरएम का शून्य रजिस्टर अदृश्य है) और निर्देश शून्य को व्यवस्थित करने के लिए उस शून्य रजिस्टर का उपयोग करें।

एक विशिष्ट आधुनिक ARM32 डिज़ाइन पर विचार करें, जिसमें एक सॉफ्टवेयर अदृश्य रजिस्टर है, R16 को वायर्ड कहें। 0. ARM32 लोड पर विचार करें, ARM32 लोड इंस्ट्रक्शन के कई मामले इन रूपों में से एक में आते हैं (चर्चा को सामान्य रखने के लिए थोड़ी देर के लिए पूर्व-पोस्ट इंडेक्सिंग पर ध्यान न दें) ) ...

LDR ra, [rb] // NOTE:The ! is optional and represents address writeback.
LDR ra, [rb, rc](!)
LDR ra, [rb, #k](!)

प्रोसेसर के अंदर, यह एक सामान्य को डिकोड करता है

ldr.uop ra, rb, rx, rc, #c // Internal decoded instruction format.

इश्यू स्टेज में प्रवेश करने से पहले जहां रजिस्टर पढ़ा जाता है। ध्यान दें कि आरएक्स अद्यतन पते को लिखने के लिए रजिस्टर का प्रतिनिधित्व करता है। यहाँ कुछ डिकोड उदाहरण हैं:

LDR R0, [R1]      ==> ldr.uop R0, R1, R16, R16, #0 // Writeback to NULL. 
LDR R0, [R1, R2]! ==> ldr.uop R0, R1, R1, R2,   #0 // Writeback to R1.
LDR R0, [R1, #2]  ==> ldr.uop R0, R1, R16, R16, #2 // Writeback to NULL.

सर्किट स्तर पर, सभी तीन भार वास्तव में एक ही आंतरिक निर्देश हैं और इस तरह की ऑर्थोगोनलिटी प्राप्त करने का एक आसान तरीका एक जमीनी रजिस्टर आर 16 बनाना है। चूंकि R16 हमेशा ग्राउंडेड होता है, ये निर्देश स्वाभाविक रूप से बिना किसी अतिरिक्त तर्क के सही ढंग से डिकोड होते हैं। किसी एकल आंतरिक प्रारूप में निर्देशों के वर्ग को मैप करने से सुपरस्केलर कार्यान्वयन में बहुत मदद मिलती है क्योंकि यह तर्क की जटिलता को कम करता है।

एक और कारण एक सुव्यवस्थित तरीके से दूर फेंकने के लिए लिखता है। R16 को केवल गंतव्य रजिस्टर और झंडे सेट करके निर्देश अक्षम किए जा सकते हैं। राइट-बैक आदि को अक्षम करने के लिए किसी अन्य नियंत्रण संकेत को बनाने की कोई आवश्यकता नहीं है।

अधिकांश प्रोसेसर कार्यान्वयन वास्तुकला के बावजूद पाइपलाइन में आरएजेड रजिस्टर मॉडल के साथ समाप्त होते हैं। MIPS पाइपलाइन अनिवार्य रूप से एक बिंदु पर शुरू होती है जो अन्य आर्किटेक्चर में कुछ चरणों में होगी।

MIPS ने सही विकल्प बनाया

इस प्रकार, किसी भी आधुनिक प्रोसेसर कार्यान्वयन में रीड-ए-जीरो रजिस्टर लगभग अनिवार्य है और एमआइपी इसे सॉफ्टवेयर के लिए दृश्यमान बनाता है, निश्चित रूप से यह एक प्लस पॉइंट दिया गया है कि यह आंतरिक डीकोड लॉजिक को कैसे सुव्यवस्थित करता है। MIPS प्रोसेसर के डिजाइनरों को अतिरिक्त RAZ रजिस्टर में जोड़ने की आवश्यकता नहीं है क्योंकि $ 0 पहले से ही जमीन पर है। चूंकि RAZ असेंबलर के लिए उपलब्ध है, MIPS के लिए बहुत सारे psuedo निर्देश उपलब्ध हैं और कोई भी इस बात के बारे में सोच सकता है कि कोड के लिए खुद को डीकोड लॉजिक का हिस्सा पुश करने के बजाय प्रत्येक निर्देश प्रकार के लिए समर्पित प्रारूप बनाने के बजाय RAZ रजिस्टर को सॉफ़्टवेयर से छिपाएँ। अन्य आर्किटेक्चर के साथ के रूप में। RAZ रजिस्टर एक अच्छा विचार है और इसीलिए ARMv8 ने इसे कॉपी किया।

अगर ARM32 में $ 0 रजिस्टर होता, तो डिकोड लॉजिक सरल हो जाता और आर्किटेक्चर गति, क्षेत्र और शक्ति के मामले में बहुत बेहतर होता। उदाहरण के लिए, ऊपर प्रस्तुत LDR के तीन संस्करणों में, केवल 2 प्रारूपों की आवश्यकता होगी। इसी तरह, एमओवी और एमवीएन निर्देशों के लिए डिकोड तर्क को आरक्षित करने की आवश्यकता नहीं है। इसके अलावा, CMP / CMN / TST / TEQ बेमानी हो जाएगा। लघु (MUL) और लंबी गुणा (UMULL / SMULL) के बीच अंतर करने की भी आवश्यकता नहीं होगी क्योंकि लघु गुणन को उच्च रजिस्टर के साथ $ 0 आदि के साथ लंबे गुणा के रूप में माना जा सकता है।

चूंकि MIPS को शुरू में एक छोटी टीम द्वारा डिजाइन किया गया था, इसलिए डिजाइन की सादगी महत्वपूर्ण थी और इस प्रकार $ 0 को स्पष्ट रूप से RISC की भावना में चुना गया था। ARM32 वास्तुशिल्प स्तर पर बहुत सी पारंपरिक CISC सुविधाओं को बरकरार रखता है।


1
सभी ARM32 सीपीयू आपके द्वारा वर्णित तरीके से काम नहीं करते हैं। कुछ के पास अधिक जटिल लोड निर्देशों और / या रजिस्टर पर वापस लिखने के लिए कम प्रदर्शन है। इसलिए वे सभी ठीक उसी तरह से डिकोड नहीं कर सकते।
पीटर कॉर्डेस

6

विस्मयादिबोधक: मैं वास्तव में एमआइपीएस कोडांतरक को नहीं जानता, लेकिन 0-मूल्य रजिस्टर इस वास्तुकला के लिए अद्वितीय नहीं है, और मुझे लगता है कि इसका उसी तरह उपयोग किया जाता है जैसे अन्य आरआईएससी आर्किटेक्चर में मुझे पता है।

0 प्राप्त करने के लिए रजिस्टर पर पंजीकरण करना आपको एक निर्देश का भुगतान करेगा, जबकि पूर्वनिर्धारित 0-मूल्य रजिस्टर का उपयोग नहीं करेगा।

उदाहरण के लिए, mov RX, RYनिर्देश अक्सर के रूप में लागू किया जाता है add RX, RY, R0। 0-मान रजिस्टर के बिना, आपको xor RZ, RZहर बार उपयोग करना होगा mov

एक अन्य उदाहरण cmpनिर्देश है और इसके वेरिएंट (जैसे "तुलना और कूद", "तुलना और चाल", आदि), जहां cmp RX, R0नकारात्मक संख्याओं का परीक्षण करने के लिए उपयोग किया जाता है।


1
के MOV Rx,Ryरूप में लागू करने में कोई समस्या होगी AND Rx,Ry,Ry?
सुपरकैट

3
@ सुपरकैट आप को सांकेतिक शब्दों में बदलना mov RX, Immया mov RX, mem[RY]यदि आपका निर्देश केवल एक तत्काल मूल्य और प्रति निर्देश एक एकल मेमोरी एक्सेस का समर्थन करने में सक्षम नहीं होगा ।
दिमित्री ग्रिगोरीव

मुझे पता नहीं है कि MIPS में कौन सी एड्रेसिंग मोड हैं। मुझे पता है कि ARM में [Rx + Ry << स्केल] और [Rx + disp] मोड हैं, और कुछ निरपेक्ष पतों के लिए उत्तरार्द्ध का उपयोग करने में सक्षम होने के दौरान कुछ मामलों में यह उपयोगी हो सकता है जो आमतौर पर आवश्यक नहीं है। एक सीधे [Rx] मोड को शून्य विस्थापन का उपयोग करके [Rx + disp] के माध्यम से अनुकरण किया जा सकता है। MIPS क्या उपयोग करता है?
सुपरकैट

movएक गरीब उदाहरण है; आप इसे शून्य रजिस्टर के बजाय तत्काल 0 के साथ लागू कर सकते हैं। उदा ori dst, src, 0। लेकिन हाँ, यदि आप नहीं था mov-तत्काल रजिस्टर करने के लिए के लिए एक opcode आवश्यकता होगी addiu $dst, $zero, 1234, की तरह luiहै, लेकिन ऊपरी 16 वर्ष की बजाय कम 16 बिट के लिए और आप उपयोग नहीं कर सका norया subएक संकार्य नहीं / neg निर्माण करने के लिए ।
पीटर कॉर्डेस

@ सुपरकैट: यदि आप अभी भी आश्चर्यचकित हैं: क्लासिक MIPS में केवल एक ही संबोधित मोड है: रजिस्टर + disp16। आधुनिक एमआइपी ने एफपी लोड / स्टोर के लिए 2-रजिस्टर एड्रेसिंग मोड के लिए अन्य ऑपकोड को जोड़ा, सरणी इंडेक्सिंग को तेज किया। (लेकिन अभी भी पूर्णांक लोड / स्टोर के लिए नहीं, हो सकता है कि क्योंकि 2 पते के लिए पूर्णांक रजिस्टर फ़ाइल में अधिक पढ़ने वाले पोर्ट की आवश्यकता हो सकती है + स्टोर के लिए एक डेटा reg + + ऑफसेट के रूप में एक रजिस्टर का उपयोग देखें )
पीटर कॉर्डेस

3

आपके रजिस्टर बैंक के अंत में कुछ जमीन बांधना सस्ता है (यह एक पूर्ण विकसित रजिस्टर बनाने की तुलना में सस्ता है)।

वास्तविक एक्सर करने से गेटों को स्विच करने और फिर रजिस्टर में संग्रहीत करने के लिए थोड़ी शक्ति और समय लगता है, उस लागत का भुगतान क्यों करें जब मौजूदा 0 मूल्य आसानी से उपलब्ध हो सकता है।

आधुनिक cpus में एक (छिपा हुआ) 0-मूल्य रजिस्टर भी होता है जिसे वे xor eax eaxरजिस्टर नामकरण के माध्यम से एक निर्देश के परिणाम के रूप में उपयोग कर सकते हैं ।


6
की वास्तविक लागत R0कुछ तारों को जमींदोज करने में नहीं है बल्कि इस तथ्य में है कि आपको इसके लिए प्रत्येक निर्देश में एक कोड आरक्षित करना होगा जो रजिस्टरों से संबंधित है।
दिमित्री ग्रिगोरीव

Xor एक लाल हेरिंग है। x86- xing केवल x86 पर अच्छा है, जहां CPU मुहावरों को पहचानते हैं और इनपुट पर निर्भरता से बचते हैं। जैसा कि आप बताते हैं, सैंडीब्रिज-परिवार इसके लिए एक यूओपी भी नहीं चलाता है, बस इसे रजिस्टर-रीनेम स्टेज में संभालता है। ( X86 असेंबली में शून्य पर रजिस्टर सेट करने का सबसे अच्छा तरीका क्या है: xor, mov या? )। लेकिन एमआइपी पर, एक रजिस्टर पर झूठ बोलना एक झूठी निर्भरता होगी; मेमोरी निर्भरता आदेश नियम (C ++ का HW समतुल्य std::memory_order_consume) निर्भरता का प्रसार करने के लिए XOR की आवश्यकता होती है।
पीटर कॉर्डेस

यदि आपके पास एक शून्य रजिस्टर नहीं था, तो आप एक रजिस्टर में तत्काल स्थानांतरित करने के लिए एक ओपकोड शामिल करेंगे। जैसे luiकि 16 से नहीं छोड़ा गया, लेकिन फिर भी आप एक निर्देश के साथ रजिस्टर में एक छोटी संख्या रख सकते हैं। झूठी निर्भरता के साथ केवल शून्य की अनुमति देना पागल होगा। (सामान्य MIPS गैर-शून्य मान बनाता है addiu $dst, $zero, 1234या इसके साथ ori, इसलिए आपका "पावर कॉस्ट" तर्क टूट जाता है। यदि आप एक ALU फायरिंग से बचना चाहते हैं, तो आप सॉफ़्टवेयर ADD या OR के बजाय रजिस्टर करने के लिए mov-तत्काल के लिए एक opcode शामिल करेंगे। शून्य के साथ एक तत्काल।)
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.