vcvtlsi2sd指令的定义

时间:2018-02-20 22:38:53

标签: assembly x86 avx

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

1 个答案:

答案 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 explorerdouble 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}}后缀,而不是中间。

相关问题