gpt4 book ai didi

c++ - 如何使用来自另一个 XMM 寄存器条目的 4 个相同 float 填充 x86 XMM 寄存器?

转载 作者:IT老高 更新时间:2023-10-28 23:12:56 25 4
gpt4 key购买 nike

我正在尝试实现一些内联汇编器(在 C/C++ 代码中)以利用 SSE。我想将值(从 XMM 寄存器或内存)复制并复制到另一个 XMM 寄存器。例如,假设我在内存中有一些值 {1, 2, 3, 4}。我想复制这些值,使 xmm1 填充 {1, 1, 1, 1},xmm2 填充 {2, 2, 2, 2},依此类推。

查看英特尔引用手册,我找不到执行此操作的说明。我只需要结合使用重复的 MOVSS 和旋转(通过 PSHUFD 吗?)?

最佳答案

有两种方式:

  1. 仅使用 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)
  2. 让编译器使用_mm_set1_ps_mm_cvtss_f32选择最佳方式:

    __m128 first = ...;
    __m128 xxxx = _mm_set1_ps(_mm_cvtss_f32(first));

请注意,第二种方法会在 MSVC 上产生可怕的代码,as discussed here ,并且只会产生 'xxxx' 作为结果,这与第一个选项不同。

I'm trying to implement some inline assembler (in C/C++ code) to take advantage of SSE

这是非常不便携的。使用内在函数。

关于c++ - 如何使用来自另一个 XMM 寄存器条目的 4 个相同 float 填充 x86 XMM 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com