[Interest] armv7a-hard-float in Qt android apps
Elvis Stansvik
elvstone at gmail.com
Sat Apr 30 13:24:00 CEST 2016
2016-04-30 11:51 GMT+02:00 Ola Røer Thorsen <ola at silentwings.no>:
>
> 2016-04-30 10:46 GMT+02:00 Jean-Michaël Celerier
> <jeanmichael.celerier at gmail.com>:
>>
>> https://godbolt.org/g/DqBlFG
>>
>> With gcc -O1
>>
>> float f(float x)
>> {
>> return 2. * x;
>> }
>>
>> becomes
>>
>> f(float):
>> addss %xmm0, %xmm0
>> ret
>>
>>
>> and
>>
>> float g (float x)
>> {
>> return 2.f * x;
>> }
>>
>> becomes
>>
>> g(float):
>> addss %xmm0, %xmm0
>> ret
>>
>
> This is on x86. I was talking about ARM with single-precision FPUs and the
> general advice not to use double precision constants if possible there.
Also, Jean-Michaël's example is a little unfortunate since the
compiler is smart enough to convert the multiplication by 2 to an
addss instruction. Changing the constant to 2.1 is more interesting
(https://godbolt.org/g/Cgw2cR):
f(float):
cvtss2sd %xmm0, %xmm0
mulsd .LC0(%rip), %xmm0
cvtsd2ss %xmm0, %xmm0
ret
g(float):
mulss .LC1(%rip), %xmm0
ret
.LC0:
.long 3435973837
.long 1073794252
.LC1:
.long 1074161254
So conversion to double-precision and then back to single-precision in
the code for f.
For reference, here's the result with ARM GCC 4.5.3:
https://godbolt.org/g/r7Kf1H
Elvis
>
> This is what GCC itself says in the documentation for -Wdouble-promotion:
>
> -Wdouble-promotion (C, C++, Objective-C and Objective-C++ only)Give a
> warning when a value of type float is implicitly promoted to double. CPUs
> with a 32-bit “single-precision” floating-point unit implement float in
> hardware, but emulate double in software. On such a machine, doing
> computations using double values is much more expensive because of the
> overhead required for software emulation.
>
> It is easy to accidentally do computations with double because
> floating-point literals are implicitly of type double. For example, in:
>
> float area(float radius)
> {
> return 3.14159 * radius * radius;
> }
>
> the compiler performs the entire computation with double because the
> floating-point literal is a double.
>
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
More information about the Interest
mailing list