summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-05-22 18:27:02 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-05-22 18:27:02 +0000
commit840b02bccf61cf2feda985399c45ff8b995c8701 (patch)
tree575dd6ecb057354798fa78ae5a05455e8a6f8743 /llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll
parent6e7814c4848e95c0df484c7d283052f7258bc147 (diff)
downloadbcm5719-llvm-840b02bccf61cf2feda985399c45ff8b995c8701.tar.gz
bcm5719-llvm-840b02bccf61cf2feda985399c45ff8b995c8701.zip
[Hexagon] Add patterns for accumulating HVX compares
llvm-svn: 333009
Diffstat (limited to 'llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll')
-rw-r--r--llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll298
1 files changed, 298 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll b/llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll
index 39a117f4ecd..9475eb6a880 100644
--- a/llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll
+++ b/llvm/test/CodeGen/Hexagon/autohvx/vector-compare-64b.ll
@@ -92,6 +92,106 @@ define <64 x i8> @test_09(<64 x i8> %v0, <64 x i8> %v1) #0 {
ret <64 x i8> %t1
}
+; CHECK-LABEL: test_0a:
+; CHECK: q[[Q0A0:[0-3]]] &= vcmp.eq(v0.b,v1.b)
+; CHECK: v0 = vmux(q[[Q0A0]],v0,v1)
+define <64 x i8> @test_0a(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp eq <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = and <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0b:
+; CHECK: q[[Q0B0:[0-3]]] |= vcmp.eq(v0.b,v1.b)
+; CHECK: v0 = vmux(q[[Q0B0]],v0,v1)
+define <64 x i8> @test_0b(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp eq <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = or <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0c:
+; CHECK: q[[Q0C0:[0-3]]] ^= vcmp.eq(v0.b,v1.b)
+; CHECK: v0 = vmux(q[[Q0C0]],v0,v1)
+define <64 x i8> @test_0c(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp eq <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = xor <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0d:
+; CHECK: q[[Q0D0:[0-3]]] &= vcmp.gt(v0.b,v1.b)
+; CHECK: v0 = vmux(q[[Q0D0]],v0,v1)
+define <64 x i8> @test_0d(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp sgt <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = and <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0e:
+; CHECK: q[[Q0E0:[0-3]]] |= vcmp.gt(v0.b,v1.b)
+; CHECK: v0 = vmux(q[[Q0E0]],v0,v1)
+define <64 x i8> @test_0e(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp sgt <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = or <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0f:
+; CHECK: q[[Q0F0:[0-3]]] ^= vcmp.gt(v0.b,v1.b)
+; CHECK: v0 = vmux(q[[Q0F0]],v0,v1)
+define <64 x i8> @test_0f(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp sgt <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = xor <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0g:
+; CHECK: q[[Q0G0:[0-3]]] &= vcmp.gt(v0.ub,v1.ub)
+; CHECK: v0 = vmux(q[[Q0G0]],v0,v1)
+define <64 x i8> @test_0g(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp ugt <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = and <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0h:
+; CHECK: q[[Q0H0:[0-3]]] |= vcmp.gt(v0.ub,v1.ub)
+; CHECK: v0 = vmux(q[[Q0H0]],v0,v1)
+define <64 x i8> @test_0h(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp ugt <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = or <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+; CHECK-LABEL: test_0i:
+; CHECK: q[[Q0I0:[0-3]]] ^= vcmp.gt(v0.ub,v1.ub)
+; CHECK: v0 = vmux(q[[Q0I0]],v0,v1)
+define <64 x i8> @test_0i(<64 x i8> %v0, <64 x i8> %v1, <64 x i8> %v2) #0 {
+ %q0 = icmp ugt <64 x i8> %v0, %v1
+ %q1 = trunc <64 x i8> %v2 to <64 x i1>
+ %q2 = xor <64 x i1> %q0, %q1
+ %t1 = select <64 x i1> %q2, <64 x i8> %v0, <64 x i8> %v1
+ ret <64 x i8> %t1
+}
+
+
; --- Half
; CHECK-LABEL: test_10:
@@ -184,6 +284,105 @@ define <32 x i16> @test_19(<32 x i16> %v0, <32 x i16> %v1) #0 {
ret <32 x i16> %t1
}
+; CHECK-LABEL: test_1a:
+; CHECK: q[[Q1A0:[0-3]]] &= vcmp.eq(v0.h,v1.h)
+; CHECK: v0 = vmux(q[[Q1A0]],v0,v1)
+define <32 x i16> @test_1a(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp eq <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = and <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1b:
+; CHECK: q[[Q1B0:[0-3]]] |= vcmp.eq(v0.h,v1.h)
+; CHECK: v0 = vmux(q[[Q1B0]],v0,v1)
+define <32 x i16> @test_1b(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp eq <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = or <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1c:
+; CHECK: q[[Q1C0:[0-3]]] ^= vcmp.eq(v0.h,v1.h)
+; CHECK: v0 = vmux(q[[Q1C0]],v0,v1)
+define <32 x i16> @test_1c(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp eq <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = xor <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1d:
+; CHECK: q[[Q1D0:[0-3]]] &= vcmp.gt(v0.h,v1.h)
+; CHECK: v0 = vmux(q[[Q1D0]],v0,v1)
+define <32 x i16> @test_1d(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp sgt <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = and <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1e:
+; CHECK: q[[Q1E0:[0-3]]] |= vcmp.gt(v0.h,v1.h)
+; CHECK: v0 = vmux(q[[Q1E0]],v0,v1)
+define <32 x i16> @test_1e(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp sgt <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = or <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1f:
+; CHECK: q[[Q1F0:[0-3]]] ^= vcmp.gt(v0.h,v1.h)
+; CHECK: v0 = vmux(q[[Q1F0]],v0,v1)
+define <32 x i16> @test_1f(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp sgt <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = xor <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1g:
+; CHECK: q[[Q1G0:[0-3]]] &= vcmp.gt(v0.uh,v1.uh)
+; CHECK: v0 = vmux(q[[Q1G0]],v0,v1)
+define <32 x i16> @test_1g(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp ugt <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = and <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1h:
+; CHECK: q[[Q1H0:[0-3]]] |= vcmp.gt(v0.uh,v1.uh)
+; CHECK: v0 = vmux(q[[Q1H0]],v0,v1)
+define <32 x i16> @test_1h(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp ugt <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = or <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
+; CHECK-LABEL: test_1i:
+; CHECK: q[[Q1I0:[0-3]]] ^= vcmp.gt(v0.uh,v1.uh)
+; CHECK: v0 = vmux(q[[Q1I0]],v0,v1)
+define <32 x i16> @test_1i(<32 x i16> %v0, <32 x i16> %v1, <32 x i16> %v2) #0 {
+ %q0 = icmp ugt <32 x i16> %v0, %v1
+ %q1 = trunc <32 x i16> %v2 to <32 x i1>
+ %q2 = xor <32 x i1> %q0, %q1
+ %t1 = select <32 x i1> %q2, <32 x i16> %v0, <32 x i16> %v1
+ ret <32 x i16> %t1
+}
+
; --- Word
; CHECK-LABEL: test_20:
@@ -276,4 +475,103 @@ define <16 x i32> @test_29(<16 x i32> %v0, <16 x i32> %v1) #0 {
ret <16 x i32> %t1
}
+; CHECK-LABEL: test_2a:
+; CHECK: q[[Q2A0:[0-3]]] &= vcmp.eq(v0.w,v1.w)
+; CHECK: v0 = vmux(q[[Q2A0]],v0,v1)
+define <16 x i32> @test_2a(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp eq <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = and <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2b:
+; CHECK: q[[Q2B0:[0-3]]] |= vcmp.eq(v0.w,v1.w)
+; CHECK: v0 = vmux(q[[Q2B0]],v0,v1)
+define <16 x i32> @test_2b(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp eq <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = or <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2c:
+; CHECK: q[[Q2C0:[0-3]]] ^= vcmp.eq(v0.w,v1.w)
+; CHECK: v0 = vmux(q[[Q2C0]],v0,v1)
+define <16 x i32> @test_2c(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp eq <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = xor <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2d:
+; CHECK: q[[Q2D0:[0-3]]] &= vcmp.gt(v0.w,v1.w)
+; CHECK: v0 = vmux(q[[Q2D0]],v0,v1)
+define <16 x i32> @test_2d(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp sgt <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = and <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2e:
+; CHECK: q[[Q2E0:[0-3]]] |= vcmp.gt(v0.w,v1.w)
+; CHECK: v0 = vmux(q[[Q2E0]],v0,v1)
+define <16 x i32> @test_2e(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp sgt <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = or <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2f:
+; CHECK: q[[Q2F0:[0-3]]] ^= vcmp.gt(v0.w,v1.w)
+; CHECK: v0 = vmux(q[[Q2F0]],v0,v1)
+define <16 x i32> @test_2f(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp sgt <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = xor <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2g:
+; CHECK: q[[Q2G0:[0-3]]] &= vcmp.gt(v0.uw,v1.uw)
+; CHECK: v0 = vmux(q[[Q2G0]],v0,v1)
+define <16 x i32> @test_2g(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp ugt <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = and <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2h:
+; CHECK: q[[Q2H0:[0-3]]] |= vcmp.gt(v0.uw,v1.uw)
+; CHECK: v0 = vmux(q[[Q2H0]],v0,v1)
+define <16 x i32> @test_2h(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp ugt <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = or <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
+; CHECK-LABEL: test_2i:
+; CHECK: q[[Q2I0:[0-3]]] ^= vcmp.gt(v0.uw,v1.uw)
+; CHECK: v0 = vmux(q[[Q2I0]],v0,v1)
+define <16 x i32> @test_2i(<16 x i32> %v0, <16 x i32> %v1, <16 x i32> %v2) #0 {
+ %q0 = icmp ugt <16 x i32> %v0, %v1
+ %q1 = trunc <16 x i32> %v2 to <16 x i1>
+ %q2 = xor <16 x i1> %q0, %q1
+ %t1 = select <16 x i1> %q2, <16 x i32> %v0, <16 x i32> %v1
+ ret <16 x i32> %t1
+}
+
attributes #0 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-length64b" }
OpenPOWER on IntegriCloud