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