[llvm] d1c3ec6 - [Hexagon] Add missing patterns for truncate to vNi1
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 17 16:39:22 PDT 2023
Author: Krzysztof Parzyszek
Date: 2023-06-17T16:31:21-07:00
New Revision: d1c3ec61d6543aeef8577c1baa5331fec9248c8d
URL: https://github.com/llvm/llvm-project/commit/d1c3ec61d6543aeef8577c1baa5331fec9248c8d
DIFF: https://github.com/llvm/llvm-project/commit/d1c3ec61d6543aeef8577c1baa5331fec9248c8d.diff
LOG: [Hexagon] Add missing patterns for truncate to vNi1
Added:
llvm/test/CodeGen/Hexagon/isel/trunc-vNi1.ll
Modified:
llvm/lib/Target/Hexagon/HexagonPatterns.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/Hexagon/HexagonPatterns.td b/llvm/lib/Target/Hexagon/HexagonPatterns.td
index 48a79cb9074d6..d1c44db74de28 100644
--- a/llvm/lib/Target/Hexagon/HexagonPatterns.td
+++ b/llvm/lib/Target/Hexagon/HexagonPatterns.td
@@ -562,6 +562,20 @@ def: Pat<(v4i8 (trunc V4I16:$Rs)),
def: Pat<(v2i16 (trunc V2I32:$Rs)),
(A2_combine_ll (HiReg $Rs), (LoReg $Rs))>;
+// Truncate to vNi1
+def: Pat<(v2i1 (trunc V2I32:$Rs)),
+ (A4_vcmpweqi (A2_andp V2I32:$Rs, (A2_combineii (i32 1), (i32 1))),
+ (i32 1))>;
+def: Pat<(v4i1 (trunc V4I16:$Rs)),
+ (A4_vcmpheqi (Combinew (A2_andir (HiReg $Rs), (i32 0x00010001)),
+ (A2_andir (LoReg $Rs), (i32 0x00010001))),
+ (i32 1))>;
+def: Pat<(v8i1 (trunc V8I8:$Rs)),
+ (A4_vcmpbeqi (Combinew (A2_andir (HiReg $Rs), (i32 0x01010101)),
+ (A2_andir (LoReg $Rs), (i32 0x01010101))),
+ (i32 1))>;
+
+
// Saturation:
// Note: saturation assumes the same signed-ness for the input and the
// output.
diff --git a/llvm/test/CodeGen/Hexagon/isel/trunc-vNi1.ll b/llvm/test/CodeGen/Hexagon/isel/trunc-vNi1.ll
new file mode 100644
index 0000000000000..1394d49587de2
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/isel/trunc-vNi1.ll
@@ -0,0 +1,70 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+define void @f0(<2 x i32> %a0, ptr %a1) {
+; CHECK-LABEL: f0:
+; CHECK: .cfi_startproc
+; CHECK-NEXT: // %bb.0: // %b0
+; CHECK-NEXT: {
+; CHECK-NEXT: r5:4 = combine(#1,#1)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: r1:0 = and(r1:0,r5:4)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: p0 = vcmpw.eq(r1:0,#1)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: jumpr r31
+; CHECK-NEXT: memb(r2+#0) = r0.new
+; CHECK-NEXT: }
+b0:
+ %v0 = trunc <2 x i32> %a0 to <2 x i1>
+ store <2 x i1> %v0, ptr %a1, align 1
+ ret void
+}
+
+define void @f1(<4 x i16> %a0, ptr %a1) {
+; CHECK-LABEL: f1:
+; CHECK: .cfi_startproc
+; CHECK-NEXT: // %bb.0: // %b0
+; CHECK-NEXT: {
+; CHECK-NEXT: r0 = and(r0,##65537)
+; CHECK-NEXT: r1 = and(r1,##65537)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: p0 = vcmph.eq(r1:0,#1)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: jumpr r31
+; CHECK-NEXT: memb(r2+#0) = r0.new
+; CHECK-NEXT: }
+b0:
+ %v0 = trunc <4 x i16> %a0 to <4 x i1>
+ store <4 x i1> %v0, ptr %a1, align 1
+ ret void
+}
+
+define void @f2(<8 x i8> %a0, ptr %a1) {
+; CHECK-LABEL: f2:
+; CHECK: .cfi_startproc
+; CHECK-NEXT: // %bb.0: // %b0
+; CHECK-NEXT: {
+; CHECK-NEXT: r0 = and(r0,##16843009)
+; CHECK-NEXT: r1 = and(r1,##16843009)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: p0 = vcmpb.eq(r1:0,#1)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: jumpr r31
+; CHECK-NEXT: memb(r2+#0) = r0.new
+; CHECK-NEXT: }
+b0:
+ %v0 = trunc <8 x i8> %a0 to <8 x i1>
+ store <8 x i1> %v0, ptr %a1, align 1
+ ret void
+}
More information about the llvm-commits
mailing list