【发布时间】:2010-01-13 23:52:35
【问题描述】:
“为 Thumb 编译”和 VFP 代码如何相互关联?
在 iPhone 2G/3G 上,我知道 Thumb 指令集不包括浮点计算(在 3GS 上,Thumb2 显然有..)。那么,如果为 thumb 编译,但使用 VFP 代码进行浮点计算,会发生什么?
我知道这很深入 - 但可能这里有人知道...c
【问题讨论】:
标签: c++ iphone floating-point thumb
“为 Thumb 编译”和 VFP 代码如何相互关联?
在 iPhone 2G/3G 上,我知道 Thumb 指令集不包括浮点计算(在 3GS 上,Thumb2 显然有..)。那么,如果为 thumb 编译,但使用 VFP 代码进行浮点计算,会发生什么?
我知道这很深入 - 但可能这里有人知道...c
【问题讨论】:
标签: c++ iphone floating-point thumb
我不确定您所说的“使用 VFP 代码”是什么意思。你的意思是浮点代码,它可能被编译以在 VFP 上运行,还是你的意思是实际的 VFP 汇编指令?
如果您在 thumb 模式下编译并使用浮点数,则会为代码中的每个浮点运算进行函数调用。这些函数调用(它们的名称类似于__muldf3vfp)将模式切换到ARM,将数据移入浮点寄存器,执行操作,将数据移回整数寄存器,然后返回。如果你在 ARM 模式下编译,那么对于只有一条指令的东西来说这是很多工作,所以不要在浮点密集型代码中使用 thumb。
如果您尝试在拇指模式下使用 VFP 汇编指令,您只会收到汇编错误。
如您所述,3GS 支持 thumb2,确实可以访问 VFP 和 NEON 寄存器,因此这种情况不适用。
另请注意,可以根据源文件在 thumb 和 ARM 编译之间切换,因此您可以在 thumb 中编译大部分项目,并将 ARM 用于一些执行大量浮点的例程,例如。如果你想写汇编代码,你可以在 ARM 和 thumb 每个函数之间切换。
【讨论】:
Get Info,选择 Build 选项卡,然后将 -mthumb 添加到 Additional Compiler Flags 字段。 (这个字段实际上是每个文件/目标组合,所以如果你的项目有多个目标,你需要确保正确的一个是活动的)