Я незнаком с библиотекой libsimdpp, но, насколько я вижу, вы можете использовать simdpp::shuffle2x2
с подходящими индексами перестановки в качестве альтернативы _mm_move_sd
.Из файла https://github.com/p12tic/libsimdpp/blob/master/simdpp/detail/insn/shuffle2x2.h, видно, что таким образом используется _mm_shuffle_pd
или _mm_blend_pd
, в зависимости от выбранных индексов перестановки.Эти встроенные функции Intel можно использовать в качестве альтернативы _mm_move_sd
.
. На странице руководства кажется, что для эмуляции необходимо выбрать индексы перестановки s0 = 2
и s1 = 1
_mm_move_sd
.Это соответствует строкам 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 выбирает _mm_blend_ps
для архитектуры x86, если для индексов перестановки верно следующее (s0==0 || s0==4) && (s1==1 || s1==5) && (s2==2 || s2==6) && (s3==3 || s3==7)
, см. sse_float32_4x2.h , строки 40 и 155.
Обратите внимание, что, например, GCC может компилировать как _mm_blend_ps(a, b, 1)
, так и _mm_move_ss
в инструкцию movss
.См. эту ссылку Годболта .Таким образом, с помощью libsimdpp и умного компилятора действительно возможно генерировать код операции movss
.Но обратите внимание, что GCC распознает только _mm_blend_pd(a, b, 1);
, а не _mm_blend_pd(a, b, 2);
, созданный libsimdpp.
Обратите внимание, что инструкция blendpd/ps
с операндами регистров имеет лучшую пропускную способность, чем movsd/ss
, на процессорах Intelначиная с процессора Intel Haswell, как заметил Питер Кордес в своем комментарии.