[clang] [CIR][AArch64] Lower vfmaq_lane_v and vfma_laneq_v (PR #197084)

Andrzej WarzyƄski via cfe-commits cfe-commits at lists.llvm.org
Wed May 13 02:49:49 PDT 2026


================
@@ -2567,8 +2567,49 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
     return builder.createBitcast(ops[0], ty);
   }
   case NEON::BI__builtin_neon_vfma_lane_v:
-  case NEON::BI__builtin_neon_vfmaq_lane_v:
-  case NEON::BI__builtin_neon_vfma_laneq_v:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented AArch64 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return mlir::Value{};
+  case NEON::BI__builtin_neon_vfmaq_lane_v: {
+    mlir::Value addend = builder.createBitcast(ops[0], ty);
+    mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
+    cir::VectorType sourceTy =
+        cir::VectorType::get(ty.getElementType(), ty.getSize() / 2);
+    mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
+    laneSource = emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
+
+    llvm::SmallVector<mlir::Value> fmaOps = {multiplicand, laneSource, addend};
+    return emitCallMaybeConstrainedBuiltin(builder, loc, "fma", ty, fmaOps);
+  }
+  case NEON::BI__builtin_neon_vfma_laneq_v: {
+    if (ty.getElementType() == cgm.doubleTy) {
----------------
banach-space wrote:

This sort-of arbitrary special-casing requires some comments, see below for a reference: https://github.com/llvm/llvm-project/blob/9346acd7806aee8a675089d5b5bcbd8ce98147e0/clang/lib/CodeGen/TargetBuiltins/ARM.cpp?plain=1#L6101

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


More information about the cfe-commits mailing list