作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
因为 golang 的 plan 9 汇编中不支持部分 avx 指令,因此对于不支持的 avx 指令,只能按照指令格式,以指令流字节的方式把指令插入到汇编代码里,像这样:
PADDL X5, X0 \
LONG $0xdacb380f \ // SHA256RNDS2 XMM3, XMM2
MOVO X5, X1 \
LONG $0x0f3a0f66; WORD $0x04cc \ // PALIGNR XMM1, XMM4, 4
PADDL X1, X6 \
指令格式这个感觉还是有点难写,而且某条指令对应的二进制值又去哪里查呢?对于新手还是挺头疼的。
于是我用下面的办法来迂回:
- 先用 c + gcc 内置函数来写 avx 指令集的优化代码;
- 使用 clang 把 .c 文件编译为 elf 文件;
- 找个解析 elf 的工具或者库,找到对应指令的二进制格式。
因此,本文要介绍的就是第三步这个工具:
https://github.com/horsicq/XELFViewer
从这里可以下载 mac 版本: https://github.com/horsicq/XELFViewer/releases/download/0.05/xelfviewer_mac_0.05.pkg
安装后运行,然后在菜单中选择对应的 elf 文件即可:
- 在菜单中选择 elf 文件
- Disasm 中可以看到反汇编的信息
- 找到 gcc 内置函数对应的汇编指令
- 对应的位置就是十六进制的指令格式了
寄存器对的上的话,应该就能把这个代码复制到 golang plan9 汇编中使用了。