2

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选项?

4

1 回答 1

4

如果 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,是其中两个——并且应该首先在那里......)

于 2017-08-26T15:02:04.287 回答