[C++11] Reclaiming fixed-point suffixes for user-defined literals.
David Brown
david@westcontrol.com
Tue Nov 8 16:14:00 GMT 2011
On 08/11/2011 15:24, Hans-Peter Nilsson wrote:
> (Not CC:ing the quoted newsgroup, sorry.)
>
> On Tue, 8 Nov 2011, David Brown wrote:
>> If the compiler can generate fractional arithmetic code directly from such
>> expressions, then it is indeed a good step towards implementing such types as
>> a pure C++ class without needing to use compiler extensions.
>
> Right, but don't hold your breath. Getting a native type in
> place for all targets seems to be more important.
Agreed.
>
>> The guts of gcc already know about types like "signed short _Fract", and can
>> handle them well (at least for some targets).
>
> By default too few to matter, it seems, MIPS and ARM. Not even
> sure any of it works elsewhere. Missing from the AVR port too
> (yes, that's you cue. :) For acceptance, IMHO better get it
> working universally by open-coding the implementation without
> requiring --enable-* options.
>
Agreed.
I had actually thought the fixed point types were part of the
up-and-coming C1x standard, but it seems they are not - they are just
part of a draft "TR 18037". Maybe that will make it into the C
standards eventually.
I had been thinking that since they are in a C standard, it's only a
matter of time before gcc supports them on all targets.
>> It is always easier for the
>> compiler when it has more knowledge than if it has to guess based on code
>> patterns - so using "signed short _Fract" means it can see the real type early
>> in the process rather than in a later "combine" pass.
>
> Certainly.
>
>>> Looks like a pretty typical Q7 (or Q1.7) multiplication to me
>>> unless I miss something... Would be a nice thing to have those
>>> Q1.<N-1> formats as native GCC-extension types including
>>> vectorized versions. No, not planning it.
>>>
>>
>> Yes, it is Q1.7 multiplication. And there is already a type for it in C,
>> though gcc doesn't (yet) support it for all targets (I haven't checked recent
>> versions).
>
> I checked my tree above (up-to-date modulo a few hours).
>
>> It is "signed short _Fract" from TR 18037.
>> <http://gcc.gnu.org/onlinedocs/gcc/Fixed_002dPoint.html>
>
> There you go! I thought it had other semantics. Actually the
> type would be target-dependent, but all the targets (both ARM
> and MIPS :) have it that way. Somewhat awkward: the intuitive
> choice would have been "signed char _Fract" IMHO.
>
I can understand why you say that - but from my point of view, "signed
char _Fract" is as horrible as "signed short _Fract". What is really
needed is an equivalent to "stdint.h" to give specific, fixed sizes to
these - then programmers can rely on them. Something like
typedef signed short _Fract fract1q7;
typedef unsigned short _Fract ufract0q7;
Otherwise there will be more madness in the ranks of embedded programmers...
Actually, I suspect that the reality of the situation is that the time
for these types has gone. They will be useful to a few, but people will
continue to use their ugly, type-unsafe, macro-ridden, target-specific
fixed point libraries - either written themselves or by the manufacturer
of the target chip. Steadily more chips support single-precision
floating point in hardware, making fixed point redundant for many uses.
I still think it would be nice to see full support in gcc - both for C
and C++. But I think that by the time they are well supported on a
range of compilers and targets, and therefore useful for general
portable embedded code, most code that could use them will use floating
point in stead.
> brgds, H-P
>
More information about the Gcc
mailing list