Вектор двойного слова вращается на старых Altivec без 64-битного типа данных

Это связано с Power4 и отсутствие vector long long. На Power7 и Power8 мы можем выполнить:

typedef __vector unsigned long long uint64x2_p;
...

uint64x2_p val = {...};
uint64x2_p res = vec_rl(val, val, bits);

Мне нужно найти обходной путь для отсутствующего 64-битного векторного типа и повернуть на Power4. Я думаю, что есть две стратегии. Во-первых, вращайтесь в C / C ++ или; во-вторых, используйте 32-битные векторные типы. Я предполагаю (2) — более быстрая стратегия, учитывая, что данные находятся в векторном регистре.

Я чувствую, что эта проблема была решена давно, так как нет ничего особенного в повороте двойного слова. К сожалению, поиск не возвращает полезные хиты: «power4» «двойное слово» повернуть.

Я думаю, что у меня есть основной алгоритм, который состоит из трех LOAD, двух SHIFT, двух PERM и OR. Но я не уверен, что есть лучший подход.

Как выполнить 64-разрядное вращение при работе на Power4, в котором отсутствует поворот двойного слова?


typedef __vector unsigned int uint32x4_p;

template <unsigned int R>
inline uint32x4_p VecRotateLeft64(const uint32x4_p val)
{
enum {LSHIFT = R%32};
enum {RSHIFT = 32 - (R%32)};
enum {PERMUTE = R > 32};

const uint32x4_p lbits = {LSHIFT,LSHIFT,LSHIFT,LSHIFT};
uint32x4_p left(vec_sl(val, lbits));

const uint32x4_p rbits = {RSHIFT,RSHIFT,RSHIFT,RSHIFT};
uint32x4_p right(vec_sr(val, rbits));

const uint8x16_p mask = {4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11};
right = vec_perm(right, right, mask);
uint32x4_p result = vec_or(left, right);

// Permute left and right parts of 64-bit word as needed
if (PERMUTE)
result = vec_perm(result, result, mask);

return result;
}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …