8.1 Intel和AMD x86选项

Intel和AMD x86家族的处理器(386,486,Pentium,等等)中被广泛使用的特性可以使用GCC平台特定选项控制。

在这些平台上,GCC生成的可执行代码默认支持所有x86家族的处理器--向后兼容到386。然而也可以为特定处理器编译代码来得到更好的性能。

例如,最新版本的GCC支持最新的处理器如Pentium 4和AMD Athlon。可以使用下面的选项选择Pentium 4特定选项,

$ gcc -Wall -march=pentium4 hello.c

AMD Athlon特定选项:

$ gcc -Wall -march=athlon hello.c

GCC支持的所有CPU类型可以在GCC参考书册中找到。

使用’-march=CPU’选项生成的代码运行速度会更快但是不能在x86家族的其他处理器上运行。如果你发布的可执行文件在通用Intel和AMD处理器上运行则编译的时候不能使用’-march’选项。

‘-mcpu=CPU’选项用于在速度和可移植性之间权衡--它根据特定处理器产生代码并有指令调度但是不会使用任何其他x86家族的CPUs不支持的指令。最终生成的代码适用于所有CPUs但是在’-mcpu’选项指定的CPU上有速度优势。’-mcpu’选项生成的代码没有’-march’选项生成的代码速度快,但是在实践中’-mcpu’更加方便。

AMD将x86的32位指令集强化为64位指令集被称为x86-64,应用于他们的AMD64位处理器上。在AMD64系统上GCC默认生成64位的机器码。’-m32’选项允许在64位CPU上生成32位机器码。

AMD64处理器对于程序运行在64位模式下有多种不同的内存模型。默认模型是小代码模型,它支持的最大代码和数据体积为2GB。中代码模型对数据体积没有要求,可以使用’-mcmodel=medium’选项选择中代码模型。也有大代码模型它支持无限代码体积和无限数据体积。因为中代码模型已经满足所有日常需求--在日常使用中不会遇到大于2GB的可执行文件所以GCC不支持大代码模型。

一种特殊的内核代码模式’-mcmodel=kernel’用于系统级别的代码,如Linux内核。有一点需要特别注意AMD64默认情况下在栈指针下面分配了一个128字节的内存区域用于存放临时数据,称为”red-zone”(红色区域),Linux内核不支持这种情况。为AMD64处理器编译Linux内核需要’-mcmodel=kernel -mno-red-zone’选项。