Обрабатывать и загружать Altivec независимо от порядка байтов PPC?
У меня есть некоторый SIMD-код в Altivec, обрабатывающий 32-битные целочисленные значения параллельно. В некоторых случаях я хочу загрузить целые числа с прямым порядком байтов, в других случаях - с прямым порядком байтов (примечание: этот выбор не зависит от собственного порядка байтов процессора; он основан на том, какой алгоритм выполняется). Реально поменять местами байты очень легко, используя операции перестановки Altivec, как это документировано Apple.
Меня беспокоит то, что PowerPC допускает операции с большим или небольшим порядком байтов, и поэтому я не знаю, нужно ли мне менять местами байты при младших загрузках / хранилищах или при больших байтовых загрузках / хранилищах. (В настоящее время мой код всегда делает это для байтов с прямым порядком байтов и никогда не переставляет для операций с памятью с прямым порядком байтов, что отлично работает на 970, который я сейчас использую, поскольку, конечно, он работает с байтовым порядком байтов).
Из того, что я могу найти, PPC в режиме с прямым порядком байтов относительно редки, но они существуют, и в идеале я хотел бы, чтобы мой код работал правильно и быстро независимо от режима.
Есть ли способ обработки больших и меньших порядковых загрузок в регистры AltiVec независимо от порядкового номера процессора? Есть ли другие вопросы, связанные с этим, о которых я должен знать? В Википедии есть (не цитируется, естественно) утверждение:
"Операции AltiVec, несмотря на то, что они 128-разрядные, обрабатываются так, как если бы они были 64-разрядными. Это обеспечивает совместимость с материнскими платами с прямым порядком байтов, которые были разработаны до AltiVec".
что заставляет меня думать, что в AltiVec в режиме с прямым порядком байтов могут возникать другие неприятности.
1 ответ
Практически весь код PowerPC будет иметь порядок с прямым порядком байтов, а весь код ARM - с прямым порядком байтов.
Есть несколько специализированных случаев, когда используется чередование с обратным порядком байтов - очевидно, что VirtualPC полагался на режим с прямым порядком байтов и поэтому изначально не работал на G5 (который не включает его) - но я бы не стал беспокоиться об этом.
У ARM аналогичная проблема в режиме с прямым порядком байтов: двойные числа имеют смешанный порядок. "Псевдо-порядковый номер" достигается путем XOR для младших битов адреса с 0x2 (для доступа к полуслову) и 0x3 (для доступа к байту), так что эффективный порядок в 32-битном слове меняется местами, но это прерывается для 64- битовый доступ. Я подозреваю, что та же самая хитрость используется на PowerPC, за исключением того, что она выполняется по 64 бита за раз.