[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / SystemZ / vec-or-02.ll
blobeeb86e36ff007325316464d6b2d853e15c4f3f0b
1 ; Test vector (or (and X, Z), (and Y, (not Z))) patterns.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5 ; Test v16i8.
6 define <16 x i8> @f1(<16 x i8> %val1, <16 x i8> %val2, <16 x i8> %val3) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: vsel %v24, %v24, %v26, %v28
9 ; CHECK: br %r14
10   %not = xor <16 x i8> %val3, <i8 -1, i8 -1, i8 -1, i8 -1,
11                                i8 -1, i8 -1, i8 -1, i8 -1,
12                                i8 -1, i8 -1, i8 -1, i8 -1,
13                                i8 -1, i8 -1, i8 -1, i8 -1>
14   %and1 = and <16 x i8> %val1, %val3
15   %and2 = and <16 x i8> %val2, %not
16   %ret = or <16 x i8> %and1, %and2
17   ret <16 x i8> %ret
20 ; ...and again with the XOR applied to the other operand of the AND.
21 define <16 x i8> @f2(<16 x i8> %val1, <16 x i8> %val2, <16 x i8> %val3) {
22 ; CHECK-LABEL: f2:
23 ; CHECK: vsel %v24, %v26, %v24, %v28
24 ; CHECK: br %r14
25   %not = xor <16 x i8> %val3, <i8 -1, i8 -1, i8 -1, i8 -1,
26                                i8 -1, i8 -1, i8 -1, i8 -1,
27                                i8 -1, i8 -1, i8 -1, i8 -1,
28                                i8 -1, i8 -1, i8 -1, i8 -1>
29   %and1 = and <16 x i8> %val1, %not
30   %and2 = and <16 x i8> %val2, %val3
31   %ret = or <16 x i8> %and1, %and2
32   ret <16 x i8> %ret
35 ; Test v8i16.
36 define <8 x i16> @f3(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3) {
37 ; CHECK-LABEL: f3:
38 ; CHECK: vsel %v24, %v24, %v26, %v28
39 ; CHECK: br %r14
40   %not = xor <8 x i16> %val3, <i16 -1, i16 -1, i16 -1, i16 -1,
41                                i16 -1, i16 -1, i16 -1, i16 -1>
42   %and1 = and <8 x i16> %val1, %val3
43   %and2 = and <8 x i16> %val2, %not
44   %ret = or <8 x i16> %and1, %and2
45   ret <8 x i16> %ret
48 ; ...and again with the XOR applied to the other operand of the AND.
49 define <8 x i16> @f4(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3) {
50 ; CHECK-LABEL: f4:
51 ; CHECK: vsel %v24, %v26, %v24, %v28
52 ; CHECK: br %r14
53   %not = xor <8 x i16> %val3, <i16 -1, i16 -1, i16 -1, i16 -1,
54                                i16 -1, i16 -1, i16 -1, i16 -1>
55   %and1 = and <8 x i16> %val1, %not
56   %and2 = and <8 x i16> %val2, %val3
57   %ret = or <8 x i16> %and1, %and2
58   ret <8 x i16> %ret
61 ; Test v4i32.
62 define <4 x i32> @f5(<4 x i32> %val1, <4 x i32> %val2, <4 x i32> %val3) {
63 ; CHECK-LABEL: f5:
64 ; CHECK: vsel %v24, %v24, %v26, %v28
65 ; CHECK: br %r14
66   %not = xor <4 x i32> %val3, <i32 -1, i32 -1, i32 -1, i32 -1>
67   %and1 = and <4 x i32> %val1, %val3
68   %and2 = and <4 x i32> %val2, %not
69   %ret = or <4 x i32> %and1, %and2
70   ret <4 x i32> %ret
73 ; ...and again with the XOR applied to the other operand of the AND.
74 define <4 x i32> @f6(<4 x i32> %val1, <4 x i32> %val2, <4 x i32> %val3) {
75 ; CHECK-LABEL: f6:
76 ; CHECK: vsel %v24, %v26, %v24, %v28
77 ; CHECK: br %r14
78   %not = xor <4 x i32> %val3, <i32 -1, i32 -1, i32 -1, i32 -1>
79   %and1 = and <4 x i32> %val1, %not
80   %and2 = and <4 x i32> %val2, %val3
81   %ret = or <4 x i32> %and1, %and2
82   ret <4 x i32> %ret
85 ; Test v2i64.
86 define <2 x i64> @f7(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3) {
87 ; CHECK-LABEL: f7:
88 ; CHECK: vsel %v24, %v24, %v26, %v28
89 ; CHECK: br %r14
90   %not = xor <2 x i64> %val3, <i64 -1, i64 -1>
91   %and1 = and <2 x i64> %val1, %val3
92   %and2 = and <2 x i64> %val2, %not
93   %ret = or <2 x i64> %and1, %and2
94   ret <2 x i64> %ret
97 ; ...and again with the XOR applied to the other operand of the AND.
98 define <2 x i64> @f8(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3) {
99 ; CHECK-LABEL: f8:
100 ; CHECK: vsel %v24, %v26, %v24, %v28
101 ; CHECK: br %r14
102   %not = xor <2 x i64> %val3, <i64 -1, i64 -1>
103   %and1 = and <2 x i64> %val1, %not
104   %and2 = and <2 x i64> %val2, %val3
105   %ret = or <2 x i64> %and1, %and2
106   ret <2 x i64> %ret