2015-06-17 93 views
3

所以我最終說服自己嘗試學習/使用PowerPC(PPC)。 一切進展順利,大部分信息都在網上找到。瞭解PowerPC rlwinm指令

rlwinm r3, r3, 0,1,1 

我會怎麼做這在C: 然而,在一些例子看,當我遇到這個來的? 我試着做一些研究,但找不到任何幫助我的東西。 在此先感謝!

回答

4

rlwinm代表「向左旋轉字立即然後,掩碼,這是正確的用法是

rlwinm RA, RS, SH, MB, ME 

由於每description page

  • RA指定目標的通用寄存器,其中存儲操作結果
  • RS指定操作的源通用寄存器
  • SH指定操作的移位值。
  • MB指定操作掩碼的開始值。
  • ME指定操作掩碼的結束值。
  • BM指定32位掩碼的值。

而且

  • 如果MB值小於ME值+ 1,則掩碼位之間幷包括的出發點和結束點 被設置爲 那些。所有其他位都設置爲零。
  • 如果MB值與 ME值+ 1相同,則所有32個屏蔽位都設置爲1。
  • 如果MB值大於ME值+ 1,則包括ME值+1和MB值-1之間並且包括ME值+1和MB值-1在內的所有掩碼位 被設置爲 個零。所有其他位都被設置爲1。

所以在你的例子中,源和目標是相同的。偏移量爲0,所以不需要移位。並且MB=ME=1,因此第一種情況適用,使得掩碼變成全爲0,比特編號1爲1,同時編號爲MSB=00x40000000

在C我們可以寫出它一樣簡單

a &= 0x40000000; 

假設a是32位的變量。

2

rlwinm將寄存器的值旋轉指定的數字,執行AND並將結果存儲在寄存器中。

實施例:rlwinm r3, r4, 5, 0, 31

r4是由5並將旋轉後的結果被放置在r3前旋轉的源寄存器,它也是AND編以來031之間的間隔只有1組成的位掩碼是整個32位值。

取自here的示例。

對於C的實現,你可能想看看how to rotate lefthow to AND這應該是微不足道的現在建立在一起。像下面這樣的東西應該工作:

int rotateLeft(int input, int shift) { 
    return (input << shift) | ((input >> (32 - shift)) & ~(-1 << shift)); 
} 

int rlwinm(int input, int shift, int mask) { 
    return rotateLeft(input, shift) & mask; 
} 
+0

注意的PowerPC從左側計數位,MSB = 0位(許多其他的ISA,像86,從右邊數位)。 –