Go版本
提示
在你的项目/工作区中 go env
的输出:
GOARCH=ppc64le
你做了什么?
进一步探索下层规则改进时发现了使用值类型的大小来确定是否应用规则的问题。
例如,在 PPC64.rules 中的规则:
(MOVWZreg y:(AND (MOVDconst [c]) _)) && uint64(c) <= 0xFFFFFFFF => y
然后在 PPC64latelower.rules 中:(AND <t> x:(MOVDconst [m]) n) && t.Size() == 4 && isPPC64WordRotateMask(m) => (RLWINM [encodePPC64RotateMask(0,m,32)] n)
如果 m
是 0xF000000F
或类似 Package 掩码的值,那么该值的上 32 位并不总是为 0。我认为这只影响使用 RLWINM 和 RLWNM 的规则。我相信它们是 PPC64 上唯一具有这种行为的 GPR 操作码。
你看到了什么发生?
在结果预期比分配的类型更宽的情况下触发了 latelower 规则。
你期望看到什么?
在 lower 中的类型的应该是反映出拓宽后的类型。
2条答案
按热度按时间xzv2uavs1#
相似问题
(如果这个有帮助或者没有帮助,请给表情投票;欢迎在 this discussion 中提供更详细的反馈。)
brtdzjyr2#
我怀疑这今天不会造成问题。32位常量进行符号扩展,因此任何 Package 掩码都会生成一个负的int32常量,这阻止了上面的AND规则对这样的常量运行。