Условное перемещение на PowerPC

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

3 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам