-1

どの C コードが rlwinm 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>
   }

ありがとう、

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 に答える