2013-04-19 2 views
-1

c 코드가 rlwinm power로 변경됩니다. PC assembly instruction? 이것은 objdump를의 스냅 샷입니다어떤 c 코드가 rlwinm power로 변경 될 것입니다. PC assembly instruciton

..

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> 
    } 

감사합니다,

답변

2

rlwinm r4,r0,4,0,27

r4 = (r0 << 4) & 0xFFFFFFF0

가 (실제로는 회전이 아닌 변화의 의미 하지만 여기서 문제가되지 않습니다. 마스크 사용).

그래서 16을 곱하면 다음 줄에 r11이 추가됩니다. 내 생각 엔이

pool->sdBufs + ind

에 해당 즉 ind은 데이터의 요소 크기 인 pool->sdBufs가 가리키는 크기에 맞게 조정됩니다.

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; 
관련 문제