vcvtlsi2sd指令的定义

Zac*_*chB 2 x86 assembly avx

vcvtlsi2sd如果AVX可用,则v8编译器会发出,但我无法在英特尔参考手册中找到该指令(或在谷歌搜索时在v8之外的任何上下文中).我收集它是一个双重转换的int,但它是什么L

Pet*_*des 5

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指令末尾的后缀,而不是中间的后缀.

  • [汇编源代码的相关部分](https://github.com/v8/v8/blob/master/src/x64/assembler-x64.h#L1502).它显然是操作码"0x2a",实际上是"vcvtsi2sd". (2认同)