https://discussion.fedoraproject.org/t/f42-change-proposal-integrate-fex-in-fedora-linux-self-contained/131147
在且仅在 aarch64 上拖家带口地预装一个在且仅在 aarch64 上能运行的 x86-64 模拟器,真行啊
在且仅在 aarch64 上拖家带口地预装一个在且仅在 aarch64 上能运行的 x86-64 模拟器,真行啊
Fedora Discussion
F42 Change Proposal: Integrate FEX in Fedora Linux (Self-Contained)
Integrate FEX in Fedora Linux This is a proposed Change for Fedora Linux. This document represents a proposed Change. As part of the Changes process, proposals are publicly announced in order to receive community feedback. This proposal will only be implemented…
🙈1
今天给 box64 RISC-V 后端增加了 eflags 指令融合的优化,填补了 eflags 模拟的最后一片空白。在 4 个线程的 p7zip benchmark 中,执行效率达到了原生的 70%!
举例来说,对于如下的指令序列:
注释中是 box64 的 eflags 依赖计算根据当前指令序列推断出来的信息,即
但这真的足够好吗?只计算
但如果从语义的角度出发,
具体到实现中,虽然涉及到很多实现细节,但其实就是检测连续的两条指令是否符合这个模式,然后将符合的替换为原生的 RISC-V 指令即可,有了已有的依赖计算的帮助,检测工作实际上非常容易。
图中第一个是带有指令融合的跑分,第二个是原生的跑分,第三个是不带指令融合的跑分。
举例来说,对于如下的指令序列:
// set SF/OF/ZF
cmp rax, rbx
// use SF/OF/ZF
jle .label
// flush cmp, set ...
test rcx, rcx
...
.label:
注释中是 box64 的 eflags 依赖计算根据当前指令序列推断出来的信息,即
jle 需要 SF/OF/ZF 来完成 less than or equal 的计算,同时 test 会刷新所有的 flags,所以 cmp 只需要对 jle 负责,完成以上三个 flags 的计算即可。但这真的足够好吗?只计算
SF/OF/ZF 也非常昂贵,RISC-V 没有龙架构 LBT 这样的专用硬件,这些 flags 的计算全靠手动写汇编来模拟,保守估计也要十几条指令来完成。但如果从语义的角度出发,
cmp+jle 其实就是在做 jump if rax<=rbx 。所以我们要做的其实就是把这两条指令当成一条指令来看待,直接翻译成一条 BGE rbx, rax !具体到实现中,虽然涉及到很多实现细节,但其实就是检测连续的两条指令是否符合这个模式,然后将符合的替换为原生的 RISC-V 指令即可,有了已有的依赖计算的帮助,检测工作实际上非常容易。
图中第一个是带有指令融合的跑分,第二个是原生的跑分,第三个是不带指令融合的跑分。
🔥10🤯1