aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorKerry McLaughlin <kerry.mclaughlin@arm.com>2023-02-07 11:21:37 +0000
committerKerry McLaughlin <kerry.mclaughlin@arm.com>2023-02-07 11:34:07 +0000
commitf3188b98d05dc17417d6783265f38fe012a5b548 (patch)
tree0172c6a3877f14985078e44705d7045f93f2b3f5 /llvm/lib
parent29374543e9e520b449bc43d48f9027efefbc7d29 (diff)
downloadllvm-f3188b98d05dc17417d6783265f38fe012a5b548.zip
llvm-f3188b98d05dc17417d6783265f38fe012a5b548.tar.gz
llvm-f3188b98d05dc17417d6783265f38fe012a5b548.tar.bz2
[AArch64][SME2] Add multi-vector frint intrinsics
Adds x2 and x4 vector intrinsics for the following instructions: - frinta - frintm - frintn - frintp NOTE: These intrinsics are still in development and are subject to future changes. Reviewed By: david-arm Differential Revision: https://reviews.llvm.org/D143058
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
index a9ee346..2eb3101 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
@@ -367,6 +367,7 @@ public:
void SelectClamp(SDNode *N, unsigned NumVecs, unsigned Opcode);
void SelectUnaryMultiIntrinsic(SDNode *N, unsigned NumOutVecs,
bool IsTupleInput, unsigned Opc);
+ void SelectFrintFromVT(SDNode *N, unsigned NumVecs, unsigned Opcode);
template <unsigned MaxIdx, unsigned Scale>
void SelectMultiVectorMove(SDNode *N, unsigned NumVecs, unsigned BaseReg,
@@ -1874,6 +1875,13 @@ void AArch64DAGToDAGISel::SelectPredicatedLoad(SDNode *N, unsigned NumVecs,
CurDAG->RemoveDeadNode(N);
}
+void AArch64DAGToDAGISel::SelectFrintFromVT(SDNode *N, unsigned NumVecs,
+ unsigned Opcode) {
+ if (N->getValueType(0) != MVT::nxv4f32)
+ return;
+ SelectUnaryMultiIntrinsic(N, NumVecs, true, Opcode);
+}
+
void AArch64DAGToDAGISel::SelectClamp(SDNode *N, unsigned NumVecs,
unsigned Op) {
SDLoc DL(N);
@@ -5380,6 +5388,30 @@ void AArch64DAGToDAGISel::Select(SDNode *Node) {
SelectUnaryMultiIntrinsic(Node, 4, /*IsTupleInput=*/true,
AArch64::UZP_VG4_4Z4Z_Q);
return;
+ case Intrinsic::aarch64_sve_frinta_x2:
+ SelectFrintFromVT(Node, 2, AArch64::FRINTA_2Z2Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frinta_x4:
+ SelectFrintFromVT(Node, 4, AArch64::FRINTA_4Z4Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frintm_x2:
+ SelectFrintFromVT(Node, 2, AArch64::FRINTM_2Z2Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frintm_x4:
+ SelectFrintFromVT(Node, 4, AArch64::FRINTM_4Z4Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frintn_x2:
+ SelectFrintFromVT(Node, 2, AArch64::FRINTN_2Z2Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frintn_x4:
+ SelectFrintFromVT(Node, 4, AArch64::FRINTN_4Z4Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frintp_x2:
+ SelectFrintFromVT(Node, 2, AArch64::FRINTP_2Z2Z_S);
+ return;
+ case Intrinsic::aarch64_sve_frintp_x4:
+ SelectFrintFromVT(Node, 4, AArch64::FRINTP_4Z4Z_S);
+ return;
}
break;
}