rlwinm指令非常强大,也非常不易懂,现举例其计算过程:
下例中r1, r2为寄存器,SH,A, B为立即数
1. rlwinm r1, r2, SH, A
计算过程: r1 <= ( (r2 <- SH) & A )
如:r2 = 0x12345678, SH=8, A=0xfff 则:r1 = 0x812.
r2 <- 8 == 0x34567812(注意是循环左移,下同), & 0xfff == 0x812
2. rlwinm r1, r2, SH, A, B (A < B)
计算过程:r1 <= ( (r2 <- SH) & MASK(A,B) ), MASK(A,B)指位A到位B为全1,其余为0的立即数.
如:r2 = 0x12345678, SH=8, A=3,B=9 则:r1 = 0x1440 0000.
过程:MASK(A,B) = 0x1fc0 0000. r2 <- 8 = 0x34567812.
r1 = 0x1fc0 0000 & 0x3456 7812 = 0x1440 0000.
3. rlwinm r1, r2, SH, A, B (A > B)
计算过程:r1 <= ( (r2 <- SH) & ~MASK(A,B) ), ~MASK(A,B)指位B到位A之间为全0,不含A位和B位本身,其余为1的立即数.
如:r2 = 0x12345678, SH=8, A=14,B=3 则:r1 = 0x3002 7812.
过程: ~mask(A,B) = 0xf003 ffff, r2 <- 8 = 0x34567812.
r1 = 0xf003 ffff & 0x3456 7812 = 0x3002 7812.
4. rlwinm r1, r2, SH, A, A
计算过程与2类似,只取A位一位值。
如:如:r2 = 0x1234 5678, SH=8, A=3,则:r1 = 0x1000 0000.
另有rlwnm r1, r2, r3, A, B功能与其类似,只是移位立即数变成了寄存器。
还有该指令的一些简化形式, 如:
阅读(9596) | 评论(0) | 转发(1) |