Как эффективно определить 128-битную константу?

Я работаю с набором инструкций SSE2 в MS Visual Studio. Я использую его для некоторых вычислений с 16-битными данными.

Предположим, у меня есть 8 значений, загруженных в регистр SSE. Я хочу добавить константу (например, 42) ко всем из них. Вот как я хотел бы, чтобы мой код выглядел.

__m128i values; // 8 values, 16 bits each
const __m128i my_const_42 = ???; // What should i write here?
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values

Теперь, как я могу определить константу? Следующее работают два способа, но один неэффективен, а другой уродлив

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42)- компилятор генерирует 8 команд для "сборки" константа
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0}- трудно понять, что происходит on; замена 42на, например, -42не тривиальна

Есть ли способ более удобно выразить 128-битную константу?

5
задан anatolyg 3 June 2012 в 20:13
поделиться