如果AVX可用,v8编译器会发出vcvtlsi2sd
,但我无法在英特尔参考手册中找到该指令(或在谷歌搜索时在v8之外的任何上下文中)。我认为它是双转换的int,但是L
是什么?
答案 0 :(得分:5)
cvtsi2sd xmm, r/m32
几乎肯定是32位操作数大小的非标准语法(对于整数源)。
显然是vcvtsi2sd xmm, xmm, r/m32
;没有任何其他指令是有意义的,特别是如果int-> double从上下文有意义。相同的指令适用于32或64位整数输入,因此指示操作数大小是有意义的。非VEX SSE2版本只是l
;除非V8使用与非AVX情况完全不同的东西,否则我希望在同一个地方有一个q
。
操作数大小通常是AT& T语法中的后缀(b / w / l / q),而不是填充到助记符的中间。 GAS是否汇编了这种语法,还是只是来自V8的内部转储? gcc没有将操作数大小覆盖放在助记符内;如果需要,它在末尾使用gcc7.3 -O3 -mavx
(当源寄存器隐含操作数大小时,即使用内存源操作数):
在Godbolt compiler explorer上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
:
vcvtsi2sdl (%rdi), %xmm0, %xmm0
有趣的是,clang使用l
来表示32位的情况;请注意指令末尾的{{1}}后缀,而不是中间。