在V8中为x64生成cmp和cmov指令

Ste*_*bev 2 assembly v8 x86-64

我正在尝试Math.clamp使用内部汇编程序在V8中实现我自己的版本。

我设法使用Torque脚本语言生成了它的一个版本,并希望尝试使用CodeStubAssembler内置插件进行类似的实现。我意识到他们被认为是老派,但这似乎是生成我想要的实际装配的最简单方法。目的是使编译器生成的代码与此尽可能相似

问题是:是否有已经产生cmp并产生cmov指令的汇编程序?如果没有,我将如何生成它?

这仅出于教育目的,这就是为什么我仅对x64管道感兴趣并将所有输入都视为整数的原因。

jmr*_*mrk 6

V8开发人员在这里。CodeStubAssembler并不是为了让您精确控制发出什么汇编指令而设计的-它与平台无关,这是其存在的重要原因。

你可以看一下MathBuiltinsAssembler::MathMaxMinsrc/builtins/builtins-math-gen.cc其两个呼叫站点在同一文件进一步往下看,你会怎样表达最小/最大操作(或其他条件的选择),在CSA的序列。然后由为CSA提供动力的Turbofan后端在每个平台上选择适当的机器指令。如果您认为可以改进机器代码,那么解决该问题的方法将是改进Turbofan的指令选择器(和/或更早的优化过程)以检测相关模式。

如果您实际上是想手工编写特定于平台的程序集,也可以这样做:您可以使用特定于平台的MacroAssembler(在x64上公开)cmp和,而不是CodeStubAssembler cmov。剩下一些这样的内置函数,您可以作为示例进行研究,请参阅src/builtins/x64/builtins-x64.cc。过去有很多这样的方法,但是我们几乎将所有方法都迁移到了其他实现技术,例如C ++,CSA或Torque,因为读/写/调试/维护汇编代码非常耗时且容易出错。