主要观点:
- 距离上一次关于 RISC-V 后端状态的更新已一年多,最近成功在 RISC-V PC 上运行了《巫师 3》,是首款在 RISC-V 机器上运行的 AAA 游戏,故撰写此更新。
- 一年前 RV64 DynaRec 只能运行一些相对“易运行”的原生 Linux 游戏,当时缺乏可接入 AMD 显卡的 RISC-V 设备及相应图形支持。
- 如今有了 Milk-V Pioneer 等设备,添加了基本 RVV 支持和若干常见 SSE 指令,虽仍有不足但未来可期。
- RISC-V 在 x86 模拟方面缺乏一些关键指令,如从一个寄存器选取范围位到另一个寄存器、从一个寄存器插入位到另一个寄存器范围等,导致翻译效率低。
- 对于 16 字节原子指令,RISC-V 没有对应指令,无法像其他架构那样完美实现,如《巫师 3》中的
LOCK CMPXCHG16B
指令,很多程序会使用此指令。
关键信息:
- 一年前的情况:RV64 DynaRec 能运行部分简单游戏,因新 x86_64 指令实现后 DynaRec 有很多 bug,且当时无接入 AMD 显卡的 RISC-V 设备,IMG 集成显卡不支持 OpenGL 只支持 OpenGL ES。
- 现有设备及进展:Milk-V Pioneer 有 64 核及 PCIe 插槽,xctan 找到将 AMD 显卡接入 VisionFive 2 的方法,已修复大量 RV64 DynaRec bug 并添加新指令,成功运行《巫师 3》。
- RISC-V 指令集现状:x86 指令集大,RV64 后端约实现 1000 条指令,比 ARM64 后端少,SSE 指令用标量实现性能差,已有支持 RVV 的设备如 Milk-V Pioneer 和 SpacemiT K1/M1 SoC 等。
- 最缺指令及影响:缺乏从一个寄存器选取位到另一个寄存器及插入位到另一个寄存器范围的指令,导致 x86 指令在 RISC-V 上实现更繁琐,如简单字节加法需 10 条指令,很多 x86 程序使用的 16 字节原子指令也无法完美实现。
重要细节:
- 以 Stardew Valley 为例说明缺乏合适设备时测试 x86 程序的困难及使用 gl4es 获得一定 OpenGL 支持的情况。
- 详细展示了在 RISC-V 上实现
ADD AH, BL
指令与其他架构的对比。 - 给出了在 RISC-V 上模拟
LOCK ADD [RAX], RCX
指令的代码示例及 16 字节原子指令缺失的情况。 - 展示了运行《巫师 3》时的游戏菜单截图。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。