ทำไม MIPS ใช้ R0 เป็น“ ศูนย์” เมื่อคุณทำได้เพียง XOR สองรีจิสเตอร์เพื่อสร้าง 0


10

ฉันคิดว่าฉันกำลังมองหาคำตอบสำหรับคำถามเรื่องไม่สำคัญ ฉันพยายามที่จะเข้าใจว่าทำไม MIPS Architecture จึงใช้ค่า "ศูนย์" ที่ชัดเจนในการลงทะเบียนเมื่อคุณสามารถบรรลุสิ่งเดียวกันโดยเพียงแค่ XOR'ing การลงทะเบียนใด ๆ กับตัวเอง อาจกล่าวได้ว่าการดำเนินการเสร็จแล้วสำหรับคุณ อย่างไรก็ตามฉันไม่สามารถจินตนาการถึงสถานการณ์ที่คุณจะใช้ค่า "ศูนย์" จำนวนมากได้ ฉันอ่านเอกสารต้นฉบับของ Hennessey และมันแค่กำหนดค่าศูนย์ให้เป็นเรื่องจริงโดยไม่มีเหตุผลจริงใด ๆ

เหตุผลเชิงตรรกะที่มีการกำหนดเลขฐานสองแบบฮาร์ดโค้ดเป็นศูนย์หรือไม่?

ปรับปรุง: ใน 8k ของปฏิบัติการจาก xc32-gcc สำหรับแกน MIPS ใน PIC32MZ ฉันมีอินสแตนซ์เดียวของ "ศูนย์"

add     t3,t1,zero

คำตอบที่แท้จริง: ฉันได้รับรางวัลสำหรับผู้ที่มีข้อมูลเกี่ยวกับ MIPS และรหัสเงื่อนไข คำตอบนั้นอยู่ในโครงสร้างของ MIPS สำหรับเงื่อนไขต่างๆ แม้ว่าในตอนแรกฉันไม่ต้องการกำหนดเวลาให้กับเรื่องนี้ แต่ฉันได้ตรวจสอบสถาปัตยกรรมสำหรับopensparc , MIPS-Vและ OpenPOWER (เอกสารนี้เป็นภายใน) และนี่คือผลสรุป การลงทะเบียน R0 จำเป็นสำหรับการเปรียบเทียบสาขาเนื่องจากสถาปัตยกรรมของไปป์ไลน์

  • จำนวนเต็มเปรียบเทียบกับศูนย์และสาขา (bgez, bgtz, blez, bltz)
  • จำนวนเต็มเปรียบเทียบการลงทะเบียนสองรายการและสาขา (beq, bne)
  • จำนวนเต็มเปรียบเทียบการลงทะเบียนและกับดักสองรายการ (teq, tge, tlt, tne)
  • จำนวนเต็มเปรียบเทียบการลงทะเบียนและทันทีและกับดัก (teqi, tgei, tlti, tnei)

มันเป็นเพียงวิธีการที่ฮาร์ดแวร์ใช้งาน จากคู่มือ MIPS-V มีคำพูดที่ไม่ได้อ้างถึงในหน้า 68:

สาขาเงื่อนไขถูกออกแบบมาเพื่อรวมการดำเนินการเปรียบเทียบทางคณิตศาสตร์ระหว่างสองรีจิสเตอร์ (เช่นเดียวกับใน PA-RISC และ Xtensa ISA) แทนที่จะใช้รหัสเงื่อนไข (x86, ARM, SPARC, PowerPC) หรือเปรียบเทียบหนึ่งทะเบียนกับศูนย์ ( อัลฟ่า MIPS) หรือสองลงทะเบียนเพื่อความเท่าเทียมกันเท่านั้น (MIPS) การออกแบบนี้ได้รับแรงบันดาลใจจากการสังเกตว่าคำสั่งเปรียบเทียบและสาขารวมเข้ากับไปป์ไลน์ปกติหลีกเลี่ยงสถานะรหัสเงื่อนไขเพิ่มเติมหรือใช้การลงทะเบียนชั่วคราวและลดขนาดรหัสคงที่ อีกจุดหนึ่งคือการเปรียบเทียบกับศูนย์ต้องการวงจรไม่หน่วงเล็กน้อย (โดยเฉพาะหลังจากการเคลื่อนที่ไปที่ตรรกะคงที่ในกระบวนการขั้นสูง) และเกือบจะมีราคาแพงเท่ากับการเปรียบเทียบขนาดทางคณิตศาสตร์ ข้อดีอีกอย่างของการสอนแบบเปรียบเทียบและแยกสาขาคือการสังเกตการแตกกิ่งก้านก่อนหน้านี้ในลำธารการเรียนการสอนส่วนหน้าและสามารถคาดการณ์ได้ก่อนหน้านี้ อาจมีข้อได้เปรียบในการออกแบบที่มีรหัสเงื่อนไขในกรณีที่สามารถนำหลายสาขาขึ้นอยู่กับรหัสเงื่อนไขเดียวกัน แต่เราเชื่อว่ากรณีนี้จะค่อนข้างหายาก

เอกสาร MIPS-V ไม่ได้ตีที่ผู้เขียนของส่วนที่ยกมา ฉันขอบคุณทุกคนสำหรับเวลาและการพิจารณาของพวกเขา


6
บ่อยครั้งที่คุณต้องการใช้การลงทะเบียนที่มีค่า 0 ในการดำเนินการบางอย่างเป็นค่าต้นทาง มันจะมีค่าใช้จ่ายในการลงทะเบียนเป็นศูนย์ก่อนการดำเนินการเหล่านั้นดังนั้นผลประโยชน์ด้านประสิทธิภาพหากคุณสามารถใช้ศูนย์ที่ให้ไว้แทนที่จะสร้างด้วยตัวคุณเองทุกครั้งที่ต้องการ ตัวอย่างรวมถึงการเพิ่มธงพก
JimmyB

3
บนสถาปัตยกรรม AVR นั้น gcc จะทำการเตรียมใช้งาน r1 ให้เป็นศูนย์เมื่อเริ่มต้นและไม่เคยสัมผัสกับค่านั้นอีกครั้งโดยใช้ r1 เป็นแหล่งที่มาซึ่งไม่สามารถใช้ 0 ทันที ที่นี่การลงทะเบียนเป็นศูนย์เฉพาะคือ 'จำลอง' ในซอฟต์แวร์โดยคอมไพเลอร์ด้วยเหตุผลด้านประสิทธิภาพ (AVRs ส่วนใหญ่มีการลงทะเบียน 32 ตัวดังนั้นการตั้งค่าหนึ่ง (สองอัน) จริง ๆ แล้วไม่เสียค่าใช้จ่ายมากนักในเรื่องประสิทธิภาพและขนาดรหัสที่เป็นไปได้)
JimmyB

1
ฉันไม่ทราบเกี่ยวกับ MIPS แต่อาจเร็วกว่าที่จะย้าย r0 ไปยังการลงทะเบียนอื่นเมื่อเทียบกับ XORing ที่การลงทะเบียนเพื่อรับข้อมูล
JimmyB

คุณไม่เห็นด้วยกับประเด็นที่ว่าศูนย์มีความถี่มากจนเสียค่าตำแหน่งในไฟล์ register หรือไม่? ถ้าอย่างนั้นคุณอาจจะพูดถูกเพราะมันเป็นเรื่องจริงที่ถกเถียงกันและมี ISAs จำนวนมากเลือกที่จะไม่จองการลงทะเบียนเป็นศูนย์ เช่นเดียวกับฟีเจอร์แย้งอื่น ๆ ในเวลาเช่น register windows, slot branch, คำสั่งล่วงหน้าจาก "the old days" ... หากคุณต้องการออกแบบ ISA คุณไม่จำเป็นต้องใช้มันหากคุณตัดสินใจที่จะไม่ใช้
user3528438

2
มันอาจจะเป็นที่น่าสนใจที่จะอ่านหนึ่งในเอกสารเก่า Berkeley RISC, RISC ฉัน: ลดชุดคำสั่ง VLSI คอมพิวเตอร์ มันแสดงให้เห็นว่าการใช้การลงทะเบียนศูนย์แบบใช้สายฮาร์ด R0 อนุญาตให้มีคำสั่ง VAX และโหมดการกำหนดแอดเดรสจำนวนมากเพื่อนำไปใช้ในการเรียนการสอน RISC เพียงครั้งเดียว
Mark Plotnick

คำตอบ:


14

zero-register บน RISC CPUs มีประโยชน์ด้วยเหตุผลสองประการ:

มันเป็นค่าคงที่มีประโยชน์

ขึ้นอยู่กับข้อ จำกัด ของ ISA คุณไม่สามารถใช้ตัวอักษรในการเข้ารหัสคำแนะนำบางอย่าง แต่คุณสามารถมั่นใจได้ว่าคุณสามารถใช้สิ่งนั้นr0เพื่อรับ 0

มันสามารถใช้ในการสังเคราะห์คำแนะนำอื่น ๆ

นี่อาจเป็นจุดที่สำคัญที่สุด ในฐานะนักออกแบบ ISA คุณสามารถแลกเปลี่ยนวัตถุประสงค์ทั่วไปลงทะเบียนเป็นศูนย์ลงทะเบียนเพื่อสังเคราะห์คำแนะนำที่มีประโยชน์อื่น ๆ คำแนะนำในการสังเคราะห์นั้นดีเนื่องจากมีคำสั่งจริงน้อยกว่าคุณต้องใช้บิตน้อยกว่าในการเข้ารหัสการดำเนินการใน opcode ซึ่งเพิ่มพื้นที่ว่างในพื้นที่การเข้ารหัสคำสั่ง คุณสามารถใช้พื้นที่นั้นเพื่อให้มีขนาดใหญ่กว่าเช่นออฟเซ็ตและ / หรือตัวอักษรที่ใหญ่กว่า

ซีแมนทิกส์ของ zero-register นั้นเหมือนกับ/dev/zeroในระบบ * nix: ทุกสิ่งที่เขียนลงไปจะถูกละทิ้งและคุณอ่านกลับ 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ลงทะเบียนในการถอดแยกชิ้นส่วนของคุณบางทีมันอาจเป็น disassembler ของคุณที่ฉลาดพอที่จะแปลงลำดับของคำแนะนำที่รู้จักให้เป็นคำสั่งหลอกเทียมของพวกเขา

การลงทะเบียนเป็นศูนย์มีประโยชน์จริง ๆหรือไม่?

เห็นได้ชัดว่า ARM พบว่าการลงทะเบียนเป็นศูนย์มีประโยชน์มากพอสำหรับใน ARMv8-A core ตัวใหม่ที่ใช้ AArch64 ตอนนี้มีการลงทะเบียนเป็นศูนย์ในโหมด 64 บิต ไม่เคยมีการลงทะเบียนเป็นศูนย์มาก่อน (การลงทะเบียนเป็นบิตพิเศษแม้ว่าในการเข้ารหัสบริบทบางอย่างมันเป็นศูนย์ลงทะเบียนในอื่น ๆ มันแทนที่จะกำหนดตัวชี้สแต็ค )


ฉันไม่คิดว่า MIPS ใช้ธงใช่ไหม การลงทะเบียนเป็นศูนย์เพิ่มความสามารถในการอ่าน / เขียน ccess ที่อยู่บางอย่างโดยไม่มีเงื่อนไขโดยไม่คำนึงถึงเนื้อหาของการลงทะเบียน CPU ใด ๆ และช่วยอำนวยความสะดวกในการดำเนินการสไตล์ "mov ทันที" แต่ movs อื่นสามารถทำได้โดยตรรกะหรือแหล่งที่มากับตัวเอง .
supercat

1
อันที่จริงมีการลงทะเบียนที่ถือธงเลขคณิตไม่มีแทนที่จะมีสามคำแนะนำที่จะช่วยให้เลียนแบบทั่วไปสาขาเงื่อนไข ( slt, slti, sltu)
Jarhmander

เมื่อดูชุดคำสั่ง MIPS และจากสิ่งที่ฉันเข้าใจในแต่ละคำสั่งนั้นจะถูกเรียกตามเวลาที่คำสั่งก่อนหน้าดำเนินการฉันสงสัยว่ามันคงยากที่จะมี opcode ที่ไม่ได้ทำอะไรเลยโดยตรง แต่แทนที่จะบอกว่า หากคำสั่งในโหมดทันทีดำเนินการและคำสั่งที่ดึงข้อมูลถัดไปมีรูปแบบบิตนั้นตัว 16 บิตส่วนบนของตัวถูกดำเนินการจะถูกนำมาจากคำสั่งแบบดึงข้อมูลล่วงหน้าหรือไม่ นั่นเป็นการดำเนินการในโหมดทันที 32 บิตที่จะได้รับการจัดการด้วยคำสั่งสองรอบสองคำแทนที่จะต้องใช้คำสองคำและสองรอบ ...
supercat

... กำลังโหลดตัวถูกดำเนินการจากนั้นรอบที่สามเพื่อใช้งานจริง
supercat

7

การใช้งาน ARM / POWER / SPARC ส่วนใหญ่มีการลงทะเบียน RAZ ที่ซ่อนอยู่

คุณอาจคิดว่า ARM32, SPARC และอื่น ๆ ไม่มีการลงทะเบียน 0 แต่ในความเป็นจริงพวกเขาทำ! ในระดับไมโครสถาปัตยกรรมวิศวกรออกแบบ CPU ส่วนใหญ่จะเพิ่มใน 0 register ที่อาจมองไม่เห็นในซอฟต์แวร์

พิจารณาการออกแบบ 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.

ก่อนที่จะเข้าสู่ขั้นตอนปัญหาที่มีการอ่านการลงทะเบียน โปรดทราบว่า rx แสดงถึงรีจิสเตอร์เพื่อลบที่อยู่ที่อัพเดต นี่คือตัวอย่างการถอดรหัส:

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.

ที่ระดับวงจรโหลดทั้งสามเป็นจริงคำสั่งภายในเดียวกันและวิธีที่ง่ายในการรับ orthogonality ชนิดนี้คือการสร้าง register ดิน R16 เนื่องจาก R16 มีการลงกราวด์อยู่เสมอคำแนะนำเหล่านี้จึงถอดรหัสอย่างถูกต้องตามธรรมชาติโดยไม่มีเหตุผลเพิ่มเติม การแม็พคลาสคำสั่งกับรูปแบบภายในเดียวจะช่วยในการนำซูเปอร์คาร์มาใช้อย่างมากเนื่องจากช่วยลดความซับซ้อนของตรรกะ

อีกเหตุผลหนึ่งคือวิธีที่คล่องตัวในการทิ้งงานเขียน คำแนะนำอาจถูกปิดใช้งานโดยเพียงตั้งค่าการลงทะเบียนปลายทางและตั้งค่าสถานะเป็น R16 ไม่จำเป็นต้องสร้างสัญญาณควบคุมอื่น ๆ เพื่อปิดการใช้งานการเขียนกลับเป็นต้น

การใช้งานตัวประมวลผลส่วนใหญ่โดยไม่คำนึงถึงสถาปัตยกรรมจะจบลงด้วยรูปแบบการลงทะเบียน RAZ ก่อนหน้านี้ในท่อ MIPS ไปป์ไลน์เป็นหลักเริ่มต้นที่จุดที่จะอยู่ในสถาปัตยกรรมอื่น ๆ ไม่กี่ขั้นตอนใน

MIPS เป็นตัวเลือกที่เหมาะสม

ดังนั้นการลงทะเบียน read-as-zero เกือบจะเป็นข้อบังคับในการติดตั้งโปรเซสเซอร์ที่ทันสมัยและ MIPS ทำให้ซอฟต์แวร์สามารถมองเห็นได้อย่างแน่นอนเป็นข้อดี นักออกแบบของโปรเซสเซอร์ MIPS ไม่จำเป็นต้องเพิ่มในการลงทะเบียน RAZ พิเศษเนื่องจาก $ 0 มีอยู่แล้ว เนื่องจาก RAZ สามารถใช้งานได้กับแอสเซมเบลอร์คำสั่ง psuedo จำนวนมากมีให้ MIPS และสามารถคิดได้ว่านี่เป็นการผลักดันส่วนหนึ่งของตรรกะการถอดรหัสไปยังแอสเซมเบลอร์เองแทนที่จะสร้างรูปแบบเฉพาะสำหรับแต่ละคำสั่ง เช่นเดียวกับสถาปัตยกรรมอื่น ๆ การลงทะเบียน RAZ เป็นความคิดที่ดีและนั่นเป็นสาเหตุที่ ARMv8 คัดลอกมา

ถ้า ARM32 มีการลงทะเบียน $ 0 ลอจิกการถอดรหัสจะง่ายขึ้นและสถาปัตยกรรมจะดีขึ้นมากในแง่ของความเร็วพื้นที่และพลังงาน ตัวอย่างเช่น LDR ทั้งสามเวอร์ชันที่แสดงด้านบนจะมีเพียง 2 รูปแบบเท่านั้นที่จำเป็น ในทำนองเดียวกันไม่จำเป็นต้องสำรองตรรกะถอดรหัสสำหรับคำแนะนำ MOV และ MVN นอกจากนี้ CMP / CMN / TST / TEQ ก็จะกลายเป็นซ้ำซ้อน นอกจากนี้ยังไม่จำเป็นต้องแยกความแตกต่างระหว่าง short (MUL) และการคูณแบบยาว (UMULL / SMULL) เนื่องจากการคูณแบบสั้นนั้นถือได้ว่าเป็นการคูณแบบยาวด้วยการลงทะเบียนสูงที่ตั้งไว้ที่ $ 0 เป็นต้น

ตั้งแต่เริ่มแรก MIPS ได้รับการออกแบบโดยทีมเล็ก ๆ ความเรียบง่ายของการออกแบบจึงมีความสำคัญและทำให้ $ 0 ได้รับเลือกอย่างชัดเจนในจิตวิญญาณของ RISC ARM32 ยังคงคุณสมบัติ CISC ดั้งเดิมไว้มากมายในระดับสถาปัตยกรรม


1
ซีพียู ARM32 ไม่ได้ทำงานตามที่คุณอธิบาย บางรุ่นมีประสิทธิภาพต่ำกว่าสำหรับคำแนะนำในการโหลดที่ซับซ้อนมากขึ้นและ / หรือการเขียนกลับไปที่รีจิสเตอร์ ดังนั้นพวกเขาจึงไม่สามารถถอดรหัสแบบเดียวกันทั้งหมดได้
Peter Cordes

6

Disclamer: ฉันไม่รู้จริง ๆ ว่าแอสเซมเบลอร์ MIPS แต่การลงทะเบียน 0 ค่านั้นไม่ซ้ำกับสถาปัตยกรรมนี้และฉันคิดว่ามันใช้ในลักษณะเดียวกับสถาปัตยกรรม RISC อื่น ๆ ที่ฉันรู้จัก

การลงทะเบียนเพื่อรับ 0 จะทำให้คุณเสียค่าใช้จ่ายในการเรียนการสอนในขณะที่ใช้การลงทะเบียน 0 ค่าที่กำหนดไว้ล่วงหน้าจะไม่

ยกตัวอย่างเช่นการเรียนการสอนมักจะถูกนำมาใช้เป็นmov RX, RY add RX, RY, R0โดยไม่ต้องลงทะเบียน 0 มูลค่าที่คุณจะต้องเวลาที่คุณต้องการที่จะใช้ทุกxor RZ, RZmov

อีกตัวอย่างหนึ่งคือcmpคำแนะนำและตัวแปร (เช่น "เปรียบเทียบและกระโดด", "เปรียบเทียบและย้าย" ฯลฯ ) ซึ่งcmp RX, R0จะใช้ในการทดสอบหาจำนวนลบ


1
จะมีปัญหาใด ๆ การดำเนินการMOV Rx,Ryเป็นAND Rx,Ry,Ry?
supercat

3
@supercat คุณจะไม่สามารถเข้ารหัสได้mov RX, Immหรือmov RX, mem[RY]หากชุดคำสั่งของคุณสนับสนุนเฉพาะค่าในทันทีและการเข้าถึงหน่วยความจำเดียวต่อการเรียนการสอน
Dmitry Grigoryev

ฉันไม่คุ้นเคยกับโหมดการระบุที่อยู่ใน MIPS ฉันรู้ว่า ARM มีโหมด [Rx + Ry << scale] และ [Rx + disp] และในขณะที่การใช้หลังสำหรับที่อยู่สัมบูรณ์บางอย่างอาจมีประโยชน์ในบางกรณีโดยทั่วไปไม่จำเป็น โหมดตรง [Rx] สามารถจำลองผ่าน [Rx + การแสดงผล] โดยใช้การกระจัดเป็นศูนย์ MIPS ใช้อะไร
supercat

movเป็นตัวอย่างที่น่าสงสาร คุณสามารถใช้มันด้วย 0 ทันทีแทนการลงทะเบียนเป็นศูนย์ ori dst, src, 0เช่น แต่ใช่คุณต้องมี opcode สำหรับ mov ทันทีเพื่อลงทะเบียนหากคุณไม่มีaddiu $dst, $zero, 1234เช่นluiแต่สำหรับ 16 bit ต่ำกว่าแทน 16 อันดับแรกและคุณไม่สามารถใช้norหรือsubสร้างหนึ่งตัวถูกดำเนินการ / neg .
Peter Cordes

@supercat: ในกรณีที่คุณยังสงสัย: MIPS แบบคลาสสิกมีโหมดการกำหนดแอดเดรสเดียว: register + disp16 MIPS สมัยใหม่ได้เพิ่ม opcode อื่น ๆ สำหรับการลงทะเบียน 2 โหมดสำหรับการโหลด / เก็บ FP, การเร่งการทำดัชนีอาเรย์ (แต่ก็ยังไม่ใช่สำหรับการโหลด / เก็บจำนวนเต็มอาจเป็นเพราะอาจต้องอ่านพอร์ตเพิ่มเติมในไฟล์ register จำนวนเต็มสำหรับ 2 address regs + data reg สำหรับร้านค้าดู การใช้ register เป็น offset )
Peter Cordes

3

การคาดว่าจะนำไปสู่การเป็นจุดจบในตอนท้ายของทะเบียนธนาคารของคุณนั้นมีราคาถูก (ราคาถูกกว่าการลงทะเบียนเต็มเป่า)

การทำ xor จริงใช้พลังงานและเวลาเล็กน้อยในการเปลี่ยนประตูและเก็บไว้ในรีจิสเตอร์ทำไมต้องจ่ายค่าใช้จ่ายเมื่อค่า 0 ที่มีอยู่สามารถใช้ได้อย่างง่ายดาย

ซีพียูสมัยใหม่ยังมีการลงทะเบียน 0 ค่า (ซ่อน) ซึ่งพวกเขาสามารถใช้เป็นผลมาจากการxor eax eaxเรียนการสอนผ่านการเปลี่ยนชื่อการลงทะเบียน


6
ค่าใช้จ่ายที่แท้จริงของR0ไม่ได้อยู่ในสายดินเพียงไม่กี่สาย แต่ในความจริงที่ว่าคุณต้องจองรหัสไว้ในทุกคำสั่งที่เกี่ยวข้องกับการลงทะเบียน
Dmitry Grigoryev

แฮคเกอร์เป็นปลาเฮอริ่งแดง xor-zeroing นั้นดีใน x86 เท่านั้นซึ่งซีพียูจะรับรู้สำนวนและหลีกเลี่ยงการพึ่งพาอินพุต ในขณะที่คุณชี้ให้เห็นว่าครอบครัว Sandybridge ไม่ได้เรียกใช้ uop เพียงแค่จัดการมันในขั้นตอนการเปลี่ยนชื่อลงทะเบียน ( วิธีที่ดีที่สุดในการตั้งค่าการลงทะเบียนเป็นศูนย์ในแอสเซมบลี x86 คือ: xor, mov หรือและ? ) แต่สำหรับ MIPS XORing การลงทะเบียนจะมีการอ้างอิงเท็จ; กฎการสั่งซื้อการพึ่งพาหน่วยความจำ (HW เทียบเท่ากับ C ++ std::memory_order_consume) จำเป็นต้องมี XOR เพื่อเผยแพร่การพึ่งพา
Peter Cordes

หากคุณไม่มีการลงทะเบียนเป็นศูนย์คุณจะต้องมีรหัสเพื่อย้ายการลงทะเบียนทันที กดไลค์luiแต่ไม่เลื่อนไปทางซ้ายโดย 16 ดังนั้นคุณยังสามารถใส่จำนวนเล็กน้อยในการลงทะเบียนได้ด้วยคำสั่งเดียว การอนุญาตเฉพาะศูนย์ที่มีการอ้างอิงที่ผิดจะเป็นบ้า (MIPS ปกติสร้างค่าที่ไม่เป็นศูนย์ด้วยaddiu $dst, $zero, 1234หรือoriดังนั้นอาร์กิวเมนต์ "ค่าใช้จ่ายพลังงาน" ของคุณจะพังหากคุณต้องการหลีกเลี่ยงการเรียกใช้ ALU คุณจะต้องมี opcode สำหรับ mov ทันทีเพื่อลงทะเบียนแทนที่จะมีซอฟต์แวร์เพิ่มหรือ ทันทีที่มีศูนย์)
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.