У меня возникли проблемы с пониманием rlwinm
Инструкция по сборке PPC (Повернуть левое слово сразу же И с маской).
Я пытаюсь изменить эту часть функции
rlwinm r3, r3, 0, 28, 28
Я уже знаю что r3
является. r3
в данном случае это 4-байтовое целое число, но я не уверен, что именно эта инструкция rlwinm
делает с этим.
Кстати, это на 32-битной машине.
Ваше понимание не довольно право. В соответствии с IBM link В этой инструкции вы видите следующую форму:
rlwinm <target=r3>, <source=r3>, <shift=0>, <begin-mask=28>, <end-mask=28>
Следовательно, никакого фактического сдвига не происходит. И фактическая маска, используемая для AND
операция построена из begin
а также end
маскировать позиции, это не дано как явный аргумент(А).
В этом случае, поскольку обе позиции равны 28, маска представляет собой просто один бит, согласно связанной странице (слегка перефразировано):
Если начать-маску значение меньше, чем конец маски значение плюс один, то биты маски между начальной точкой и конечной точкой, включая их, устанавливаются в единицы. Все остальные биты установлены в нули.
Таким образом, инструкция, которую вы видите, не более сложна, чем AND
операция.
(А) Там является форма, которая позволяет вам указать фактическую маску (при условии, что она состоит из смежных однобитных), но это четыре-версия аргумента и действительно просто синтаксический сахар, который ассемблер может превратить в аргумент с пятью аргументами.
Ответ @ paxdiablo правильный, но добавим еще немного контекста:
Различные r*
Инструкции (rlwinm, rlwimi и т. д.) предназначены для извлечения битовых полей, размер которых известен во время компиляции, например, битовых полей структуры C, или даже просто для разбиения слова на байты (что может быть быстрее с одним lw
и четыре rlwinm
инструкции, чем несколько отдельных lbzu
с).
lw r4, r3 ; load the word at the address pointed at by r3
rlwinm r5, r4, 8, 24, 31 ; first byte in r5
rlwinm r6, r4, 16, 24, 31 ; second byte in r6
rlwinm r7, r4, 24, 24, 31 ; third byte in r7
rlwinm r8, r4, 0, 24, 31 ; fourth byte in r8, identical to andi r8, r4, 255
rlwinm
Инструкции также могут быть использованы, как в этом случае, в качестве особой формы andi
для смежных наборов битов. Поскольку инструкции в PowerPC всегда 32-битные, инструкции, принимающие непосредственные значения, имеют только 16 бит для хранения этих значений — поэтому, если вы хотите замаскировать набор битов, которые пересекают верхнюю / нижнюю границу полуслов, скажем, 23–8, вам нужно использовать несколько операций.
lis r4, r4, 0x00ff ; first set bits 23 to 16 of the mask
ori r4, r4, 0xff00 ; then bits bits 15 to 8
and r3, r3, r4 ; then perform the actual masking
Однако с rlwinm
инструкции, мы можем выполнить ту же операцию в одной инструкции:
rlwinm r3, r3, 0, 8, 23
В вашем случае значение, вероятно, содержит флаги для чего-то, и эта инструкция извлекает один из них. Следующая инструкция, вероятно, является условной веткой на r3
,
ETA: Питер Кордс исправил некоторые из моих ошибок, за что я благодарен, и добавил, что, вероятно, нет необходимости использовать rlwinm
в этом случае и то, что это может быть просто особенностью компилятора, которая заставляет эту инструкцию генерироваться вместо andi
,