оператор if / else во встроенных функциях SSE

Я пытаюсь оптимизировать небольшой фрагмент кода с помощью встроенных функций SSE (я полный новичок в этой теме), но я немного застрял в использовании условных выражений.

Мой исходный код:

unsigned long c;
unsigned long constant = 0x12345678;
unsigned long table[256];
int n, k;

for( n = 0; n < 256; n++ )
{
  c = n;
  for( k = 0; k < 8; k++ )
    {
      if( c & 1 ) c = constant ^ (c >> 1);
      else c >>= 1;
    }
  table[n] = c;
}

Цель этого кода - вычислить таблицу crc (константа может быть любым полиномом, здесь она не играет роли),

Я полагаю, что мой оптимизированный код будет примерно таким:

__m128 x;
__m128 y;
__m128 *table;

x = _mm_set_ps(3, 2, 1, 0);
y = _mm_set_ps(3, 2, 1, 0);
//offset for incrementation
offset = _mm_set1_ps(4);

for( n = 0; n < 64; n++ )
{
    y = x;
    for( k = 0; k < 8; k++ )
    {
        //if do something with y
        //else do something with y
    }
    table[n] = y;
    x = _mm_add_epi32 (x, offset);
}

Я понятия не имею, как использовать оператор if-else, но подозреваю, что это хитрый трюк. Есть ли у кого-нибудь идеи, как это сделать?

(Помимо этого, моя оптимизация, вероятно, довольно плохая - любые советы или исправления будут восприняты с большим сочувствием)

6
задан drolex 9 June 2011 в 10:25
поделиться