Oracle 最近发布了 Sun Studio 12.6。我们有一个基于 SHA-1 和 SHA-256 内部函数的实现(适用于 ARM 和 Intel(,我们希望在 Solaris i86 机器上启用扩展。
12.6 手册和-xarch
选项可在 x86 的 A.2.115.3 -xarch 标志中找到,但它不讨论 SHA。
我们对 SHA 使用哪个-xarch
选项?
如果 Studio 12.6 不支持SHA 指令集(我强烈怀疑它不支持,因为我在 Oracle Developer Studio 12.6 Release 文档中的新增功能文档中找不到任何形式的"SHA"(,那么您就不走运了。
几乎。
您可以做的是创建自己的内联汇编程序函数。 请参阅man inline
:
内联(4(
名字
inline, filename.il - 汇编语言内联模板文件
描述
汇编语言调用指令被其副本替换 从内联模板 (*.il( 获取的相应函数体 文件。
内联模板文件的后缀为 .il,例如:
% CC foo.il hello.c
内联由编译器的代码生成器完成。
。
例子
请查看 libm.il 或 vis.il 以获取示例。您可以在编译器的 lib/目录下找到特定于每个受支持体系结构的这些库的版本。
。
可以在这里找到一个例子(强调我的(:
使用 Sun Studio 编译器和内联程序集代码进行性能调优
。
本文演示了如何衡量性能 的关键代码段。使用编译器标志和的示例 提供了另一个使用内联程序集代码的示例。比较结果以显示每种方法的优点和差异 方法。
。
示例 8:迭代曼德布洛特计算的内联程序集代码
了解了所有这些事实,就可以编写内联代码,如 例 8.
.inline mandel_il,0 // x is stored in %xmm0 // y is stored in %xmm1 // 4.0 is stored in %xmm2 // max_int is stored in %rdi // set registers to zero xorps %xmm3, %xmm3 xorps %xmm4, %xmm4 xorps %xmm5, %xmm5 xorps %xmm6, %xmm6 xorps %xmm7, %xmm7 xorq %rax, %rax .loop: // check to see if u2 - v2 > 4.0 movss %xmm5, %xmm7 addss %xmm6, %xmm7 ucomiss %xmm2, %xmm7 jp .exit jae .exit // v = 2 * v * u + y mulss %xmm3, %xmm4 addss %xmm4, %xmm4 addss %xmm1, %xmm4 // u = u2 - v2 + x movss %xmm5, %xmm3 subss %xmm6, %xmm3 addss %xmm0, %xmm3 // u2 = u * u movss %xmm3, %xmm5 mulss %xmm3, %xmm5 // v2 = v * v movss %xmm4, %xmm6 mulss %xmm4, %xmm6 incl %eax cmpl %edi, %eax jl .loop .exit: // end of mandel_il .end
一点也不难。我不得不为我在 Solaris 8 天咨询的客户编写许多 SPARC 内联汇编程序函数,其中一些非常基本 - 实际上是单行代码来包装单个指令。 我发誓其中一些最终出现在Studio 编译器套件的更高版本中(因为我们是由 Sun 本身分包的,这并不奇怪,更不用说其中一些是显而易见的——floor()
和ceil()
IIRC 是其中的两个——并且应该首先在那里......