[clang] [CIR][AArch64] Upstream Neon vget_lane/vgetq_lane builtins (PR #186119)

Andrzej WarzyƄski via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 16 03:52:38 PDT 2026


================
@@ -2212,33 +2219,99 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
   case NEON::BI__builtin_neon_vset_lane_mf8:
   case NEON::BI__builtin_neon_vsetq_lane_mf8:
   case NEON::BI__builtin_neon_vsetq_lane_f64:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
+
   case NEON::BI__builtin_neon_vget_lane_i8:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdupb_lane_i8:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
+
   case NEON::BI__builtin_neon_vgetq_lane_i8:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdupb_laneq_i8:
   case NEON::BI__builtin_neon_vget_lane_mf8:
   case NEON::BI__builtin_neon_vdupb_lane_mf8:
   case NEON::BI__builtin_neon_vgetq_lane_mf8:
   case NEON::BI__builtin_neon_vdupb_laneq_mf8:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vget_lane_i16:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vduph_lane_i16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vgetq_lane_i16:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vduph_laneq_i16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vget_lane_i32:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdups_lane_i32:
   case NEON::BI__builtin_neon_vdups_lane_f32:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vgetq_lane_i32:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdups_laneq_i32:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vget_lane_i64:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdupd_lane_i64:
   case NEON::BI__builtin_neon_vdupd_lane_f64:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vgetq_lane_i64:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdupd_laneq_i64:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vget_lane_f32:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vget_lane_f64:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vgetq_lane_f32:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
   case NEON::BI__builtin_neon_vdups_laneq_f32:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
   case NEON::BI__builtin_neon_vgetq_lane_f64:
+    return emitAArch64GetLaneBuiltinExpr(builder, loc, ops[0],
+                                         emitScalarExpr(expr->getArg(1)));
----------------
banach-space wrote:

That's a good point, but note that this PR does not implement e.g. `BI__builtin_neon_vdups_laneq_f32` and hence the need for every case to be treated separately.

This will be fixed once the implementation of `dup` variants is implemented. @Ayush3941 , will you take care of that as well? Thanks!

https://github.com/llvm/llvm-project/pull/186119


More information about the cfe-commits mailing list