@@ -99,6 +99,47 @@ static void initializeAlloca(CodeGenFunction &CGF, AllocaInst *AI, Value *Size,
9999 I->addAnnotationMetadata("auto-init");
100100}
101101
102+ static Value *handleHlslClip(const CallExpr *E, CodeGenFunction *CGF) {
103+ Value *Op0 = CGF->EmitScalarExpr(E->getArg(0));
104+
105+ Constant *FZeroConst = ConstantFP::getZero(CGF->FloatTy);
106+ Value *CMP;
107+ Value *LastInstr;
108+
109+ if (const auto *VecTy = E->getArg(0)->getType()->getAs<clang::VectorType>()) {
110+ FZeroConst = ConstantVector::getSplat(
111+ ElementCount::getFixed(VecTy->getNumElements()), FZeroConst);
112+ auto *FCompInst = CGF->Builder.CreateFCmpOLT(Op0, FZeroConst);
113+ CMP = CGF->Builder.CreateIntrinsic(
114+ CGF->Builder.getInt1Ty(), CGF->CGM.getHLSLRuntime().getAnyIntrinsic(),
115+ {FCompInst}, nullptr);
116+ } else
117+ CMP = CGF->Builder.CreateFCmpOLT(Op0, FZeroConst);
118+
119+ if (CGF->CGM.getTarget().getTriple().isDXIL())
120+ LastInstr = CGF->Builder.CreateIntrinsic(
121+ CGF->VoidTy, llvm::Intrinsic::dx_discard, {CMP}, nullptr);
122+ else if (CGF->CGM.getTarget().getTriple().isSPIRV()) {
123+ BasicBlock *LT0 = CGF->createBasicBlock("lt0", CGF->CurFn);
124+ BasicBlock *End = CGF->createBasicBlock("end", CGF->CurFn);
125+
126+ CGF->Builder.CreateCondBr(CMP, LT0, End);
127+
128+ CGF->Builder.SetInsertPoint(LT0);
129+
130+ CGF->Builder.CreateIntrinsic(CGF->VoidTy, llvm::Intrinsic::spv_discard, {},
131+ nullptr);
132+
133+ LastInstr = CGF->Builder.CreateBr(End);
134+
135+ CGF->Builder.SetInsertPoint(End);
136+ } else {
137+ llvm_unreachable("Backend Codegen not supported.");
138+ }
139+
140+ return LastInstr;
141+ }
142+
102143static Value *handleHlslSplitdouble(const CallExpr *E, CodeGenFunction *CGF) {
103144 Value *Op0 = CGF->EmitScalarExpr(E->getArg(0));
104145 const auto *OutArg1 = dyn_cast<HLSLOutArgExpr>(E->getArg(1));
@@ -19208,6 +19249,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1920819249 "asuint operands types mismatch");
1920919250 return handleHlslSplitdouble(E, this);
1921019251 }
19252+ case Builtin::BI__builtin_hlsl_elementwise_clip:
19253+ assert(E->getArg(0)->getType()->hasFloatingRepresentation() &&
19254+ "clip operands types mismatch");
19255+ return handleHlslClip(E, this);
1921119256 }
1921219257 return nullptr;
1921319258}
0 commit comments