@@ -99,6 +99,47 @@ static void initializeAlloca(CodeGenFunction &CGF, AllocaInst *AI, Value *Size,
99
99
I->addAnnotationMetadata("auto-init");
100
100
}
101
101
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
+
102
143
static Value *handleHlslSplitdouble(const CallExpr *E, CodeGenFunction *CGF) {
103
144
Value *Op0 = CGF->EmitScalarExpr(E->getArg(0));
104
145
const auto *OutArg1 = dyn_cast<HLSLOutArgExpr>(E->getArg(1));
@@ -19208,6 +19249,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
19208
19249
"asuint operands types mismatch");
19209
19250
return handleHlslSplitdouble(E, this);
19210
19251
}
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);
19211
19256
}
19212
19257
return nullptr;
19213
19258
}
0 commit comments