================
@@ -675,38 +714,86 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned
builtinID,
case X86::BI__builtin_ia32_ktestzsi:
case X86::BI__builtin_ia32_ktestcdi:
case X86::BI__builtin_ia32_ktestzdi:
+ cgm.errorNYI(expr->getSourceRange(),
+ std::string("unimplemented X86 builtin call: ") +
+ getContext().BuiltinInfo.getName(builtinID));
+ return {};
case X86::BI__builtin_ia32_kaddqi:
case X86::BI__builtin_ia32_kaddhi:
case X86::BI__builtin_ia32_kaddsi:
- case X86::BI__builtin_ia32_kadddi:
+ case X86::BI__builtin_ia32_kadddi: {
+ std::string intrinsicName;
+ switch (builtinID) {
+ default:
+ llvm_unreachable("Unsupported intrinsic!");
+ case X86::BI__builtin_ia32_kaddqi:
+ intrinsicName = "x86.avx512.kadd.b";
+ break;
+ case X86::BI__builtin_ia32_kaddhi:
+ intrinsicName = "x86.avx512.kadd.w";
+ break;
+ case X86::BI__builtin_ia32_kaddsi:
+ intrinsicName = "x86.avx512.kadd.d";
+ break;
+ case X86::BI__builtin_ia32_kadddi:
+ intrinsicName = "x86.avx512.kadd.q";
+ break;
+ }
+ auto intTy = cast<cir::IntType>(ops[0].getType());
+ unsigned numElts = intTy.getWidth();
+ mlir::Value lhsVec = getMaskVecValue(*this, expr, ops[0], numElts);
+ mlir::Value rhsVec = getMaskVecValue(*this, expr, ops[1], numElts);
+ mlir::Type vecTy = lhsVec.getType();
+ mlir::Value resVec = emitIntrinsicCallOp(*this, expr, intrinsicName, vecTy,
+ mlir::ValueRange{lhsVec, rhsVec});
+ return builder.createBitcast(resVec, ops[0].getType());
----------------
HendrikHuebner wrote:
Please move this logic into a helper that also takes the intrinsic name. Then
call this helper for each `kadd*i` case to avoid duplicating the switch
statement.
https://github.com/llvm/llvm-project/pull/169185
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits