================
@@ -354,24 +354,21 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
case NEON::BI__builtin_neon_vrecpxh_f16:
case NEON::BI__builtin_neon_vrsqrteh_f16:
case NEON::BI__builtin_neon_vrsqrtsh_f16:
- case NEON::BI__builtin_neon_vmaxv_s8:
- case NEON::BI__builtin_neon_vmaxvq_s8:
- case NEON::BI__builtin_neon_vmaxv_s16:
- case NEON::BI__builtin_neon_vmaxvq_s16:
- case NEON::BI__builtin_neon_vmaxv_s32:
- case NEON::BI__builtin_neon_vmaxvq_s32:
- case NEON::BI__builtin_neon_vmaxv_u8:
- case NEON::BI__builtin_neon_vmaxvq_u8:
- case NEON::BI__builtin_neon_vmaxv_u16:
- case NEON::BI__builtin_neon_vmaxvq_u16:
- case NEON::BI__builtin_neon_vmaxv_u32:
- case NEON::BI__builtin_neon_vmaxvq_u32:
- case NEON::BI__builtin_neon_vmaxv_f32:
- case NEON::BI__builtin_neon_vmaxvq_f32:
- case NEON::BI__builtin_neon_vmaxvq_f64:
return emitNeonCall(cgf.cgm, cgf.getBuilder(),
{cgf.convertType(expr->getArg(0)->getType())}, ops,
llvmIntrName, cgf.convertType(expr->getType()), loc);
+ case NEON::BI__builtin_neon_vslid_n_s64:
+ case NEON::BI__builtin_neon_vslid_n_u64: {
+ // The LLVM intrinsic is aarch64.neon.vsli.v1i64, so wrap the i64 inputs
+ // in <1 x i64> and unwrap the result back to i64.
+ mlir::Type scalarTy = cgf.convertType(expr->getArg(0)->getType());
+ cir::VectorType vecTy = cir::VectorType::get(scalarTy, 1);
+ llvm::SmallVector<mlir::Type> argTypes = {vecTy, vecTy, ops[2].getType()};
+ mlir::Value result = emitNeonCall(cgf.cgm, cgf.getBuilder(), argTypes, ops,
+ llvmIntrName, vecTy, loc);
+ return cgf.getBuilder().createBitcast(result,
+ cgf.convertType(expr->getType()));
----------------
banach-space wrote:
This one should go via `emitCommonNeonSISDBuiltinExpr` ;-) See also
clang/include/clang/Basic/AArch64CodeGenUtils.h (search for e.g. `vslid_n_u64)
https://github.com/llvm/llvm-project/pull/199415
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits