Я пытаюсь найти способ выполнить косвенную операцию сдвига влево/вправо, не используя переменную shift или какие-либо ветки.
Конкретный процессор PowerPC, над которым я работаю, имеет особенность, которая заключается в смещении на постоянную, например
int ShiftByConstant( int x ) { return x << 3 ; }
быстрый, однооперационный и суперскалярный, в то время как сдвиг на переменную, как
int ShiftByVar( int x, int y ) { return x << y ; }
То, что я хотел бы сделать, это выяснить, какой не-микрокодированный целочисленный PPC использует декодирование sraw, а затем выдать их по отдельности. Это не поможет с задержкой самого sraw
- он заменит одну sraw
шесть - но в промежутке между этими шестью операциями я могу sraw
некоторых работ другим исполнительным блокам и получить чистый выигрыш.
Кажется, я нигде не могу найти, во что декодируется микроопция sops - кто-нибудь знает, как я могу заменить переменное битовое смещение последовательностью постоянных сдвигов и основными целочисленными операциями? (Цикл for, или переключатель, или что-либо с ветвлением в нем не будет работать, потому что штраф за переходы даже больше, чем штраф за микрокод, даже для правильно предсказанных переходов.)
Это не нужно отвечать в собрании; Я надеюсь изучить алгоритм, а не конкретный код, поэтому ответ на языке C, языке высокого уровня или даже псевдокоде был бы очень полезен.
Изменить: пару пояснений, которые я должен добавить:
- Я даже не беспокоюсь о мобильности
-
PPC имеет условный ход, поэтому мы можем предположить существование внутренней функции без ответвлений
int isel(a, b, c) { return a >= 0 ? b : c; }
(если вы напишите троичный, который делает то же самое, я пойму, что вы имеете в виду)
- целочисленное умножение также микрокодируется и даже медленнее, чем
sraw
. :-( - На Xenon PPC задержка прогнозируемой ветки составляет 8 циклов, поэтому даже одна делает это столь же дорогостоящим, как и микрокодированная инструкция. Переход к указателю (любая косвенная ветвь или указатель на функцию) является гарантированным ошибочным прогнозом, остановкой на 24 цикла.