Mark Mitchell wrote: > > I attached a diff file for 14 files of the new structures > > and documents. You and other maintainers are welcome to > > check it. Thanks a lot! > > Thank you for posting this. > > Things about which I am clueless: > > What is the difference between a _Fract type and an _Accum type? I'm > gathering that _Fract types have no integer part, i.e., they always > represent a number between (-1,1), whereas _Accum types > contain both an > integer and a fractional part. Is there any other difference?
No other differences. For _Fract and _Accum, there are signed and unsigned types. The unsigned _Fract and _Accum types are always >= 0. > > Substantive issues: > > + unsigned saturating_flag : 1; /* FIXME. This new flag > increases the > size of > + tree_common by a full word. */ > > We need to fix that, if it's true. Grab a bit out of > tree_base::spare, > if need be. Yes. Will get one spare bit for saturating_flag. > > + /* Fixed-point types. */ > + if (targetm.fixed_point_supported_p ()) > > I thought there was an emulation library for fixed-point operations? > So, why would this be supported only on some targets? Is there a harm > in supporting it everywhere? If there is, should it be enabled > per-target, or via a configure-time option? Right now, the fixed-point support is a configure-time option. Each target can decide to support it or not. I think there is no harm to enable for every target. But, each target needs to modify tm.h tm.c tm-modes.def to set or change some target macros. > > I don't see any constant-folding code for fixed-point; is > there no need > for that? Is it somewhere else in the codebase? I will post a diff file that has everything including constant-folding code soon. > > Stylistic points: > > Every function needs a comment saying what it does, what > every argument > is, and what the return value is. You have some new > functions that are > missing comments. Ok. Will fix it. > > + fixed-point <- real, > > Please write as "real to fixed point" to avoid ambiguity with > the errors. Ok. Will fix it. > > +DEF_RTL_EXPR(FIXED_ALL, "fixed_all", "e", RTX_UNARY) > > Why FIXED_ALL? That doesn't seem mnemonic. It's hard to pick up a name. Maybe we will change it to the following as Nigel suggested. /* Conversions involving fractional fixed point types without saturation, including: fractional to fractional (of different precision), signed integer to fractional, fractional to signed integer, floating point to fractional, fractional to floating point. */ DEF_RTL_EXPR(FRACT_CONVERT, "fract_convert", "e", RTX_UNARY) > > > + sat_short_fract_type_node = > make_sat_signed_fract_type (SHORT_FRACT_TYPE_SIZE); > > + sat_fract_type_node = make_sat_signed_fract_type > (FRACT_TYPE_SIZE); > > + sat_long_fract_type_node = > make_sat_signed_fract_type (LONG_FRACT_TYPE_SIZE); > > + sat_long_long_fract_type_node = > make_sat_signed_fract_type (LONG_LONG_FRACT_TYPE_SIZE); > > Can we macroize some of this goo? There are several places > in the patch > where you have very long sequences of types, modes, etc. I would hope > that by naming things consistently, we might be able to compact this a > lot, and reduce the chance that we've got something wrong in just one > place. Like: > > #define MAKE_FIXED_TYPE_NODE(KIND, WIDTH, SAT) \ > set_##WIDTH_##KIND_type_node = make_##SAT_... > > and then: > > #define MAKE_FIXED_TYPE_NODE_FAMILY(KIND) \ > MAKE_FIXED_TYPE_NODE(_short, KIND); \ > MAKE_FIXED_TYPE_NODE(_, KIND); \ > MAKE_FIXED_TYPE_NODE(_long, KIND); \ > MAKE_FIXED_TYPE_NODE(_long_long, KIND); > > and then: > > MAKE_FIXED_TYPE_NODE_FAMILY(sat, fract); > MAKE_FIXED_TYPE_NODE_FAMILY(sat, accum); > > etc. > > That's not right, but you get the idea. :-) Ok. We will try to shorten C code. Thanks! Regards, Chao-ying