vcvtlsi2sd如果AVX可用,则v8编译器会发出,但我无法在英特尔参考手册中找到该指令(或在谷歌搜索时在v8之外的任何上下文中).我收集它是一个双重转换的int,但它是什么L?
的l是几乎可以肯定的32位操作数大小一些非标准的语法(整数源).
这显然是一个vcvtsi2sd xmm, xmm, r/m32; 没有任何其他指令是有意义的,特别是如果int-> double从上下文有意义.相同的指令适用于32或64位整数输入,因此指示操作数大小是有意义的.非VEX SSE2版本很简单cvtsi2sd xmm, r/m32; l除非V8使用与非AVX情况完全不同的东西,否则我希望在同一个地方.
操作数大小通常是AT&T语法中的后缀(b/w/l/q),而不是填充到助记符的中间.GAS是否汇编了这种语法,还是只是来自V8的内部转储?gcc不会将操作数大小覆盖放在助记符内; q如果需要,它在末尾使用a (当源寄存器不暗示操作数大小时,即使用内存源操作数):
在Godbolt编译器资源管理器上gcc7.3 -O3 -mavx:
double cvt32(int *a) {
return *a;
}
vxorpd %xmm0, %xmm0, %xmm0
vcvtsi2sd (%rdi), %xmm0, %xmm0
ret
double cvt64(long long *a) {
return *a;
}
vxorpd %xmm0, %xmm0, %xmm0
vcvtsi2sdq (%rdi), %xmm0, %xmm0 # gcc7.3
ret
Run Code Online (Sandbox Code Playgroud)
有趣的是,clang vcvtsi2sdl (%rdi), %xmm0, %xmm0用于32位的情况; 注意l指令末尾的后缀,而不是中间的后缀.