Apple LLVM 3.0编译器自动从float转换为double

时间:2011-12-26 13:59:28

标签: c assembly casting floating-point llvm

代码的一部分:

*det_ptr++ = (float)(dx*dy - 0.81*dxy*dxy);

其中dx,dy和dxy是浮点数。

Apple LLVM 3.0编译器为它进行以下程序集:

+0x250  vldr.32                        s0, [r13, #+140]
+0x254  vldr.32                        s1, [r13, #+136]
+0x258  vmul.f32                       s0, s0, s1
+0x25c  vcvt.f64.f32                   d16, s0 <-------------- cast from float to double
+0x260  vldr.32                        s0, [r13, #+132]
+0x264  vcvt.f64.f32                   d17, s0 <-------------- cast from float to double
+0x268  vldr.64                        d18, [r13, #+16]
+0x26c  vmul.f64                       d17, d18, d17
+0x270  vldr.32                        s0, [r13, #+132]
+0x274  vcvt.f64.f32                   d19, s0 <-------------- cast from float to double
+0x278  vmul.f64                       d17, d17, d19
+0x27c  vsub.f64                       d16, d16, d17
+0x280  vcvt.f32.f64                   s0, d16
+0x284  ldr                            r0, [sp, #+104]
+0x286  adds                           r1, r0, #4  ; 0x4
+0x288  str                            r1, [sp, #+104]
+0x28a  vstr.32                        s0, [r0]

有没有办法禁止这些演员?

1 个答案:

答案 0 :(得分:10)

您编写程序的方式需要这些演员表。 0.81是双精度字面值,因此在乘法发生之前必须将dxy提升为double,并且必须在减法之前提升dx*dy。将最终结果转换回浮点数的事实并不重要 - C标准非常清楚,无论如何都要以双精度计算这些项。

要防止促销加倍,请使用单精度文字(通过添加f后缀):

*det_ptr++ = dx*dy - 0.81f*dxy*dxy;