[Hexagon] Add missing patterns for truncate to vNi1
authorKrzysztof Parzyszek <kparzysz@quicinc.com>
Sat, 17 Jun 2023 22:37:24 +0000 (15:37 -0700)
committerKrzysztof Parzyszek <kparzysz@quicinc.com>
Sat, 17 Jun 2023 23:31:21 +0000 (16:31 -0700)
llvm/lib/Target/Hexagon/HexagonPatterns.td
llvm/test/CodeGen/Hexagon/isel/trunc-vNi1.ll [new file with mode: 0644]

index 48a79cb..d1c44db 100644 (file)
@@ -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 (file)
index 0000000..1394d49
--- /dev/null
@@ -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
+}