-1

哪个 c 代码将更改为 rlwinm 电源 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>
   }

谢谢,

4

2 回答 2

2

rlwinm r4,r0,4,0,27

方法

r4 = (r0 << 4) & 0xFFFFFFF0

(实际上它是旋转而不是移位,但由于掩码在这里并不重要)。

所以它乘以 16,在下一行被添加到r11. 我的猜测是这对应于

pool->sdBufs + ind

ind缩放以匹配数据pool->sdBufs点的元素大小。

于 2013-04-19T10:05:25.030 回答
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;
于 2013-04-19T10:07:10.483 回答