此外,编译器的某些配置支持附加的特殊选项,通常是为了在命令行上兼容这个平台的其他编译器.
下面是针对68000系列定义的`-m'选项:
这种调用约定不兼容UNIX的正常调用.因此如果你需要调用UNIX编译器编译的库函数,你就不能使用这个选项.
此外,所有参数数量可变地函数必须提供函数原型(包括printf);否则编译器会生成错误的调用代码.
另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码. (正常情况下,多余的参数被安全无害的忽略.)
68010和68020处理器支持rtd指令,但是68000不支持.
下面是针对VAX定义的`-m'选项:
下面是SPARC支持的`-m'选项开关:
-mfpu
-mno-fpu
-msoft-float改变了输出文件中的调用约定;因此只有用这个选项编译整个程序才有意义.
-mno-epilogue
使用-mno-epilogue选项时,编译器尽量在每个函数退出点嵌入退出代码.
-mno-v8
默认情况下(除非特别为Fujitsu SPARClite配置), GCC生成SPARC v7目标码.
-mv8生成SPARC v8目标码.他和v7目标码唯一的区别是,编译器生成整数乘法和整数除法指令, SPARC v8支持该指令,而v7体系不支持.
-msparclite生成SPARClite目标码.增加了SPARClite支持的整数乘法,整数除法单步扫描 (integer divide step and scan (ffs))指令. v7体系不支持这些指令.
-mcypress
-mcypress选项(默认项)使编译器对Cypress CY7C602芯片优化代码, SparcStation/SparcServer 3xx系列使用这种芯片.该选项也适用于老式的SparcStation 1, 2, IPX 等机型..
-msupersparc选项使编译器对SuperSparc处理器优化代码, SparcStation 10, 1000 和2000系列使用这种芯片.同时该选项启用完整的SPARC v8指令集.
下面是针对Convex定义的`-m'选项:
下面是针对AMD Am29000定义的`-m'选项:
注意,使用这个选项时, `-f'选项中的寄存器名字必须是normal, user-mode, names.
下面是针对Motorola 88K体系定义的`-m'选项:
-mserialize-volatile
对于常用的处理器子型号, GNU CC始终默认保证这种一致性.如何实现结果一致取决于处理器子型号.
m88100处理器不对内存引用重新安排,因此访问结果始终一致.如果使用了`-m88100'选项, GNU CC 不产生任何针对结果一致的特别指令.
m88110处理器的内存引用顺序并不始终符合指令请求的引用顺序.特别是某条读取指令可能在先前的存储指令之前执行. 多处理器环境下,乱序访问扰乱了易变内存访问的结果一致.因此当使用`-m88000'或`-m88110' 选项时, GNU CC在适当的时候产生特别的指令迫使执行顺序正确.
这些用于保证一致性的额外代码有可能影响程序的性能.如果你确认能够安全地放弃这种保证,你可以使用 `-mno-serialize-volatile'选项.
如果你使用`-m88100'选项,但是需要在m88110处理器上运行时的结果一致,你应该加上 `-mserialize-volatile'选项.
-msvr4
除了SVr4配置, `-msvr3'是所有m88K配置的默认选项.
下面的选项用于IBM RS6000:
-mfp-in-toc
下面的`-m'选项用于IBM RT PC:
下面的`-m'选项用于MIPS家族的计算机:
-mabicalls
下面的`-m'选项用于Intel 80386族计算机: -m486
在函数把浮点返回值放在80387寄存器栈的机器上,即使设置了`-msoft-float'选项,也可能会发出 一些浮点操作码.
通常函数调用约定把float和double的返回值放在FPU寄存器中,即使不存在FPU. 这种作法的理念是操作系统应该仿真出FPU.
而`-mno-fp-ret-in-387'选项使浮点值通过普通的CPU寄存器返回.