Skip to content

Commit 211465d

Browse files
committed
[Hexagon]Handle truncate of v4i8/v2i16 -> v4i1/v2i1 when Hvx is enabled
Change-Id: Id1c25dfbaf95a56b687eb6e47d2e48c8fe84deaf
1 parent dcc692a commit 211465d

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

llvm/lib/Target/Hexagon/HexagonPatterns.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,13 @@ def: Pat<(v8i1 (trunc V8I8:$Rs)),
582582
(A4_vcmpbeqi (Combinew (A2_andir (HiReg $Rs), (i32 0x01010101)),
583583
(A2_andir (LoReg $Rs), (i32 0x01010101))),
584584
(i32 1))>;
585+
def : Pat<(v4i1 (trunc V4I8:$Rs)),
586+
(A4_vcmpheqi (Combinew (A2_andir (HiReg (S2_vzxtbh $Rs)), 0x00010001),
587+
(A2_andir (LoReg (S2_vzxtbh $Rs)), 0x00010001)),
588+
(i32 1))>;
589+
def: Pat<(v2i1 (trunc V2I16:$Rs)),
590+
(A4_vcmpweqi (A2_andp (S2_vzxthw $Rs), (A2_combineii (i32 1), (i32 1))),
591+
(i32 1))>;
585592

586593

587594
// Saturation:

llvm/test/CodeGen/Hexagon/isel/trunc-vNi1.ll

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
22
; RUN: llc -mtriple=hexagon < %s | FileCheck %s
3+
; RUN: llc --mtriple=hexagon -mattr=+hvxv79,+hvx-length128b < %s | FileCheck %s
34

45
define void @f0(<2 x i32> %a0, ptr %a1) {
56
; CHECK-LABEL: f0:
@@ -68,3 +69,53 @@ b0:
6869
store <8 x i1> %v0, ptr %a1, align 1
6970
ret void
7071
}
72+
73+
define void @f3(<4 x i8> %a0, ptr %a1) {
74+
; CHECK-LABEL: f3:
75+
; CHECK: .cfi_startproc
76+
; CHECK-NEXT: // %bb.0: // %b0
77+
; CHECK-NEXT: {
78+
; CHECK-NEXT: r3:2 = vzxtbh(r0)
79+
; CHECK-NEXT: }
80+
; CHECK-NEXT: {
81+
; CHECK-NEXT: r2 = and(r2,##65537)
82+
; CHECK-NEXT: r3 = and(r3,##65537)
83+
; CHECK-NEXT: }
84+
; CHECK-NEXT: {
85+
; CHECK-NEXT: p0 = vcmph.eq(r3:2,#1)
86+
; CHECK-NEXT: }
87+
; CHECK-NEXT: {
88+
; CHECK-NEXT: r2 = p0
89+
; CHECK-NEXT: jumpr r31
90+
; CHECK-NEXT: memb(r1+#0) = r2.new
91+
; CHECK-NEXT: }
92+
b0:
93+
%v0 = trunc <4 x i8> %a0 to <4 x i1>
94+
store <4 x i1> %v0, ptr %a1, align 1
95+
ret void
96+
}
97+
98+
define void @f4(<2 x i16> %a0, ptr %a1) {
99+
; CHECK-LABEL: f4:
100+
; CHECK: .cfi_startproc
101+
; CHECK-NEXT: // %bb.0: // %b0
102+
; CHECK-NEXT: {
103+
; CHECK-NEXT: r3:2 = vzxthw(r0)
104+
; CHECK-NEXT: r5:4 = combine(#1,#1)
105+
; CHECK-NEXT: }
106+
; CHECK-NEXT: {
107+
; CHECK-NEXT: r3:2 = and(r3:2,r5:4)
108+
; CHECK-NEXT: }
109+
; CHECK-NEXT: {
110+
; CHECK-NEXT: p0 = vcmpw.eq(r3:2,#1)
111+
; CHECK-NEXT: }
112+
; CHECK-NEXT: {
113+
; CHECK-NEXT: r2 = p0
114+
; CHECK-NEXT: jumpr r31
115+
; CHECK-NEXT: memb(r1+#0) = r2.new
116+
; CHECK-NEXT: }
117+
b0:
118+
%v0 = trunc <2 x i16> %a0 to <2 x i1>
119+
store <2 x i1> %v0, ptr %a1, align 1
120+
ret void
121+
}

0 commit comments

Comments
 (0)