ภาษามีอิทธิพลต่อการออกแบบ CPU อย่างไร [ปิด]


44

เรามักจะบอกว่าฮาร์ดแวร์ไม่สนใจภาษาที่โปรแกรมเขียนเนื่องจากเห็นเฉพาะรหัสไบนารี่ที่คอมไพล์ แต่นี่ไม่ใช่ความจริงทั้งหมด ยกตัวอย่างเช่นพิจารณา Z80 ผู้ต่ำต้อย ส่วนขยายไปยังชุดคำสั่ง 8080 มีคำแนะนำเช่น CPIR ซึ่งจะเป็นประโยชน์สำหรับการสแกนแบบ C (NULL สิ้นสุด) strlen()สตริงเช่นการดำเนินการ ผู้ออกแบบจะต้องระบุว่าการรันโปรแกรม C (ตรงข้ามกับ Pascal ที่ความยาวของสตริงอยู่ในส่วนหัว) เป็นสิ่งที่การออกแบบของพวกเขาน่าจะใช้ อีกตัวอย่างที่คลาสสิกเป็นเครื่องเสียงกระเพื่อม

มีตัวอย่างอะไรอีกบ้าง? เช่นคำแนะนำจำนวนและประเภทของการลงทะเบียนโหมดการกำหนดแอดเดรสที่ทำให้ตัวประมวลผลเฉพาะสนับสนุนหลักการของภาษาเฉพาะหรือไม่ ฉันสนใจเป็นพิเศษในการแก้ไขครอบครัวเดียวกัน


3
อย่าลืมว่า Z-80 มีคำสั่ง LDIR ซึ่งมีประโยชน์มากเมื่อคัดลอกสตริงเมื่อคุณทราบความยาว (เช่นใน Pascal ที่เก็บความยาวไว้ในส่วนหัว)
TMN

27
1. Z-80 ได้รับการออกแบบในปี 1975 เมื่อ Unix และ C เป็นระบบปฏิบัติการและภาษาที่คลุมเครือในคอมพิวเตอร์บางเครื่องเมื่อ 3 ปีก่อน K&R รุ่นแรก 2. ไม่มีอะไรเกี่ยวกับปาสคาลที่ทำให้ความยาวสตริงเป็น "ในส่วนหัว" 3. สตริงใน CP / M ซึ่งเป็นไมโครคอมพิวเตอร์หลัก ๆ ในเวลานั้นถูกยกเลิกด้วยอักขระ '$' ไม่ใช่ '\ 0' CPIR สามารถค้นหาอักขระใด ๆ 4. CPIR จับคู่กับ CPDR (ค้นหาย้อนหลัง) เช่นเดียวกับคำแนะนำ -IR และ -DR อื่น ๆ สรุป: CPIR ไม่เกี่ยวข้องกับภาษาการเขียนโปรแกรม C มันเป็นเพียงคำแนะนำในการค้นหาไบต์
librik

4
ที่ใหญ่ที่สุด (และหนึ่งในสิ่งที่น่ารำคาญที่สุดสำหรับผู้ออกแบบฮาร์ดแวร์) ของสิ่งที่บังคับโดย C คือการกำหนดแอดเดรสแบบไบต์ ซีพียูจะง่ายขึ้นและเร็วขึ้นหากปราศจากสิ่งที่น่ารังเกียจนี้
SK-logic

1
@ SK-logic: แม้ว่ามาตรฐาน POSIX ต้องใช้การกำหนดแอดเดรสแบบไบต์ แต่มาตรฐาน C นั้นไม่ได้ การใช้งานใด ๆ ที่sizeof(int)เท่ากับ 1 ต้องกำหนดประเภทนั้นcharต้องลงนาม (เนื่องจากintจะต้องสามารถเก็บค่าประเภททั้งหมดchar) ฉันเขียนโค้ดสำหรับเครื่องที่charและintเป็นจำนวนเต็ม 16 บิตทั้งสองแบบ ปัญหาที่ใหญ่ที่สุดคือการที่ไม่สามารถใช้สหภาพเพื่อการแปลงชนิดและการจัดเก็บที่มีประสิทธิภาพของจำนวนมากไบต์ต้องมีการบรรจุด้วยตนเองและการเปิดออก ปัญหาเหล่านั้นเล็กน้อยเมื่อเทียบกับความเป็นไปได้ใน C ที่ sizeof (int) == sizeof (ยาว) ตั้งแต่ ...
supercat

2
... ซึ่งหมายความว่าไม่มีประเภทมาตรฐานที่รับประกันว่าจะเก็บความแตกต่างระหว่างสองunsigned intค่า C99 ปรับปรุงสถานการณ์นั้น แต่ก่อน C99 ไม่มีวิธีรับประกันขั้นตอนเดียวที่ปลอดภัยในการเปรียบเทียบค่าที่อาจเป็นลบกับค่าของประเภทunsigned int(หนึ่งจะต้องทดสอบว่าตัวเลขนั้นเป็นค่าลบก่อนทำการเปรียบเทียบหรือไม่)
supercat

คำตอบ:


20

คำตอบที่มีอยู่เน้นการเปลี่ยนแปลงISA มีการเปลี่ยนแปลงฮาร์ดแวร์อื่น ๆ ด้วย ตัวอย่างเช่น C ++ มักใช้ vtables สำหรับการโทรเสมือน เริ่มต้นด้วย Pentium M Intel มีส่วนประกอบ "การคาดคะเนสาขาโดยอ้อม" ซึ่งเร่งการเรียกฟังก์ชันเสมือน


6
และสถาปัตยกรรมของ Berkeley RISC ได้รวมแนวคิดของ "register file" ดังนั้นแทนที่จะสร้างฟังก์ชั่น "spill" ลงใน stack ลงทะเบียนจะมีการบล็อก 8 register ต่อแต่ละฟังก์ชั่น สิ่งนี้เร่งโค้ดอ็อบเจกต์เชิงได้อย่างมากเนื่องจากมันมีแนวโน้มที่จะประกอบด้วยการเรียกเมธอดจำนวนมากไปยังเมธอดแบบสั้น
TMN

1
นี่ไม่ใช่ตัวอย่างที่ถูกต้อง การออกแบบ "Table of function pointers" ยังใช้ในสถานการณ์เชื่อมโยงแบบไดนามิกจำนวนมากเช่นผ่านการนำเข้าและส่งออก DLL บน Windows และใช้ในโปรแกรม C แม้ว่าฉันเดาว่าคุณสามารถโต้แย้งได้ว่ามันแสดงให้เห็นว่าโปรเซสเซอร์ได้รับการปรับให้เหมาะสมสำหรับการใช้งานเฉพาะเจาะจง แต่ไม่ใช่เฉพาะภาษา
DeadMG

@DeadMG: กรณีอื่น ๆ ได้รับประโยชน์นั่นเป็นความจริง แต่จนถึง c ++ กลายเป็นที่นิยมการออกแบบ CPU ไม่ได้รับอิทธิพล และนั่นคือคำถามที่ถูกวาง ในทำนองเดียวกัน TMN มีจุดเกี่ยวกับการลงทะเบียนไฟล์ การชุมนุมไม่ได้มีแนวคิดที่ชัดเจนของฟังก์ชั่น ฟังก์ชั่นที่เราเข้าใจกันโดยทั่วไปในวันนี้กลับไปที่ Algol 60 และดังนั้นเราสามารถพูดได้ว่า Algol 60 มีผลต่อการออกแบบไฟล์ลงทะเบียน CPU
MSalters

14

ชุดคำสั่ง Intel 8086 มีรูปแบบ "ret" ซึ่งเพิ่มค่าให้กับตัวชี้แบบสแต็กหลังจาก popping ที่อยู่ผู้ส่ง สิ่งนี้มีประโยชน์สำหรับการใช้งาน Pascal จำนวนมากที่ผู้เรียกฟังก์ชั่นจะส่งอาร์กิวเมนต์ลงบนสแต็กก่อนที่จะทำการเรียกใช้ฟังก์ชั่นและเปิดออกหลังจากนั้น หากรูทีนยอมรับพารามิเตอร์เช่นสี่ไบต์พารามิเตอร์อาจลงท้ายด้วย "RET 0004" เพื่อล้างสแต็ก ขาดคำสั่งดังกล่าวการประชุมที่เรียกเช่นนี้อาจจำเป็นต้องให้โค้ดปรากฏที่อยู่ผู้ส่งกลับไปที่รีจิสเตอร์อัพเดตตัวชี้สแต็กจากนั้นข้ามไปที่การลงทะเบียนนั้น

น่าสนใจรหัสส่วนใหญ่ (รวมถึงรูทีนระบบปฏิบัติการ) บน Macintosh เดิมใช้หลักการเรียก Pascal แม้จะไม่มีคำสั่งที่อำนวยความสะดวกใน 68000 การใช้การประชุมนี้บันทึกรหัส 2-4 ไบต์ที่ไซต์การโทรทั่วไป แต่จำเป็นต้องมีการเพิ่มเติม โค้ด 4-6 ไบต์ที่ไซต์ส่งคืนของทุกฟังก์ชันที่ใช้พารามิเตอร์


นอกจากนี้ยังมีENTERสิ่งนี้RET n...
โดย

1
@herby: ฉันไม่คิดว่าENTERมีอยู่ใน 8086 เดิม; มันมาพร้อมกับโปรเซสเซอร์ในภายหลัง มันทำให้เกิดประเด็นที่น่าสนใจแม้ว่า: โหมดการกำหนดแอดเดรสแบบ BP นั้นได้รับการออกแบบมาอย่างชัดเจนเกี่ยวกับการใช้พารามิเตอร์แบบสแต็กและคนในท้องถิ่นที่เข้าถึงได้ผ่านตัวชี้เฟรม ฉันพบว่าการประชุมนี้น่าสนใจหลายวิธีโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่า (1) รหัสภาษาแอสเซมบลีบริสุทธิ์นั้นมีแนวโน้มที่จะใช้ค่าในการลงทะเบียนมากกว่าสแต็ก แต่ (2) ข้อดีของ [BP + nn] ที่อยู่เหนือ [SP + nn] การกำหนดที่อยู่มีความสำคัญมากขึ้นสำหรับโปรแกรมภาษาแอสเซมบลีที่เข้าถึงสิ่งต่าง ๆ บนสแต็กมากกว่า ...
supercat

... สำหรับรหัสแอสเซมบลีที่เขียนด้วยมือ คอมไพเลอร์จะรู้โดยทั่วไปสำหรับคำสั่งที่สร้างขึ้นทุกครั้งว่า SP และ BP เปรียบเทียบอย่างไร ตัวอย่างเช่นถ้า SP คือ BP-8 คอมไพเลอร์จะไม่สามารถจัดการกับ [BP + 12] ได้ง่ายกว่า [SP + 20] หากคอมไพเลอร์คอมไพล์ใหม่ต้องเพิ่ม PUSH / POP อีกรอบบล็อกโค้ดมันสามารถปรับออฟเซ็ต SP ตามอย่างเหมาะสม ในทางกลับกันในแอสเซมบลีที่เขียนด้วยมือการเพิ่ม PUSH / POP มีแนวโน้มที่จะต้องมีการปรับแต่งโค้ดระหว่างพวกเขา ดังนั้นพอยน์เตอร์ของเฟรมจึงเป็นประโยชน์ในการรวมรหัสระดับสูง / asm
supercat

บางทีความเป็นไปได้ที่จะใช้รหัสซ้ำโดยไม่ต้องรวบรวมใหม่อาจเป็นจุดใช้งานเล็กน้อยสำหรับการกำหนดที่อยู่ BP และพระเจ้ารู้ว่า BP คำแนะนำอยู่ไม่ได้เร็วขึ้นในวงจรกว่า SP คน addressed เนื่องจากความดันโลหิตอยู่เป็นประเภทของมาตรฐาน ...
Herby

3
@herby: อันที่จริงฉันสงสัยว่าเหตุผลส่วนใหญ่ที่คอมไพเลอร์ใช้ตัวชี้เฟรมโดยทั่วไปมีส่วนเกี่ยวข้องกับการดีบัก ในการดีบั๊กโปรแกรมที่ไม่ได้ใช้ระเบียบเช่นนั้นจะต้องให้คอมไพเลอร์สร้าง - และตัวดีบั๊กใช้ - ไฟล์ที่แสดงรายการ SP-BP offset สำหรับทุกคำสั่ง ข้อมูลเมตาที่มีรายละเอียดดังกล่าวเป็นเรื่องปกติในทุกวันนี้ (และเป็นส่วนสำคัญของสิ่งที่ทำให้ภาษาที่รวบรวมขยะใช้งานได้จริง) แต่จำนวน RAM ที่ต้องการจะเป็นที่ยอมรับไม่ได้เมื่อ 30 ปีที่แล้ว
supercat

10

ตัวอย่างหนึ่งคือ MIPS ซึ่งมีทั้งaddและadduสำหรับการดักจับและละเว้นการล้นตามลำดับ (เช่นsubและsubu.) มันต้องการคำสั่งประเภทแรกสำหรับภาษาเช่น Ada (ฉันคิดว่า - ฉันไม่เคยใช้ Ada มาก่อน) ซึ่งจัดการกับ overflow อย่างชัดเจนและประเภทที่สองสำหรับภาษาเช่น C ที่ไม่สนใจ overflows

ถ้าฉันจำได้อย่างถูกต้อง CPU จริงมีวงจรเพิ่มเติมใน ALU เพื่อติดตามการไหลล้น ถ้าภาษาเดียวที่คนใส่ใจคือ C มันคงไม่ต้องการสิ่งนี้


ไม่แน่ใจว่าเกี่ยวข้องหรือไม่ แต่คำแนะนำเหล่านั้นอาจมีประโยชน์ในสถานการณ์อื่น ๆ เช่นการจัดสรรหน่วยความจำที่ปลอดภัยเช่นหากคุณกำลังจัดสรรnmemb*size+offsetไบต์และต้องแน่ใจว่าคุณไม่ได้รับข้อมูลมากเกินไป
NikiC

@ Nikik: ฉันคิดว่าadduและsubuคำแนะนำ (คนที่ไม่ได้ตรวจสอบการล้น) เป็นคนที่ถูกเพิ่มเข้ามาเพื่อให้ C มีความสุข แน่นอนฉันไม่รู้จริง ๆ - เราครอบคลุมมันอย่างคลุมเครือในการบรรยายเท่านั้นและแน่นอนว่าฉันไม่มีผู้เชี่ยวชาญด้านสถาปัตยกรรม: P
Tikhon Jelvis

โอ้ใช่ฉันกำลังคิดอีกทางขอโทษ: /
NikiC

8

ซีรี่ส์ Burroughs 5000 ได้รับการออกแบบมาเพื่อรองรับ ALGOL อย่างมีประสิทธิภาพและ iAPX-432 ของ Intel ได้รับการออกแบบมาเพื่อดำเนินการ Ada ได้อย่างมีประสิทธิภาพ Inmos Transputer มีภาษาของตัวเอง Occam ฉันคิดว่าโพรเซสเซอร์ Parallax "Propeller" ได้รับการออกแบบให้ตั้งโปรแกรมโดยใช้ตัวแปรพื้นฐานของตัวเอง

ไม่ใช่ภาษา แต่ชุดคำสั่ง VAX-11 มีคำสั่งเดียวในการโหลดบริบทของกระบวนการซึ่งได้รับการออกแบบหลังจากคำขอจากทีมออกแบบ VMS ฉันจำรายละเอียดไม่ได้ แต่ ISTR ใช้คำแนะนำมากมายในการนำไปใช้ซึ่งทำให้มีขีด จำกัด สูงสุดที่ร้ายแรงสำหรับจำนวนกระบวนการที่พวกเขาสามารถกำหนดเวลาได้


มันเกี่ยวกับการออกแบบเหล่านี้ที่ทำให้พวกเขาเหมาะอย่างยิ่ง? เช่น Ada คุณลักษณะใดของ iAPX ที่ได้รับประโยชน์โดยเฉพาะอย่างยิ่ง?
ออกุสตุส

ISTR ที่เป้าหมาย Ada ของ iAPX-432 พยายามที่จะบันทึกการออกแบบที่ล้มเหลวมากกว่าโดยแนบกับสิ่งที่คาดหวังได้ดีกว่าสิ่งอื่นใด
AProgrammer

@AProgrammer: ฉันค่อนข้างมั่นใจว่า iAPX-432 ได้รับการออกแบบมาตั้งแต่เริ่มใช้ Ada ฉันยังจำได้ว่ามีข่าวลือว่า Intel จะไม่เผยแพร่ชุดคำสั่งเพื่อขัดขวางการเขียนโปรแกรมภาษาแอสเซมบลีและบังคับให้คนใช้ Ada สำหรับทุกสิ่ง
TMN

1
@TMN, โครงการ 432 ของ Intel เริ่มต้นในปี 1975 และเปิดตัวในปี 1981 (Wikipedia) Ironman (ข้อกำหนดขั้นสุดท้ายสำหรับ Ada) ได้รับการตีพิมพ์ในเดือนมกราคม 2520 และได้รับการคัดเลือกให้เป็นสีเขียวในเดือนพฤษภาคม 2522 แก้ไขและผลสุดท้ายที่ได้รับการตีพิมพ์เป็นมาตรฐานทหารในกรกฏาคม 2523 มีปัญหาในระยะเวลาที่ระบุว่า iAPX-432 จุดเริ่มต้นที่จะใช้ Ada (เป็นตัวประมวลผลแบบช้าและแบบทั่วไป "ปิดช่องว่างทางความหมาย" ด้วยข้อบกพร่องตามปกติในเวลาที่ทางเลือกเริ่มทำการค้นหาทำการตลาดในขณะที่ตัวประมวลผล Ada นั้นไม่แน่นอนที่จะบันทึกการออกแบบที่ล้มเหลว - ISTR )
AProgrammer

1
@AProgrammer: อืมดูเหมือนว่าคุณพูดถูก ฉันวิ่งข้ามบทความนี้จากสถาปนิกนำของ 432 และในการสรุปเขากล่าวว่า "การจับคู่ที่ใกล้ชิดของสถาปัตยกรรมและภาษานี้ไม่ได้เกิดขึ้นเพราะ 432 ถูกออกแบบมาเพื่อรัน Ada - มันไม่ได้เป็น" ฉันจะต้องขุดหนังสือ 432 เล่มเก่าของฉันและดูว่ามันพูดอะไร
TMN

8

สิ่งหนึ่งที่ไม่มีใครพูดถึงก็คือความก้าวหน้าในการเพิ่มประสิทธิภาพคอมไพเลอร์ (ซึ่งภาษาพื้นฐานส่วนใหญ่ไม่เกี่ยวข้อง) ทำให้เกิดการเปลี่ยนแปลงจากชุดคำสั่ง CISC (ซึ่งส่วนใหญ่ได้รับการออกแบบให้เข้ารหัสโดยมนุษย์) เป็นชุดคำสั่ง RISC ออกแบบให้เขียนโค้ดโดยคอมไพเลอร์)


5

ตระกูลโมโตโรล่า 68000 แนะนำที่อยู่autoincrementบางอย่างที่ทำให้การคัดลอกข้อมูลผ่านซีพียูที่มีประสิทธิภาพและมีขนาดกะทัดรัดมาก

[อัปเดตตัวอย่าง]

นี่คือรหัส c ++ บางอย่างที่มีอิทธิพลต่อ 68,000 แอสเซมเบลอร์

while(someCondition)
    destination[destinationOffset++] = source[sourceOffset++]

ดำเนินการในแอสเซมเบลอร์ธรรมดา (pseudocode ฉันลืมคำสั่งแอสเซมเบลอร์ 68000)

adressRegister1 = source
adressRegister2 = destination
while(someCondition) {
    move akku,(adressRegister1)
    move (adressRegister2), akku
    increment(adressRegister1, 1)
    increment(adressRegister2, 1)
}

ด้วยที่อยู่ใหม่มันกลายเป็นสิ่งที่แปลกไป

adressRegister1 = source
adressRegister2 = destination
while(someCondition) {
    move akku,(adressRegister1++)
    move (adressRegister2++), akku
}

เพียงสองคำแนะนำต่อวงแทน 4


1
สิ่งนี้ได้รับอิทธิพลจากการประชุมของภาษาใดภาษาหนึ่งโดยเฉพาะ?
ออกุสตุส

ดูตัวอย่างที่อัปเดต
k3b

อาเตือนฉันถึงการเพิ่มประสิทธิภาพการวนซ้ำของ DBxx ใน 68010
Gaius

7
ที่จริงฉันคิดว่าคุณมีสิ่งนี้ย้อนหลัง การกำหนดที่อยู่การสร้างอัตโนมัติ [ใน | de] เป็นส่วนหนึ่งของชุดคำสั่ง PDP-11 ซึ่งน่าจะส่งผลต่อการออกแบบของ C.
TMN

5

ไอบีเอ็มเมนเฟรมซีรีย์ Z เป็นลูกหลานของ IBM 360 จากทศวรรษ 1960

มีคำแนะนำหลายอย่างที่เฉพาะเจาะจงเพื่อเร่งความเร็วโปรแกรมภาษาโคบอลและฟอร์แทรน ตัวอย่างแบบคลาสสิกคือBXLE- "Branch on Index Low Or Equal" ซึ่งส่วนใหญ่ของ Fortran forloop หรือ COBOL PERFORM VARYING x from 1 by 1 until x > nencapsulated ในคำสั่งเดียว

นอกจากนี้ยังมีทั้งครอบครัวของคำแนะนำทศนิยมบรรจุเพื่อรองรับเลขทศนิยมทศนิยมคงที่ทั่วไปในโปรแกรมภาษาโคบอล


ฉันคิดว่าคุณหมายถึงลูกหลาน
Clockwork-Muse

@ X-Zero - อุ๊ปส์! เช้าตรู่แคฟฟีนไม่เพียงพอในระบบ ฯลฯ .......
James Anderson

1
สิ่งที่น่าสนใจยิ่งกว่าคือคำสั่งบล็อกซ้ำของ TI 32050 DSP ตัวถูกดำเนินการมันเป็นที่อยู่ของการเรียนการสอนต่อไปนี้คนสุดท้ายในวง; การโหลดการลงทะเบียนลูปนับแล้วดำเนินการคำสั่งบล็อกซ้ำแล้วซ้ำอีกจะทำให้คำสั่งถึง (แต่ไม่รวม) เป้าหมายที่จะทำซ้ำตามจำนวนครั้งที่ระบุ เตือนให้รำลึกถึง FORTRAN DOloop อย่างมาก
supercat

@supercat ทุก DSP ที่คุ้มค่าของชื่อนี้มีคุณสมบัติสามอย่าง: ลูป zero-overhead, คำสั่งเดียวคูณทวีคูณ, และโหมดการจัดการแอดเดรสแบบบิต - แบ็คอิน อัลกอริธึม DSP เกือบทุกตัวที่มนุษย์รู้จักใช้ลูป อัลกอริธึมที่พบบ่อยที่สุดสองอย่างคือตัวกรอง FIR ซึ่งเป็นลูปรอบการทวีคูณการสะสมและ FFT ซึ่งการกำหนดแอดเดรสบิตย้อนกลับเป็นสิ่งสำคัญ DSP จำนวนมากรวมถึงการดำเนินการผีเสื้อ radix-2 FFT หนึ่งคำสั่งหรือการคูณทวีคูณ / เพิ่มที่สามารถใช้ในการสร้างผีเสื้อคำสั่งเดียว
John R. Strohm

@ JohnR.Strohm: DSP ทุกตัวที่ฉันเห็นมีการทำซ้ำทวีคูณ - สะสม แต่ไม่ใช่ทั้งหมดที่รวมลูปค่าโสหุ้ยเป็นศูนย์ทั่วไป ที่จริงแล้วฉันไม่แน่ใจว่าทำไมลูปดังกล่าวควรพิจารณาเฉพาะฟีเจอร์ "DSP" เนื่องจากพวกมันจะมีประโยชน์ในโค้ด "โปรเซสเซอร์ทั่วไป" จำนวนมากเช่นกัน
supercat

3

ซีพียูรุ่นแรก ๆ ของ Intel มีคุณสมบัติดังต่อไปนี้หลาย ๆ รุ่นนั้นล้าสมัยแล้วในโหมด 64 บิต:

  • คำแนะนำสำหรับ ENTER, LEAVE และ RET [คู่มือเริ่มต้นบอกอย่างชัดเจนว่าคำแนะนำเหล่านั้นถูกนำมาใช้กับภาษาที่มีโครงสร้างของบล็อกเช่น Pascal ซึ่งรองรับขั้นตอนซ้อนกัน]
  • คำแนะนำสำหรับการเร่งเลขคณิต BCD (AAA, AAM, ฯลฯ ); นอกจากนี้ยังรองรับ BCD ใน x87
  • คำแนะนำ JCXZ และ LOOP สำหรับการใช้ลูปที่นับ
  • INTO สำหรับการสร้างกับดักทางคณิตศาสตร์มากเกินไป (เช่นใน Ada)
  • XLAT สำหรับการค้นหาตาราง
  • BOUND สำหรับตรวจสอบขอบเขตของอาร์เรย์

ธงสัญญาณที่พบในการลงทะเบียนสถานะของ CPU จำนวนมากมีอยู่เพื่อให้ดำเนินการทางคณิตศาสตร์ที่ลงนามและไม่ได้ลงนามได้อย่างง่ายดาย

ชุดคำสั่ง SSE 4.1 แนะนำคำแนะนำสำหรับการประมวลผลสตริงทั้งที่ถูกนับและสิ้นสุดด้วยการเป็นศูนย์ (PCMPESTR ฯลฯ )

นอกจากนี้ฉันสามารถจินตนาการได้ว่าคุณสมบัติระดับระบบจำนวนหนึ่งได้รับการออกแบบมาเพื่อสนับสนุนความปลอดภัยของรหัสที่รวบรวม (การตรวจสอบการ จำกัด ส่วนเซ็กเมนต์เรียกใช้เกตส์ด้วยการคัดลอกพารามิเตอร์ ฯลฯ )


3

โปรเซสเซอร์ ARM บางตัวส่วนใหญ่เป็นอุปกรณ์พกพา ได้แก่ (d) Jazelle extension ซึ่งเป็นล่าม JVM สำหรับฮาร์ดแวร์ มันตีความ Java bytecode โดยตรง Jazelle-JVM ตระหนักถึงสามารถใช้ฮาร์ดแวร์เพื่อเพิ่มความเร็วในการประมวลผลและกำจัด JIT ส่วนใหญ่ แต่ทางเลือกในการใช้ซอฟต์แวร์ VM ยังคงมีอยู่หากไม่สามารถตีความ bytecode บนชิป

โปรเซสเซอร์ที่มีหน่วยดังกล่าวรวมถึงคำสั่ง BXJ ซึ่งทำให้โปรเซสเซอร์อยู่ใน "โหมด Jazelle" พิเศษหรือหากการเปิดใช้งานยูนิตล้มเหลวก็จะถูกตีความว่าเป็นคำสั่งสาขาปกติ หน่วยใช้ ARM รีจิสเตอร์เพื่อเก็บสถานะ JVM

ผู้สืบทอดต่อเทคโนโลยี Jazelle คือThumbEE


2

เท่าที่ฉันรู้ว่านี่เป็นเรื่องธรรมดาในอดีต

มีคำถามอยู่หลายคำถามที่ James Gosling กล่าวว่ามีคนพยายามทำฮาร์ดแวร์ที่สามารถจัดการกับ JVM bytecode ได้ดีขึ้น แต่จากนั้นคนเหล่านี้จะหาวิธีที่จะทำด้วยสามัญ "intel" intel x86 (อาจจะรวบรวม bytecode อย่างชาญฉลาด)

เขากล่าวว่ามีข้อได้เปรียบในการใช้ชิปยอดนิยมทั่วไป (เช่น intel) เนื่องจากมี บริษัท ขนาดใหญ่ที่ส่งเงินจำนวนมหาศาลไปที่ผลิตภัณฑ์

วิดีโอมีมูลค่าการตรวจสอบ เขาพูดเกี่ยวกับเรื่องนี้ในนาทีที่ 19 หรือ 20


2

ผมค้นหาหน้าอย่างรวดเร็วและดูเหมือนว่าไม่มีใครได้กล่าวถึง CPU ที่พัฒนาขึ้นโดยเฉพาะการดำเนินการออกมา การเขียนโปรแกรมภาษามาเป็นไปตามสแต็คที่มีขนาดกะทัดรัดและใช้ในระบบการควบคุม


2

Intel iAPX CPU ได้รับการออกแบบมาโดยเฉพาะสำหรับภาษา OO แม้ว่าจะไม่ได้ผลมากนัก

iAPX 432 ( Intel Processor ขั้นสูงสถาปัตยกรรม ) คือการออกแบบไมโครโปรเซสเซอร์ของอินเทลแรก 32 บิตแนะนำในปี 1981 เป็นชุดของสามวงจรแบบบูรณา มันมีจุดประสงค์เพื่อเป็นการออกแบบที่สำคัญของ Intel สำหรับทศวรรษ 1980 โดยใช้คุณสมบัติมัลติทาสกิ้งขั้นสูงและการจัดการหน่วยความจำจำนวนมาก การออกแบบจึงเรียกว่าMicromainframe ...

iAPX 432 ถูก"ออกแบบมาให้ตั้งโปรแกรมทั้งหมดในภาษาระดับสูง"โดยAdaเป็นอุปกรณ์หลักและรองรับการเขียนโปรแกรมเชิงวัตถุและการเก็บขยะในฮาร์ดแวร์และไมโครโค้ดโดยตรง การสนับสนุนโดยตรงสำหรับโครงสร้างข้อมูลต่างๆนั้นมีวัตถุประสงค์เพื่อให้ระบบปฏิบัติการที่ทันสมัยสำหรับ iAPX 432 สามารถใช้งานได้โดยใช้รหัสโปรแกรมน้อยกว่าโปรเซสเซอร์ทั่วไป คุณสมบัติและคุณสมบัติเหล่านี้ส่งผลให้การออกแบบฮาร์ดแวร์และไมโครโค้ดนั้นซับซ้อนกว่าตัวประมวลผลส่วนใหญ่ในยุคนั้นโดยเฉพาะไมโครโปรเซสเซอร์

ด้วยการใช้เทคโนโลยีเซมิคอนดักเตอร์ของวันวิศวกรของ Intel ไม่สามารถแปลการออกแบบเป็นการใช้งานครั้งแรกที่มีประสิทธิภาพมาก นอกจากการขาดการปรับให้เหมาะสมในคอมไพเลอร์ Ada ก่อนกำหนดสิ่งนี้มีส่วนทำให้ระบบคอมพิวเตอร์ค่อนข้างช้า แต่มีราคาแพงโดยทำการวัดประสิทธิภาพโดยทั่วไปที่ประมาณ 1/4 ความเร็วของชิป 80286 ใหม่ที่ความถี่สัญญาณนาฬิกาเดียวกัน (ในช่วงต้นปี 1982)

ช่องว่างประสิทธิภาพเริ่มต้นนี้ไปยังโปรไฟล์ที่ค่อนข้างต่ำและราคาต่ำ 8086- สายอาจเป็นเหตุผลหลักว่าทำไมแผนของ Intel ที่จะแทนที่หลัง (ที่รู้จักกันในชื่อ x86) ด้วย iAPX 432 ล้มเหลว แม้ว่าวิศวกรจะเห็นวิธีในการปรับปรุงการออกแบบรุ่นต่อ ๆ ไป แต่สถาปัตยกรรมความสามารถของ iAPX 432 ได้เริ่มได้รับการพิจารณาว่าเป็นค่าใช้จ่ายในการดำเนินการมากกว่าการสนับสนุนที่ทำให้มันง่ายขึ้น

โครงการ iAPX 432 เป็นความล้มเหลวในเชิงพาณิชย์สำหรับ Intel ...


การอ่านกระดาษดูเหมือนว่าหลายแง่มุมของการออกแบบอาจมีประโยชน์ในกรอบงานเชิงวัตถุเช่นได้รับความนิยมในปัจจุบัน สถาปัตยกรรมที่ใช้การรวมกันของ object-id 32- บิตและออฟเซ็ต 32- บิตในหลาย ๆ กรณีให้ประสิทธิภาพการแคชที่ดีกว่าที่ซึ่ง object id ทั้งหมด 64 บิต (ในกรณีส่วนใหญ่แอปพลิเคชันที่จะใช้วัตถุเป็นพันล้าน จะได้รับการบริการที่ดีขึ้นโดยมีมากกว่าที่มีขนาดใหญ่กว่าหนึ่งที่จะเก็บพันล้านไบต์ในวัตถุหนึ่งจะได้รับบริการที่ดีกว่าการแบ่งย่อยที่เป็นวัตถุที่มีขนาดเล็ก
supercat

1

68000 นั้นมี MOVEM ซึ่งเหมาะสมที่สุดในการผลักดันการลงทะเบียนหลายครั้งบนสแต็กในคำสั่งเดียวซึ่งเป็นสิ่งที่หลายภาษาคาดหวัง

หากคุณเห็น MOVEM (MOVE หลายรายการ) นำหน้า JSR (Jump SubRoutine) ตลอดทั้งรหัสคุณจะรู้ว่าคุณกำลังจัดการกับรหัสที่เป็นไปตาม C

อนุญาตให้ MOVEM เพิ่มการลงทะเบียนปลายทางอัตโนมัติโดยอนุญาตให้ใช้งานแต่ละครั้งเพื่อดำเนินการซ้อนต่อบนปลายทางหรือลบออกจากสแต็คในกรณีที่มีการลดลงอัตโนมัติ

http://68k.hax.com/MOVEM


1

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

IMO นี้เกี่ยวข้องอย่างใกล้ชิดกับคำตอบที่ยอดเยี่ยมของ rockets4kids โดย PIC16-s รุ่นแรกได้รับการพัฒนาสำหรับการเขียนโปรแกรมแอสเซมเบลอร์โดยตรง (รวมคำสั่งทั้งหมด 40 คำสั่ง) โดยมีครอบครัวเป้าหมายรุ่นต่อมา C


1

เมื่อตัวประมวลผลร่วมตัวเลข 8087 ได้รับการออกแบบมันเป็นเรื่องธรรมดาสำหรับภาษาที่จะทำการคำนวณทางคณิตศาสตร์ทั้งหมดโดยใช้ชนิดความแม่นยำสูงสุดและปัดผลลัพธ์เป็นความแม่นยำต่ำเมื่อกำหนดให้กับตัวแปรความแม่นยำต่ำ ในมาตรฐาน C ดั้งเดิมตัวอย่างเช่นลำดับ:

float a = 16777216, b = 0.125, c = -16777216;
float d = a+b+c;

จะส่งเสริมaและbเพื่อdoubleเพิ่มพวกเขาส่งเสริมcการdoubleเพิ่มและจากนั้นเก็บผลการปัดเศษให้floatเป็น แม้ว่ามันจะเร็วขึ้นในหลาย ๆ กรณีสำหรับคอมไพเลอร์เพื่อสร้างรหัสที่จะดำเนินการโดยตรงกับประเภทfloatแต่มันง่ายกว่าที่จะมีชุดของจุดลอยตัวซึ่งจะทำงานเฉพาะกับประเภทdoubleพร้อมกับรูทีนการแปลงเป็น / จากfloatกว่าที่จะมีชุดเฉพาะกิจการของการปฏิบัติในการจัดการการดำเนินงานและfloat double8087 ได้รับการออกแบบโดยใช้วิธีการทางคณิตศาสตร์เพื่อทำการคำนวณทางคณิตศาสตร์ทั้งหมดโดยใช้ชนิดจุดลอยตัว 80 บิต [80 บิตอาจถูกเลือกเพราะ:

  1. สำหรับโปรเซสเซอร์ 16- และ 32 บิตหลายตัวมันจะเร็วกว่าในการทำงานกับแมนทิสซา 64 บิตและเลขชี้กำลังแยกต่างหากแทนที่จะทำงานกับค่าซึ่งแบ่งไบต์ระหว่างแมนทิสซาและเลขชี้กำลัง

  2. เป็นการยากมากที่จะทำการคำนวณซึ่งแม่นยำกับความแม่นยำเต็มรูปแบบของประเภทตัวเลขที่ใช้ ถ้าใครพยายามคำนวณเช่น log10 (x) มันง่ายกว่าและเร็วกว่าในการคำนวณผลลัพธ์ที่แม่นยำภายใน 100ulp ของประเภท 80 บิตแทนที่จะคำนวณผลลัพธ์ที่แม่นยำภายใน 1ulp ของ 64- บิต ประเภทและการปัดเศษผลลัพธ์ก่อนหน้าเป็นความแม่นยำ 64 บิตจะให้ค่า 64- บิตซึ่งมีความแม่นยำมากกว่าหลัง

น่าเสียดายที่เวอร์ชันในอนาคตของภาษาได้เปลี่ยนความหมายของการทำงานของประเภทจุดลอยตัว ในขณะที่ความหมาย 8087 น่าจะดีมากหากภาษารองรับภาษาอย่างสม่ำเสมอหากฟังก์ชัน f1 (), f2 () และอื่น ๆ กลับมาประเภทfloatผู้เขียนคอมไพเลอร์จำนวนมากจะใช้มันเพื่อสร้างlong doubleนามแฝงสำหรับประเภท 64- บิตคู่ แทนที่จะเป็นประเภท 80- บิตของคอมไพเลอร์ (และไม่มีวิธีการอื่นในการสร้างตัวแปร 80 บิต) และเพื่อประเมินสิ่งที่ชอบโดยพลการ:

double f = f1()*f2() - f3()*f4();

ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

double f = (float)(f1()*f2()) - (extended_double)f3()*f4();
double f = (extended_double)f1()*f2() - (float)(f3()*f4());
double f = (float)(f1()*f2()) - (float)(f3()*f4());
double f = (extended_double)f1()*f2() - (extended_double)f3()*f4();

โปรดทราบว่าถ้า f3 และ f4 คืนค่าเช่นเดียวกับ f1 และ f2 ตามลำดับนิพจน์ดั้งเดิมควรกลับศูนย์อย่างชัดเจน แต่นิพจน์หลังส่วนใหญ่อาจไม่ สิ่งนี้นำไปสู่การประณามคนที่ "แม่นยำพิเศษ" ของ 8087 แม้ว่าสูตรสุดท้ายโดยทั่วไปจะดีกว่าที่สามและ - ด้วยรหัสที่ใช้ประเภทสองขยายอย่างเหมาะสม - จะไม่ค่อยด้อยกว่า

ในช่วงหลายปีที่ผ่านมา Intel ได้ตอบสนองต่อแนวโน้มของภาษา (IMHO โชคร้าย) ในการบังคับให้ผลลัพธ์ระดับกลางกลมกลืนกับความแม่นยำของตัวถูกดำเนินการโดยการออกแบบตัวประมวลผลในภายหลังเพื่อที่จะสนับสนุนพฤติกรรมดังกล่าว ความแม่นยำในการคำนวณระดับกลาง


โปรดทราบว่าคุณได้รับคำตอบ ( ด้านบน ) ในโพสต์นี้แล้ว พวกเขาตอบว่าสามารถ / ควรรวมเป็นหนึ่งหรือไม่

@MichaelT: ฉันไม่คิดอย่างนั้น - หนึ่งครอบคลุมการออกแบบสแต็คและอื่น ๆ ที่ครอบคลุมความหมายจุดลอย
supercat

แค่ทำให้แน่ใจ โดยส่วนตัวแล้วฉันเชื่อว่ามันเป็นไปได้ที่จะสร้างหนึ่งคำตอบที่แข็งแกร่งขึ้น (ใช้ส่วนหัวเพื่อแยกส่วน) แต่นั่นคือสิ่งที่ฉันทำ คุณอาจต้องการที่จะใช้ส่วนหัวเพื่อระบุอย่างชัดเจนที่ด้านบนสุดของแต่ละคำตอบที่อยู่ ( ## How the stack changed the processorและ## How floating point changed the processor) เพื่อให้ผู้คนสามารถรับความตั้งใจที่เหมาะสมเมื่ออ่านและมีโอกาสน้อยที่จะคิดว่าคุณขาดสติในการตอบหรือประกาศใหม่ คำตอบเดียวกัน (คล้ายกัน)

@MichaelT: คำตอบสองคำนี้แยกจากกันพอสมควรว่าฉันคิดว่าพวกเขาควรได้รับการโหวตแยกต่างหาก แม้ว่า 80486 จะดูดซับฟังก์ชั่นที่ทำก่อนหน้านี้โดย 8087/80287/80387 แต่ 8086 และ 8087 ได้รับการออกแบบให้เป็นชิปแยกต่างหากที่มีสถาปัตยกรรมเกือบเป็นอิสระ แม้ว่าทั้งคู่จะรันโค้ดจากสตรีมคำสั่งทั่วไปที่ได้รับการจัดการโดยการให้ 8086 จัดการกับลำดับไบต์บางอย่างเป็นคำขอเพื่อสร้างคำขอการอ่าน / เขียนที่อยู่ในขณะที่ละเว้นบัสข้อมูลและ 8087 ไม่สนใจทุกอย่างที่เกิดขึ้น
supercat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.