Поскольку вы не указали, я предполагаю, что намерением является использование встроенных функций SSE. Я также предполагаю, что по крайней мере SSE2 доступен, так как это в основном базовый уровень, установленный x86-64 в эти дни ...
Весьма буквальный способ сделать то, что вы описали выше, это просто скопировать младшие 64 бита введите и обнулите старшие 64 бита с помощью _mm_move_epi64()
__m128 lo2(__m128 x)
{
return _mm_castsi128_ps(_mm_move_epi64(_mm_castps_si128(x)));
}
и используйте _mm_move_sd()
, чтобы скопировать верхние 64 бита входа и скопировать младшие 64 бита с нуля
__m128 hi2(__m128 x)
{
return _mm_castpd_ps(_mm_move_sd(_mm_castps_pd(x), _mm_setzero_pd()));
}
рабочий пример здесь