哪个c代码将被更改为rlwinm powerPC汇编指令??
这是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>
}
谢谢,
答案 0 :(得分:2)
rlwinm r4,r0,4,0,27
装置
r4 = (r0 << 4) & 0xFFFFFFF0
(实际上它是一个旋转,而不是一个移位,但由于掩模,这里并不重要。)
所以它将乘以16,将下一行添加到r11
。我猜这是对应
pool->sdBufs + ind
即。缩放ind
以匹配数据pool->sdBufs
指向的元素大小。
答案 1 :(得分:1)
在我看来,你大部分时间都已经知道了。但是:
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;