Skip to content

Commit a36829f

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower vaddh_f16, vsubh_f16, vmulh_f16 and vdivh_f16 (#1258)
Lowering: - `vaddh_f16` - `vsubh_f16` - `vmulh_f16` - `vdivh_f16`
1 parent 3286e2f commit a36829f

File tree

3 files changed

+713
-8
lines changed

3 files changed

+713
-8
lines changed

clang/lib/CIR/CodeGen/CIRGenBuilder.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,14 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
675675
assert(!cir::MissingFeatures::foldBinOpFMF());
676676
return create<cir::BinOp>(lhs.getLoc(), cir::BinOpKind::Mul, lhs, rhs);
677677
}
678+
mlir::Value createFDiv(mlir::Value lhs, mlir::Value rhs) {
679+
assert(!cir::MissingFeatures::metaDataNode());
680+
if (IsFPConstrained)
681+
llvm_unreachable("Constrained FP NYI");
682+
683+
assert(!cir::MissingFeatures::foldBinOpFMF());
684+
return create<cir::BinOp>(lhs.getLoc(), cir::BinOpKind::Div, lhs, rhs);
685+
}
678686

679687
mlir::Value createDynCast(mlir::Location loc, mlir::Value src,
680688
cir::PointerType destType, bool isRefCast,

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3770,14 +3770,22 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
37703770
Ops[0], cir::VectorType::get(&getMLIRContext(), DoubleTy, 2));
37713771
return builder.create<cir::VecExtractOp>(getLoc(E->getExprLoc()), Ops[0],
37723772
emitScalarExpr(E->getArg(1)));
3773-
case NEON::BI__builtin_neon_vaddh_f16:
3774-
llvm_unreachable("NEON::BI__builtin_neon_vaddh_f16 NYI");
3775-
case NEON::BI__builtin_neon_vsubh_f16:
3776-
llvm_unreachable("NEON::BI__builtin_neon_vsubh_f16 NYI");
3777-
case NEON::BI__builtin_neon_vmulh_f16:
3778-
llvm_unreachable("NEON::BI__builtin_neon_vmulh_f16 NYI");
3779-
case NEON::BI__builtin_neon_vdivh_f16:
3780-
llvm_unreachable("NEON::BI__builtin_neon_vdivh_f16 NYI");
3773+
case NEON::BI__builtin_neon_vaddh_f16: {
3774+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3775+
return builder.createFAdd(Ops[0], Ops[1]);
3776+
}
3777+
case NEON::BI__builtin_neon_vsubh_f16: {
3778+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3779+
return builder.createFSub(Ops[0], Ops[1]);
3780+
}
3781+
case NEON::BI__builtin_neon_vmulh_f16: {
3782+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3783+
return builder.createFMul(Ops[0], Ops[1]);
3784+
}
3785+
case NEON::BI__builtin_neon_vdivh_f16: {
3786+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3787+
return builder.createFDiv(Ops[0], Ops[1]);
3788+
}
37813789
case NEON::BI__builtin_neon_vfmah_f16:
37823790
// NEON intrinsic puts accumulator first, unlike the LLVM fma.
37833791
llvm_unreachable("NEON::BI__builtin_neon_vfmah_f16 NYI");

0 commit comments

Comments
 (0)