指定指令集体系结构 (instruction set architecture, ISA)。
-xarch 关键字 isa 接受的体系结构如表 3–12 所示:
表 3–12 –xarch ISA 关键字
平台 |
有效的 -xarch 关键字 |
SPARC |
generic, generic64, native, native64, sparc, sparcvis, sparcvis2, sparcvis3, sparcfmaf, v9, v9a, v9b |
x86 |
generic, native, 386 , pentium_pro, sse, sse2, amd64, pentium_proa, ssea, sse2a, amd64a, sse3,sse3a, ssse3, sse4_1, sse4_2, amdsse4a |
请注意,尽管 -xarch 可以单独使用,但它是 –xtarget 选项扩展的一部分,并且可用于覆盖由特定 -xtarget 选项设置的 -xarch 值。例如:
% f95 -xtarget=ultra2 -xarch=sparcfmaf ...
会覆盖由 -xtarget=ultra2 设置的 -xarch。
通过只允许指定的指令集,此选项可将编译器生成的代码限定于指定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。
如果此选项与优化一起使用,则在指定的体系结构上,适当的选择可以为可执行文件提供良好性能。如果选择不当,则会导致二进制程序在预定的目标平台上无法执行。
请注意以下事项:
使用 generic、sparc、sparcvis2、sparcvis3、sparcfmaf、sparcima 编译的目标二进制文件 (.o) 可以链接,可以在一起执行,但只能在支持所链接的所有指令集的处理器上运行。
使用任何特殊选择时,所生成的可执行文件可能无法在传统体系结构上运行或者运行速度大大降低。此外,由于在任何这些指令集体系结构中都不会实现四精度(REAL*16 和 long double)浮点指令,因此编译器不会在其生成的代码中使用这些指令。
未指定 -xarch 选项时的缺省值为 generic。
表 3–13 提供了有关 SPARC 平台上每个 -xarch 关键字的详细信息。
表 3–13 SPARC 平台的 -xarch 值
-xarch= |
含义 (SPARC) |
---|---|
generic |
使用大多数处理器通用的指令集进行编译。 |
generic64 |
针对大多数的 64 位平台进行编译。 (仅限 Solaris)此选项与 -m64 -xarch=generic 等效,并与早期的发行版兼容。使用 -m64(而非 -xarch=generic64)指定 64 位编译 |
native |
为了在此系统上获得良好性能而进行编译。 编译器为运行它的当前系统处理器选择适当的设置。这是 -fast 选项的缺省值。 |
native64 |
为了在此系统上获得 64 位模式下的良好性能而进行编译。 (仅适用于 Solaris)此选项与 -m64 -xarch=native 等效,并与早先的发行版兼容。 |
sparc |
针对 SPARC–V9 ISA 进行编译。 针对 V9 ISA 进行编译,但不具备可视指令集 (Visual Instruction Set, VIS),也不具备特定于其他实现的 ISA 扩展。该选项在 V9 ISA 上使编译器生成高性能代码。 |
sparcvis |
针对具有 UltraSPARC 扩展的 SPARC–V9 ISA 进行编译。 针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。 |
sparcvis2 |
针对具有 UltraSPARC-III 扩展的 SPARC-V9 ISA 进行编译。 此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视化指令集 (VIS) 2.0 版上生成目标代码。 |
sparcvis3 |
针对 SPARC-V9 ISA 的 SPARC VIS 版本 3 进行编译。 允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0、UltraSPARC-III 扩展(包括可视指令集版本 2.0 以及混合乘加指令和可视指令集版本 3.0 中的指令。 |
sparcfmaf |
针对 SPARC-V9 ISA 的 sparcfmaf 版本进行编译。 允许编译器使用 SPARC-V9 指令集,加 UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。 请注意,必须将 -xarch=sparcfmaf 与 -fma=fused 以及某些优化级别结合使用,来使编译器尝试寻找机会自动使用乘加指令。 |
sparcima |
针对 SPARC-V9 ISA 的 sparcima 版本进行编译。使编译器可以使用如下指令集内的指令:SPARC-V9 指令集、UltraSPARC 扩展(包括可视化指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视化指令集 (Visual Instruction Set, VIS) 版本 2.0)、SPARC64 VI 扩展(用于浮点乘加)和 SPARC64 VII 扩展(用于整数乘加)。 |
v9 |
与 -m64 -xarch=sparc 等效 使用 xarch=v9 来获取 64 位内存模型的传统 makefile 和脚本仅需使用 -m64。 |
v9a |
与 -m64 -xarch=sparcvis 等效,并与早前的发行版兼容。 |
v9b |
与 -m64 -xarch=sparcvis2 等效,并与早期的发行版兼容。 |
表 3–14 详细介绍了 x86 平台上的每个 -xarch 关键字。如果未指定 -xarch,x86 上的缺省值为 generic(或者如果指定了 —m64 则为 generic64)。
表 3–14 x86 平台的 -xarch 值
-xarch= |
含义 (x86) |
---|---|
generic |
为了在大多数 32 位 x86 平台上获得良好性能而进行编译。这是缺省值,与 -xarch=pentium_pro 等效。 |
generic64 |
为了在大多数 64 位 x86 平台上获得良好性能而进行编译。它与 sse2 等效。 |
native |
为了在此 x86 体系结构上获得良好性能而进行编译。使用最佳指令集以便在大多数 x86 处理器上获得良好性能。对于每个新发行版,“最佳”指令集的定义可能会有所调整(如果适用)。 |
native64 |
为了在此 64 位 x86 体系结构上获得良好性能而进行编译。 |
386 |
将指令集限制于 Intel 386/486 体系结构。 |
pentium_pro |
将指令集限制于 Pentium Pro 体系结构。 |
pentium_proa |
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 Pentium Pro 体系结构中。 |
sse |
将 SSE 指令集添加到 pentium_pro 中。(参见下面的注释。) |
ssea |
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE 体系结构中。 |
sse2 |
将 SSE2 指令集添加到 pentium_pro 中。(参见下面的注释。) |
sse2a |
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE2 体系结构中。 |
sse3 |
向 SSE2 指令集中添加 SSE3 指令集。 |
amd64 |
在 Solaris 平台上,这与 -m64 -xarch=sse2 等效 使用 -xarch=amd64 来获取 64 位内存模型的传统 makefile 和脚本应使用 -m64。 |
amd64a |
在 Solaris 平台上,这与 —m64 —xarch=sse2a 等效。 |
sse3a |
将 AMD 扩展指令(包括 3DNow!)添加到 SSE3 指令集。 |
ssse3 |
将 SSSE3 指令添加到 SSE3 指令集。 |
sse4_1 |
将 SSE4.1 指令添加到 SSSE3 指令集。 |
sse4_2 |
将 SSE4.2 指令添加到 SSE4.1 指令集。 |
amdsse4a |
将 SSE4a 指令添加到 AMD 指令集。 |
当针对 x86 Solaris 平台进行编译时,有几项重要的注意事项。
使用设置为 sse、sse2、sse2a 或 sse3 等的 -xarch 编译的程序必须在支持这些功能和扩展的平台上运行。
从 Solaris 9 4/04 开始的操作系统发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。早期版本的 Solaris OS 不支持 SSE/SSE2。
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
x86 上的运算结果可能与 SPARC 上的结果不同,这是由 x86 80 字节浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
从 Solaris Studio 11 和 Solaris 10 OS 开始,会对使用这些专用的 -xarch 硬件标志编译和生成的程序二进制文件进行验证,看其是否在相应的平台上运行。
在 Solaris 10 以前的系统上,不进行任何验证,而是由用户负责确保使用这些标志生成的对象已部署在适当的硬件上。
如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
此警告还会扩展到采用 .il 内联汇编语言函数或 __asm() 汇编程序代码(使用 SSE、SSE2、SSE2a 和 SSE3 指令和扩展)的程序。