OK, understood !
The softfloat library have a _big_ advantage here : nowhere it has to multiplies nor divides 64 bit numbers.
Take qmul for example (return (int32_t) (((int64_t) a*B) >> 8)) : although a single smull should be enough, because both a and b are 32 bits, we cannot in C have operands with different size than result, so we cast a into 64 bits, which, as consequence, imply that b also will be casted to 64 bits and the mul will in fact multiplies two 64 bits integers, giving a 64 bit result. This version of qmul leads to 2 MULs instead of one.
Take now qdiv ( return (int32_t) (( (int64_t) a << 32 )/B)>> 8) ) : here again we are asking GCC to divide two 64 bits integers, althoug we only have 32 significants bits per value.
By not using 64 bit cast anymore in qdiv yields an improvement of about 40% in speed, while removing 64 bits cast from qmul add another aprox 10% (very rought numbers). The result is then twice faster, that is much faster than the float version. But, of course, the results are false
What you should need : code an inlined qmul function in asm that use smull (very easy).
Then, code your own divide that do not use int64_t integers (should be easy in C, more tricky in asm).
And I will do exactly the same in gpu940 : I just checked that my Fix_mul function suffer the same problem
Thank you for raising some attention on this !