所以我最終說服自己嘗試學習/使用PowerPC(PPC)。 一切進展順利,大部分信息都在網上找到。瞭解PowerPC rlwinm指令
rlwinm r3, r3, 0,1,1
我會怎麼做這在C: 然而,在一些例子看,當我遇到這個來的? 我試着做一些研究,但找不到任何幫助我的東西。 在此先感謝!
所以我最終說服自己嘗試學習/使用PowerPC(PPC)。 一切進展順利,大部分信息都在網上找到。瞭解PowerPC rlwinm指令
rlwinm r3, r3, 0,1,1
我會怎麼做這在C: 然而,在一些例子看,當我遇到這個來的? 我試着做一些研究,但找不到任何幫助我的東西。 在此先感謝!
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=0
:0x40000000
。
在C我們可以寫出它一樣簡單
a &= 0x40000000;
假設a
是32位的變量。
rlwinm
將寄存器的值旋轉指定的數字,執行AND
並將結果存儲在寄存器中。
實施例:rlwinm r3, r4, 5, 0, 31
r4
是由5
並將旋轉後的結果被放置在r3
前旋轉的源寄存器,它也是AND
編以來0
和31
之間的間隔只有1組成的位掩碼是整個32位值。
取自here的示例。
對於C
的實現,你可能想看看how to rotate left和how 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;
}
注意的PowerPC從左側計數位,MSB = 0位(許多其他的ISA,像86,從右邊數位)。 –