Условное перемещение на 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 (и, возможно, других). Они используют обычный бит регистра условий, но могут выбирать только из источников регистра.