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

Ale*_*lex 4 c floating-point assembly casting 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]
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*non 10

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

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

*det_ptr++ = dx*dy - 0.81f*dxy*dxy;
Run Code Online (Sandbox Code Playgroud)