2016-11-06 2 views
0

Скажем, у меня есть вектор 4 поплавками:Есть ли эквивалент _mm_slli_si128 (__ m128i a, int num) для поплавков?

__m128 vector = |f0|f1|f2|f3| (pseudocode) 

Мое намерение состоит в том, чтобы превратить эту переменную в этом:

|0.0|f0|f1|f2| 

Doing сдвиг вправо, казалось бы, самый простой выбор, но я не смогли найти такое внутреннее пространство, доступное для поплавков.

Что было бы самым быстрым способом для этого?

+1

'_mm_shuffle_ps' +' _mm_and_ps' –

+0

Я сделал это и принцип работы. Однако я не уверен, какие значения я должен вводить в качестве параметров для хранения последних чисел с плавающей запятой: vb = _mm_and_ps (vb, _mm_set_ps (?,?,?, 0)). – ismarlowe

+1

Альтернативой является использование двух приведений: '_mm_castsi128_ps' и' _mm_castps_si128', так что вы все равно можете использовать '_mm_slli_si128'. Эти приведения не генерируют никаких инструкций. Единственное наказание - это небольшое увеличение латентности от перехода от float к целочисленному домену и наоборот. – wim

ответ

0

Вот мое решение:

__m128 const mask = _mm_castsi128_ps(_mm_set_epi32(0, -1, -1, -1)); 

vector = _mm_shuffle_ps(vector, vector, _MM_SHUFFLE(0,3,2,1)) 
vector = _mm_and_ps(vector, mask); 
Смежные вопросы