rjmccall added inline comments.

================
Comment at: clang/include/clang/Basic/FixedPoint.h:67
+  FixedPointSemantics
+  getCommonSemantics(const FixedPointSemantics &Other) const;
+
----------------
leonardchan wrote:
> rjmccall wrote:
> > Actually representing the fully-precise value is operation-specific; you'd 
> > need a different calculation for at least addition and multiplication, and 
> > maybe also subtraction and (maybe?) division.  Is this what you actually 
> > want?
> For addition and subtraction, I believe we just need to extend and shift to a 
> type that is large enough to hold the larger scale and integral bits, then we 
> can do a normal add/sub. I think the relational operations can use this also 
> since we would just need to resize and align scales for them.
> 
> For multiplication, the intrinsics we will use also assume the scale for both 
> operands are the same, which I believe will also require finding semantics 
> large enough to hold the larger scale and integral bits.
> 
> ```
> declare iN @llvm.smul.fix(iN %L, %iN R, i32 %Scale)
> ```
> 
> Division is similar since the saturating and non-saturating intrinsics assume 
> both operands have the same scale.
> 
> ```
> declare iN @llvm.sdiv.fix(iN %L, %iN R, i32 %Scale)
> ```
> 
> In each of these cases, I believe the common semantics just needs to be large 
> enough to hold the scale and largest representable value, which is what this 
> method does.
Okay, so I believe what you're saying is that `getCommonSemantics` is defined 
as returning a semantics that is capable of precisely representing both input 
values, not one that's capable of precisely representing the result of the 
computation.  The documentation could be clearer about that.


================
Comment at: clang/lib/Basic/FixedPoint.cpp:141
+  if (ResultIsSigned || ResultHasUnsignedPadding)
+    CommonWidth++;
+
----------------
leonardchan wrote:
> rjmccall wrote:
> > Is this right?  If I have `a+b+c+d+e+f+g+h+i`, where those are all the same 
> > signed type, won't the width of the common semantics keep growing as I add 
> > more operands?
> This should be right. Each addition is split into separate binary operations 
> which produce separate common fixed point semantics from 2 different 
> semantics. The width is also primarily made from the larger scale and large 
> number of integral bits (which excludes the sign or unsigned padding).
> 
> For example:
> 
> ```
> a+b -> Width: 32 (scale 14 + integral bits 16 + sign bit 1)
> (a+b)+c -> Width: 32 ^^^^^
> ((a+b)+c)+d -> Width: 32 ^^^^^
> ```
> 
> Added a test for this.
I see.  If that's done consistently then it's fine that it technically slightly 
misrepresents the range of negative values.


================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:3370
+
+  const auto *BinOp = dyn_cast<BinaryOperator>(op.E);
+  assert(BinOp && "Expected the operator to be a binary operator");
----------------
Please use `cast`.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:1237
+  if (Ty->isIntegerType())
+    return 0;
+
----------------
Please optimize this function around expecting a `BuiltinType`.  That is, 
instead of separately checking for an integer type here, please assert it when 
(1) the `getAs` fails or (2) you fall into the `default` case.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:1304
+    RHSTy = ResultTy;
+  }
+
----------------
Hmm.  So adding a signed integer to an unsigned fixed-point type always 
converts the integer to unsigned?  That's a little weird, but only because the 
fixed-point rule seems to be the other way.  Anyway, I assume it's not a bug in 
the spec.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D53738/new/

https://reviews.llvm.org/D53738



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

Reply via email to