【发布时间】:2011-06-08 06:21:21
【问题描述】:
(微软)x64 calling convention 声明:
参数在寄存器 RCX、RDX、R8 和 R9 中传递。如果参数是浮点数/双精度数,则在 XMM0L、XMM1L、XMM2L 和 XMM3L 中传递。
这很好,但为什么只是浮动/双打?为什么整数(可能还有指针)也不通过 XMM 寄存器传递?
似乎有点浪费可用空间,不是吗?
【问题讨论】:
-
我在后面的问题上写了一个更完整的答案:Why not store function parameters in float registers?。你介意编辑标签以包含
x86-64和/或assembly,这样我就可以重复这个了吗? -
@PeterCordes:但是这个是 4 年前来的……?!另外,在我的问题中,我并不是真的打算将指针伪装成非指针,反之亦然。另一张海报实际上打算将它们伪装成不同的类型,所以这不是同一个问题......我可以想象,例如在这种情况下禁止优化。
-
稍后的规范可以是一个很好的 dup 目标,以清理同一问题的早期分散问题。这基本上就是这里发生的事情,但我不是故意写它的目的是为了成为一个规范,只是回答这个问题。我在另一个问题中没有看到任何关于在 C 中使用浮点/双精度来实现这一点的内容,只是问(就像你一样)为什么 XMM regs 不用于传递整数/指针 arg 类型。 (他们说“浮点寄存器”而不是 XMM 寄存器,但这仍然是一个调用约定设计问题,而不是破解 C 来解决它。)
-
无论您是否同意以 dup 身份关闭,这个问题仍然缺少 x86-64 标记。 (我宁愿不编辑自己,以防我 能够说服您这是重复的。)
-
@PeterCordes:不是“在 C 中”。但是“使用浮点寄存器来存储下一个参数,即使参数不是单/双精度变量” 正是提出了类型双关语的等价物。再说一次,我不认为这是我在这个问题中的意图(当然不仅仅是来自文本),所以我不同意两者都是对方的欺骗。人们可以不同意该问题中的提案,但不能不同意这一问题。 (对于标签本身,如果您继续添加它,您可能会比我们都浪费的争论节省更多的时间。我不同意这是 x86-64。)
标签: windows assembly x86-64 sse calling-convention