[clang] [CIR][AArch64] Lower NEON vzip intrinsics (PR #193658)
Andrzej WarzyĆski via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 27 02:02:43 PDT 2026
================
@@ -2774,8 +2774,31 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
case NEON::BI__builtin_neon_vtrnq_v:
case NEON::BI__builtin_neon_vuzp_v:
case NEON::BI__builtin_neon_vuzpq_v:
+ cgm.errorNYI(expr->getSourceRange(),
+ std::string("unimplemented AArch64 builtin call: ") +
+ getContext().BuiltinInfo.getName(builtinID));
+ return mlir::Value{};
case NEON::BI__builtin_neon_vzip_v:
- case NEON::BI__builtin_neon_vzipq_v:
+ case NEON::BI__builtin_neon_vzipq_v: {
+ ops[1] = builder.createBitcast(ops[1], ty);
+ ops[2] = builder.createBitcast(ops[2], ty);
+ // Adding a bitcast here as Ops[0] might be a void pointer.
+ mlir::Value baseAddr =
+ builder.createBitcast(ops[0], builder.getPointerTo(ty));
+ mlir::Value sv;
+ for (unsigned vi = 0; vi != 2; ++vi) {
+ llvm::SmallVector<int64_t, 16> indices;
+ for (unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
+ indices.push_back((i + vi * e) >> 1);
+ indices.push_back(((i + vi * e) >> 1) + e);
+ }
+ cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
+ mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
+ sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
+ (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
----------------
banach-space wrote:
Thanks for checking - that's what I suspected, but wasn't sure.
https://github.com/llvm/llvm-project/pull/193658
More information about the cfe-commits
mailing list