为什么这个PowerPC指令序列似乎要同时设置cr0和cr1?

3

在大端序的POWER7上执行以下一组PowerPC指令后,为什么寄存器r6的值等于0b10001000000000000000000000000000?

cmpd中有一个隐式条件测试吗?

li r3, 420
li r4, 360
cmpd r3, r4
mfocrf r6, 0x80

1
据我所了解,mfocrf 应该只复制4位,所以由于您设置的位相距为5,我假设第二个位是上一个 r6 值留下的。手册没有清楚说明其他位是否被归零,因此可以尝试在此之前将 r6 归零。 - Jester
我找到的版本说一条指令中可以设置一个位,但是它控制着4个位的复制。无论是1还是4,这意味着其余的位都是未定义的,因此问题中的第二个设置位只是随机垃圾。 - Jester
r6清零没有任何影响。更奇怪的是,cmpd 7, 3, 4的结果是r6 == 0b10001000。 - Icchan
使用 mfcr r6 怎么样? - Jester
我可以使用mfcr,但我认为在新的POWER和PPC处理器上使用mfocrf更便宜。 - Icchan
如果 mfocrf 除了第一个1或4之外没有给出任何位,那么谈论其他设置的位是毫无意义的,因为这并不能表明条件寄存器的情况。你应该使用 mfcr 进行测试,它可以给出所有位,这样你就可以看到 cmpd 实际上发生了什么。 - Jester
1个回答

2
我应该更仔细地阅读。
来自Power ISA V2.07B:
POWER4、POWER5、POWER7和POWER8处理器将RT寄存器的所有字节设置为0,除了包含指定CR字段的字节。在包含CR字段的字节中,除了包含CR字段的位之外的位可能被设置为0或不被设置为0。
因此,在我使用的机器上,这种行为是可以预期的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接