ebevhan added inline comments.

================
Comment at: lib/CodeGen/CGExprScalar.cpp:768
+    if (CGF.getContext().getTargetInfo().unsignedFixedPointTypesHavePadding() 
&&
+        Ty->isUnsignedFixedPointType()) {
+      unsigned NumBits = CGF.getContext().getTypeSize(Ty);
----------------
rjmccall wrote:
> ebevhan wrote:
> > rjmccall wrote:
> > > ebevhan wrote:
> > > > rjmccall wrote:
> > > > > Can you explain the padding thing?  Why is padding uniformly present 
> > > > > or absent on all unsigned fixed point types on a target, and never on 
> > > > > signed types?  Is this "low bits set" thing endian-specific?
> > > > I'll give an example with a fract type. Let's say fract is 16 bits 
> > > > wide. That means the signed fract will have a scale of 15 (15 
> > > > fractional bits) and one sign bit, for a value range of [-1.0, 1.0). 
> > > > The LSB is worth 2^-15 and the MSB is worth  -2^0, similar to  signed 
> > > > integers.
> > > > 
> > > > The unsigned fract cannot be negative, but must also have a value range 
> > > > of 1.0. This means that either:
> > > > * The scale remains the same (15), and the MSB is a padding bit. This 
> > > > bit would normally be the 2^0 bit, but since the range of the number 
> > > > cannot exceed 1, this bit will always be 0. In this case, the LSB is 
> > > > worth 2^-15 (same as the signed) and the MSB is not worth anything.
> > > > * The scale is that of signed fract + 1 (16). All bits of the number 
> > > > are value bits, and there is no padding. The LSB is worth 2^-16 and the 
> > > > MSB is worth 2^-1. There is no bit with a magnitude of 2^0.
> > > > 
> > > > These rules also apply to accum types, since the number of integral 
> > > > bits in the unsigned accum types may not exceed that of the signed 
> > > > ones. Therefore, we either have to choose between having the same 
> > > > number of fractional bits as the signed ones (leaving the MSB as 
> > > > 0/padding) or having one more fractional bit than the signed ones.
> > > > 
> > > > The lowBits is just there to construct a mask to block out the MSB. 
> > > > There should be no endian consideration.
> > > > I'll give an example with a fract type. Let's say fract is 16 bits 
> > > > wide. That means the signed fract will have a scale of 15 (15 
> > > > fractional bits) and one sign bit, for a value range of [-1.0, 1.0). 
> > > > The LSB is worth 2^-15 and the MSB is worth -2^0, similar to signed 
> > > > integers.
> > > 
> > > Ah, I see, and now I've found where this is laid out in the spec, as well 
> > > as where the spec leaves this representation question open for unsigned 
> > > types.
> > > 
> > > Is this review debating whether or not to use a padded implementation?  
> > > Do we not have any requirement to maintain compatibility with other 
> > > compilers?  Do other compilers differ on the representation, perhaps by 
> > > target, or is there general agreement?
> > > 
> > > In the abstract, I think it would be better to fully use all the bits 
> > > available, even if it means conversions are non-trivial.
> > We had some discussions about representation in earlier patches. The target 
> > specification was a lot more free in the first revisions, but we locked it 
> > down to fewer parameters (scale options for accum types, fract scale being 
> > width-1, and the unsigned-signed scale flag) to make the implementation 
> > simpler.
> > 
> > I argued for adding the target option to set the unsigned scale to the same 
> > as the signed; Leonard's original design did not have it. The reason is 
> > simply that we use that representation downstream in our DSP-C 
> > implementation, and things would be harder to maintain for us if the 
> > upstream implementation did not support it. The only other Embedded-C 
> > implementation I know of is the one in avr-gcc, and I believe it uses all 
> > the bits for unsigned.
> > 
> > I've given some arguments for why our representation is better from an 
> > implementation perspective (conversion is easier, precision ranges are more 
> > uniform, hardware operations that operate on signed can be reused for 
> > unsigned) in previous patches, but I suspect that using all bits is a 
> > reasonable default.
> I'd be happy to read those discussions instead of asking you to summarize 
> them if you wouldn't mind digging out a link.
> 
> That said, I agree that the right approach for Clang as a project is to allow 
> the target to decide.  If there were really an arbitrary number of 
> implementations, that would be different, but from the spec it seems clear 
> that there are exactly two reasonable choices.
I think most of the discussion about representation is spread out in D46915, 
probably some here:
* https://reviews.llvm.org/D46915#inline-419405
* https://reviews.llvm.org/D46915#inline-421591


Repository:
  rC Clang

https://reviews.llvm.org/D48456



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to