1 ; Test vector (or (and X, Z), (and Y, (not Z))) patterns.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
6 define <16 x i8> @f1(<16 x i8> %val1, <16 x i8> %val2, <16 x i8> %val3) {
8 ; CHECK: vsel %v24, %v24, %v26, %v28
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
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) {
23 ; CHECK: vsel %v24, %v26, %v24, %v28
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
36 define <8 x i16> @f3(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3) {
38 ; CHECK: vsel %v24, %v24, %v26, %v28
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
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) {
51 ; CHECK: vsel %v24, %v26, %v24, %v28
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
62 define <4 x i32> @f5(<4 x i32> %val1, <4 x i32> %val2, <4 x i32> %val3) {
64 ; CHECK: vsel %v24, %v24, %v26, %v28
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
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) {
76 ; CHECK: vsel %v24, %v26, %v24, %v28
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
86 define <2 x i64> @f7(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3) {
88 ; CHECK: vsel %v24, %v24, %v26, %v28
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
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) {
100 ; CHECK: vsel %v24, %v26, %v24, %v28
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