jbl*_*jbl 12 c c++ x86 sse inline-assembly
我正在尝试实现一些内联汇编程序(在C/C++代码中)以利用SSE.我想复制和复制值(从XMM寄存器或从内存)到另一个XMM寄存器.例如,假设我在内存中有一些值{1,2,3,4}.我想复制这些值,使xmm1填充{1,1,1,1},xmm2填充{2,2,2,2},依此类推.
查看英特尔参考手册,我找不到执行此操作的说明.我是否只需要使用重复MOVSS和旋转的组合(通过PSHUFD?)?
Lir*_*una 15
有两种方法:
shufps
仅限使用:
__m128 first = ...;
__m128 xxxx = _mm_shuffle_ps(first, first, 0x00); // _MM_SHUFFLE(0, 0, 0, 0)
__m128 yyyy = _mm_shuffle_ps(first, first, 0x55); // _MM_SHUFFLE(1, 1, 1, 1)
__m128 zzzz = _mm_shuffle_ps(first, first, 0xAA); // _MM_SHUFFLE(2, 2, 2, 2)
__m128 wwww = _mm_shuffle_ps(first, first, 0xFF); // _MM_SHUFFLE(3, 3, 3, 3)
Run Code Online (Sandbox Code Playgroud)让使用编译器选择的最佳方式_mm_set1_ps
和_mm_cvtss_f32
:
__m128 first = ...;
__m128 xxxx = _mm_set1_ps(_mm_cvtss_f32(first));
Run Code Online (Sandbox Code Playgroud)请注意,第二种方法将在MSVC上生成可怕的代码,如此处所述,并且只会产生'xxxx',这与第一种方法不同.
我正在尝试实现一些内联汇编程序(在C/C++代码中)以利用SSE
这非常难以置信.使用内在函数.
将源移动到dest寄存器.使用'shufps'并只使用新的dest寄存器两次,然后选择适当的掩码.
以下示例将XMM2.x的值广播到XMM0.xyzw
MOVAPS XMM0, XMM2
SHUFPS XMM0, XMM0, 0x00
Run Code Online (Sandbox Code Playgroud)