Условное перемещение на PowerPC - PullRequest
1 голос
/ 30 апреля 2010

Существует ли условный эквивалент перемещения в наборе команд PowerPC (32 или 64)? Очевидно, что его можно эмулировать, используя условную ветвь, но я хочу что-то, что превосходит это.

Ответы [ 3 ]

3 голосов
/ 23 мая 2010

PowerPC имеет как минимум операцию условного перемещения с плавающей точкой, fsel, которая работает следующим образом:

fsel f0, f1, f2, f3 // f0 = ( f1 >= 0 ? f2 : f3 )

Для целочисленных значений вы можете использовать битовые маски, чтобы "выбрать", какое значение использовать.

Вот обсуждение этой темы (целое число внизу)

2 голосов
/ 28 декабря 2010

Использование fsel само по себе часто может привести к неверным результатам для исключительных значений, таких как NaN и Inf. Вам нужно будет тщательно рассмотреть результаты каждого сравнения.

Целочисленный выбор реализован как минимум в двух вариантах PowerPC.

IBM имеет инструкции selii, selir, selri, selrr в своих системах AS / 400. Они могут выбирать между регистром или подписанным 5-битным немедленным для каждого источника. Решение основано на регистре AS / 400.

У Motorola / Freescale есть APU isel, встречающийся в сериях e200 и e500 (и, возможно, других). Они используют обычный бит регистра условий, но могут выбирать только из источников регистров.

2 голосов
/ 30 апреля 2010

Помните, что PowerPC - это RISC, поэтому набор инструкций намеренно прост. Однако вы можете найти полезные советы в "Руководстве по написанию компиляторов PowerPC" (ISBN 0-9649654-0-2) - есть ряд примеров реализаций условных последовательностей без ветвей (например, max / min), которые могут дать вам некоторые идеи .

Кроме того, если у вас есть AltiVec, и ваш код может быть векторизован, то условные перемещения очень легко использовать, например, сравнивает и vec_sel.

...