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 explorer 上 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
有趣的是,clang 在 32 位情况下使用 vcvtsi2sdl (%rdi), %xmm0, %xmm0
;请注意指令末尾的 l
后缀,而不是中间的
如果 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 explorer 上 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
有趣的是,clang 在 32 位情况下使用 vcvtsi2sdl (%rdi), %xmm0, %xmm0
;请注意指令末尾的 l
后缀,而不是中间的