diff options
author | Kerry McLaughlin <kerry.mclaughlin@arm.com> | 2023-02-07 11:21:37 +0000 |
---|---|---|
committer | Kerry McLaughlin <kerry.mclaughlin@arm.com> | 2023-02-07 11:34:07 +0000 |
commit | f3188b98d05dc17417d6783265f38fe012a5b548 (patch) | |
tree | 0172c6a3877f14985078e44705d7045f93f2b3f5 /llvm/lib | |
parent | 29374543e9e520b449bc43d48f9027efefbc7d29 (diff) | |
download | llvm-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.cpp | 32 |
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; } |