Is there a reason your target is defining double in an unuseful and
incompatible way rather than doing hard-single and soft-double? If you
have any control over the choice of ABI, I think the latter makes a
lot more sense.

I can see a few arguments for float==double, but haven't actually done that for our target yet.

A common error is to write 1.0 instead of 1.0f, where the former sometimes pulls in the soft double support.

Integer arguments to libm functions promote to double but I would prefer promote to 32 bit float.

Arguments to variadic functions promote to double. Again I would prefer 32 bit float.

Leaving long double as 64 bit, unlike in the question, means no loss of functionality relative to double == long double.

Cheers

Jon