CPU บางตัวมีค่าสถานะการลงทะเบียน (ARM, x86, ... ), ตัวอื่น ๆ ไม่ (MIPS, ... ) อะไรคือข้อดีของการมีคำสั่ง CMP เพื่ออัปเดตค่าสถานะการลงทะเบียนตามด้วยคำสั่งสาขาแทนที่จะใช้การลงทะเบียนเป็นศูนย์และสาขาที่มีเงื่อนไขเพื่อตรวจสอบเครื่องหมายล้น ฯลฯ
CPU บางตัวมีค่าสถานะการลงทะเบียน (ARM, x86, ... ), ตัวอื่น ๆ ไม่ (MIPS, ... ) อะไรคือข้อดีของการมีคำสั่ง CMP เพื่ออัปเดตค่าสถานะการลงทะเบียนตามด้วยคำสั่งสาขาแทนที่จะใช้การลงทะเบียนเป็นศูนย์และสาขาที่มีเงื่อนไขเพื่อตรวจสอบเครื่องหมายล้น ฯลฯ
คำตอบ:
ในสถาปัตยกรรมแบบจุลภาคสมัยใหม่ที่มีการลงทะเบียนการเปลี่ยนชื่อค่าใช้จ่ายในการดำเนินการสำหรับแฟล็กหรือไม่แฟล็กนั้นคล้ายคลึงกัน ความแตกต่างหลักที่ฉันคิดได้ก็คือบางแฟล็กบ่งบอกถึงลักษณะของค่า (ค่าเป็นลบหรือไม่ค่าเป็นศูนย์หรือไม่ค่ามีความเท่าเทียมหรือคี่หรือไม่) ในขณะที่บางคนแสดงถึงเหตุการณ์ที่เกิดขึ้นระหว่างการดำเนินการก่อนหน้านี้ (คำสั่งการเพิ่มมีการดำเนินการหรือโอเวอร์โฟลว์หรือไม่) สิ่งนี้นำไปสู่สถานการณ์ที่ไม่เหมาะกับ MIPS เมื่อคุณต้องการจำลองการเพิ่ม 64- บิตบนสถาปัตยกรรม 32- บิต (หรือการเพิ่ม 128- บิตบน สถาปัตยกรรม 64 บิต) สำหรับสถาปัตยกรรมส่วนใหญ่ที่มีธงพกพาจะมีความพิเศษadd-with-carry
การเรียนการสอนที่มีธงดำเนินการจากการเพิ่มคำสั่งก่อนหน้า สิ่งนี้ทำให้การคำนวณทางคณิตศาสตร์ที่มีความแม่นยำสูงมีราคาไม่แพงในสถาปัตยกรรมจำนวนมากที่มีการลงทะเบียนสถานะ
ในทางกลับกันการทดสอบการลงทะเบียน N-bit สำหรับศูนย์หรือไม่เป็นศูนย์จะมีราคาแพงอย่างน่าประหลาดใจ ในการทดสอบการลงทะเบียน N-bit สำหรับศูนย์คุณต้องดำเนินการ N-bit NOR ซึ่งต้องใช้ตรรกะระดับในการคำนวณ ในสถาปัตยกรรมที่มีธงลงทะเบียนตรรกะพิเศษสำหรับการคำนวณศูนย์ / ไม่เป็นศูนย์ที่ส่วนท้ายของขั้นตอน ALU อาจทำให้นาฬิกาทำงานช้าลง (หรือบังคับให้ ALU มีการทำงานสองรอบ) ด้วยเหตุผลนี้ฉันคิดว่าบางคน สถาปัตยกรรมเช่น SPARC มีสองรุ่นของการดำเนินการทางคณิตศาสตร์แต่ละอันหนึ่งอันที่ตั้งค่าสถานะและอีกอันที่ไม่ได้ทำ
แต่ MIPS ไม่ได้บันทึกอะไรเลยที่นี่ พวกเขาย้ายปัญหาไปที่อื่น ใน MIPS มีbranch-on-equal
คำแนะนำ ซึ่งหมายความว่าคำสั่งสาขาต้องมีสเตจ ALU (รวมถึงการxor
ดำเนินการบิตบิตตามด้วย a nor
เพื่อลดลงไปที่บิตที่เท่ากัน / ไม่เท่ากัน) ก่อนที่จะกำหนดวิธีที่สาขาจะไป
สถาปัตยกรรม DEC Alpha พยายามแยกความแตกต่างโดยใช้เล่ห์เหลี่ยม DEC อัลฟ่าไม่มีธงลงทะเบียน แต่ยังไม่มีbranch-on-equal
คำแนะนำ แต่คำสั่งสาขาจะดูสถานะของการลงทะเบียนวัตถุประสงค์ทั่วไปเพียงครั้งเดียว มีbranch-on-zero
, branch-on-not-zero
, branch-on-less-than-zero
ฯลฯ เคล็ดลับคือการที่คุณสามารถให้ทุกอเนกประสงค์ลงทะเบียนบิต 65 พิเศษที่จะบอกคุณว่าอีก 64 บิตเป็นศูนย์ทั้งหมดหรือไม่ สิ่งนี้ทำให้คล้ายกับการลงทะเบียนค่าสถานะ: คำสั่งสาขาทั้งหมดดูบิตเดียว (ที่คำนวณแล้ว) เพื่อทำการตัดสินใจ แต่ตอนนี้คุณกลับมาหาวิธีคำนวณบิตตัวบ่งชี้ที่เป็นศูนย์พิเศษในระหว่าง ALU ปกติ วงจร (และคุณยังคงไม่สามารถทำการคำนวณทางคณิตศาสตร์ที่มีความแม่นยำได้หลายรูปแบบเพียงแค่ดูที่แฟลกพกพาจากการทำงานก่อนหน้านี้)
การมีคำแนะนำในการทดสอบซึ่งตั้งค่าเฉพาะธงเป็นเพียงวิธีการลดแรงกดดันในการลงทะเบียนในสถาปัตยกรรมที่หิวโหยลงทะเบียน หากคุณมีการลงทะเบียนเพียงพอให้แก้ไขอย่างใดอย่างหนึ่งและละเว้นผลลัพธ์ เคล็ดลับของการมี register 0 ที่มีค่าอินพุต 0 เป็นเพียงเทคนิคการเข้ารหัสที่สะดวกเมื่อคุณมีรีจิสเตอร์เพียงพอที่การกำหนดหนึ่งใน 0 เป็นดีกว่าการเพิ่มจำนวนคำสั่ง จากนั้นจะสะดวกในการใช้เป็นเป้าหมายเช่นกัน (จะลดจำนวนการอ้างอิงเท็จ)
การเข้ารหัสอีกครั้ง หากคุณเข้ารหัสเงื่อนไขการข้ามคุณจะมีการข้ามด้วยตัวถูกดำเนินการ 3 ตัว (ทั้งสองจะถูกเปรียบเทียบและเป้าหมายการกระโดด) ซึ่งสองอย่างที่คุณต้องการให้เป็นค่าทันทีหนึ่งที่คุณต้องการจะเป็นใหญ่เป็น เป็นไปได้ (กระโดดมักมีรูปแบบการเข้ารหัสของตนเองเพื่อให้เป้าหมายสามารถใช้บิตได้มากที่สุด) หรือคุณทิ้งโอกาส
การใช้ธงช่วยให้คุณมีโอกาสมากขึ้นในการตั้งค่า มันไม่ได้เป็นเพียงการดำเนินการเปรียบเทียบที่สามารถตั้งค่าสถานะ แต่สิ่งที่คุณต้องการ (ด้วยข้อแม้ที่การดำเนินการเพิ่มเติมที่คุณมีการตั้งค่าสถานะที่ระมัดระวังยิ่งคุณต้องให้แน่ใจว่าการดำเนินการล่าสุดที่ตั้งค่าสถานะเป็นสิ่งที่คุณต้องการ) หากคุณมีแฟล็กคุณสามารถทดสอบจำนวนเงื่อนไข (บ่อยครั้งที่ 16) คูณด้วยจำนวนคำสั่งที่สามารถตั้งค่าสถานะ (หากคุณไม่ได้ใช้แฟล็กคุณจะพบกับการกระโดดตามเงื่อนไขได้มากเท่ากับคุณ มีสิ่งที่จะทดสอบหรือมีสิ่งที่คุณไม่อนุญาตให้ทดสอบได้อย่างง่ายดาย (เช่นพกพาหรือล้น)
การทดสอบค่าสถานะนั้นง่ายและสามารถทำได้อย่างรวดเร็ว ยิ่งการทดสอบของคุณซับซ้อนมากเท่าใดก็จะยิ่งส่งผลมากขึ้นตามรอบเวลา (หรือโครงสร้างท่อถ้าคุณวางท่อ) โดยเฉพาะอย่างยิ่งสำหรับการปรับใช้ที่ง่ายขึ้นเมื่อคุณไปถึงโปรเซสเซอร์ระดับสูงโดยใช้ลูกเล่นทั้งหมดของหนังสือ
การมีค่าสถานะหมายความว่าคำสั่งจำนวนมากมีผลลัพธ์หลายรายการ (ผลลัพธ์ตามธรรมชาติและแต่ละค่าสถานะที่แก้ไข) และจาก POV สถาปัตยกรรมขนาดเล็กผลลัพธ์หลายรายการไม่ดี (คุณต้องติดตามความสัมพันธ์ของพวกเขา) เมื่อคุณมีเพียงหนึ่งชุดของค่าสถานะที่แนะนำการพึ่งพา (ไม่จำเป็นถ้าไม่ได้ใช้ค่าสถานะ) คุณต้องจัดการทางหรืออื่น ๆ อีกครั้งที่เป็นจริงโดยเฉพาะอย่างยิ่งสำหรับการใช้งานที่ง่ายขึ้นเมื่อคุณไปถึงโปรเซสเซอร์ระดับสูงโดยใช้ลูกเล่นทั้งหมดของหนังสือความยากลำบากเพิ่มเติมจะถูกแคระแกร็นโดยส่วนที่เหลือของโปรเซสเซอร์
บนเครื่อง 32 บิตคำสั่ง "add-with-carry" ที่ใช้เป็นส่วนหนึ่งของลำดับการเพิ่มความแม่นยำแบบมัลติต้องรับตัวถูกดำเนินการ 65 บิตและคำนวณผลรวม 33 บิต ข้อมูลจำเพาะการลงทะเบียนแหล่งที่มาจะระบุว่าตัวถูกดำเนินการ 64 บิตมาจากที่ใดและข้อกำหนดการลงทะเบียนปลายทางจะบอกว่าผลการค้นหา 32 บิตที่ต่ำกว่าควรไปที่ใด แต่จะทำอย่างไรกับตัวถูกดำเนินการ ของผลลัพธ์หรือไม่ การได้รับอนุญาตให้ระบุว่าเป็นส่วนหนึ่งของคำสั่งที่ตัวถูกดำเนินการพิเศษควรมาจากที่ใดและบิตผลลัพธ์พิเศษควรเป็นประโยชน์ในระดับปานกลาง แต่โดยทั่วไปแล้วจะไม่เป็นประโยชน์มากพอที่จะพิสูจน์ฟิลด์พิเศษใน opcode การมี "ตำแหน่ง" ที่คงที่เพื่อจัดการกับธงพกพาอาจจะอึดอัดเล็กน้อยจากมุมมองการตั้งเวลาการเรียนการสอน แต่มัน '
หากมีใครพยายามออกแบบชุดคำสั่งเพื่อให้สามารถคำนวณทางคณิตศาสตร์ได้หลายแบบ แต่แต่ละคำสั่งนั้นถูก จำกัด ไว้ที่ตัวถูกดำเนินการ 32 บิตสองตัวและปลายทางหนึ่งตัวถูกดำเนินการ 32 บิตตัวหนึ่งสามารถใช้ "เพิ่ม" 64 บิตในสี่คำสั่ง: r5 ถึง 1 ถ้า r0 + r2 จะมีค่าเป็นศูนย์หรืออย่างอื่นคำนวณ r4 = r1 + r3 คำนวณ r5 = r4 + r5 คำนวณ r4 = r0 + r2 "แต่ไปไกลเกินกว่านั้นจะต้องใช้สามคำแนะนำสำหรับแต่ละคำเพิ่มเติม การมีธงพกพาเป็นแหล่งเสริมและปลายทางช่วยลดค่าใช้จ่ายในการเรียนการสอนหนึ่งคำต่อคำ
โปรดทราบว่า btw ที่มีการควบคุมบิตคำสั่งว่าการเรียนการสอนการปรับปรุงการลงทะเบียนธงอาจอำนวยความสะดวกในการดำเนินการออกคำสั่งเนื่องจากคำแนะนำที่ใช้หรือแก้ไขบิตธงจะต้องรักษาลำดับของพวกเขาเมื่อเทียบกับแต่ละอื่น ๆ จัดใหม่ได้อย่างอิสระ รับลำดับ:
ldr r0,[r1]
add r0,r0,r2
eors r4,r5,r6
หน่วยปฏิบัติการสามารถจดจำได้ง่ายพอสมควรว่าคำสั่งที่สามสามารถดำเนินการได้โดยไม่ต้องรอข้อมูลที่จะอ่าน[r1]
แต่ถ้าคำสั่งที่สองadds r0,r0,r2
นั้นเป็นไปได้ก็ต่อเมื่อหน่วยปฏิบัติงานสามารถมั่นใจได้ว่าในเวลาใดก็ตามที่พยายามใช้ แฟล็ก zero flag จะเก็บค่าที่กำหนดในคำสั่งที่สาม แต่แฟล็ก carry จะเก็บค่าในวินาที
คำตอบง่ายๆ ... การทำงานของหน่วยความจำราคาถูกที่รวดเร็วซึ่งไม่จำเป็นต้องมีการใช้งานภายในอย่างแน่นอนยกเว้นการเรียนการสอนเอง มันสามารถใช้เป็นบูลบูลโดยไม่มีสแต็กหรือบิตกระบวนการโดยไม่มีหน่วยความจำ