aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/VE/VVPInstrPatternsVec.td
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/VE/VVPInstrPatternsVec.td')
-rw-r--r--llvm/lib/Target/VE/VVPInstrPatternsVec.td71
1 files changed, 71 insertions, 0 deletions
diff --git a/llvm/lib/Target/VE/VVPInstrPatternsVec.td b/llvm/lib/Target/VE/VVPInstrPatternsVec.td
new file mode 100644
index 000000000000..7003fb387670
--- /dev/null
+++ b/llvm/lib/Target/VE/VVPInstrPatternsVec.td
@@ -0,0 +1,71 @@
+//===----------- VVPInstrPatternsVec.td - VVP_* SDNode patterns -----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes how VVP_* SDNodes are lowered to machine instructions.
+//
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+//
+// VVP SDNode definitions.
+//
+//===----------------------------------------------------------------------===//
+include "VVPInstrInfo.td"
+
+multiclass VectorBinaryArith<
+ SDPatternOperator OpNode,
+ ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
+ string OpBaseName,
+ SDPatternOperator ImmOp, SDNodeXForm ImmCast> {
+ // No mask.
+ def : Pat<(OpNode
+ (any_broadcast ScalarVT:$sx),
+ DataVT:$vy, (MaskVT true_mask), i32:$avl),
+ (!cast<Instruction>(OpBaseName#"rvl")
+ ScalarVT:$sx, $vy, $avl)>;
+ def : Pat<(OpNode DataVT:$vx, DataVT:$vy, (MaskVT true_mask), i32:$avl),
+ (!cast<Instruction>(OpBaseName#"vvl")
+ $vx, $vy, $avl)>;
+
+ // Mask.
+ def : Pat<(OpNode
+ (any_broadcast ScalarVT:$sx),
+ DataVT:$vy, MaskVT:$mask, i32:$avl),
+ (!cast<Instruction>(OpBaseName#"rvml")
+ ScalarVT:$sx, $vy, $mask, $avl)>;
+ def : Pat<(OpNode DataVT:$vx, DataVT:$vy, MaskVT:$mask, i32:$avl),
+ (!cast<Instruction>(OpBaseName#"vvml")
+ $vx, $vy, $mask, $avl)>;
+
+ // TODO We do not specify patterns for the immediate variants here. There
+ // will be an immediate folding pass that takes care of switching to the
+ // immediate variant where applicable.
+
+ // TODO Fold vvp_select into passthru.
+}
+
+// Expand both 64bit and 32 bit variant (256 elements)
+multiclass VectorBinaryArith_ShortLong<
+ SDPatternOperator OpNode,
+ ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
+ ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
+ defm : VectorBinaryArith<OpNode,
+ LongScalarVT, LongDataVT, v256i1,
+ LongOpBaseName, simm7, LO7>;
+ defm : VectorBinaryArith<OpNode,
+ ShortScalarVT, ShortDataVT, v256i1,
+ ShortOpBaseName, simm7, LO7>;
+}
+
+
+defm : VectorBinaryArith_ShortLong<c_vvp_add,
+ i64, v256i64, "VADDSL",
+ i32, v256i32, "VADDSWSX">;
+defm : VectorBinaryArith_ShortLong<c_vvp_and,
+ i64, v256i64, "VAND",
+ i32, v256i32, "PVANDLO">;