2013-04-19 2 views
-1

, который с кодом будет изменен на rlwinm power PC assembly instructionciton ??, который с кодом будет изменен на rlwinm power PC assembly instructionciton

Это снимок 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> 
    } 

Спасибо,

ответ

2

rlwinm r4,r0,4,0,27

означает

r4 = (r0 << 4) & 0xFFFFFFF0

(на самом деле это поворот, а не сдвиг, но это не имеет значения здесь beca использование маски).

Так что он умножает что-то на 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^