Я хочу использовать две 256-битные регистры для выполнения операций на 10 uint32_ts. Прямо сейчас, как я это делаю, хранят первые 8 в левой регистре и оставшиеся 2 левых прокладок в правой регистрации. < /P>
где x игнорируются значения. Мне нужно создать операцию, в которой я сдвигаю 10 значений влево или вправо максимум на 2 пространства < /p>
Результат левой сдвига: < /p>
Я хочу использовать две 256-битные регистры для выполнения операций на 10 uint32_ts. Прямо сейчас, как я это делаю, хранят первые 8 в левой регистре и оставшиеся 2 левых прокладок в правой регистрации. < /P> [code][0, 1, 2, 3, 4, 5, 6, 7], [8, 9, x, x, x, x, x, x] [/code] где x игнорируются значения. Мне нужно создать операцию, в которой я сдвигаю 10 значений влево или вправо максимум на 2 пространства < /p> Результат левой сдвига: < /p> [code][1, 2, 3, 4, 5, 6, 7, 8], [9, Z, x, x, x, x, x, x][/code] Результат двух правых смен: [code][Z, Z, 0, 1, 2, 3, 4, 5], [6, 7, x, x, x, x, x, x][/code] Положения с 'z' должны быть нулевыми. Это то, что у меня есть до сих пор: < /p> [code]__m256i ind[5] = { _mm256_setr_epi32(2, 3, 4, 5, 6, 7, 0, 1), _mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 0), _mm256_setr_epi32(0, 1, 2, 3, 4, 5, 6, 7), _mm256_setr_epi32(7, 0, 1, 2, 3, 4, 5, 6), _mm256_setr_epi32(6, 7, 0, 1, 2, 3, 4, 5) };
if (x > 0) { ymml = _mm256_and_si256(ymml, zeroes[x+2]); } else { ymmr = _mm256_and_si256(ymmr, zeroes[x+2]); } } [/code] Есть ли лучший способ сделать это?