vcvtlsi2sd指令的定义

Definition of vcvtlsi2sd instruction

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

l 几乎可以肯定是 32 位 operand-size(对于整数源)的一些 non-standard 语法。

分明是vcvtsi2sd xmm, xmm, r/m32;没有任何其他有意义的指令,特别是如果 int->double 从上下文中有意义。相同的指令适用于 32 位或 64 位整数输入,因此指示 operand-size 是有意义的。 non-VEX SSE2 版本就是 cvtsi2sd xmm, r/m32;我希望 l 在同一个地方,除非 V8 在 non-AVX 情况下使用完全不同的东西。

Operand-size在AT&T语法中一般是后缀(b/w/l/q),不塞入助记符中间。 GAS assemble 是这种语法还是仅来自 V8 的内部转储? gcc 没有将 operand-size 覆盖放在助记符中;如果需要,它在末尾使用 q (当 operand-size 不是由源寄存器暗示时,即使用内存源操作数):

Godbolt compiler explorergcc7.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

有趣的是,clang 在 32 位情况下使用 vcvtsi2sdl (%rdi), %xmm0, %xmm0;请注意指令末尾的 l 后缀,而不是中间的