哪个c代码将被更改为rwinm power PC汇编指令?
这是objdump的快照。
if(!pool || pool->maxPoolSize > SEQ_MODULUS ) /* Invalid mask or pointer is null */
29ccc: 41 82 00 dc beq- 29da8 <asGetSdBuf+0x108>
29cd0: 80 c3 00 08 lwz r6,8(r3)
29cd4: 3c 00 00 ff lis r0,255
29cd8: 60 00 ff ff ori r0,r0,65535
29cdc: 7f 86 00 40 cmplw cr7,r6,r0
29ce0: 41 9d 00 78 bgt- cr7,29d58 <asGetSdBuf+0xb8>
ind = pool->maxPoolSize & idx;
/* there are free sdBufs, get one */
sdBuf = pool->sdBufs + ind;
29ce4: 81 63 00 10 lwz r11,16(r3)
29ce8: 7c 80 30 38 and r0,r4,r6
29cec: 54 04 20 36 **rlwinm r4,r0,4,0,27**
if(!sdBuf) /* check if sdBuf pointer is null */
29cf0: 7f eb 22 15 add. r31,r11,r4
29cf4: 41 82 00 fc beq- 29df0 <asGetSdBuf+0x150>
}
谢谢,
rlwinm r4,r0,4,0,27
是
r4 = (r0 << 4) & 0xFFFFFFF0
(实际上这是一个旋转而不是移位,但这里没有关系,因为蒙版)。
所以它将某数乘以16,然后在下一行加上r11
。我猜这对应的是
pool->sdBufs + ind
。ind
被缩放以匹配pool->sdBufs
所指向的数据的元素大小。
在我看来,你已经知道了大部分。然而:
lwz r11,16(r3) // tmp1 = pool->sdBufs
and r0,r4,r6 // ind = pool->maxPoolSize & idx
rlwinm r4,r0,4,0,27 // tmp2 = ind*sizeof(*pool->sdBufs)
add. r31,r11,r4 // sdBuf = tmp1 + tmp2;