- RV64 DynaRec ของ Box64 พัฒนาจากระดับที่เมื่อ 1 ปีก่อนรันได้เพียงเกม Linux แบบเนทีฟง่าย ๆ ไปจนถึงขั้นรัน The Witcher 3 บนพีซี RISC-V ได้
- จุดเปลี่ยนของความคืบหน้าคือการที่สามารถ ใช้การ์ดจอ AMD ได้ ทำให้ข้อจำกัดด้าน OpenGL ลดลง และสามารถทดสอบโปรแกรม x86 ได้มากขึ้นพร้อมแก้บั๊กได้มากขึ้น
- แบ็กเอนด์ RV64 มีจำนวนคำสั่ง x86 ที่อิมพลีเมนต์น้อยกว่าแบ็กเอนด์ ARM64 และในฝั่ง RISC-V ยังมีงานค้างอีกมากสำหรับ คำสั่ง AVX
- RISC-V ขาดการดึง/แทรกช่วงบิตและ คำสั่งอะตอมิกขนาด 16 ไบต์ ทำให้ต้นทุนการแปลสำหรับอีมูเลชัน x86 สูงกว่า AArch64 หรือ LoongArch64
- The Witcher 3 สามารถรันจริงด้วย box64 โดยทำได้สูงสุด 15fps ในเกม และถึงความเร็วเต็มในเมนูหลัก
กว่าจะรัน The Witcher 3 บน RISC-V ได้
- เมื่อ 1 ปีก่อน RV64 DynaRec รันได้เฉพาะ เกม Linux แบบเนทีฟที่รันค่อนข้างง่าย อย่าง Stardew Valley และ World of Goo
- คอขวดในตอนนั้นมีหลัก ๆ 2 อย่าง
- ระหว่างเพิ่มคำสั่ง x86_64 ให้แบ็กเอนด์ RISC-V อย่างรวดเร็ว ยังมี บั๊กของ DynaRec เหลืออยู่มาก
- GPU ในตัว IMG ของ VisionFive 2 และ LicheePi 4A รองรับเฉพาะ OpenGL ES และไม่รองรับ OpenGL
- แม้จะได้การรองรับ OpenGL บางส่วนผ่าน gl4es จนรันเกมอย่าง Stardew Valley ได้ แต่ก็ยังไม่เพียงพอสำหรับเกม Linux ที่หนักกว่าและเกม Windows ทั่วไป
- Milk-V Pioneer ของ Sophgo เป็นพีซี RISC-V แบบ 64 คอร์ และมีสล็อต PCIe สำหรับเสียบการ์ดจอ
- ผู้ร่วมพัฒนาอีกคนคือ xctan พบวิธี “เชื่อมต่อ” การ์ดจอ AMD เข้ากับ VisionFive 2 ผ่านอินเทอร์เฟซ M.2
- เมื่อสามารถใช้การ์ดจอ AMD ได้ ขอบเขตโปรแกรม x86 ที่ทดสอบได้ก็กว้างขึ้น และมีการแก้บั๊ก RV64 DynaRec กับเพิ่มคำสั่ง x86 จำนวนมาก
- ผลคือเมื่อรัน The Witcher 3 ครั้งแรก เกมก็ทำงานได้ทันที
สถานะปัจจุบันของ RV64 DynaRec
- ชุดคำสั่ง x86 มีขนาดใหญ่มาก และขนาดการอิมพลีเมนต์ก็แตกต่างกันไปในแต่ละแบ็กเอนด์
- แบ็กเอนด์ ARM64 อิมพลีเมนต์คำสั่ง x86 โดยรวมแล้ว มากกว่า 1,600 คำสั่ง
- แบ็กเอนด์ RV64 อิมพลีเมนต์คำสั่ง x86 ประมาณ 1,000 คำสั่ง
- ในจำนวนนี้มากกว่า 300 คำสั่งเป็นคำสั่ง AVX ที่เพิ่งรองรับใหม่ และยังไม่ได้อิมพลีเมนต์บน RISC-V เลย
- ในการอิมพลีเมนต์คำสั่ง SSE นั้น RISC-V ก็เสียเปรียบด้านประสิทธิภาพ
- แบ็กเอนด์ RV64 อิมพลีเมนต์คำสั่ง SSE ด้วย คำสั่งสเกลาร์
- AArch64 ใช้ส่วนขยาย Neon ส่วน LoongArch64 ใช้ส่วนขยาย LSX
- ความแตกต่างนี้ทำให้ประสิทธิภาพต่ำกว่าอีกสองแบ็กเอนด์อย่างมาก
- RISC-V มีส่วนขยายเวกเตอร์ชื่อ RVV
- Milk-V Pioneer รองรับส่วนขยาย xtheadvector ซึ่งเป็นรูปแบบหนึ่งของ RVV 0.7.1
- SoC SpacemiT K1/M1 รองรับ RVV 1.0 ที่ได้รับการให้สัตยาบันแล้ว
- Banana Pi F3 และ Milk-V Jupiter ที่ใช้ SoC นี้มีวางจำหน่ายแล้ว
- เมื่อเร็ว ๆ นี้ box64 ได้เพิ่มการรองรับ RVV ขั้นพื้นฐานและการอิมพลีเมนต์คำสั่ง SSE ทั่วไปบางรายการ
- งานด้าน RVV ยังอยู่ในช่วงเริ่มต้นมาก จึงยังไม่ช่วยเพิ่มประสิทธิภาพในตอนนี้
คำสั่ง RISC-V ที่ขาดเป็นพิเศษสำหรับอีมูเลชัน x86
- จากมุมมองของอีมูเลชัน x86 นั้น RISC-V ถือว่าเป็นหนึ่งในสถาปัตยกรรมที่ มีความสามารถในการแสดงคำสั่งต่ำที่สุด ในบรรดา 3 สถาปัตยกรรมที่รองรับ
- เมื่อเทียบกับ AArch64 และ LoongArch64 แล้ว RISC-V ขาดคำสั่งที่สะดวก ทำให้ต้องใช้คำสั่งมากกว่าเมื่ออีมูเลตการทำงานเดียวกัน
- โดยเฉพาะอย่างยิ่ง ขาดฟังก์ชันสำคัญ 2 อย่าง
- ฟังก์ชันเลือก ช่วงบิต เฉพาะจากรีจิสเตอร์หนึ่งแล้วนำไปยังอีกรีจิสเตอร์หนึ่ง
- ฟังก์ชันแทรกบางบิตของรีจิสเตอร์หนึ่งเข้าไปในช่วงเฉพาะของอีกรีจิสเตอร์หนึ่ง
- LoongArch64 และ AArch64 มีคำสั่งที่ทำสิ่งนี้ได้
- LoongArch64 ใช้
BSTRPICK.DและBSTRINS.D - ARM64 ใช้ opcode
UBFXและBFI
- LoongArch64 ใช้
- RISC-V ไม่มีคำสั่งที่สอดคล้องกันทั้งในส่วนขยายทางการและส่วนขยายของผู้ผลิต
ตัวอย่าง ADD AH, BL แสดงต้นทุนการแปล
- x86 ISA มีแนวโน้มที่จะคงบิตที่ไม่ได้เปลี่ยนไว้ ทำให้การจัดการรีจิสเตอร์บางส่วนมีความสำคัญ
- ในกรณีของ
ADD AH, BLbox64 ต้องทำงานต่อไปนี้- ดึงไบต์ล่างสุดของ
RBX - นำไปบวกกับไบต์ล่างสุดลำดับที่สองของ
RAX - แทรกผลลัพธ์กลับเข้าไปในไบต์ล่างสุดลำดับที่สองของ
RAX - คงไบต์ที่เหลือของ
RAXไว้เหมือนเดิม
- ดึงไบต์ล่างสุดของ
- บน LoongArch64 สามารถอิมพลีเมนต์ได้อย่างเรียบง่ายและตรงไปตรงมาด้วย
BSTRPICK.D,ADD,BSTRINS.D - บน RISC-V ต้องผสมผสาน shift, mask,
AND,ORฯลฯ เพื่อทำงานเดียวกัน จึงต้องใช้ 10 คำสั่ง - กรณีแบบนี้ไม่ได้เป็นตัวอย่างโดดเดี่ยว และ x86 มีคำสั่งรูปแบบคล้ายกันจำนวนมาก ทำให้การอิมพลีเมนต์บน RISC-V ยุ่งยากกว่า
ข้อจำกัดของคำสั่งอะตอมิกขนาด 16 ไบต์
- x86 มี คำสั่งที่มีคำนำหน้า LOCK สำหรับการทำงานแบบอะตอมิกที่ไม่ต้องใช้ lock
- box64 อีมูเลตสิ่งนี้หลัก ๆ ด้วยลำดับ LR/SC
- LR/SC ย่อมาจาก Load-Reserved / Store-Conditionally
- ตัวอย่างเช่น
LOCK ADD [RAX], RCXจะถูกสร้างเป็นรูปแบบLR.D,ADD,SC.D, และการแตกแขนงตามเงื่อนไข
- หากที่อยู่
RAXไม่ได้จัดแนวไว้ จะซับซ้อนขึ้น แต่โดยทั่วไปวิธีนี้ทำงานได้ดี - ปัญหาคือ
LOCK CMPXCHG16B- คำสั่งนี้เปรียบเทียบ
RDX:RAXกับข้อมูล 16 ไบต์ในหน่วยความจำ - จากนั้นสลับ
RCX:RBXไปยังที่อยู่หน่วยความจำนั้นตามเงื่อนไข
- คำสั่งนี้เปรียบเทียบ
- AArch64 และ LoongArch64 มี คำสั่งอะตอมิกขนาด 16 ไบต์ บางส่วนที่ใช้ในการอิมพลีเมนต์ได้
- RISC-V ไม่มีคำสั่งที่สอดคล้องกัน จึงไม่สามารถอิมพลีเมนต์ได้สมบูรณ์เท่าสถาปัตยกรรมอื่น
- โปรแกรมจำนวนมากรวมถึงเกม Unity ใช้
LOCK CMPXCHG16B
ผลการรันจริง
- แม้ยังมีข้อจำกัดเหลืออยู่ แต่ The Witcher 3 ก็รันบน RISC-V ได้ด้วย box64
- ประสิทธิภาพในเกมทำได้สูงสุดถึง 15fps
- ในเมนูหลักทำงานที่ ความเร็วเต็ม
- ถือว่าไม่เลวสำหรับผลลัพธ์จากเครื่องที่ไม่ได้ออกแบบมาเพื่อรันเกม AAA
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ในฐานะคนที่ไม่ได้ทำงานฝั่งชิป อยากรู้ว่าเวลาเขียน ซอฟต์แวร์สำหรับ RISC-V วิศวกรซอฟต์แวร์ต้องทำอะไรให้ต่างออกไปบ้าง
สงสัยว่าขนาดไฟล์ปฏิบัติการจะใหญ่ขึ้นจนต้องปรับแต่ง cache locality อย่างจริงจังหรือเปล่า และก็อยากรู้ว่ามีประเภทซอฟต์แวร์แบบเกมหรือเว็บเซิร์ฟเวอร์ที่เหมาะกับ CISC/RISC ฝั่งใดฝั่งหนึ่งมากกว่ากันไหม
ในเชิงแนวทางการทำซอฟต์แวร์ ไม่ได้มีอะไรที่ต้องเปลี่ยนโดยพื้นฐานมากนัก และความต่างใหญ่สุดเมื่อเทียบกับ x86-64 คือมีรีจิสเตอร์ 32 ตัว จึงเก็บค่ากลางได้มากขึ้นก่อนที่จะต้อง spill ลงสแตก แต่ ARM ก็มี 32 ตัวเช่นกันจึงคล้ายกัน ปกติถ้าไม่ได้ทำ micro-optimization ก็แทบไม่ต้องกังวลมาก
ถ้าลงรายละเอียดกว่านั้น ส่วนขยายเวกเตอร์ (V/RVV) ไม่ได้อยู่ใน ISA พื้นฐาน rv64gc จึงอาจไม่ได้รับการปรับแต่ง SIMD แล้วแต่เป้าหมาย และ popcount รวมถึงการนับจำนวน 0 นำหน้า/ต่อท้ายก็ไม่มีใน rv64gc พื้นฐาน ต้องใช้ Zbb นอกจากนี้ การเลือกแบบไม่มี branch อย่าง
a ? b : cใน rv64gc พื้นฐานต้องใช้คำสั่ง 4~5 คำสั่ง, ถ้าใช้ Zicond ใช้ 3 คำสั่ง แต่ใน x86-64 และ aarch64 ทำได้ด้วยคำสั่งเดียวโปรไฟล์ RISC-V ช่วยแก้ปัญหาสองข้อแรกได้ในระดับหนึ่ง เช่น Android กำหนดให้ใช้ rva23 ซึ่งต้องมี RVV, Zbb, Zicond ฯลฯ แต่ถ้าดิสทริบิวชันลินุกซ์ตั้งเป้าเป็น rva20/rv64gc โค้ดที่คอมไพล์ไว้ล่วงหน้าและไม่ได้ใส่ dynamic dispatch ก็แทบจะใช้ส่วนขยายเหล่านั้นไม่ได้ไปอีกนาน ปัญหาคล้ายกันก็มีใน x86-64 แต่ ARM มีส่วนขยายน้อยกว่ามากจึงเบากว่า โดย SVE เป็นข้อยกเว้นที่ใหญ่ที่สุด แต่ตอนนี้ยังไม่ได้รับการรองรับอย่างแพร่หลาย
ความต่างที่ใหญ่ที่สุดคือ memory model ที่อ่อนกว่า ซึ่งเป็นคุณสมบัติที่มีในสถาปัตยกรรมที่ไม่ใช่ x86 ส่วนใหญ่อย่าง ARM ด้วย และตั้งแต่แรกโค้ดก็ไม่ควรพึ่งพา memory model ที่แข็งอยู่แล้ว
ความหนาแน่นของโค้ดปฏิบัติการนั้น ด้วยเหตุผลทางประวัติศาสตร์ x86 ไม่ได้ดีนัก ขนาดไฟล์ปฏิบัติการจึงไม่ได้เพิ่มขึ้นมากเท่าที่คิด RISC-V ที่มีส่วนขยายคำสั่งแบบบีบอัด และ ARM 32 บิตที่มีส่วนขยาย Thumb ค่อนข้างหนาแน่นทีเดียว
สิ่งสำคัญไม่ใช่ CISC เทียบกับ RISC แต่คือการมีอยู่และคุณภาพของ คำสั่งเวกเตอร์ กับส่วนขยายด้านการเข้ารหัส วิดีโอเข้ารหัส/ถอดรหัสพึ่งพาคำสั่งเวกเตอร์อย่างมากเพื่อให้ได้ประสิทธิภาพดี และการเข้ารหัสดิสก์ทั้งลูกหรือการทำแฮชอาจได้ประโยชน์จากคำสั่งเฉพาะที่ช่วยเร่งอัลกอริทึมอย่าง AES, SHA256
ประเด็นหลักคือการเป็นอิสระจากสิทธิบัตรของ ARM และใกล้เคียงกับการ เริ่มต้นใหม่ บนพื้นฐานของบทเรียนที่ได้เรียนรู้มา
นึกถึงคนรัสเซียชื่อดังที่รัน Atomic Heart บน Elbrus 8S
Elbrus มีตัวแปลแบบเนทีฟ และเท่าที่รู้ก็ถือว่าใช้ได้ดีทีเดียว Atomic Heart เล่นได้ในระดับหนึ่งที่ประมาณ 15~25fps
บทความอธิบาย “พื้นฐาน” น้อยไปหน่อย ตอนแรกนึกว่าใช้พอร์ต Wine อะไรแบบนั้นรัน แต่จริง ๆ ดูเหมือนว่าเป็นการนำ x86_64 ISA ไปใช้งานบนชิป RISC-V ด้วยวิธีใดวิธีหนึ่ง
ถ้ามีใครอธิบายเพิ่มเติมได้ว่าตรงนั้นทำงานอย่างไรคงดี
แม้จะเป็นอีมูเลเตอร์ แต่ไลบรารี “ระบบ” บางส่วนอย่าง libc, libm, SDL, OpenGL ใช้เวอร์ชันเนทีฟ จึงผสานใช้งานกับแอปพลิเคชันส่วนใหญ่ได้ง่าย และในบางกรณีประสิทธิภาพก็อาจสูงอย่างน่าประหลาดใจ Wine ก็สามารถคอมไพล์เป็นเนทีฟแล้วรันได้เช่นกัน
เป็นผลลัพธ์ที่น่าทึ่ง งานหนักมหาศาล และในบางกรณีก็ดูเหมือนจะแตะ ขีดจำกัดของ RISC-V แล้ว
คำสั่งรวบรวม/กระจายบิตน่าจะควรถูกใส่เข้ามาเป็นส่วนขยาย
สิ่งที่น่าสนใจคือ ในบรรดา 3 สถาปัตยกรรมที่รองรับในบริบทของการจำลอง x86 นั้น RISC-V เป็นตัวที่มีความสามารถในการแสดงออกต่ำที่สุด
ในวิชาประวัติศาสตร์วิทยาการคอมพิวเตอร์ เราเรียนว่า RISC คือคอมพิวเตอร์ชุดคำสั่งแบบลดทอน แต่พอดูข้อเสนอโปรไฟล์ RISC-V หรือบทความต่าง ๆ ช่วงนี้ มักเห็นแนวคิดประมาณว่า “เพื่อให้มีความสามารถเทียบเท่ากัน แค่ต้องเพิ่มคำสั่งอีกไม่กี่ตัว” ผมเข้าใจว่า RISC-V เป็นทางเลือกที่สะดวกแทนแพลตฟอร์มอื่นสำหรับหลายคน แต่ก็สงสัยว่านี่หมายความว่า ความฝันของ RISC ตายไปแล้วหรือเปล่า
จากที่จำได้ตอนอ่านสเปก RISC-V เขาค่อนข้างเข้มงวดกับการไม่เพิ่มคำสั่งแบบ “คอมโบ” เพราะลำดับคำสั่งที่พบบ่อยสามารถ fuse กันได้ที่ฟรอนต์เอนด์
สิ่งที่ RISC-V ขาดเมื่อเทียบกับ x86/ARM ดูเหมือนไม่ได้มาจากลัทธิ RISC แบบสุดโต่ง แต่เกิดจากสเปกที่เริ่มจากชิปฝังตัวพื้นฐานมาก ๆ แล้วค่อยเพิ่มส่วนขยายสำหรับ CPU แอปพลิเคชันตามกาลเวลา ใน RV32I พื้นฐานไม่มีแม้แต่การคูณจำนวนเต็มด้วยซ้ำ น่าเสียดายที่การถกเถียงเรื่อง bit manipulation และส่วนขยาย SIMD/เวกเตอร์ใช้เวลายุตินานเกินไป และผลก็คือเกิดช่องว่างของฟีเจอร์ที่กำลังพูดถึงกันตอนนี้
แต่แลกมากับการตัดคำสั่งบางอย่างที่สะดวกสำหรับประสิทธิภาพสูงออกไป
พายป์ไลน์ที่เรียบง่ายยังมีข้อดีคือกินทรัพยากรวิศวกรรมของทีมที่ออกแบบประสิทธิภาพสูงน้อยลง ทำให้มีเวลาใช้กับการปรับแต่งมากขึ้น
โดยทั่วไป RISC เป็น ปรัชญาการทำให้เรียบง่าย แต่ระดับของมันแตกต่างกันไป MIPS ถูกทำให้ง่ายพอ ๆ กับ RISC-V แต่ ARM และ POWER ประนีประนอมมากกว่า และดูเหมือนไม่มีปัญหาใหญ่ในการชนกับ x86 ในกลุ่มประสิทธิภาพสูง
ตลาดของโปรเซสเซอร์ยังมีช่องเฉพาะอีกหลายแบบนอกจากการรันแอปพลิเคชัน เช่น embedded และ accelerator ในช่องเฉพาะที่เรียกว่าแอปพลิเคชันคอร์ ผมค่อนข้างมอง RISC-V ในแง่ลบ แต่ถ้ามองกว้างกว่านั้น ศักยภาพมีมาก และอาจครองช่องเฉพาะเชิงพาณิชย์บางส่วนได้ อีกทั้งยังยอดเยี่ยมในฐานะเครื่องมือเพื่อการศึกษาและวิจัย
ลักษณะของ RISC แบบคลาสสิกคือคำสั่งจัดการข้อมูลส่วนใหญ่ทำงานเฉพาะบนรีจิสเตอร์ คำสั่งหน่วยความจำส่วนมากมีเพียง load/store ไปยังรีจิสเตอร์ จึงต้องมีรีจิสเตอร์จำนวนมาก การส่งพารามิเตอร์ต้องจัดการสแตกโดยตรง ก็เลยต้องสร้างสแตกเอง และแทนที่จะมีคำสั่ง CALL/JSR ก็ทำด้วยคำสั่งพื้นฐานที่ load/store ไปยังรีจิสเตอร์ instruction pointer โดยตรง การเข้ารหัสคำสั่งคาดเดาได้และทุกคำสั่งมีขนาดเท่ากัน สถาปัตยกรรม RISC หลายแบบยังมีรีจิสเตอร์ที่อ่านได้เป็น 0 เสมอและเขียนไม่ได้ ใช้ตอนตั้งค่าเป็น 0
วิธีนี้ได้ผล แต่ภายหลัง การประมวลผลแบบไม่เรียงลำดับ และ SIMD ทำให้ความสำคัญลดลง สตรีมคำสั่งดิบใกล้เคียงกับการประกาศเส้นทางไปสู่ผลลัพธ์ที่ต้องการ ไม่ได้หมายความว่า CPU จะรันตามนั้นจริง ๆ เบื้องหลังยังมี speculative execution, branch prediction และ register renaming ส่วน SIMD ก็คล้ายกับพื้นที่รีจิสเตอร์กว้าง ๆ และคำสั่งที่ทำงานกับค่าทั้งหมดในนั้น สุดท้ายการประมวลผลแบบไม่เรียงลำดับและ SIMD ก็เป็นฝ่ายนำ
ในทางทฤษฎี ถ้าคอมไพล์ ซอร์สโค้ด ต้นฉบับสำหรับ RISC ก็จะได้ไบนารีที่ต่างไปโดยสิ้นเชิง และอาจไม่ต้องใช้คำสั่งเฉพาะเหล่านั้น
แต่ในทางปฏิบัติ คงไม่มีใครจะคอมไพล์เกมพวกนี้สำหรับ RISC-V จริง ๆ
ในสกรีนช็อตแสดง RAM 31GB ซึ่งมากกว่าสเปกสูงสุดของบอร์ดพัฒนาที่กล่าวถึงอย่างชัดเจน ที่นี่ใช้ตัวอื่นอยู่หรือเปล่า?
ถ้าเป็นตอนนี้ น่าจะดีกว่าถ้าใช้หนึ่งในตัวเลือกล่าสุดที่มีหลายคอร์ที่เร็วกว่าและรองรับ RVA22 กับ RVV 1.0 แล้ว
นี่คือ 86Box หรือเปล่า? สนุกดีที่ได้ย้อนนึกถึงสมัยที่ซื้อ Amstrad PC1512
พอเพิ่มฮาร์ดการ์ด 500MB สองตัวกับส่วนขยายหน่วยความจำ 128KB จนเป็น 640KB แล้วสนุกขึ้นมาก ตอนแรกมีแค่ฟลอปปี 360KB สองไดรฟ์ และอีกไม่กี่ปีต่อมาก็เพิ่มฮาร์ดการ์ด 32MB เข้าไป ยังมี Borland TurboPascal กับ Zortech C ด้วย เป็นช่วงเวลาที่สนุกจริง ๆ
แต่ก็ยังจำสมัยใช้ Amstrad PC1512 ได้เหมือนกัน
สงสัยว่าสักวันจะมีระบบที่ใส่ CPU RISC-V ขนาดใหญ่ไม่กี่ตัว พร้อม “GPU” ที่สร้างด้วย CPU RISC-V ขนาดเล็กเป็นพวงหรือไม่
น่าจะเป็นรูปแบบที่ติดฟีเจอร์เวกเตอร์ที่เหมาะสมเข้าไป และคำถามเสริมคือ แนวทางเวกเตอร์แบบคลาสสิก แทน packed SIMD จะมีประโยชน์ใน GPU หรือไม่
ถ้าพูดถึงความสำเร็จทางเทคนิคที่น่าประทับใจของ Witcher 3 ก็มีพอร์ต Switch ด้วย และมันรันได้ดีจริง ๆ
มันแสดงให้เห็นว่าการปรับแต่งทำอะไรได้มากแค่ไหน และบน PC มีทรัพยากรถูกสิ้นเปลืองไปมากเพียงใดเพราะ การปรับแต่งที่แย่
มันไม่ใช่การเทียบแบบแอปเปิลกับแอปเปิล และช่วงที่แสดงบนหน้าจอก็ต่างกันมาก จึงยากที่จะสรุปว่าเป็นเพราะการปรับแต่งที่แย่บน PC
หวังว่า ฟีดแบ็กในระดับ ISA แบบนี้จะถูกส่งต่อไปถึงคนฝั่ง RVI
เมื่อวานลองตรวจสอบดู [1] พบว่าตัวอย่างในบทความสามารถทำได้ด้วยคำสั่ง RISC-V 4 คำสั่งอยู่แล้ว เพียงแต่ค่อนข้างนึกออกยาก
# a0 = rax, a1 = rbxslli t0, a1, 64-8rori a0, a0, 16add a0, a0, t0rori a0, a0, 64-16[1] https://www.reddit.com/r/RISCV/comments/1f1mnxf/box64_and_ri...
อันที่จริง การขาด การดึงบิตฟิลด์ เป็นความผิดพลาดที่ชัดเจนเกินไป จนเป็นตัวอย่างโปรดของผมที่แสดงให้เห็นว่า RISC-V ISA นั้นเหลวไหลแค่ไหน อันดับสองคือการไม่มีโหมดการระบุที่อยู่ที่สมเหตุสมผล
การออกแบบ RISC-V ที่ดีกว่าบางส่วนจึงนำคำสั่งแบบกำหนดเองสำหรับเรื่องนี้มาใช้จริง เช่น BEXTM ของ Hazard3: https://github.com/Wren6991/Hazard3/blob/stable/doc/hazard3....