Oracle 最近发布了 Sun Studio 12.6。我们有一个基于 SHA-1 和 SHA-256内在的实现(用于 ARM 和 Intel),我们希望在 Solaris i86 机器上启用扩展。
12.6 手册和-xarch
选项在A.2.115.3 -xarch Flags for x86中可用,但它不讨论 SHA。
我们对 SHA 使用哪个-xarch
选项?
Oracle 最近发布了 Sun Studio 12.6。我们有一个基于 SHA-1 和 SHA-256内在的实现(用于 ARM 和 Intel),我们希望在 Solaris i86 机器上启用扩展。
12.6 手册和-xarch
选项在A.2.115.3 -xarch Flags for x86中可用,但它不讨论 SHA。
我们对 SHA 使用哪个-xarch
选项?
如果 Studio 12.6 不支持 SHA 指令集(我强烈怀疑它不支持,因为我在 Oracle Developer Studio 12.6 发行版文档的新增功能中根本找不到任何形式的“SHA” ) ,你运气不好。
几乎。
您可以做的是创建自己的内联汇编函数。 见man inline
:
内联(4)
姓名
inline, filename.il - 汇编语言内联模板文件
描述
汇编语言调用指令被替换为从内联模板 (*.il) 文件中获得的相应函数体的副本。
内联模板文件的后缀为 .il,例如:
% CC foo.il hello.c
内联是由编译器的代码生成器完成的。
...
例子
请查看 libm.il 或 vis.il 以获取示例。您可以在编译器的 lib/ 目录下找到特定于每个受支持架构的这些库的版本。
...
可以在这里找到一个例子(强调我的):
使用 Sun Studio 编译器和内联汇编代码进行性能调优
...
本文演示了如何测量关键代码段的性能。提供了一个使用编译器标志的示例和 另一个使用内联汇编代码的示例。比较结果以显示每种方法的优点和差异。
...
示例 8:迭代 Mandelbrot 计算的内联汇编代码
了解所有这些事实后,就可以编写内联代码,如示例 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,是其中两个——并且应该首先在那里......)