[clang] [llvm] Adding splitdouble HLSL function (PR #109331)

Justin Bogner via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 9 19:21:12 PDT 2024


================
@@ -18901,6 +18901,159 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
         CGM.getHLSLRuntime().getRadiansIntrinsic(), ArrayRef<Value *>{Op0},
         nullptr, "hlsl.radians");
   }
+  case Builtin::BI__builtin_hlsl_splitdouble: {
+
+    assert((E->getArg(0)->getType()->hasFloatingRepresentation() &&
+            E->getArg(1)->getType()->hasUnsignedIntegerRepresentation() &&
+            E->getArg(2)->getType()->hasUnsignedIntegerRepresentation()) &&
+           "asuint operands types mismatch");
+    Value *Op0 = EmitScalarExpr(E->getArg(0));
+    const auto *OutArg1 = dyn_cast<HLSLOutArgExpr>(E->getArg(1));
+    const auto *OutArg2 = dyn_cast<HLSLOutArgExpr>(E->getArg(2));
+
+    CallArgList Args;
+    auto [Op1BaseLValue, Op1TmpLValue] =
+        EmitHLSLOutArgExpr(OutArg1, Args, OutArg1->getType());
+    auto [Op2BaseLValue, Op2TmpLValue] =
+        EmitHLSLOutArgExpr(OutArg2, Args, OutArg2->getType());
+
+    if (CGM.getTarget().getTriple().isDXIL()) {
+
+      llvm::StructType *RetType = nullptr;
+
+      if (Op0->getType()->isVectorTy()) {
+        auto *Op0VecTy = E->getArg(0)->getType()->getAs<VectorType>();
+
+        llvm::VectorType *i32VecTy = llvm::VectorType::get(
+            Int32Ty, ElementCount::getFixed(Op0VecTy->getNumElements()));
+        RetType = llvm::StructType::get(i32VecTy, i32VecTy);
+      } else {
+        RetType = llvm::StructType::get(Int32Ty, Int32Ty);
+      }
+
+      CallInst *CI =
+          Builder.CreateIntrinsic(RetType, Intrinsic::dx_splitdouble, {Op0},
+                                  nullptr, "hlsl.splitdouble");
+
+      Value *Arg0 = Builder.CreateExtractValue(CI, 0);
+      Value *Arg1 = Builder.CreateExtractValue(CI, 1);
+
+      Builder.CreateStore(Arg0, Op1TmpLValue.getAddress());
+      auto *s = Builder.CreateStore(Arg1, Op2TmpLValue.getAddress());
+
+      EmitWritebacks(*this, Args);
----------------
bogner wrote:

The store and the writebacks happen in every case. Can we structure this to avoid repeating them each time?

>From an abstraction perspective it would also be nice if this was tied more tightly to EmitHLSLOutArgExpr rather than just being something you need to know to do to follow up.

https://github.com/llvm/llvm-project/pull/109331


More information about the cfe-commits mailing list