我不熟悉libsimdpp库,但据我所知,您可以使用它
simdpp::shuffle2x2
,具有合适的排列索引,作为
_mm_move_sd
https://github.com/p12tic/libsimdpp/blob/master/simdpp/detail/insn/shuffle2x2.h
,我们可以这样看
_mm_shuffle_pd
_mm_blend_pd
根据选择的排列索引使用。这些英特尔内部函数可以作为
.
manual page
似乎你必须选择排列指数
s0 = 2
,和
s1 = 1
_移动
. 这与
第156和157行
shuffle2x2.h
,即:
if (s0 == 2 && s1 == 1) {return _mm_blend_pd(b.native(), a.native(), 0x2);}
另一种选择
_mm_move_ss
_mm_blend_ps
,戴上合适的面罩。与
simdpp::shuffle4x2
libsimdpp库选择
在x86体系结构上,如果置换索引满足以下条件
(s0==0 || s0==4) && (s1==1 || s1==5) && (s2==2 || s2==6) && (s3==3 || s3==7)
,请参见
sse_float32_4x2.h
,第40行和第155行。
_mm_blend_ps(a, b, 1)
_移动
movss
说明。看到了吗
this Godbolt link
. 因此,使用libsimdpp和智能编译器,确实可以生成
操作码。
但请注意
_mm_blend_pd(a, b, 1);
_mm_blend_pd(a, b, 2);
,由libsimdpp生成。
blendpd/ps
带寄存器操作数的指令比带寄存器操作数的指令具有更好的吞吐量
movsd/ss
,自Intel Haswell处理器以来的Intel CPU上,正如Peter Cordes在其评论中所说的那样。