Sun Studio 12 Update 1:C++ 用户指南

A.2.174 –xregs=r[,r...]

控制临时寄存器的使用。

如果编译器可以使用更多的寄存器用于临时存储(临时寄存器),那么编译器将能生成速度更快的代码。该选项使得附加临时寄存器可用,而这些附加寄存器通常是不适用的。

A.2.174.1 值

r 必须是下列值之一。每个值的含义都与 -m32|-m64 的设置相关。

表 A–45 -xregs

值 

含义  

[no%]appl

(SPARC) [不] 允许编译器将应用程序寄存器用作临时寄存器来生成代码。应用程序寄存器是: 

g2、g3 或 g4(在 32 位平台上) 

g2 或 g3(在 64 位平台上) 

强烈建议使用 -xregs=no%appl 编译所有系统软件和库。系统软件(包括共享库)必须为应用程序保留这些寄存器值。这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致。

在 SPARC ABI 中,这些寄存器表示为应用程序寄存器。使用这些寄存器时需要的 loadstore 指令较少,因此可以提高性能。不过,这样使用会与将寄存器用于其他目的的程序发生冲突。

[no%]float

(SPARC) [不] 允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码。使用浮点值可能会用到与该选项无关的这些寄存器。如果希望您的代码没有任何对浮点寄存器的引用,需要使用 -xregs=no%float 并确保您的代码不会以任何方式使用浮点类型。

[no%]frameptr

(x86)[不] 允许编译器将帧指针寄存器(IA32 上的 %ebp、AMD64 上的 %rbp )用作未分配的被调用方保存寄存器。

如果将此寄存器用作被调用方保存寄存器,则可提高程序运行时性能。但是,它也会降低检查和跟踪栈的某些工具的性能。这种栈检查功能对系统性能测量和调节至关重要。因此,使用这种优化可以提高本地系统性能,但会降低全局系统性能。 

  • 为事后分析而转储栈的工具(如性能分析器)将无法工作。

  • 调试器(adbmdbdbx)将无法转储栈或直接弹出栈帧。

  • 最新的帧丢失帧指针之前,dtrace 性能分析实用程序将无法收集栈上的任何帧的信息。

  • Posix pthread_cancel 将无法尝试找到清除处理程序。

  • C++ 异常无法传播给 C 函数。

    丢失了帧指针的 C 函数调用在 C 函数中引发异常的 C++ 函数时,C++ 异常中会发生失败。函数接受函数指针(例如,qsort)或全局函数(例如 malloc)被干预时,通常会发生此类调用。

    上面列出的后两种后果可能会影响应用程序的正常操作。大多数应用程序代码不会遇到这些问题。但是,使用 -xO4 开发的库需要详细记录客户端使用限制的文档。


  • 注 –

    如果也指定了 -xpg,编译器将忽略 -xregs=framptr,并发出警告。另外,对于 32 位 x86 编译,编译器会忽略此选项,除非使用 -noex 选项禁用了异常。


缺省值

SPARC 缺省值为 -xregs=appl,float

x86 缺省值是包括在 -fast 扩展中的 -xregs=no%frameptr -xregs=frameptr

示例

要使用所有可用的临时寄存器编译应用程序,请使用 -xregs=appl,float

要编译对上下文切换敏感的非浮点代码,请使用 -xregs=no%appl,no%float

另请参见

SPARC V8 和 SPARC V9 ABI