@paxdiablo 的回答是正确的,但要添加更多上下文:
各种r* 指令(rlwinm、rlwimi 等)旨在提取其大小在编译时已知的位域,例如 C 结构位域,甚至只是将一个字拆分为字节(使用一个lw 和四个rlwinm 指令而不是几个单独的lbzus)。
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:Peter Cordes 纠正了我的一些错误,对此我表示感谢,并补充说在这种情况下可能没有必要使用 rlwinm,并且可能只是编译器的一个特性导致了这种情况要生成的指令而不是andi。