Skip to content

Commit aee90fa

Browse files
AmrDeveloperlanza
authored andcommitted
[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 bac4b5c commit aee90fa

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
@@ -3771,14 +3771,22 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
37713771
Ops[0], cir::VectorType::get(&getMLIRContext(), DoubleTy, 2));
37723772
return builder.create<cir::VecExtractOp>(getLoc(E->getExprLoc()), Ops[0],
37733773
emitScalarExpr(E->getArg(1)));
3774-
case NEON::BI__builtin_neon_vaddh_f16:
3775-
llvm_unreachable("NEON::BI__builtin_neon_vaddh_f16 NYI");
3776-
case NEON::BI__builtin_neon_vsubh_f16:
3777-
llvm_unreachable("NEON::BI__builtin_neon_vsubh_f16 NYI");
3778-
case NEON::BI__builtin_neon_vmulh_f16:
3779-
llvm_unreachable("NEON::BI__builtin_neon_vmulh_f16 NYI");
3780-
case NEON::BI__builtin_neon_vdivh_f16:
3781-
llvm_unreachable("NEON::BI__builtin_neon_vdivh_f16 NYI");
3774+
case NEON::BI__builtin_neon_vaddh_f16: {
3775+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3776+
return builder.createFAdd(Ops[0], Ops[1]);
3777+
}
3778+
case NEON::BI__builtin_neon_vsubh_f16: {
3779+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3780+
return builder.createFSub(Ops[0], Ops[1]);
3781+
}
3782+
case NEON::BI__builtin_neon_vmulh_f16: {
3783+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3784+
return builder.createFMul(Ops[0], Ops[1]);
3785+
}
3786+
case NEON::BI__builtin_neon_vdivh_f16: {
3787+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3788+
return builder.createFDiv(Ops[0], Ops[1]);
3789+
}
37823790
case NEON::BI__builtin_neon_vfmah_f16:
37833791
// NEON intrinsic puts accumulator first, unlike the LLVM fma.
37843792
llvm_unreachable("NEON::BI__builtin_neon_vfmah_f16 NYI");

0 commit comments

Comments
 (0)