Add a triple to switch.ll test.
[oota-llvm.git] / test / CodeGen / X86 / combine-and.ll
1 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 < %s | FileCheck %s
2 ;
3 ; Verify that the DAGCombiner is able to fold a vector AND into a blend
4 ; if one of the operands to the AND is a vector of all constants, and each
5 ; constant element is either zero or all-ones.
6
7
8 define <4 x i32> @test1(<4 x i32> %A) {
9 ; CHECK-LABEL: test1:
10 ; CHECK:       # BB#0:
11 ; CHECK-NEXT:    pxor %xmm1, %xmm1
12 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
13 ; CHECK-NEXT:    retq
14   %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 0, i32 0>
15   ret <4 x i32> %1
16 }
17
18 define <4 x i32> @test2(<4 x i32> %A) {
19 ; CHECK-LABEL: test2:
20 ; CHECK:       # BB#0:
21 ; CHECK-NEXT:    pxor %xmm1, %xmm1
22 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
23 ; CHECK-NEXT:    retq
24   %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 0, i32 0>
25   ret <4 x i32> %1
26 }
27
28 define <4 x i32> @test3(<4 x i32> %A) {
29 ; CHECK-LABEL: test3:
30 ; CHECK:       # BB#0:
31 ; CHECK-NEXT:    pxor %xmm1, %xmm1
32 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5],xmm1[6,7]
33 ; CHECK-NEXT:    retq
34   %1 = and <4 x i32> %A, <i32 0, i32 0, i32 -1, i32 0>
35   ret <4 x i32> %1
36 }
37
38 define <4 x i32> @test4(<4 x i32> %A) {
39 ; CHECK-LABEL: test4:
40 ; CHECK:       # BB#0:
41 ; CHECK-NEXT:    pxor %xmm1, %xmm1
42 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7]
43 ; CHECK-NEXT:    retq
44   %1 = and <4 x i32> %A, <i32 0, i32 0, i32 0, i32 -1>
45   ret <4 x i32> %1
46 }
47
48 define <4 x i32> @test5(<4 x i32> %A) {
49 ; CHECK-LABEL: test5:
50 ; CHECK:       # BB#0:
51 ; CHECK-NEXT:    pxor %xmm1, %xmm1
52 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
53 ; CHECK-NEXT:    retq
54   %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 0>
55   ret <4 x i32> %1
56 }
57
58 define <4 x i32> @test6(<4 x i32> %A) {
59 ; CHECK-LABEL: test6:
60 ; CHECK:       # BB#0:
61 ; CHECK-NEXT:    pxor %xmm1, %xmm1
62 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
63 ; CHECK-NEXT:    retq
64   %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 0, i32 -1>
65   ret <4 x i32> %1
66 }
67
68 define <4 x i32> @test7(<4 x i32> %A) {
69 ; CHECK-LABEL: test7:
70 ; CHECK:       # BB#0:
71 ; CHECK-NEXT:    pxor %xmm1, %xmm1
72 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
73 ; CHECK-NEXT:    retq
74   %1 = and <4 x i32> %A, <i32 0, i32 0, i32 -1, i32 -1>
75   ret <4 x i32> %1
76 }
77
78 define <4 x i32> @test8(<4 x i32> %A) {
79 ; CHECK-LABEL: test8:
80 ; CHECK:       # BB#0:
81 ; CHECK-NEXT:    pxor %xmm1, %xmm1
82 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5],xmm0[6,7]
83 ; CHECK-NEXT:    retq
84   %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 0, i32 -1>
85   ret <4 x i32> %1
86 }
87
88 define <4 x i32> @test9(<4 x i32> %A) {
89 ; CHECK-LABEL: test9:
90 ; CHECK:       # BB#0:
91 ; CHECK-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
92 ; CHECK-NEXT:    retq
93   %1 = and <4 x i32> %A, <i32 -1, i32 -1, i32 0, i32 0>
94   ret <4 x i32> %1
95 }
96
97 define <4 x i32> @test10(<4 x i32> %A) {
98 ; CHECK-LABEL: test10:
99 ; CHECK:       # BB#0:
100 ; CHECK-NEXT:    pxor %xmm1, %xmm1
101 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5],xmm1[6,7]
102 ; CHECK-NEXT:    retq
103   %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 -1, i32 0>
104   ret <4 x i32> %1
105 }
106
107 define <4 x i32> @test11(<4 x i32> %A) {
108 ; CHECK-LABEL: test11:
109 ; CHECK:       # BB#0:
110 ; CHECK-NEXT:    pxor %xmm1, %xmm1
111 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
112 ; CHECK-NEXT:    retq
113   %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 -1, i32 -1>
114   ret <4 x i32> %1
115 }
116
117 define <4 x i32> @test12(<4 x i32> %A) {
118 ; CHECK-LABEL: test12:
119 ; CHECK:       # BB#0:
120 ; CHECK-NEXT:    pxor %xmm1, %xmm1
121 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[6,7]
122 ; CHECK-NEXT:    retq
123   %1 = and <4 x i32> %A, <i32 -1, i32 -1, i32 -1, i32 0>
124   ret <4 x i32> %1
125 }
126
127 define <4 x i32> @test13(<4 x i32> %A) {
128 ; CHECK-LABEL: test13:
129 ; CHECK:       # BB#0:
130 ; CHECK-NEXT:    pxor %xmm1, %xmm1
131 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
132 ; CHECK-NEXT:    retq
133   %1 = and <4 x i32> %A, <i32 -1, i32 -1, i32 0, i32 -1>
134   ret <4 x i32> %1
135 }
136
137 define <4 x i32> @test14(<4 x i32> %A) {
138 ; CHECK-LABEL: test14:
139 ; CHECK:       # BB#0:
140 ; CHECK-NEXT:    pxor %xmm1, %xmm1
141 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
142 ; CHECK-NEXT:    retq
143   %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 -1>
144   ret <4 x i32> %1
145 }
146
147 define <4 x i32> @test15(<4 x i32> %A, <4 x i32> %B) {
148 ; CHECK-LABEL: test15:
149 ; CHECK:       # BB#0:
150 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
151 ; CHECK-NEXT:    retq
152   %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 -1>
153   %2 = and <4 x i32> %B, <i32 0, i32 -1, i32 0, i32 0>
154   %3 = or <4 x i32> %1, %2
155   ret <4 x i32> %3
156 }
157
158 define <4 x i32> @test16(<4 x i32> %A, <4 x i32> %B) {
159 ; CHECK-LABEL: test16:
160 ; CHECK:       # BB#0:
161 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
162 ; CHECK-NEXT:    retq
163   %1 = and <4 x i32> %A, <i32 -1, i32 0, i32 -1, i32 0>
164   %2 = and <4 x i32> %B, <i32 0, i32 -1, i32 0, i32 -1>
165   %3 = or <4 x i32> %1, %2
166   ret <4 x i32> %3
167 }
168
169 define <4 x i32> @test17(<4 x i32> %A, <4 x i32> %B) {
170 ; CHECK-LABEL: test17:
171 ; CHECK:       # BB#0:
172 ; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
173 ; CHECK-NEXT:    retq
174   %1 = and <4 x i32> %A, <i32 0, i32 -1, i32 0, i32 -1>
175   %2 = and <4 x i32> %B, <i32 -1, i32 0, i32 -1, i32 0>
176   %3 = or <4 x i32> %1, %2
177   ret <4 x i32> %3
178 }