This is an archive of the discontinued LLVM Phabricator instance.

[Fixed Point Arithmetic] Addition of the remaining fixed point types and their saturated equivalents
ClosedPublic

Authored by leonardchan on May 15 2018, 4:03 PM.

Details

Summary

This diff includes changes for the remaining _Fract and _Sat fixed point types.

signed short _Fract s_short_fract;
signed _Fract s_fract;
signed long _Fract s_long_fract;
unsigned short _Fract u_short_fract;
unsigned _Fract u_fract;
unsigned long _Fract u_long_fract;

// Aliased fixed point types
short _Accum short_accum;
_Accum accum;
long _Accum long_accum;
short _Fract short_fract;
_Fract fract;
long _Fract long_fract;

// Saturated fixed point types
_Sat signed short _Accum sat_s_short_accum;
_Sat signed _Accum sat_s_accum;
_Sat signed long _Accum sat_s_long_accum;
_Sat unsigned short _Accum sat_u_short_accum;
_Sat unsigned _Accum sat_u_accum;
_Sat unsigned long _Accum sat_u_long_accum;
_Sat signed short _Fract sat_s_short_fract;
_Sat signed _Fract sat_s_fract;
_Sat signed long _Fract sat_s_long_fract;
_Sat unsigned short _Fract sat_u_short_fract;
_Sat unsigned _Fract sat_u_fract;
_Sat unsigned long _Fract sat_u_long_fract;

// Aliased saturated fixed point types
_Sat short _Accum sat_short_accum;
_Sat _Accum sat_accum;
_Sat long _Accum sat_long_accum;
_Sat short _Fract sat_short_fract;
_Sat _Fract sat_fract;
_Sat long _Fract sat_long_fract;

This diff only allows for declaration of these fixed point types. Assignment and other operations done on fixed point types according to http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf will be added in future patches.

Diff Detail

Repository
rC Clang

Event Timeline

leonardchan created this revision.May 15 2018, 4:03 PM
leonardchan retitled this revision from Addition of the remaining fixed point types and their saturated equivalents to [Fixed Point Arithmetic] Addition of the remaining fixed point types and their saturated equivalents.May 16 2018, 9:41 AM

Updated formatting

ebevhan added inline comments.
include/clang/Basic/DiagnosticSemaKinds.td
206

This error should be reworded.

Perhaps '_Sat' specifier is only valid on '_Fract' or '_Accum', not '%0'.

lib/Sema/DeclSpec.cpp
1143

This variable name should probably be a different case.

lib/Sema/SemaType.cpp
1394–1395

You should probably use the 'getCorrespondingSaturatingType' function instead of disambiguating the whole thing here again.

test/Frontend/fixed_point.c
45

What about typedefs with the _Sat specifier on them?

Ka-Ka added a subscriber: Ka-Ka.May 23 2018, 1:07 AM
leonardchan marked 4 inline comments as done.
leonardchan added inline comments.
lib/Sema/SemaType.cpp
1394–1395

Also used getCorrespondingSignedType() for the signage

Forgot to include tests for the _Fract and _Sat keywords in c++ usage

ebevhan added inline comments.May 31 2018, 12:59 AM
include/clang/AST/Type.h
6551

These should probably be in ASTContext directly.

include/clang/Basic/TargetInfo.h
83

I don't think the saturating types need separate configurations. Embedded-C says "Each saturating fixed-point type has the same representation and the same rank as its corresponding primary fixed-point type."

lib/Parse/ParseDecl.cpp
3614

Is there a use for the isSat parameter?

lib/Sema/DeclSpec.cpp
1123

Handling this case here means that placing _Sat on something other than exactly a fixed-point type is a parsing error rather than a semantic error. How does this handle _Sat on sugared types? Should _Sat on things like typedefs work?

typedef _Fract myfract;
_Sat myfract F;

The primary issue (and this is one that we have encountered as well) is that you cannot have a true _Sat typedef since _Sat only exists as part of builtin types. You need to desugar/canonicalize the type and then do getCorrespondingSaturatingType (or have getCorrespondingSaturatingType look at the canonical type internally).

1135

IsFixedPointType can be used here as well.

1165

IsFixedPointType?

lib/Sema/SemaType.cpp
1410

The logic is a bit reversed. The default should be to select the signed variant, and if the TSS is unsigned, then convert it to the unsigned variant.

1609

Other qualifiers like const and volatile are handled down here. Should the _Sat application be performed somewhere here instead?

leonardchan marked 7 inline comments as done.
leonardchan added inline comments.
lib/Sema/DeclSpec.cpp
1123

I think _Sat is analogous to _Complex where it only works with specific builtin types, albeit the only builtin type _Complex doesn't work with is _Bool.

Currently this example would throw the error '_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name' which is similar to what _Complex does when paired with a typedef:

typedef double mydouble;
mydouble _Complex D;  // _Complex type-name' is invalid

I don't see this as a big problem right now, but am willing to come back to this in the future if it becomes more urgent. For now, I added a test that asserts this error is thrown.

lib/Sema/SemaType.cpp
1410

Using getCorrespondingUnsignedType(). Also changed getCorrespondingUnsignedType() to accept fixed point types.

ebevhan added inline comments.Jun 1 2018, 12:45 AM
include/clang/AST/ASTContext.h
2879

This probably belongs up near the other predicates.

Also I think it's more common to simply pass QualType instead of a const QualType&.

lib/Sema/DeclSpec.cpp
1123

That sounds reasonable. I have no strong opinions on it and I don't think we use the functionality anyway.

lib/Sema/SemaType.cpp
1614

The braces aren't needed.

leonardchan marked an inline comment as done.

@ebevhan Does everything look good in this patch? I'm almost done with the next one. Writing tests for it still.

leonardchan added subscribers: rjmccall, jfb.

Yes, it looks good to me.

Actually, wait! One last thing I missed.

include/clang/Sema/DeclSpec.h
669

This should take a PrintingPolicy like the others.

ebevhan added inline comments.Jun 7 2018, 4:52 AM
lib/Sema/SemaType.cpp
1614

Also, this does not seem to invalidate the declarator.

leonardchan added inline comments.Jun 7 2018, 8:01 AM
include/clang/Sema/DeclSpec.h
669

I think the PrintingPolicy may not be necessary because it's only used for getting the name of the current TypeSpecType. More specifically, for just differentiating vetween "bool" and "_Bool" for TST_bool. It also seems that other setters that don't touch TypeSpecType use PrintingPolicy, like SetTypeSpecComplex or SetTypeSpecSign

lib/Sema/SemaType.cpp
1614

How so? I have tests under test/Frontend/fixed_point_errors.c that check for an error thrown if _Sat is used with non-fixed point types.

ebevhan added inline comments.Jun 7 2018, 8:14 AM
include/clang/Sema/DeclSpec.h
669

You are correct, the ones that don't need it don't take it. I'm just being selfish since I need it downstream to disambiguate __sat and _Sat.

It's fine the way it is.

lib/Sema/SemaType.cpp
1614

Hm, that is true. We don't have it downstream either. I'm not sure what the purpose of doing it is, but other invalid specifiers do declarator.setInvalidType(true);

I guess it isn't needed, just curious as to why it's done for some other ones.

ebevhan accepted this revision.Jun 13 2018, 4:34 AM

LGTM, but I'm not a code owner so maybe someone else should chime in if they have any input.

This revision is now accepted and ready to land.Jun 13 2018, 4:34 AM
ebevhan added inline comments.Jun 13 2018, 4:36 AM
test/Frontend/fixed_point_bit_widths.c
44

Wait; should these dso_local be {{.*}}?

leonardchan marked an inline comment as done.
leonardchan added inline comments.
test/Frontend/fixed_point_bit_widths.c
44

They should, I forgot to get the latest diff which checks this since not all targets produce dso_local.

ebevhan accepted this revision.Jun 14 2018, 6:25 AM
This revision was automatically updated to reflect the committed changes.
This revision was automatically updated to reflect the committed changes.