在golang汇编中,"MOVOU"是什么意思?

6

当我阅读一些Golang汇编代码时,我发现了MOVOU指令。但是在谷歌上搜索时,我没有找到关于该指令的任何信息。

例如:src/runtime/asm_amd64.s#L933

MOVOU   -16(AX), X1

1
相关:添加MOVDQA和MOVDQU指令 - Ashwini Chaudhary
1
@AshwiniChaudhary 谢谢。那正是我需要的。O代表八字节。你是怎么找到的?我尝试了很多方法但都没有找到。 - templexxx
3
因为Golang发明了自己的汇编语言,所以@rad. MOVO和MOVOU并不是Intel定义的操作码。 - Cody Gray
@RadLexus 例如:Golang没有SUB,但有SUBQ。 - templexxx
@CodyGray 更正:Go语言采用了Plan 9汇编语言,并扩展支持SSE和AVX。Plan 9汇编器主要设计为在所有平台上具有相同的语法和操作码,这就是为什么它的助记符与英特尔的不同的原因。 - fuz
显示剩余4条评论
1个回答

6

很不幸,Go x86语法中存在许多奇怪的名称、不一致性和问题。

正如评论中指出的那样,MOVOU应该是MOVDQU。

我试图维护Go汇编补充参考文档,它填补了官方文档的一些空白,但目前它已经过时并需要进行一些清理。 当实现细节稳定下来后,我打算在那里写AVX512的详细信息。 我希望它对于快速搜索一些Go汇编问题是有用的ctrl+F

对于你的特定问题,这肯定是有用的:

enter image description here

你可能会发现x86.v0.2.csv很有用,因为它为每个列出的指令提供了Intel、GNU和Go语法。v0.2在名称中表明,未来将会有更新和修复。
更糟糕的是,还有别名可以让你写PADDD而不是PADDL。由于向后兼容性,这不太可能改变。
为了避免完全负面的印象,有些东西Go汇编“做得很好”。例如,它检查期望只设置较低N位的指令的立即操作数宽度。它也不允许“无符号”立即操作数使用负常数。
(作为奖励,这里有一个问题,其中包含一些Russ Cox关于此主题的想法:issue21528。)

1
所以Go在所有地方都使用O(像Oct-word)而不是DQ(double-quad)吗?英特尔也没有保持一致(cqo助记符与SSE2和其他SIMD指令相反),尽管可能是AMD的错。我猜想AMD64引入了cqo助记符。哈,如果英特尔对事物进行命名的话,我们本可以有cqdq来搭配punpcklqdq。 - Peter Cordes
@PeterCordes,从AVX开始,这是英特尔指令名称。如果它们中的任何一个不匹配--那就是一个错误。在此之前,我认为像“到处”这样的东西并不适用,因为这里有很多不一致之处。 - Iskander Sharipov
那么Go使用vmovdqa(AX),x1进行AVX-128加载,但对于非VEX遗留SSE编码,则使用movo(AX),x1(这会使ymm1 / zmm1的上半部分保持不变)? 这很有趣... 但是,停止自己创造名称可能是好事;一旦开始使用包含数字的英特尔指令助记符,例如AVX512BW vmovdqu8(以8位粒度掩码)或VSHUFF32x4(128b车道洗牌的不同粒度掩码),就可能会变得非常混乱。 - Peter Cordes
@PeterCordes,是的,那是正确的,VMOVDQA用于AVX1指令。 - Iskander Sharipov

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