[PATCH] D50616: [Fixed Point Arithmetic] FixedPointCast

Bevin Hansson via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 16 01:43:57 PDT 2018


ebevhan added a comment.

I think I've mentioned this before, but I would like to discuss the possibility of adding a target hook(s) for some of these operations (conversions, arithmetic when it comes). Precisely matching the emitted saturation operation is virtually impossible for a target.



================
Comment at: lib/CodeGen/CGExprScalar.cpp:331
+                                  SourceLocation Loc);
+
   /// Emit a conversion from the specified complex type to the specified
----------------
What's the plan for the other conversions (int<->fix, float<->fix)? Functions for those as well?

What about `EmitScalarConversion`? If it cannot handle conversions of fixed-point values it should probably be made to assert, since it will likely mess up.


================
Comment at: lib/CodeGen/CGExprScalar.cpp:1017
+    // Need to extend first before scaling up
+    ResultWidth = SrcWidth + DstScale - SrcScale;
+    llvm::Type *UpscaledTy = Builder.getIntNTy(ResultWidth);
----------------
It is definitely simpler to always do the 'upscale+resize/downscale, [saturate], resize' in the constant evaluation case, but when emitting IR it is not as efficient. There's no need to keep the upshifted bits if you aren't interested in saturation, so in the non-saturating case it is better to keep everything in the native type sizes with '[downscale], resize, [upscale]'. This is why there are a bunch of 'sext i32 to i33' in the test cases.

Perhaps something like
```
if !dst.saturating
  downscale if needed
  resize
  upscale if needed
  return 

old code here, minus the 'DstFPSema.isSaturated()' which is implied
```

It gives a bit of duplication (or at least similar code) but I think it's an important disambiguation to make.


================
Comment at: lib/CodeGen/CGExprScalar.cpp:1052
+    } else if (IsSigned && !DstFPSema.isSigned()) {
+      Value *Zero =
+          ConstantInt::get(CGF.getLLVMContext(), APInt(ResultWidth, 0));
----------------
`ConstantInt::getNullValue`?


================
Comment at: lib/Sema/Sema.cpp:537
+  case Type::STK_FixedPoint:
+    llvm_unreachable("Unknown cast from FixedPoint to boolean");
   }
----------------
Will we want to support this?


Repository:
  rC Clang

https://reviews.llvm.org/D50616





More information about the cfe-commits mailing list